一,scikit-learn中常用的评估模型

1.评估分类模型:

2.评估回归模型:

二、常见模型评估解析:

•对于二分类问题,可将样例根据其真实类别和分类器预测类别划分为:(T,F表示预测的正确与错误性,P,N表示预测的正类和负类)

•真正例(TruePositive,TP):真实类别为正例,预测类别为正例。

•假正例(FalsePositive,FP):真实类别为负例,预测类别为正例。

•假负例(FalseNegative,FN):真实类别为正例,预测类别为负例。

•真负例(TrueNegative,TN):真实类别为负例,预测类别为负例。

•构建混淆矩阵(ConfusionMatrix):

•识别精确度(accuracy)

•Accuracy=(TP+FN)/(TP+TN+FP+FN)×100%

•准确率(precision):

•召回率(recall):

•F1值:精确度和召回率的调和平均值

•precision 和 recall 都是越高越好。精确度和召回率都高时,F1 值也会高. F1 值在1时达到最佳值(完美的精确度和召回率),最差为0.在二元分类中,F1 是测试准确度的量度。

classification_report 的主要参数:

主要参数:
y_true:1维数组,或标签指示器数组/稀疏矩阵,目标值。
y_pred:1维数组,或标签指示器数组/稀疏矩阵,分类器返回的估计值。
labels:array,shape = [n_labels],报表中包含的标签索引的可选列表。
target_names:字符串列表,与标签匹配的可选显示名称(相同顺序)。
sample_weight:类似于shape = [n_samples]的数组,可选项,样本权重。
digits:int,输出浮点值的位数.

from sklearn.metrics import classification_report
y_true = [0,1,2,2,1,0]
y_pred = [0,2,0,2,1,0] target_names= ['class0','class1','class2']
reports = classification_report(y_true, y_pred, target_names=target_names) #生成分类的指标的文本报告
print(reports)
#输出结果
# precision recall f1-score support
#
# class0 0.67 1.00 0.80 2    #support为真实label出现的次数
# class1 1.00 0.50 0.67 2
# class2 0.50 0.50 0.50 2
#
# avg / total 0.72 0.67 0.66 6

真实值 预测值
0 0
1 2
2 0
2 2
1 1
0 0

先计算label 0:即reports的class0

计算precision准确率时,只看分类标签是 0 的预测值,如图有 3 个,再看其预测成功的个数 ,有2个,所以准确率为 0.67
计算recall召回率时:只看分类标签是0 的真实值,如图有2 个,再看其预测成功的个数, 有2 个,所以召回率为 1

结合p 和 r 计算 F1值

同理:计算label 1 和label 2

1).回归模型评估:

•1.均方根误差(RootMean Squared Error,RMSE)

RMSE是一个衡量回归模型误差率的常用公式。然而,它仅能比较误差是相同单位的模型

•由于对误差E 进行平方,加强了数值大的误差在指标中的作用,从而提高了指标的灵敏性。

•2.平均绝对误差(Mean Absolute Error,MAE)

•3.平均绝对百分误差(MeanAbsolute Percentage Error)

•一般认为MAPE小于10时,预测精度高。

•2)分类模型评估:

ROC-AUC曲线

•AUC值为ROC曲线所覆盖的区域面积,显然,AUC越大,分类器分类效果越好。

•AUC的物理意义

•假设分类器的输出是样本属于正类的score(置信度),则AUC的物理意义为,任取一对(正、负)样本,正样本的score大于负样本的score的概率。

1.ROC曲线:接受者操作特征(receiveroperating characteristic)曲线代表每个点反映着对同一个信号刺激的感受性。ROC曲线和AUC常被用来评价一个二值分类器(binaryclassifier)的优劣。

•横轴FPR越大,代表预测正类中实际负类越多

•纵轴TPR越大,代表预测正类中实际正类也越多

•因此,曲线越靠近(0,1)点,越往对角线45度左上角偏,分类效果越好。

如何绘制ROC 曲线

当我们将threshold设置为1和0时,分别可以得到ROC曲线上的(0,0)和(1,1)两个点。将这些(FPR,TPR)对连接起来,就得到了ROC曲线。当threshold取值越多,ROC曲线越平滑。

