(六)模型选择 比较,验证和选择参数和模型。
目标:通过参数调整提高准确性 模块: 网格搜索,交叉验证,指标。
评估模型
不同的应用有着不同的目标,不同的评价指标
模型评价指标
准确率
准确率越高,模型不一定越好
准确率是常见的一种评估模型,但是准确率越高模型不一定越好。
举个例子
假设,在1000个样本中,有999个正样本,1个负样本(不均衡数据集) 如果全部预测正样本,就可以得到准确率99.9%!
这样的场景有:信用卡欺诈检测,离职员工检测等。
有些任务更关心的是某个类的准确率,而非整体的准确率。
比如预测病人是否患癌症,100个人只有1个人换癌症,模型的准确率为99%,但是此模型可能把本来患病的人预测成不患病,这样的情况是非常危险的。
既然准确率不足以进行模型评价,下面介绍几个模型评价的指标。
精确率,召回率
真正例(TP)
预测值是1,真实值是1。被正确分类的正例样本。
假正例(FP)
预测值是1,但真实值是0
真反例(TN)
预测值是0,真实值是0
假反例(FN)
预测值是0,但真实值是1。
正反例是相对于预测值来说的,预测值是1时即正例,预测值为0时范例。再次基础上,如果真实值与预测值一致,则是真的,反之为假的。这样就构成了上述四种评价指标。
根据上述的四种评价,我们可以组合成有意义的评价指标
•TPR(Recall,召回率):TP/(TP + FN),表示检测率,在所有实际值为1的样本中,被正确预测为1的比率
•Precision(精确率): TP/(TP + FP) ,在所有预测值为1的样本中,被正确预测的比例
•FPR: FP/(TN+FP),在所有实际值是0的样本中,被错误地预测为1的比例。
•F1
将召回率和精确率用一个数值表示,即F1
sklearn.metrics中包含常用的评价指标
1.求准确率
即所有预测值为1的样本中,被正确预测的比例
accuracy_score(y_true, y_pred, normalize=True, sample_weight=None)
参数:
y_true :验证集
y_pred :分类器的返回值
normalize:默认值为True,返回正确分类的比例;如果为False,返回正确分类的样本数
2.求精确率
即所有预测值为1的样本中,被正确预测的比例
precision_score(y_true, y_pred, labels=None, pos_label=1, average=’binary’, sample_weight=None)
3.求召回率,表示的是检测率
即在所有实际值为1的样本中,被正确预测为1的比例
(y_true, y_pred, labels=None, pos_label=1, average=’binary’, sample_weight=None)
参数:
average : string, [None, ‘micro’, ‘macro’(default), ‘samples’, ‘weighted’]
将一个二分类matrics拓展到多分类或多标签问题时,我们可以将数据看成多个二分类问题的集合,每个类都是一个二分类。接着,我们可以通过跨多个分类计算每个二分类metrics得分的均值,这在一些情况下很有用。你可以使用average参数来指定。
macro:计算二分类metrics的均值,为每个类给出相同权重的分值。当小类很重要时会出问题,因为该macro-averging方法是对性能的平均。另一方面,该方法假设所有分类都是一样重要的,因此macro-averaging方法会对小类的性能影响很大。
weighted:对于不均衡数量的类来说,计算二分类metrics的平均,通过在每个类的score上进行加权实现。
micro:给出了每个样本类以及它对整个metrics的贡献的pair(sample-weight),而非对整个类的metrics求和,它会每个类的metrics上的权重及因子进行求和,来计算整个份额。Micro-averaging方法在多标签(multilabel)问题中设置,包含多分类,此时,大类将被忽略。
samples:应用在multilabel问题上。它不会计算每个类,相反,它会在评估数据中,通过计算真实类和预测类的差异的metrics,来求平均(sample_weight-weighted)
average:average=None将返回一个数组,它包含了每个类的得分.
4.求F1
f1_score(y_true, y_pred, labels=None, pos_label=1, average=’binary’, sample_weight=None)
举个例子
k = 1
# 把水果识别转换为二分类问题
y_train_binary = y_train.copy() #备份训练集的预测值y
y_test_binary = y_test.copy() #备份测试集的预测值y
#y值不是1就将其赋值为0,也就是预测值y只可能是1和0,把原来的四分类问题转成了2分类问题。
y_train_binary[y_train_binary != 1] = 0
y_test_binary[y_test_binary != 1] = 0
# 用KNN进行学习
knn = KNeighborsClassifier(k)
knn.fit(X_train_scaled, y_train_binary)
y_pred = knn.predict(X_test_scaled)
根据用knn学习出来的模型求准确率,精确率,召回率和F1值
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
# 准确率
print('准确率:{:.3f}'.format(accuracy_score(y_test_binary, y_pred)))
# 精确率
print('精确率:{:.3f}'.format(precision_score(y_test_binary, y_pred)))
# 召回率
print('召回率:{:.3f}'.format(recall_score(y_test_binary, y_pred)))
# F1值
print('F1值:{:.3f}'.format(f1_score(y_test_binary, y_pred)))
Precision-Recall Curve (PR曲线)
1.x轴:recall, y轴:precision(可交换)
2.右上角是“最理想”的点,precision=1.0, recall=1.0
3.sklearn关于PR曲线的函数
①求PR曲线的Recall值和Precision值 precision_recall_curve()
sklearn.metrics.precision_recall_curve(y_true, probas_pred, pos_label=None, sample_weight=None)
举个例子
from sklearn.metrics import precision_recall_curve, average_precision_score
# 求precision和recall值
precision, recall, _ = precision_recall_curve(y_test, y_pred)
#求AP值
print('AP值:{:.3f}'.format(average_precision_score(y_test_binary, y_pred)))
如何用sklearn绘制PR曲线
http://scikit-learn.org/stable/auto_examples/model_selection/plot_precision_recall.html
Receiver Operating Characteristic Curve (ROC曲线)
1.x轴:FPR, y轴:TPR
2.左上角是“最理想”的点,FPR=0.0, TPR=1.0
3.AUC
AUC的值就是ROC曲线下的面积,它的取值范围为0到1之间
•0.5 < AUC < 1,优于随机猜测。这个分类器(模型)妥善设定阈值的话,能有预测价值。
•AUC = 0.5,跟随机猜测一样(例:丢铜板),模型没有预测价值。
•AUC < 0.5,比随机猜测还差;但只要总是反预测而行,就优于随机猜测。
4.sklearn中关于ROC曲线 函数
①roc_curve() 求fpr和tpr的值
sklearn.metrics.roc_curve(y_true, y_score, pos_label=None, sample_weight=None, drop_intermediate=True)
②roc_auc_score() 求AUC值
roc_auc_score(y_true, y_score, average=’macro’, sample_weight=None)
③ 如何绘制ROC曲线
http://scikit-learn.org/stable/auto_examples/model_selection/plot_roc_crossval.html
举个例子:
from sklearn.metrics import roc_auc_score, roc_curve
fpr, tpr, _ = roc_curve(y_test, y_pred) #求fpr和tpr
print('AUC值:{:.3f}'.format(roc_auc_score(y_test_binary, y_pred))) #求ROC值
混淆矩阵(confusion matrix)
1.混淆矩阵可用于多分类模型的评价
上图为一个分类模型的混淆矩阵,预测正确的类别就在此类别的对角线处,预测不对的会在对应的预测错的那个类别的位置,并且矩阵上会标明预测成这个类别的比例。
2.在sklearn使用混淆矩阵
①得到混淆矩阵confusion_matrix()
sklearn.metrics.confusion_matrix(y_true, y_pred, labels=None, sample_weight=None)
参数:
- y_true:真实因变量值
- y_pred:预测因变量值
- labels:矩阵的标签列表索引顺序
- sample_weight:样本权重
输出:
一个矩阵,shape=[y中的类型数,y中的类型数]
②输出每个分类上的概率值 predict_prob
例子
输出混淆矩阵
from sklearn.metrics import confusion_matrix
y_pred = best_model.predict(X_test_scaled)
cm = confusion_matrix(y_test, y_pred)
print(cm)
结果:
[[0 4 0 0]
[0 1 0 0]
[0 8 0 0]
[0 2 0 0]]
绘制混淆矩阵
plt.figure()
plt.grid(False)
plt.imshow(cm, cmap='jet')
plt.colorbar()
回归模型常用的评价指标
•sklearn.metrics.r2_score()
•sklearn.metrics.mean_absolute_error() •sklearn.metrics.mean_squared_error() •sklearn.metrics.median_absolute_error()