一、模型验证方法如下:

  1. 通过交叉验证得分:model_sleection.cross_val_score(estimator,X)
  2. 对每个输入数据点产生交叉验证估计:model_selection.cross_val_predict(estimator,X)
  3. 计算并绘制模型的学习率曲线:model_selection.learning_curve(estimator,X,y)
  4. 计算并绘制模型的验证曲线:model_selection.validation(estimator,...)
  5. 通过排序评估交叉验证的得分在重要性:model_selection.permutation_test_score(...)

①通过交叉验证得分:model_sleection.cross_val_score(estimator,X)

import numpy as np
from sklearn.model_selection import cross_val_score
from sklearn import datasets,svm
digits=datasets.load_digits()
X=digits.data
y=digits.target
svc=svm.SVC(kernel='linear')
C_s=np.logspace(-10,0,10)
print("参数列表长度",len(C_s))
scores=list()
scores_std=list()
n_folds=3
for C in C_s:svc.C=Cthis_scores=cross_val_score(svc,X,y,cv=n_folds,n_jobs=1)#print(this_scores)scores.append(np.mean(this_scores))scores_std.append(np.std(this_scores))#绘制交叉验证的曲线
import matplotlib.pyplot as plt
plt.figure(1,figsize=(4,3))
plt.clf()
plt.semilogx(C_s,scores)
plt.semilogx(C_s,np.array(scores)+np.array(scores_std),'b--')
plt.semilogx(C_s,np.array(scores)-np.array(scores_std),'b--')
locs,labels=plt.yticks()
plt.yticks(locs,list(map(lambda x:"%g" %x,locs)))
plt.ylabel("CV score")
plt.xlabel("Parameter C")
plt.ylim(0,1.1)
plt.show()

结果图

②对每个输入数据点产生交叉验证估计:model_selection.cross_val_predict(estimator,X)

from sklearn import datasets,linear_model
from sklearn.model_selection import cross_val_predict
disbetes=datasets.load_diabetes()
X=disbetes.data[:150]
y=disbetes.target[:150]
lasso=linear_model.Lasso()
y_pred=cross_val_predict(lasso,X,y)
print(y_pred)结果:
[ 174.26933996  117.6539241   164.60228641  155.65049088  132.68647979128.49511245  120.76146877  141.069413    164.18904498  182.37394949111.04181265  127.94311443  135.0869234   162.83066014  135.3573514157.64516523  178.95843326  163.3919841   143.85237903  144.29748882133.58117218  124.77928571  132.90918003  208.52927     153.61908967154.16616341  118.95351821  163.50467541  145.89406196  168.3308101155.87411031  123.45960148  185.70459144  133.38468582  117.2789469150.27895019  174.1541028   160.03235091  192.31389633  161.58568256154.2224809   119.35517679  146.15706413  133.82056934  179.68118754137.96619936  146.07788398  126.77579723  123.32101099  166.26710247146.41559964  161.67261029  147.47731459  138.44595305  144.85421048113.77990664  185.54970402  115.31624749  142.23672103  171.07792136132.5394716   177.80524864  116.5616502   134.25230846  142.88707475173.2830912   154.31273504  149.16680759  144.88238997  121.97783103110.38457621  180.25559631  199.06141058  151.1195546   161.14217698153.96960812  150.77179755  113.30903579  165.15755771  115.85735727174.19267171  150.12027233  115.47891783  153.38967232  115.31573467156.49909623   92.62211515  178.15649994  131.59320715  134.46166754116.97678633  190.00790119  166.01173292  126.25944471  134.29256991144.71971963  190.9769591   182.39199466  154.45325308  148.30325558151.72036937  124.12825466  138.6011155   137.75891286  123.0917243131.74735403  112.07367481  124.56956904  156.78432061  128.6313559193.68260079  130.54324394  131.8693231   154.5708257   179.81343019165.78130755  150.04779033  162.37974736  143.92996797  143.15645843125.20161377  145.99590279  155.3505536   145.97574185  134.66120515163.92450638  101.92329396  139.33014324  122.71377023  152.20573113153.36931089  116.76545147  131.96936127  109.74817383  132.57453994159.38030328  109.31343881  147.69926269  156.3664255   161.12509958128.16523686  156.78446286  154.04375702  124.83705022  143.85606595143.23651701  147.76316913  154.21572891  129.07895017  157.79644923]

③、计算并绘制模型的学习率曲线:model_selection.learning_curve(estimator,X,y)

