(1-4)sklearn库的----模型评估

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也支持自己开发评价方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BlackTurn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值