切分数据集
原理
将数据集切分两部分,一部分用来作为训练模型,另一部分用来测试模型
代码
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.3, random_state=0)
'''
参数:
X : 数据
Y: 标签
test_size: 测试集占数据集的百分比,小数
random_state: 随机数种子
'''
交叉验证
原理
将数据集划分为K个子集,每次选中一个子集作为测试集,剩余的K-1个子集作为训练模型的训练集
代码
from sklearn.mode_selection import cross_val_score # 导入交叉验证
cross_val_score(estimator= , X_train, y_train, cv=10)
'''
常用参数:
estimator: 模型对象名
X : 数据
y : 标签
cv='warn' :交叉拆分策略,分成几份
n_jobs=None : 占用Cpu核心个数
'''
混淆矩阵
原理
统计A类别实例被分成B类别的次数,使用混淆矩阵必须有一组预测值和真实值
代码实现
#导包
# 预测
from sklearn.model_selection import cross_val_predict
# 混淆矩阵
from sklearn.metrics import confusion_matrix
# 获取预测值
y_pred = cross_val_predict(estimator, X_train, y_train, cv=3, method='predict')
'''
参数:
estimator: 模型对象名
X_train: 数据
y_train : 标签
cv:折叠次数
method: 模型返回值,predict:预测标签值
'''
# 使用混淆矩阵
confusion_matrix(y_train, y_pred)
'''
参数:
y_true: 真实值
y_pred: 预测值
'''
精准度与召回率
上一步混淆矩阵中,会返回一个矩阵
假设预测为百人中查找罪犯的结果:
图示解析
- TN: 不是犯人且预测不是犯人
- TP: 是犯人且预测为犯人
前两个预测都为正确的 - FN: 是好人却预测为犯人
- FP: 是犯人却预测为好人
召回率
T P T P + F N \frac {TP} {TP+FN} TP+FNTP
精准度
T P T P + F P \frac {TP}{TP+FP} TP+FPTP
F1分数
F 1 = 2 ∗ 准 确 率 ∗ 召 回 率 准 确 率 + 召 回 率 = T P T P + F N + F P 2 F_1=2*\frac{准确率*召回率}{准确率+召回率}=\frac{TP}{TP+\frac{FN+FP}{2}} F1=2∗准确率+召回率准确率∗召回率=TP+2FN+FPTP
代码
# 精准度
from sklearn.metrics import precision_score
precision_score(y_true, y_pred)
# 召回率
from sklearn.metrics import recall_score
recall_score(y_true, y_pred)
# F1分数
from sklearn.metrics import f1_score
f1_score(y_true, y_pred)
'''
参数:
y_true: 真实值
y_pred: 预测值
'''
ROC曲线
简介
受试者工作特征曲线(简称ROC曲线),ROC曲线和精准率/召回率(PR曲线)很相似,但并不是精准率和召回率,而是真正类率(召回率,TPR)和假正类率(FPR),假正类率是负类被分为正类的比率
代码
from sklearn.model_selection import cross_val_predict
# roc曲线包
from sklearn.metrics import roc_curve
# 画图包
from matplotlib import pyplot as plt
%matplotlib inline
y_score = cross_val_predict(estimator, X_train, y_train, cv=3, method='decision_function')
'''
参数:
method:'decision_function',返回决策分数
'''
fpr, tpr, thresholds = roc_curve(y_train, y_score)
plt.plot(fpr, tpr, linewidth=2)
plt.plot([0, 1], [0, 1], 'k--')
plt.axis([0, 1, 0, 1])
plt.xlabel('假正类率')
plt.ylabel('真正类率')
AUC值
简介
AUC值代表ROC曲线下面积,完美分类器的AUC值为1,纯随机分类器的ROC曲线AUC值为0.5
代码
from sklearn.metrics import roc_auc_score
roc_auc_score(y_train, y_score)
经验法则:
当正类非常少见或者更关注假正类而不是假负类时,选择精准度/召回率(PR)曲线,反之选择ROC曲线
注: 通过ROC曲线对比,可以在多个模型中选择最适合当前数据的模型