其实,我们并不一定要得到每个测试样本是正样本的概率值,只要得到这个分类器对该测试样本的“评分值”即可(评分值并不一定在(0,1)区间)。评分越高,表示分类器越肯定地认为这个测试样本是正样本,而且同时使用各个评分值作为threshold。将评分值转化为概率更易于理解一些。

2.AUC(Areaunder roc curve)在ROC曲线下的面积,度量分类模型的好坏。

•由于ROC曲线一般都处于y=x这条直线的上方,所以AUC的取值范围在0.5和1之间。使用AUC值作为评价标准是因为很多时候ROC曲线并不能清晰的说明哪个分类器的效果更好,而作为一个数值,对应AUC更大的分类器效果更好。

•首先AUC值是一个概率值,当你随机挑选一个正样本以及一个负样本,当前的分类算法根据计算得到的Score值将这个正样本排在负样本前面的概率就是AUC值。当然,AUC值越大,当前的分类算法越有可能将正样本排在负样本前面,即能够更好的分类。

•判定AUC 曲线的优劣:

•.90-1= very good (A)

•.80-.90= good (B)

•.70-.80= not so good (C)

•.60-.70= poor (D)

•.50-.60= fail (F)

•3.精度-召回率曲线PRC(precisionrecall  curve):与ROC曲线不同的是:PRC曲线是往右上角靠拢效果较好。

•适用场景:

1. 地震的预测
对于地震的预测,我们希望的是RECALL非常高,也就是说每次地震我们都希望预测出来。这个时候我们可以牺牲PRECISION。情愿发出1000次警报,把10次地震都预测正确了;也不要预测100次对了8次漏了两次。
2. 嫌疑人定罪
基于不错怪一个好人的原则,对于嫌疑人的定罪我们希望是非常准确的。及时有时候放过了一些罪犯(recall低),但也是值得的。

•4.如何避免过拟合:

•过拟合表现为在训练数据上的误差非常小,而在测试数据集上的误差反而增大。其中原因一般是模型过于复杂,过分去拟合数据的噪声和离群点,导致模型的泛化能力差,鲁棒性差。

•常见的解决办法:增大数据集,对模型进行正则化。

•5.交叉验证:

•K-Folds交叉验证:K层交叉验证是将原始数据随机分为K 个部分,在K 个部分中,选择1 个作为测试集,K-1 个作为训练集。将实验重复K 次,每次实验都从K 个部分选择1 个不同的作为测试集,最后对得到的K 个实验结果取平均。