import numpy as np
import matplotlib.pyplot as plt
from sklearn.naive_bayes import GaussianNB
from sklearn.svm import SVC
from sklearn.datasets import load_digits
from sklearn.model_selection import learning_curve
from sklearn.model_selection import ShuffleSplitdef plt_learning_curve(estimator,title,X,y,ylim=None,cv=None,n_jobs=1,train_size=np.linspace(.1,1.0,5)):plt.figure()plt.title(title)if ylim is not None:plt.ylim(*ylim)plt.xlabel("Training examples")plt.ylabel("Score")train_sizes,train_scores,test_scores=learning_curve(estimator,X,y,cv=cv,n_jobs=n_jobs,train_sizes=train_size)train_scores_mean=np.mean(train_scores,axis=1)train_scores_std=np.std(train_scores,axis=1)test_scores_mean=np.mean(test_scores,axis=1)test_scores_std=np.std(test_scores,axis=1)plt.grid()plt.fill_between(train_sizes,train_scores_mean-train_scores_std,train_scores_mean+train_scores_std,alpha=0.1,color="r")plt.fill_between(train_sizes,test_scores_mean-test_scores_std,test_scores_mean+test_scores_std,alpha=0.1,color="g")plt.plot(train_sizes,train_scores_mean,"o-",color="r",label="Training score")plt.plot(train_sizes,test_scores_mean,"o-",color="g",label="Cross-validation score")plt.legend(loc="best")return pltdigits=load_digits()
X,y=digits.data,digits.target
title="Learning Curves(Nativr Bayes)"cv=ShuffleSplit(n_splits=100,test_size=0.2,random_state=0)
estimator=GaussianNB()
plt_learning_curve(estimator,title,X,y,ylim=(0.7,1.0),cv=cv,n_jobs=1)
title="Learnming Curves (SVM,RBF kernel,$\gamma=0.001$)"
cv=ShuffleSplit(n_splits=10,test_size=0.2,random_state=0)
estimator=SVC(gamma=0.001)
plt_learning_curve(estimator,title,X,y,(0.7,1.01),cv=cv,n_jobs=1)
plt.show()

④、计算并绘制模型的验证曲线:model_selection.validation(estimator,...)

import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import load_digits
from sklearn.svm import SVC
from sklearn.model_selection import validation_curve
digits = load_digits()
param_range=np.logspace(-6,-1,5)
train_scores,test_scores=validation_curve(SVC(),X,y,param_name="gamma",param_range=param_range,cv=10,scoring="accuracy",n_jobs=1)
train_scores_mean=np.mean(train_scores,axis=1)
train_scores_std=np.std(train_scores,axis=1)
test_scores_mean=np.mean(test_scores,axis=1)
test_scores_std=np.std(test_scores,axis=1)plt.title("Validation Curve with SVM")
plt.xlabel("$\gamma$")
plt.ylabel("Score")
plt.ylim(0.0,1.1)
lw=2
plt.semilogx(param_range,train_scores_mean,label="Training score",color="darkorange",lw=lw)
plt.fill_between(param_range,train_scores_mean-train_scores_std,train_scores_mean+train_scores_std,alpha=0.2,color="darkorange",lw=lw)
plt.semilogx(param_range,test_scores_mean,label="Cross-validation Score",color="navy",lw=lw)
plt.fill_between(param_range,test_scores_mean-test_scores_std,test_scores_mean+test_scores_std,alpha=0.2,color="navy",lw=lw)
plt.legend(loc="best")
plt.show()


⑤、通过排序评估交叉验证的得分在重要性:model_selection.permutation_test_score(...)---现在用的很少

二、模型评估方法

sklearn模型预测性能的评估方法

  • Estimator对象的score方法
  • 在交叉验证中使用的scoring参数

Estimator对象的score方法

score(self,X,y,y_true)函数在内部会调用predict函数获得预测响应y_predict,然后与传人的真实响应进行比较,计算得分

使用estimator的score函数来苹果模型的性能,默认情况下

分类器对应于准确率:sklearn.metrics.accuracy_score

回归器对应于R2得分:sklearn.metrics.r2_score

在交叉验证中使用scoring参数

上面的两个模型选择工具中都有一个参数“scoring”,该参数用来指定在进行网格搜索或计算交叉验证得分的时候,用什么标砖度量“estimator”的预测性能。默认情况下,该参数为“None”就表示“GridSearchCV”与“cross_val_score”都会去调用“estimator”自己的“score”函数,我们也可以为“scoring”参数指定别的性能度量标准,他必须是一个可调用对象,sklearn.metric不仅为我们提供了一系列预定义的可调用对象,而且好支持自定义评估标准。

