5,模型评估与选择
务必记住那些指标适合分类,那些适合回归。
一,分类问题
常见的分类模型包括:逻辑回归、决策树、朴素贝叶斯、SVM、神经网络等,
分类的模型评估指标包括以下几种:
1.TPR、FPR&TNR(混淆矩阵)
-
在二分类问题中,即将实例分成正类(positive)或负类(negative)。对一个二分问题来说,会出现四种情况。如果一个实例是正类并且也被预测成正类,即为真正类(True positive),如果实例是负类被预测成正类,称之为假正类(False
positive)。相应地,如果实例是负类被预测成负类,称之为真负类(True negative),正类被预测成负类则为假负类(false
negative)。 -
真正、假正、真负、假负
-
真正类率TPR=(真正)/(真正+假负)。实际为真的里面,机器有多少预测对了(是正确率)。
-
负正类率FPR=(假正)/(假正+真负)。实际为负的里面,机器有多少错认为是真的(是错误率)。
2. 精确率Precision、召回率Recall和F1值
①精确率Precision = (真正)/(真正+假正)。精确率只看预测,不看实际,只看预测出来的正确率是多少。
②召回率Recall=(真正)/(真正+假负)。召回率看的是实际,只看实际为真的里面,机器有多少预测对了。
③一般来说,Precision就是检索出来的条目有多少是准确的,Recall就是所有准确的条目有多少被检索出来了(10个犯罪分子,你抓捕了100人,只逮到8个是正确的,召回率就是0.8,精确率就是0.08(精确率只看预测); 10次地震,你警报拉响100次,其中八次是正确的,召回率就是0.8,准确率就是0.08(精确率只看预测) ;池塘1400条鲤鱼,撒一大网,逮着了700条鲤鱼,200只虾,100只鳖。召回率就是700/1400,准确率就是700/1000(精确率只看预测)
④精准度(又称查准率)和召回率(又称查全率)是一对矛盾的度量。一般来说,查准率高时,查全率往往偏低,而查全率高时,查准率往往偏低。所以通常只有在一些简单任务中,才可能使得查准率和查全率都很高。
⑤F1值 = 正确率 * 召回率 * 2 / (正确率 + 召回率) 。F1较高时则能说明试验方法比较有效。
3. ROC曲线和AUC
ROC是一条曲线,AUC是一个面积值。AUC:ROC曲线下面积,参考线面积为0.5,AUC应大于0.5,且偏离越多越好
分类问题的评估指标
1.看准确率
# **************************准确率**************************
y_pred = [0, 2, 1, 3,9,9,8,5,8]
y_true = [0, 1, 2, 3,2,6,3,5,9]
#1.accuracy_score
import numpy as np
from sklearn.metrics import accuracy_score
accuracy_score(y_true, y_pred)
Out[127]: 0.33333333333333331
accuracy_score(y_true, y_pred, normalize=False) # 类似海明距离,每个类别求准确后,再求微平均
Out[128]: 3
# 2, metrics
from sklearn import metrics
metrics.precision_score(y_true, y_pred, average='micro') # 微平均,精确率
Out[130]: 0.33333333333333331
metrics.precision_score(y_true, y_pred, average='macro') # 宏平均,精确率
Out[131]: 0.375
metrics.precision_score(y_true, y_pred, labels=[0, 1, 2, 3], average='macro') # 指定特定分类标签的精确率
Out[133]: 0.5
参数average=‘micro’/‘macro’/'weighted’ :
macro:计算二分类metrics的均值,为每个类给出相同权重的分值。
当小类很重要时会出问题,因为该macro-averging方法是对性能的平均。
另一方面,该方法假设所有分类都是一样重要的,因此macro-averaging
方法会对小类的性能影响很大
micro: 给出了每个样本类以及它对整个metrics的贡献的pair(sample-
weight),而非对整个类的metrics求和,它会每个类的metrics上的权重及
因子进行求和,来计算整个份额。Micro-averaging方法在多标签(multilabel)
问题中设置,包含多分类,此时,大类将被忽略
weighted: 对于不均衡数量的类来说,计算二分类metrics的平均,
通过在每个类的score上进行加权实现
2.召回率
# *************召回率*************
y_pred = [0, 2, 1, 3,9,9,8,5,8]
y_true = [0, 1, 2, 3,2,6,3,5,9]
from sklearn import metrics
metrics.recall_score(y_true, y_pred, average='micro')
Out[134]: 0.33333333333333331
metrics.recall_score(y_true, y_pred, average='macro')
Out[135]: 0.3125
metrics.f1_score(y_true, y_pred, average='weighted')
Out[136]: 0.37037037037037035
3.混淆矩阵
# *************混淆矩阵*************
y_pred = [0, 2, 1, 3,9,9,8,5,8]
y_true = [0, 1, 2, 3,2,6,3,5,9]
from sklearn.metrics import confusion_matrix
confusion_matrix(y_true, y_pred)
Out[137]:
array([[1, 0, 0, ..., 0, 0, 0],
[0, 0, 1, ..., 0, 0, 0],
[0, 1, 0, ..., 0, 0, 1],
...,
[0, 0, 0, ..., 0, 0, 1],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 1, 0]])
4.ROC
# *************ROC*************
# 1,计算ROC值
import numpy as np
from sklearn.metrics import roc_auc_score
y_true = np.array([0, 0, 1, 1])
y_scores = np.array([0.1, 0.4, 0.35, 0.8])
roc_auc_score(y_true, y_scores)
# 2,ROC曲线
y = np.array([1, 1, 2, 2])
scores = np.array([0.1, 0.4, 0.35, 0.8])
fpr, tpr, thresholds = roc_curve(y, scores, pos_label=2)
5.海明距离
# *************海明距离*************
from sklearn.metrics import hamming_loss
y_pred = [1, 2, 3, 4]
y_true = [2, 2, 3, 4]
hamming_loss(y_true, y_pred)
Out[137]:
0.25
6.Jaccard距离
# *************Jaccard距离*************
y_pred = [0, 2, 1, 3,4]
y_true = [0, 1, 2, 3,4]
import numpy as np
from sklearn.metrics import jaccard_similarity_score
jaccard_similarity_score(y_true, y_pred)
0.5
jaccard_similarity_score(y_true, y_pred, normalize=False)
2
7.classification_report
classification_report中的各项得分的avg/total 是每一分类占总数的比例加权算出来的
from sklearn.metrics import classification_report
y_true = [0, 1, 2, 2, 2]
y_pred = [0, 0, 2, 2, 1]
target_names = ['class 0', 'class 1', 'class 2']
print(classification_report(y_true, y_pred, target_names=target_names))
'''
precision recall f1-score support
class 0 0.50 1.00 0.67 1
class 1 0.00 0.00 0.00 1
class 2 1.00 0.67 0.80 3
accuracy 0.60 5
macro avg 0.50 0.56 0.49 5
weighted avg 0.70 0.60 0.61 5
'''
二,回归问题
回归问题的评价测度
(1)MAE,即平均绝对误差(Mean Absolute Error,)
(2) MSE,均方误差(Mean Squared Error)
(3)RMSE,均方根误差(Root Mean Squared Error )
(4)MAE,中值绝对误差(Median absolute error)
(5)EVS,可释方差值(Explained variance score)
(6)R,R方值,确定系数
from sklearn import metrics
import numpy as np
true = [100, 50, 30, 20]#这是一组真实的数据
pred = [90, 50, 50, 30]#这是预测出来的数据
MSE=metrics.mean_squared_error(true, pred)#输出得150.0
RMSE=np.sqrt(metrics.mean_squared_error(true, pred))#输出得12.247
MAE=metrics.median_absolute_error(y_true, y_pred)#中值绝对误差
EVS=metrics.explained_variance_score(y_true, y_pred) #可释方差值
R=metrics.r2_score(y_true, y_pred)#R方值,确定系数
或
# *************平均绝对误差(Mean absolute error)*************
from sklearn.metrics import mean_absolute_error
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
mean_absolute_error(y_true, y_pred)
# *************均方误差(Mean squared error)*************
from sklearn.metrics import mean_squared_error
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
mean_squared_error(y_true, y_pred)
# *************中值绝对误差(Median absolute error)*************
from sklearn.metrics import median_absolute_error
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
median_absolute_error(y_true, y_pred)
# *************可释方差值(Explained variance score)************
from sklearn.metrics import explained_variance_score
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
explained_variance_score(y_true, y_pred)
# *************R方值,确定系数*************
from sklearn.metrics import r2_score
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
r2_score(y_true, y_pred)
三。交叉验证
5.1 交叉验证
交叉验证cross_val_score的scoring参数
- 分类:accuracy(准确率)、f1、f1_micro、f1_macro(这两个用于多分类的f1_score)、precision(精确度)、recall(召回率)、roc_auc
- 回归:neg_mean_squared_error(MSE、均方误差)、r2
- 聚类:adjusted_rand_score、completeness_score等
from sklearn.model_selection import cross_val_score
cross_val_score(model, X, y=None, scoring=None, cv=None, n_jobs=1)
"""参数
---
model:拟合数据的模型
cv : k-fold
scoring: 打分参数-‘accuracy’、‘f1’、‘precision’、‘recall’ 、‘roc_auc’、'neg_log_loss'等等
"""
关于交叉验证具体请看Python机器学习笔记:sklearn库的学习的“5,模型评估与选择”和“8,几种交叉验证(cross validation)方式的比较”
5.2 检验曲线
使用检验曲线,我们可以更加方便的改变模型参数,获取模型表现。
from sklearn.model_selection import validation_curve
train_score, test_score = validation_curve(model, X, y, param_name, param_range, cv=None, scoring=None, n_jobs=1)
"""参数
---
model:用于fit和predict的对象
X, y: 训练集的特征和标签
param_name:将被改变的参数的名字
param_range: 参数的改变范围
cv:k-fold
返回值
---
train_score: 训练集得分(array)
test_score: 验证集得分(array)
"""
6 保存模型
最后,我们可以将我们训练好的model保存到本地,或者放到线上供用户使用,那么如何保存训练好的model呢?主要有下面两种方式:
6.1 保存为pickle文件
import pickle
# 保存模型
with open('model.pickle', 'wb') as f:
pickle.dump(model, f)
# 读取模型
with open('model.pickle', 'rb') as f:
model = pickle.load(f)
model.predict(X_test)
6.2 sklearn自带方法joblib
from sklearn.externals import joblib
# 保存模型
joblib.dump(model, 'model.pickle')
#载入模型
model = joblib.load('model.pickle')
7,模型评分
1,模型的score方法:最简单的模型评估方法就是调用模型自己的方法:
# 预测
y_predict = knnClf.predict(x_test)
print("score on the testdata:",knnClf.score(x_test,y_test))
2,sklearn的指标函数:库提供的一些计算方法,常用的有classification_report方法
3,sklearn也支持自己开发评价方法。