机器学习:模型性能评估

模型性能评估的常用指标

真阳性(True Positive,TP):指被分类器正确分类的正例数据

真阴性(True Negative,TN):指被分类器正确分类的负例数据

假阳性(False Positive,FP):被错误地标记为正例数据的负例数据

假阴性(False Negative,FN):被错误地标记为负例数据的正例数据

 

精确率=TP/(TP+FP),TP+FP是模型预测的正样本总数,精确率衡量的是准确性;

召回率=TP/(TP+FN),TP+FN是真实的正样本总数,召回率衡量的是覆盖率;

F1=(2*精确率*召回率)/(精确率+召回率),F1值是精确率和召回率的综合评估

 

ROC曲线是常用的二分类场景的模型评估算法曲线

曲线的横轴是FP值,纵轴是TP值

曲线越接近于左上角就说明模型的效果越好

ROC更多是通过曲线的光滑程度以及曲线的斜率来获取模型内的信息

AUC值表示ROC曲线与横轴围起来的面积

AUC值越大表示模型的效果越好,AUC介于0到1之间,通常大于0.5;若大于0.9则证明模型性能不错

 

使用k折交叉验证评估模型性能

1.   holdout交叉验证

方法:将原始数据随机分为训练集、验证集两部分,利用训练集训练分类器,然后利用验证集验证分类器性能

优点:处理简单,只需随机把原始数据分为两组即可

缺点:

1)验证集分类准确率对原始数据的划分方法是敏感的,模型及参数缺乏鲁棒性。

2)该方法只用了部分数据进行模型的训练,无法充分利用完整样本的数据,易出现欠拟合的情况。

 

2.   k-fold交叉验证

训练集被不重复地划分(均分)为k份,将每个子集分别做一次验证集,其余的K-1组子集作为训练集,由此得到K个模型,这K个模型的分类准确率的平均数作为此K-CV下分类器的性能指标。

优点

1)对数据划分方法的敏感性较低,同时模型性能的评估基于k个子模型性能的均值,这使得模型性能的评估具有较小的偏差,准确性较高。

2)K-fold CV的计算成本适中

缺点: K的选取是一个Bias和Variance的trade-off。

代码示例:

>>> from sklearn import datasets, linear_model

>>> from sklearn.model_selection import cross_val_score

>>> diabetes = datasets.load_diabetes()

>>> X = diabetes.data[:150]

>>> y = diabetes.target[:150]

>>> lasso = linear_model.Lasso()

>>> print(cross_val_score(lasso, X, y)) 

[ 0.33150734  0.08022311  0.03531764]

#cross_val_score(estimator, X, y=None, groups=None, scoring=None, cv=None, n_jobs=1, verbose=0, fit_params=None, pre_dispatch=‘2*n_jobs’)

#cv :取值为None时, 默认3折交叉验证;取值为integer时, 若模型为分类器且y为二值或多值变量时则选择StratifiedKFold,在其他情况下为Kfold交叉验证。

 

3.   留一交叉验证(sklearn.model_selection.LeaveOneOutLOO

留一交叉验证是K折交叉验证的一个特例,此时K等于数据集样本数N,即每次只有一个样本用于测试,其余的N-1个样本作为训练集,所以LOO-CV会得到N个模型,这N个模型最终的验证集的分类准确率的平均数作为此下LOO-CV分类器的性能指标.当数据集较小时,可用LOO-CV。

优点:

1)它不受数据划分方法的影响,因为每一个数据都单独的做过测试集

2)几乎用到了所有的数据,保证了模型的bias更小 

缺点:计算成本高,因为需要建立的模型数量与原始数据样本数量相同

 

Stratified k-fold(分层k折交叉验证)

在分层k折交叉验证中,训练集被分成k份,每一份的类别比例尽可能相等。举例:若预测结果只有0、1两类,那么每一份训练集中的预测结果为0和1的样本数是尽可能相等的。

代码实现:

>>>from sklearn.model_selection import StratifiedKFold

>>>import numpy as np

>>>X = np.array([[1, 2], [3, 4], [1, 2], [3, 4], [1, 2], [3, 4]])

>>>y = np.array([0, 1, 0, 1, 0, 1])

>>>skf = StratifiedKFold(n_splits=2,random_state=0)

>>>train,test=skf.split(X, y)

>>>print('train:',train)

>>>print('test:',test)

输出

train: (array([4, 5]), array([0, 1, 2, 3]))

test: (array([0, 1, 2, 3]), array([4, 5]))

#索引4、5对应的预测值分别为0、1(0、1各占比50%);

#索引0、1、2、3对应的预测值分别为0、1、0、1(0、1各占比50%)

转载于:https://www.cnblogs.com/albertsr/p/7422353.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值