在交叉验证中使用预定义scoring参数:

  #在交叉验证中使用预定义scoring参数

from sklearn import svm,datasets
from sklearn.model_selection import cross_val_scoreiris=datasets.load_iris()
X,y=iris.data,iris.target
clf=svm.SVC(probability=True,random_state=0)
print(cross_val_score(clf,X,y,scoring="neg_log_loss"))
#结果[-0.0757138  -0.16816241 -0.07091847]model=svm.SVC()
print(cross_val_score(model,X,y,scoring="wrong_choice"))
#结果:

ValueError: 'wrong_choice' is not a valid scoring value. Valid options are ['accuracy', 'adjusted_rand_score', 'average_precision', 'f1', 'f1_macro', 'f1_micro', 'f1_samples', 'f1_weighted', 'neg_log_loss', 'neg_mean_absolute_error', 'neg_mean_squared_error', 'neg_median_absolute_error', 'precision', 'precision_macro', 'precision_micro', 'precision_samples', 'precision_weighted', 'r2', 'recall', 'recall_macro', 'recall_micro', 'recall_samples', 'recall_weighted', 'roc_auc']

”scoring“的可用类型都存放在sklearn.metric.SCORES字典对象中

在交叉验证中海可以使用自定义scoring参数 ,具体讲解在http://www.studyai.com/course/play/9dd4fa59779d454991f55ac4c85889eb

 三、sklearn分类器评估指标总体概况

使用sklearn.metric包中的性能度量函数有:

  • 分类器性能指标
  • 回归器性能指标
  • 聚类其性能指标
  • 两两距离测度

分类器性能度量指标

总的来说,主要分为以下3类

  • 精度-召回率-F度量:Precision-Recall-F_measures
  • 损失函数:Loss Function
  • 接收机操作曲线:ROC Curves

只限于二分类单标签分类问题的评估指标

  • matthews_corrcoef(y_true,y_pred[],...):计算二元分类中的Matthews相关系数(MCC)
  • precision_recall_curve(y_true,probas_pred):在不同的概率阈值下计算precision-recall点,形成曲线
  • roc_curve(y_true,y_score[,pos_label,...]):计算ROC曲线

可用于二分类多标签分类问题的评估指标

  • average_precision_score(y_true,y_score[,...]) 计算预测得分的平均精度(mAP)
  • roc_auc_score(y_true,y_score[,average,...])计算预测得分的AUC值

可用于多分类问题的评估指标(紫色的可用于多标签分类问题)

  • cohen_kappa_score(y1,y2[,labels,weights])
  • confusion_matrix(y_true,y_pred[,labels,...])
  • hinge_loss(y_true,pred_decision[,labels,...])
  • accuracy_score(y_true,y_pred[,normalize,...])
  • classification_report(y_true,y_pred[,...])
  • f1_score(y_true,y_pres[,labels,...])
  • fbeta_score(y_true,,y_pres,beta[,labels,...])
  • hamming_loss(y_true,y_pres[,labels,...])
  • jaccard_similarity_score(y_true,y_pres[,...])
  • log_loss(y_true,y_pres[,eps,normalize,...])
  • zero_one_loss(y_true,y_pres[,normalize,...])
  • precision_recall_fsconfe_support(y_true,y_pres)

多分类性能评估指标

将二分类指标拓展到多分类或多标签问题中:

分类器性能评估指标:

  • 接收机操作曲线Reciever Operating Curves-》可用于二分类问题
  • 解卡德指数(相似性系数)Jaccard similarity coefficient-》可用于多分类问题
  • MCC指标(相关性系数)Matthews correlation coefficient-》可用于二分类问题

四、分类器评估标准

准确率:返回被正确分类的样本比例(default)或者数量(normalize=False)

#准确率
import numpy as np
from sklearn.metrics import accuracy_score
y_pred=[0,2,1,3]
y_true=[0,1,2,3]
print(accuracy_score(y_true,y_pred))
print(accuracy_score(y_true,y_pred,normalize=False))#0.5
#2

混淆矩阵

from sklearn.metrics import confusion_matrix
y_true=[2,0,2,2,0,1]
y_pred=[0,0,2,2,0,2]
print(confusion_matrix(y_true,y_pred))y_true=["cat","ant","cat","cat","ant","bird"]
y_pred=["ant","ant","cat","cat","ant","cat"]
print(confusion_matrix(y_true,y_pred,labels=["ant","cat","bird"]))#[[2 0 0][0 0 1][1 0 2]]
#[[2 0 0][1 2 0][0 1 0]]

