机器学习--模型评价和选择(8)

一、基本概念

误差(误差期望):学习器的实际预测输出与样本真实输出之间的差异
经验误差(训练误差):学习器在训练集上的误差
泛化误差:学习器在新样本上的误差
过拟合(过配):学习器学习能力过强,将训练集中自身的特点当做所有潜在样本都会由的一般性质,这会导致泛化能力下降。 无法避免,只能缓解
欠拟合(欠配):学习器对训练样本的一般性质没有学好

二、训练流程

2.1 获取测试集

测试集应该尽量与训练集互斥

当我们只有一个包含m条记录的训练集,需要对训练集进行拆分,拆分方法如下:

留出法:

① 原理: 即将训练集划分为测试集和训练集。

② 划分原则:
训练\测试集要保持均衡(和原数据集中各部分比例尽可能一致)
按比例 一般为 37 28 19

③ 注意:
使用单次留出法估计结果不太可靠,需要我们采用若干次随机划分、重复进行实验评估后采取所有结果的均值作为最终的评估结果

④ 局限:
若划分后的训练集包含大多数数据,那么训练出来的模型更接近用原数据训练出来的模型,此时测试集中数据较少,评估结果不准确;若令划分后的测试集中包含较多的数据,那么划分后训练集训练出的模型和原数据训练出的模型差距较大,从而会降低评估结果的保真性。
此问题无好的解决办法,只能选取合适的比例。

⑤ 适用范围: 数据量足够

∙ \bullet 交叉验证法:(k折交叉验证)

① 原理:
将数据集D 划分为k个子集,每个子集通过分层采样得到(为了保持数据分布的一致性),然后用k-1个子集的并集作为训练集,余下的一个子集为测试集,这样可以重复进行k次训练和测试,最后结果为这k次实验的均值。

② 注意:

评估结果的稳定性和保真性取决与k的值

同留出法一样,需要重复进行p次划分,将这p次的实验结果的均值作为最终的结果

③ 特例:留一法

数据集D有m个样本,划分为m个子集,即为留一法。

留一法训练出来的模型与D训练出来的模型及其相似,因此留一法评估结果相对准确

缺陷:
未考虑调参情况下,留一法也难以应对海量数据带来的开销,计算复杂度高
根据“没有免费午餐”定理,留一法的结果也未必永远比其他方法准确

④ 适用范围: 数据量足够大

from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import GridSearchCV

∙ \bullet 自助法:

① 原理:
它以自助采样法为基础(有放回采样),对于有m个记录的数据集D,对它采样才生数据集D’,:
每次从D中随机取出一个样本,拷贝后放入D’,再将取出的样本放回D,重复m次上述过程,得到包含m个样本的数据集D’。
D中的记录有的多次出现再D’中,有的没有出现。D中样本在D’中不出现的概率为在这里插入图片描述
我们用D’作为训练集,用D\D’ 作为测试集

② 适用范围:

数据量较小,且难以有效划分训练\测试集

③:优缺点

能产生多个不同的测试集,对集成学习有帮助
改变了原始数据集的分布,会产生估计偏差

2.2 调参

参数往往是在实数范围内取值,故将所有可能的参数都训练出来模型不太现实。我们往往对每个参数选取一定的范围和步长,这是折合了性能估计和计算开销的选择

三、性能度量

3.1 错误率与精度

分类任务最常用的两种度量方式,既适用于二分类任务,也适用于多分类任务。

错误率:分类错误的样本数占总样本数的比例
精度:1-错误率

3.2 查准率与查全率与F1度量

混淆矩阵:

预测值为正例,记为P(Positive)
预测值为反例,记为N(Negative)
预测值与真实值相同,记为T(True)
预测值与真实值相反,记为F(False)

在这里插入图片描述

TP真阳性 :预测类别是P(正例),真实类别也是P
FP假阳性 :预测类别是P,真实类别是N(反例)
TN真阴性 :预测类别是N,真实类别也是N
FN假阴性 :预测类别是N,真实类别是P

