数据建模
导入数据
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from IPython.display import Image
data = pd.read_csv('clear_data.csv')
train = pd.read_csv('train.csv')
选择模型
1 判断数据集类型
类型 | 监督学习 | 无监督学习 |
---|
定义 | 从标记的数据进行机器学习任务 | 从未经标记和分类的数据进行机器学习任务 | 分类 | 回归、分类 | 聚类、降维 | 特点 | 有特征、有标签 | 有特征、无标签 |
2 选择模型 根据数据样本量、特征的稀疏性决定模型。 尝试多个模型,以一个基本模型作为基础,和其他模型做对比,选择泛化能力或性能比较好的模型。
3 数据拟合 数据拟合:根据已知数据得到一个和数据稳合的曲线,可以根据曲线方程对其他未知数进行预测,要避免过于拟合,会拟合很多非共性的数据。
4 划分数据集 为了评估模型的性能和泛化能力,划分训练集和测试集。 切分数据集的方法:
留出法:将数据集划分为两个互斥的集合,一个训练集,一个测试集
交叉验证法:将数据分为k份,k-1份为训练集,剩余一份为测试集
自助法:有放回重复采样
from sklearn.model_selection import train_test_split
train_test_split(arrays,
test_size=0.25,
train_size=0.75,
random_state=2,
shuffle =False,
stratify=y)
示例
X_train, X_test, y_train, y_test = train_test_split(
X, y,stratify = y, random_state=42)
X_train.head()
模型搭建
基于线性模型的分类模型(逻辑回归) 基于树的分类模型(决策树、随机森林)
1 逻辑回归模型
from sklearn.linear_model import LogisticRegression
def LogisticRegression(
penalty ='l2'
dual=False
tol=1e-4
C=1.0
fit_intercept=True
intercept_scaling=1
class_weight=None:
random_state=None,
solver='warn',
max_iter=100,
multi_class='warn',
verbose=0,
warm_start=False,
n_jobs=None,
l1_ratio=None
)
逻辑回归方法
fit(X,y,sample_weight = None):根据给定的训练数据拟合模型,X训练样本,y对应的已知标签,sample_weight样本权重函数
predict(X):预测样本分类标签的方法,返回每个样本的分类结果
predict_proba(X):用来做概率估计,返回的是样本为某个标签的概率
score(X,y,sample_weight = None):根据给定测试数据的X Y,返回平均准确度;即把predict预测的结果和已知的标签进行对比
示例:
Int[1] : lr = LogisticRegression().fit(X_train,y_train)#创建逻辑回归模型,并用训练集的X y并对模型进行 训练
Int[2] : lr
Out[3] : LogisticRegression()
#示例1
Int[4] :print('训练集的得分:{:.3f}'.format(lr.score(X_train,y_train)))
Out[5] : 训练集的得分:0.799
#示例2
Int[6] :lr = LogisticRegression(C=0.01).fit(X_train,y_train)
Int[7] : print('训练集的得分:{:.3f}'.format(lr.score(X_train,y_train)))
Out[8] : 训练集的得分:0.756
2 随机森林 随机森林是由多棵决策树组成的,不同的决策树之间是没有联系的。 进行分类任务时,随机森林中的每一棵决策树都分别对自己的样本进行判断和分类,每一棵决策树得到自己的分类结果。用多个决策树拟合数据集的各个子样本,使用平均值提高精度和控制过拟合。
随机森林模型
from sklearn.ensemble import RandomForestClassifier
def RandomForestClassifier(
n_estimateors ,
criterion,
max_depth,
min_sample_split,
min_sample_leaf,
min_weight_fraction_leaf,
max_features,
max_leaf_nodes,
min_impurity_decrease,
min_impurity_split,
bootstrap=True,
oob_score=False,
n_jobs,
random_state,
verbose=0,
warm_start=False,
)
随机森林方法同逻辑回归方法
Int[1]:rf = RandomForestClassifier().fit(X_train,y_train)
Int[2]:print('训练集的得分:{:.3f}'.format(rf.score(X_train,y_train))
Out[3]:训练集的得分:1.000
Int[1]:rf2 = RandomForestClassifier(max_depth=5).fit(X_train,y_train)
Int[2]:print('训练集的得分:{:.3f}'.format(rf2.score(X_train,y_train)))
Out[3]:训练集的得分:0.871
模型预测结果
Int[1]:lr.predict(X_train)
Out[2]:array([1, 0, 0, 1, 1, 0,0,
0, 1, 0, 0, 0, 0,
0, 0,0, 0, 1, 0,
...,
0, 0, 1, 0, 0, 0], dtype=int64)
Int[3]:lr.predict_proba(X_train)
Out[4]:array([[0.08221263, 0.91778737],
[0.78688647, 0.21311353],
[0.79563833, 0.20436167],
...,
[0.54987567, 0.45012433],
[0.69985055, 0.30014945],
[0.87427156, 0.12572844]])
模型评估
1 交叉验证方法
交叉验证是一种评估泛化性能的统计学方法,它比单次划分训练集和测试集的方法更加稳定、全面。因为在交叉验证中,数据会被多次划分,并且需要训练多个模型。k_折交叉验证是最常用的交叉验证,k是由用户指定的数字。
data = pd.read_csv('clear_data.csv')
train = pd.read_csv('train.csv')
X = data
y =train['Survived']
X_train,X_test,y_train,y_test = train_test_split(X,y,stratify = y,random_state = 42)
from sklearn.model_selection import cross_val_score
cross_val_score(estimator,
X,
y,
groups=None,
scoring=None,
cv=None,
n_jobs=None,
verbose=0,
fit_params=None,
pre_dispatch='2*n_jobs',
error_score=nan,
)
示例
Int[1]:lr = LogisticRegression()
Int[2]:score = cross_val_score(lr,X_train,y_train,cv=10)
Int[3]:score.mean()
Out[4]:0.794911804613297
2 混淆矩阵
混淆矩阵:计算二分类问题的(把多元分类的混淆矩阵二分化),评估分类问题的准确性的
from sklearn.metrics import confusion_matrix
confusion_matrix(y_true,
y_pred,
labels,
sample_weight,
normalize
)
示例1
Int[1]:y_true = ['cat','ant','cat','cat','ant','bird']
Int[1]:y_pred = ['ant','ant','cat','cat','ant','cat']
Int[1]:confusion_matrix(y_true,y_pred,labels=['ant','bird','cat'])
Out[2]:array([[2,0,0],
[0,0,1],
[1,0,2]])
示例2
Int[1]:lr = LogisticRegression().fit(X_train,y_train)
Int[1]:y_pred = lr.predict(X_train)
Int[1]:confusion_matrix(y_train,y_pred,labels=[0,1])
Out[2]:array([[357,55],
[79,177]])
3 精确率、召回率
准确率:度量的是被预测为正例的样本中有多少是真正的正类
A
c
c
u
r
a
c
y
=
T
P
+
T
N
T
P
+
T
N
+
F
P
+
F
N
=
正
确
预
测
总
样
本
Accuracy = \frac{TP+TN}{TP+TN+FP+FN}=\frac{正确预测}{总样本}
Accuracy=TP+TN+FP+FNTP+TN?=总样本正确预测? 精确率:
P
r
e
c
i
s
i
o
n
=
T
P
T
P
+
F
P
=
真
的
预
测
为
真
的
Precision = \frac{TP}{TP+FP} = \frac{真的}{预测为真的}
Precision=TP+FPTP?=预测为真的真的? 召回率:度量的是正类样本中有多少被预测为正类
R
e
c
a
l
l
=
T
P
T
P
+
F
N
=
真
的
实
际
为
真
的
Recall = \frac{TP}{TP+FN}= \frac{真的}{实际为真的}
Recall=TP+FNTP?=实际为真的真的? F1-score : 精确率和召回率的调和平均数(两者发生冲突时)
F
1
?
s
c
o
r
e
=
2
P
r
e
c
i
s
i
o
n
?
R
e
c
a
l
l
P
r
e
c
i
s
i
o
n
+
R
e
c
a
l
l
F1-score = 2\frac{Precision * Recall}{Precision +Recall}
F1?score=2Precision+RecallPrecision?Recall?
from sklearn.metrics import classification_report
classification_report(y_true,
y_pred,
labels,
target_names,
sample_weight,
digits,
output_dict,
zero_division
)
示例:
Int[1]:lr = LogisticRegression().fit(X_train,y_train)
Int[1]:y_pred = lr.predict(X_train)
Int[1]:print(classification_report(y_train,y_pred))
Out[2]: precision recall f1-score support
0 0.82 0.87 0.84 412
1 0.77 0.69 0.73 256
accuracy 0.80 668
macro avg 0.79 0.78 0.79 668
weighted avg 0.80 0.80 0.80 668
4 ROC曲线
ROC曲线是由一次次的预测结果组成的,每个点代表一个分类器的结果。曲线越凸越好,曲线越偏向对角线,预测效果越不好。 如果训练多次会得到多个混淆矩阵,得到多个预测结果,ROC曲线方便显示对比。
from sklearn.metrics import roc_curve
roc_curve(y_true,
y_score,
pos_label,
sample_weight,
drop_intermediate,
)
from sklearn.metrics import plot_roc_curve
plot_roc_curve(estimator,
X,
y,
sample_weight,
drop_intermediate,
response_method,
name,
ax,
pos_label
)
示例:
from sklearn.metrics import plot_roc_curve
lr = LogisticRegression().fit(X_train,y_train)
lr1 = LogisticRegression(C=1000).fit(X_train,y_train)
lr2 = LogisticRegression(class_weight = 'balanced').fit(X_train,y_train)
lr_display = plot_roc_curve(lr,X_test,y_test,name='LR',response_method = 'decision_function')
plot_roc_curve(lr1,X_test,y_test,name='LR1',response_method = 'decision_function',ax=lr_display.ax_)
plot_roc_curve(lr2,X_test,y_test,name='LR2',response_method = 'decision_function',ax=lr_display.ax_)
sklearn
Sklearn是基于python的机器学习工具。再sklearn里面由溜达任务模块:分类、回归、聚类、降维、模型选择、预处理。
分类
from sklearn import SomeClassifier #估计器,实际问题名称具体化
from sklearn.linear_model import SomeClassifier
from sklearn.ensemble import SomeClassifier
回归
from sklearn import SomeRegressor
from sklearn.linear_model import SomeRegressor
from sklearn.ensemble import SomeRegressor
聚类
from sklearn.cluster import SomeModel
降维
from sklearn.decomposition import SomeModel
模型选择
from sklearn.model_selection import SomeModel
预处理
from sklearn.preprocessing import SomeModel
|