二元分类问题:

#precision-recall-F-measures
from sklearn import metrics
y_pred=[0,1,0,0]
y_true=[0,1,0,1]
print(metrics.precision_score(y_true,y_pred))
#1.0
print(metrics.recall_score(y_true,y_pred))
#0.5
print(metrics.f1_score(y_true,y_pred))
#0.666666666667
print(metrics.fbeta_score(y_true,y_pred,beta=0.5))
#0.833333333333
print(metrics.fbeta_score(y_true,y_pred,beta=1))
#0.666666666667
print(metrics.fbeta_score(y_true,y_pred,beta=2))
#0.555555555556
print(metrics.precision_recall_fscore_support(y_true,y_pred,beta=0.5))
#(array([ 0.66666667,  1.        ]), array([ 1. ,  0.5]), array([ 0.71428571,  0.83333333]), array([2, 2], dtype=int32))
import numpy as np
from sklearn.metrics import precision_recall_curve
from sklearn.metrics import average_precision_score
y_true=np.array([0,0,1,1])
y_score=np.array([0.1,0.4,0.35,0.8])
precision,recall,threahold=precision_recall_curve(y_true,y_score)
print(precision)
#[ 0.66666667  0.5         1.          1.        ]
print(recall)
[ 1.   0.5  0.5  0. ]
print(threahold)
#[ 0.35  0.4   0.8 ]
print(average_precision_score(y_true,y_score))
#0.791666666667

多类别多标签分类问题

把其中的一类看成是正类,其他所有类看成是负类,每一类都可以看作是正类是都可以产生P,R,F,此时,可以按照5中方式来组合每一个类的结果,这5种方式是:macro,weighted,micro,samples,average=None

from sklearn import metrics
y_true=[0,1,2,0,1,2]
y_pred=[0,2,1,0,0,1]
print(metrics.precision_score(y_true,y_pred,average="macro"))
#0.222222222222
print(metrics.recall_score(y_true,y_pred,average="micro"))
#0.333333333333
print(metrics.f1_score(y_true,y_pred,average="weighted"))
#0.266666666667
print(metrics.fbeta_score(y_true,y_pred,average="macro",beta=0.5))
#0.238095238095
print(metrics.precision_recall_fscore_support(y_true,y_pred,beta=0.5,average="None"))
#(array([ 0.66666667, 0. , 0. ]), array([ 1., 0., 0.]), array([ 0.71428571, 0. , 0. ]), array([2, 2, 2], dtype=int32))
print(metrics.recall_score(y_true,y_pred,average="micro",labels=[1,2]))
#0.0

from sklearn.metrics import classification_report
y_true=[0,1,2,0,1,2]
y_pred=[0,2,1,0,0,1]
target_names=["class0","class1","class2"]
print(classification_report(y_true,y_pred,target_names=target_names))

结果为:

precision recall f1-score support

class0 0.67 1.00 0.80 2
class1 0.00 0.00 0.00 2
class2 0.00 0.00 0.00 2

avg / total 0.22 0.33 0.27 6

Roc曲线

更多ROC曲线内容:http://v.youku.com/v_show/id_XMjcyMzg0MzgwMA==.html?spm=a2h0k.8191407.0.0&from=s1.8-1-1.2

ROC曲线只需知道true positive rate(TPR)和false positive rate(FPR),TPR,FPR被看作是分类器的某个参数的函数。

TPR定义了在全部的正样本中,分类器找到了多少个真真的正样本

FPR定义了在全部的负样本中,分类器把多少负样本错误的分为正样本