将样例根据真实类别与学习器预测类别的组合划分为真正例TP、假正例FP、假反例FN、正反例TN。他们的和为样例总数。

查准率P和查全率R为:
在这里插入图片描述

P-R曲线: 查准率为纵轴,查全率为横轴

若一个学习器的PR曲线被另一个学习器的曲线完全包住,那么我们说后者的性能优于前者;若两者PR曲线交叉,我们通常采用两者曲线的交点,即平衡点(BEP,查准率=查全率的取值)来衡量两者的性能优劣

F1: 两者性能优劣更常用的度量方式

F1的一般形式–Fβ:
在这里插入图片描述
β>0,度量了查全率对查准率的相对重要性;β=1,退化为标准的F1度量;β>1,查全率有更大影响;β<1,查准率有更大影响

3.3 ROC和AUC

ROC曲线: 横轴为假正例率(FPR),纵轴为真正例率(TPR)

在这里插入图片描述
进行学习器比较时,若一个学习器的ROC曲线被另一个学习器完全包住,那么后者性能优于前者,若发生交叉,那么我们一般采用ROC曲线下的面积,即AUC

3.4 代价敏感错误率和代价曲线

为权衡不同类型错误所造成的不同损失,可为错误赋予“非均等代价”

四、练习

用ROC评价模型,绘制混淆矩阵

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

# 导入波士顿房价数据集
from sklearn.datasets import load_boston

# 返回样例集合和标签集合
X,y = load_boston(return_X_y=True)

# # 查看房价中位数和最大值
median = np.median(y)
max = np.max(y)

# 将y二值化
y = pd.Series(y).map(lambda x:(x>median)*1)

# 拆分数据集
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=1,train_size=0.8)

# 生成模型并训练
from sklearn.linear_model import LogisticRegression
from sklearn.naive_bayes import GaussianNB
lr = LogisticRegression()
gnb = GaussianNB()
lr.fit(X_train,y_train)
gnb.fit(X_train,y_train)

# 预测
lr_y_ = lr.predict(X_test)
gnb_y_ = gnb.predict(X_test)

from sklearn.metrics import confusion_matrix

# 绘制混淆矩阵   
def paint_cm(y_true,y_pred):
    tn, fp, fn, tp = confusion_matrix(y_true,y_pred).ravel()
    cm = confusion_matrix(y_true,y_pred)
    sns.set_style('white')
    plt.imshow(cm,cmap=plt.cm.rainbow)
    plt.xticks([0,1])
    plt.yticks([0,1])
    plt.text(x=0-0.1,y=0,s='TP:%d'%tp)
    plt.text(x=0-0.1,y=1,s='FN:%d'%fn)
    plt.text(x=1-0.1,y=0,s='FP:%d'%fp)
    plt.text(x=1-0.1,y=1,s='TN:%d'%tn)
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.title("混淆矩阵")

# 封装评价函数
def select_model(y_true,y_pred,score):
    tn, fp, fn, tp = confusion_matrix(y_true,y_pred).ravel()
    # 查准率 P
    P = tp/(tp+fp)
    # 查全率 R
    R = tp/(tp+fn)
    # F1
    from sklearn.metrics import f1_score,roc_curve,roc_auc_score
    F1 = f1_score(y_true,y_pred)
    # ROC曲线
    fpr,tpr,thresholds = roc_curve(y_test,score,pos_label=1)
    plt.plot(fpr,tpr,color='green')
    plt.xlabel('FPR')
    plt.ylabel('TPR')
    plt.plot(np.linspace(0,1,10),np.linspace(0,1,10),ls='--')
    plt.legend()
    plt.show()
    
    return P,R,F1

score1 = lr.predict_proba(X_test)[:,1]
score2 = gnb.predict_proba(X_test)[:,1]

P,R,F1 = select_model(y_test,lr_y_,score1)

在这里插入图片描述

在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值