#coding=gbk
'''
Created on 2018年7月10日 @author: Administrator
''' #交叉验证 #1.留出法:直接将原始的数据集变换成2类互斥的两类,一部分为训练集,另一部分为验证集、
#在sklearn中使用 train_test_split函数
from sklearn.model_selection import train_test_split
import numpy as np
from sklearn import svm #支持向量机
from sklearn import datasets iris = datasets.load_iris() #加载鸢尾花数据集
print(iris.data.shape, iris.target.shape) #(150, 4) (150,) x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target,
test_size = 0.2, random_state=666)
#test_size 表示测试集所占的比例 print(x_train.shape, x_test.shape) #(120, 4) (30, 4)
print(y_train.shape, y_test.shape) #(120,) (30,) svm_clf = svm.SVC(kernel='linear', C= 1).fit(x_train, y_train)
print(svm_clf.score(x_test, y_test)) # 1.0 百分之百的预测成功率 #2.交叉验证方法
from sklearn.model_selection import KFold
import numpy as np
x = np.array([[1,2],[3,4],[5,6],[7,8]])
y = np.array([1,2,3,4]) kf = KFold(n_splits=2,random_state=666) #n_splits 是指将数据输出多少份
for train_index, test_index in kf.split(x):
print('train_index:', train_index, 'test_index:',test_index)
# train_index: [2 3] test_index: [0 1]
# train_index: [0 1] test_index: [2 3] #当n_splits = 3 时,输出如下:
# train_index: [2 3] test_index: [0 1]
# train_index: [0 1 3] test_index: [2]
# train_index: [0 1 2] test_index: [3] x_train, y_train = x[train_index],y[train_index]
x_test , y_test = x[test_index], y[test_index]
print(x_train,' ',y_train)
print(x_test,' ',y_test) #2.2 RepeatedKFold p次k折交叉验证,RepeatedKFold方法可以控制交叉验证的次数。n_repeats
from sklearn.model_selection import RepeatedKFold
x1 = np.array([[1,2],[3,4],[5,6],[7,8]])
y1 = np.array([1,2,3,4]) rk = RepeatedKFold(n_splits=2, n_repeats=2, random_state=666)
for train_index, test_index in rk.split(x1):
print('train_index:',train_index,'test_index:', test_index)
# train_index: [0 2] test_index: [1 3]
# train_index: [1 3] test_index: [0 2]
# train_index: [2 3] test_index: [0 1]
# train_index: [0 1] test_index: [2 3] #3 留一法 LeaveOneOut
print('-----LeaveOneOut------')
from sklearn.model_selection import LeaveOneOut x2 = np.array([1,2,3,4,5]) loo = LeaveOneOut()
for train_index, test_index in loo.split(x2):
print('train_index:',train_index, 'test_index:', test_index)
# train_index: [1 2 3 4] test_index: [0]
# train_index: [0 2 3 4] test_index: [1]
# train_index: [0 1 3 4] test_index: [2]
# train_index: [0 1 2 4] test_index: [3]
# train_index: [0 1 2 3] test_index: [4] #3.2 LeavePOut 留p法
#基本原理和留一法是一样的
from sklearn.model_selection import LeavePOut lpo = LeavePOut(p=2)
for train_index, test_index in lpo.split(x2):
print('train_index:',train_index, 'test_index:',test_index)
# train_index: [2 3 4] test_index: [0 1]
# train_index: [1 3 4] test_index: [0 2]
# train_index: [1 2 4] test_index: [0 3] 有10中取法
# train_index: [1 2 3] test_index: [0 4]
# train_index: [0 3 4] test_index: [1 2]
# train_index: [0 2 4] test_index: [1 3]
# train_index: [0 2 3] test_index: [1 4]
# train_index: [0 1 4] test_index: [2 3]
# train_index: [0 1 3] test_index: [2 4]
# train_index: [0 1 2] test_index: [3 4] #4.shuffleSplit 随机分配, 可以随机把数据打乱,然后分为训练集和测试集
print('------shufflesplit------') from sklearn.model_selection import ShuffleSplit
ss = ShuffleSplit(n_splits=4, random_state = 666, test_size=0.4)
for train_index, test_index in ss.split(x2):
print('train_index:',train_index,'test_index:',test_index)
# train_index: [1 2 4] test_index: [3 0]
# train_index: [0 2 1] test_index: [3 4]
# train_index: [0 2 3] test_index: [4 1]
# train_index: [1 2 4] test_index: [0 3]

参考:柚子皮blog