sklearn 模型选择和评估相关推荐

  1. 西瓜书机器学习笔记(第二课):模型选择与评估

    模型选择与评估 经验误差与过拟合 经验误差vs泛化误差 本质上就是训练集上的误差vs"未来"样本上的误差: 经验误差并非越小越好,因为会出现过拟合 过拟合与欠拟合 通俗理解,欠拟合 ...

  2. 《统计学习方法》-李航、《机器学习-西瓜书》-周志华总结+Python代码连载(一)--模型选择+误差评估

    一.模型选择 1.1 模型 模型就是学习的条件概率分布或者决策函数(这里只指监督学习).条件概率的集合:,决策函数的集合:.条件概率表示的模型为概率模型,决策函数表示的模型为非概率模型. 1.2 模型 ...

  3. SKLEARN模型选择

    数据集划分方法 K折交叉验证法 将全部训练集S分成k个不相交的子集,假设S中的训练样例子数为m,那么每一个子集有m/k个训练样例,相应子集称作{s1,s2--sk} 每次从分好的子集里面,拿一个作为测 ...

  4. sklearn模型预测性能评估(二)

    1. 使用sklearn.metric包中的性能度量函数 1.1 分类器性能度量 精度-召回率-F度量 损失函数 接收机操作曲线 1.2 只限于二元单标签分类问题的评估指标 metrics.preci ...

  5. 机器学习-周志华-课后习题-模型选择与评估

    文中提到,在机器学习的过程中,过拟合总是无法彻底避免的.其中,关于P与NP的论述,个人理解为:对于一个有效的算法,它一定要在多项式时间内运行完成.此时,算法可以恰当程度地学习到所需要的知识,也就是说既 ...

  6. sklearn模型评选择与评估

    sklearn模型评选择与评估 1. 数据集划分 1.1 K折交叉验证 1.1.1 K折交叉验证算法原理 a. 将全部训练及S分成K个不相交的子集,假设S中样本个数为M,那么,每一个子集的训练样本个数 ...

  7. 第六课.模型评估与模型选择

    目录 导语 模型评估 回归任务的评估指标 分类任务的评估指标 过拟合现象 过拟合的原因 过拟合解决办法 模型选择与调整超参数 正则化 留出法 交叉验证 网格搜索 实验:线性回归预测股票走势 实验说明 ...

  8. Py之scikit-learn:机器学习sklearn库的简介、六大基本功能介绍(数据预处理/数据降维/模型选择/分类/回归/聚类)、安装、使用方法(实际问题中如何选择最合适的机器学习算法)之详细攻略

    Py之scikit-learn:机器学习sklearn库的简介(组件/版本迭代).六大基本功能介绍(数据预处理/数据降维/模型选择/分类/回归/聚类).安装.使用方法(实际问题中如何选择最合适的机器学 ...

  9. 【统计学习方法】模型评估与模型选择

    一.训练误差与测试误差 首先引入误差的概念,误差(error)是指:学习器的实际预测输出与样本的真实输出之间的差异.类似地,学习器在训练集上的误差被称之为训练误差(training error)或者经 ...

  10. R语言glmnet交叉验证选择(alpha、lambda)拟合最优elastic回归模型:弹性网络(elasticNet)模型选择最优的alpha值、模型最优的lambda值,最终模型的拟合与评估

    R语言glmnet交叉验证选择(alpha参数和lambda参数)拟合最优elastic回归模型:弹性网络(elasticNet)模型选择最优的alpha值.弹性网络(elasticNet)模型最优的 ...

最新文章

  1. hdu 1306(字符串匹配)
  2. Machine Learning | (9) 回归算法-线性回归
  3. 从入门到实践:创作一个自己的 Helm Chart
  4. Windows Nano Server安装配置详解03:远程管理Nano Server
  5. 2020牛客NOIP赛前集训营-提高组(第六场)A-袜子分配【组合数学,结论】
  6. Neo4j:Cypher –删除重复的节点
  7. iOS正则表达式(亲测,持续更新)
  8. android 伪造gps位置,在Android中使用GPS的假位置
  9. java window的对象方法,[Java教程]如何真正重写window对象的方法_星空网
  10. Activating Browser Modes with Doctype
  11. Mysql8.0安装+navicat for Mysql安装+navicat for Mysql。
  12. 如何修改PDF文档,怎么编辑PDF背景
  13. Spring Cloud微服务分布式云架构源码结构
  14. 微信小程序图片上传组件
  15. 当国际贸易撞上AI,会产生怎样的化学反应?
  16. 【Tensorflow教程笔记】使用 TPU 训练 TensorFlow 模型
  17. android 隐藏电池,Android8.1隐藏状态栏电池图标
  18. 三维可视化技术在智慧电厂中的作用
  19. java hibernate 详解_hibernate详解一
  20. Python 随机切换桌面背景图

热门文章

  1. 数据--第51课 - 二叉排序树
  2. iQOO5G手机卡槽公布
  3. Cesium 1.51新功能评测
  4. Frame buffer分析 - fbmem.c【转】
  5. Seaborn学习记录(1)
  6. 支持ie与FireFox的剪切板代码
  7. Oracle10g安装在RHEL AS 3
  8. CGI和BOA使用期间遇到的问题汇总(转)
  9. C# Conditional(方法,属性的忽略)使用
  10. 在Linux上显示某个进程的线程的几种方式