scikit-learn 中常用的评估模型的更多相关文章

  1. (原创)(三)机器学习笔记之Scikit Learn的线性回归模型初探

    一.Scikit Learn中使用estimator三部曲 1. 构造estimator 2. 训练模型:fit 3. 利用模型进行预测:predict 二.模型评价 模型训练好后,度量模型拟合效果的 ...

  2. (原创)(四)机器学习笔记之Scikit Learn的Logistic回归初探

    目录 5.3 使用LogisticRegressionCV进行正则化的 Logistic Regression 参数调优 一.Scikit Learn中有关logistics回归函数的介绍 1. 交叉 ...

  3. Scikit Learn: 在python中机器学习

    转自:http://my.oschina.net/u/175377/blog/84420#OSC_h2_23 Scikit Learn: 在python中机器学习 Warning 警告:有些没能理解的 ...

  4. BOM模型中常用对象 定义计数器 网页跳转 网页前进后退

    今天上午学了的BOM模型中常用对象,了解了一部分的属性 For循环的规律 外层循环控制行 内层循环控制列 <!doctype html> <html> <head> ...

  5. 在excel中评估模型性能

    一直在用的结果, 从代码中整理出来. 评分卡模型的结果一般在excel中即可计算完成. 下面是在number中计算评分卡模型的性能(KS/AUC), 表格中百分数省略%

  6. 如何在R语言中使用Logistic回归模型

    在日常学习或工作中经常会使用线性回归模型对某一事物进行预测,例如预测房价.身高.GDP.学生成绩等,发现这些被预测的变量都属于连续型变量.然而有些情况下,被预测变量可能是二元变量,即成功或失败.流失或 ...

  7. ACM 中常用的算法有哪些? 2014-08-21 21:15 40人阅读 评论(0) 收藏

    ACM 中常用的算法有哪些?作者: 张俊Michael 网络上流传的答案有很多,估计提问者也曾经去网上搜过.所以根据自己微薄的经验提点看法. 我ACM初期是训练编码能力,以水题为主(就是没有任何算法, ...

  8. scikit learn 模块 调参 pipeline+girdsearch 数据举例:文档分类 (python代码)

    scikit learn 模块 调参 pipeline+girdsearch 数据举例:文档分类数据集 fetch_20newsgroups #-*- coding: UTF-8 -*- import ...

  9. ACM 中常用的算法有哪些?

    在网上看到别人ACM学习的心得,转载过来,源地址不记得了,当时是百度的.内容如下: 网络上流传的答案有很多,估计提问者也曾经去网上搜过.所以根据自己微薄的经验提点看法. 我ACM初期是训练编码能力,以 ...

随机推荐

  1. Linux内核中断处理体系分析

    前一篇博文中:linux内核初始化阶段通过early_trap_init()函数完毕了把异常向量复制到0xFFFF0000開始的地方,这些异常向量大部分指向通过vector_stub宏定义的那段代码. ...

  2. android素材资源

    这里先给大家 推荐两个 找图标的 搜索引擎    http://findicons.com/ 这个我也在用 大家也可以试试 找个图标还是很easy的.   http://www.iconfinder. ...

  3. shell基础(七)-条件语句

    条件语句在编写脚本经常遇到:用于处理逻辑问题. 一 IF 语句 if 语句通过关系运算符判断表达式的真假来决定执行哪个分支.Shell 有三种 if ... else 语句: if ... fi 语句 ...

  4. NGUI屏幕自适应(转)

      屏幕自适应 NGUI可以比较方便的实现屏幕自适应,但是它的官方教程里面针对这个问题没有详细的教程,所以可能在实现的时候会走比较多的弯路.以下是我在开发过程中找到的一个比较方便的实现方法. 主要组件 ...

  5. 使用area标签实现标签的嵌套

    在项目中我们会碰到这种需求:即点击这个整个a标签跳转到一个页面,点击a里面的某个a再跳转到另一个页面.有人会说,这还不简单,直接a标签嵌套a标签,可是事实如此吗,看代码: <a href=&qu ...

  6. 【Mysql】大数据处理优化方法

    1.应尽量避免在 where 子句中使用 != 或  <>  操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 orde ...

  7. 学习Ruby你需要了解的相关知识(rvm, gem, bundle, rake, rails等)

    这篇文章主要介绍了学习Ruby你需要了解的相关知识(rvm, gem, bundle, rake, rails等),需要的朋友可以参考下     Ruby 这个就不用多说了 RVM 用于帮你安装Rub ...

  8. C# 生成PDF并下载。

    例子是生成一个pdf格式的证书: 需要引用itextsharp.dll //创建Document Document document = null; //为该Document创建一个Writer实例 ...

  9. HUB、SPAN、TAP比较

    在获取数据包进行网络分析时,常用的方法有三种:HUB.SPAN和TAP. 一 HUB    HUB 很“弱智”,但这种方法却是最早的数据包获取方法.HUB是半双工的以太网设备,在广播数据包时,无法同时 ...

  10. [SQL]批量 更改字符集脚本,批量查询约束,批量查询索引

    How to change collation of all database objects in SQL Server. Have you encountered a problem where ...