《机器学习算法竞赛实战》学习笔记2.问题建模

拿到赛题,应首先考虑问题建模,同时完成基线(baseline)模型的管道(pipeline)搭建,以第一时间获得结果上的反馈。竞赛中的问题建模主要可分为赛题理解、样本选择、线下评估策略三个部分。

问题建模
赛题理解
业务背景
数据理解
评价指标
分类指标
回归指标
样本选择
主要原因
准确方法
线下评估
强时序性问题
弱时序性问题

1.赛题理解

赛题理解是从直观上梳理问题,分析问题可解的方法、赛题背景、赛题的主要痛点

1.1数据理解

在问题建模阶段,只需对数据做基本的分析。可以将数据理解分为数据基础层和数据描述层两个部分。主办方提供的原始数据质量良莠不齐,往往需要对原始数据进行清洗、加工和计算等处理。

  • 数据基础层:重点关注每个数据字段的来源、生产过程、取数逻辑、计算逻辑等,了解这些才能正确理解、选取并使用每一个原始字段,从而加工计算得出所需的更多衍生字段,数据最终通常以数据表格形式呈现。
  • 数据描述层:主要是在处理好的数据基础层上进行统计分析和概括描述,该层重点在于尽可能地通过一些简单统计量(如均值、最值、分布、增幅、趋势等)来概括整体数据的状况。具体使用哪些统计量依据数据呈现的具体情况而定。例如,对于时间序列问题,可以统计其增幅、趋势和周期;对于常规的数值特征,则可以观察期均值、最值和方差等统计量;对于存在多类别的样本集合,则可以使用分布、分位点等进行描述

1.2评价指标

1.2.1分类指标

竞赛中常见的分类指标包括容错率、精度、准确率(precision/查准率)、召回率(recall/查全率)、F1-score、ROC曲线、AUC和对数损失(logloss)等

1.错误率(error rate)与精度(accuracy)

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

2 查准率/准确率(precision)、查全率/召回率(recall)

对于二分类问题,可将样例根据真实类别与学习器预测类别的组合划分为以下四种情形:真正例(true positive)、假正例(false positive)、真反例(true negative)、假反例(false negative)。四者之和为样例总数。

由定义可知:

  • 查准率P反映真实情况与预测结果都为正例的样例在预测结果为正例的样例中的占比
  • 查全率R反映真实情况与预测结果都为正例的样例在真实情况为正例的样例中的占比

注意:

  1. 查准率与查全率是一对矛盾的度量,一般来讲,查准率高时,查全率偏低;查全率高时,查准率偏低

P-R曲线
请添加图片描述
在很多情形下,我们可根据学习器的预测结果对样例依照“是正例的可能性”从高到低进行排序,由高开始逐个把样本作为正例进行预测,则每次可以计算出当前的查全率、查准率。以查准率为纵轴、查全率为横轴作图,得到查准率-查全率曲线,简称P-R曲线。P-R曲线直观地显示出了学习器在样本总体上的查全率、查准率。

通常比较曲线下方面积大小,越大表示学习器性能越好。

平衡点(Break-Even Point,简称BEP)是“查准率=查全率”时的取值,基于BEP值比较时,BEP越大表示性能越好。

3. F1度量

BEP过于简化,更常用的是F1度量:

请添加图片描述
在一些应用中,对查准率与查全率的重视程度不同,则有F1度量的一般形式Fβ,其定义为:请添加图片描述
我们希望在n个二分类混淆矩阵上综合考察查准率和查全率,有两种做法:

  • 宏:先在各混淆矩阵上分别计算出查准率和查全率,再计算平均值,得到“宏查准率”(macro-P)、“宏查全率”(macro-R)以及相应的“宏F1”(macro-F1)
  • 微:先将各混淆矩阵对应元素分别求平均值,再基于这些平均值计算出“微查准率”(micro-P)、“微查全率”(micro-R)以及相应的“微F1”(micro-F1)

构建一个计算准确率、召回率和F1-score的评价代码也很简单,具体实现代码如下:

#构建一个计算准确率、召回率和F1-score的评价代码
from sklearn.metrics import precision_score,recall_score,f1_score
precision = precision_score(y_train,y_pred) #准确率
recall = recall_score(y_train,y_pred) #召回率
f1 = f1_score(y_train,y_pred) #f1度量
4. ROC与AUC

很多学习器是为测试样本产生一个实值或概率预测,然后将该预测值与一个分类阈值(threshold)进行比较,大于阈值则分为正类,小于则分为反类。这个实值或概率预测结果的好坏直接决定了学习器的泛化能力。根据这个实值或概率预测结果,我们可将测试样本进行排序,“最可能”排在最前,这样,分类过程就相当于在这个排序中以某个“截断点”(cut point)将样本分为两部分,前一部分为正例,后一部分为反例。

不同的应用任务中可根据任务需求采用不同的截断点,若更重视“查准率”,可选择排序中靠前的位置进行截断;若更重视“查全率”,可选择排序中靠后的位置进行截断。

可见,排序本身的质量好坏,体现了综合考虑学习器在不同任务下的“期望泛化性能”的好坏,或者说,“一般情况下”泛化性能的好坏。ROC曲线则是从这个角度出发来研究学习器泛化性能的有力工具。
请添加图片描述
先根据学习器的预测结果对样例进行排序,按此顺序逐个把样例作为正例进行预测,每次计算出“真正例率”(True Positive Rate,简称TPR)和“假正例率”(False Positive Rate,简称FPR),分别以他们为纵、横轴作图,就得到了ROC曲线。TPR与FPR定义为:请添加图片描述可见:

  • 真正例率TPR反映真正例在实际情况为正例的样例中的占比
  • 假正例率FPR反映假正例在实际情况为反例的样例中的占比

现实任务中通常利用有限个测试样例绘制ROC图。
绘图过程:给定m+个正例和m-个反例,根据学习器预测结果对样例进行排序,然后把分类阈值设置为最大(即将所有样例预测为反例),此时TPR与FPR都为0,在坐标原点处标记一个点,然后将分类阈值依次设为每个样例的预测值,即依次将每个样例划分为正例,设前一个标记点坐标为(x,y),当前若为真正例,则对应标记点的坐标为(x,y+1/m+);当前若为假正例,则对应标记点的坐标为(x+1/m-,y),最后用线段连接相邻点。
补充:画P-R曲线其实也是这么操作的

较为合理的性能判据是比较ROC曲线下的面积,即AUC(Area Under ROC Curve)。AUC在互联网的搜索、推荐和广告的排序业务中都极为常见。AUC作为一个数值,其值越大就代表分类器的效果越好。
值得一提的还有AUC的排序特性。相对于准确率、召回率等指标,AUC指标本身和模型预测的概率绝对值无关,它只关注样本间的排序效果,因此特别适合用作排序相关问题建模的评价指标。AUC是一个概率值,我们随机挑选一个正样本与一个负样本,由当前分类算法根据计算出的分数将这个正样本排在负样本前面的概率就是AUC值。

思考:为什么AUC与模型预测的分数值无关是个很好的特性?
假设采用的是准确率等指标,而模型预测的分数是个概率值,那么必须选择一个阈值来决定把哪些样本预测为1,哪些预测为0。阈值的选择不同,准确率的值就会不同。而AUC可以直接使用模型预测分数本身,参考的是相对顺序。在竞赛中,省去了参赛者试探阈值的麻烦

5.对数损失

对数损失可用于评价分类器的概率输出。对数损失通过惩罚错误的分类来实现对分类器的准确度的量化。最小化对数损失基本等价于最大化分类器的准确度。为了计算对数损失,分类器必须提供概率结果,即把输入样本喂入模型后,预测得到每个类别的概率值(0~1),而不只是预测最可能的类别。
对数损失函数的函数标准形式:
请添加图片描述思考:AUC与对数损失的区别
对数损失主要评价模型预测的概率是否足够准确,更关注和观察数据的吻合程度;AUC评价的则是模型把正样本排列到前面的能力。
两者侧重不同,故应用不同。对于广告CTR问题,如果考虑广告排序效果,则可以选择AUC,这样不会受极端值影响。
此外,对数损失反映了评价偏差,更偏向于将样本数量多的那类划分准确。
由于使用AUC或对数损失可以避免把预测概率转换成类别的麻烦,在各种数据竞赛的分类问题中,AUC和对数损失基本是最常见的模型评价指标。

1.2.2回归指标

1.平均绝对误差MAE

平均绝对误差(Mean Absolute Error,MAE),又称L1范数损失
请添加图片描述

  • MAE不是二阶连续可微的,其二阶导数总为0
  • 量纲与数据标签不一致

思考:为什么在XGBoost里通常选择Huber损失替换MAE?
由于MAE不是连续可导的(0处不可导),所以需要使用可导目标函数来逼近平均绝对误差。而对于均方误差MSE,梯度又会随着损失的减小而减小,使预测结果更加精确。在这种情况下,Huber损失就非常有用,它会由于梯度的减小而落在最小值附近。比起均方误差MSE,Huber损失对异常点更加健壮。
因此,Huber损失结合了MAE和MSE的优点。但是Huber损失可能需要我们不断调整超参数delta。

2.均方误差MSE

均方误差(Mean Squared Error,MSE),又称L2范数损失
请添加图片描述

思考:平均绝对误差MAE与均方误差MSE的区别
均方误差对误差(真实值-预测值)取了平方,若误差>1,则均方误差会进一步增大误差。如果数据中存在异常点,那误差值就会很大,而误差的平方则会远大于误差的绝对值。因此,相对于使用平均绝对误差计算损失,使用均方误差的模型会赋予异常点更大的权重。
简而言之,均方误差对异常值更加敏感

3.均方根误差RMSE

均方根误差是对均方误差MSE进行开方,缩小了误差的数值
请添加图片描述

4.平均绝对百分比误差MAPE

MAPE与MAE一样,不存在二阶导数。但不用于MAE,平均绝对百分比误差MAPE除了考虑预测值与真实值的误差,还考虑了误差与真实值之间的比例请添加图片描述

  • 当有真实数据为0时,分母为0,该公式不可用

2.样本选择

主办方提供的数据往往令人脑壳疼,主要是以下四个原因:

  • 数据集过大严重影响了模型性能
  • 噪声和异常数据导致准确率不够
  • 样本数据冗余或不相关数据没有给模型带来收益
  • 正负样本分布不均衡导致数据存在倾斜

2.1主要原因

1.数据集过大

过大的数据集会严重影响各种特征工程和建模方式的快速验证。

  • 对数据进行采样处理,然后在小数据集上建模分析
  • 特定业务场景下,可以过滤一些对建模没有意义的数据

2.数据噪声

数据噪声主要有两种来源:

  1. 采集数据时操作不当导致信息表征出现错误
  2. 数据本身的特性存在合理范围内的抖动导致噪声与异常

数据噪声的存在具有两面性,噪声的存在会导致数据的质量变低,影响模型效果;另一方面,可以通过在训练集中引入噪声数据的方法使模型健壮性更强。
若噪声数据的来源为第一种,则需要对应地去看是否能够解码出正确数据。
当处理噪声数据时,首先考虑是否为采集错误导致的,再去权衡模型的泛化性和当前效果。有时去噪会导致模型泛化性能变差。
要去噪,首先要识别出噪声,然后采取直接过滤或者修改噪声数据等多种办法,噪声数据可能是特征值不对,比如特征值缺失、超出特征值域范围等;也可能是标注不对,比如二分类问题的正样本标注成了负样本。

3.数据冗余

数据中存在的冗余不仅会影响模型性能,更会引入噪声与异常。数据冗余的一个典型解决方案就是进行特征选择。

4.正负样本分布不均衡

进行数据采样

2.2 准确方法

问题1:在数据量非常大的情况下,为了降低成本,如何提高模型的训练速度

方法1:简单随机抽样
分为有放回与无放回
方法2:分层采样
按照规定的比例从不同类别中随机抽取样本的方法


问题2:如何通过数据采样解决这类问题

方法1:评分加权处理
分布不均衡的问题包括欺诈交易识别和垃圾邮件识别等,其正负样本的数据分布差距极大。考虑正负样本的重要性,在模型训练以及评价的时候可以设计相应的得分权重,使得模型能够学习到需要获得关注的部分。
此方法的具体操作步骤是:首先遍历所有样本,根据样本是否满足某个要求来给予其权重。
加权的直观含义从业务上理解就是认为一个正样本的价值大于多个负样本的,因此希望模型在训练的时候能够更多地从正样本身上学到关键信息,当它学得不好的时候,就要对它加大惩罚力度。
方法2:欠采样
从数量较多的一类样本中随机选取一部分并剔除,使得最终样本的目标类别不太失衡。常用方法有随机欠采样和Tomek Links,其中Tomek Links先是找出两个各相指标都非常接近的相反类样本,然后删除这类样本中标签(label)占比高的,这类算法能够为分类器提供一个非常好的决策边界。
方法3:过采样
主要是对样本较少的类别进行重新组合,构造新样本。常用的方法有随机过采样和SMOTE算法。SMOTE算法并不是简单地复制已有的数据,而是在原有数据的基础上通过算法产生新生数据。

欠采样过采样
高阶类别采样低阶类别复制

思考:在什么场景下需要处理样本的不均衡问题?

  • 如果竞赛任务对于召回有特别大的需求,即对每个正样本的预测都远远比负样本的预测更重要,那么这时候假如不做任何处理,对结果影响较大
  • 如果竞赛的评价指标是AUC,那么在实战中会发现这时处理样本不均衡问题与否对于结果的差别不太大。(但细微提升也是好的
  • 如果在竞赛任务中正负样本同等重要,即预测正确一个正样本与预测准确一个负样本是同等重要的,那么不做处理问题也不大

3.线下评估

由于需要数据集对模型的效果进行线下验证,所以需要考虑如何对数据进行划分,构建合适的线下验证集。针对不同类型的问题,需要不同的线下验证方式,书中将这些问题大致分为强时序性与弱时序性两类,然后以此确定线下验证方式。

3.1强时序性问题

对于含有明显时间序列因素的赛题,可看作强时序性问题,即线上数据的时间都在离线数据集之后。

  • 采用时间上最接近测试集的数据做验证集,且验证集的时间分布在训练集之后

3.2弱时序性问题

这类问题的验证方式主要为K折交叉验证(K-fold Cross Validation)

定义:先将总数据集D划分为k个大小相似的互斥子集,每个子集都尽可能保持数据分布的一致性(即从D中分层采样得到)。然后每次用K-1个子集的并集作为训练集,余下的自己作为测试集。这样可以获得K组训练/测试集,从而可进行k次训练和测试,最终返回这k个测试结果的均值。

注意:

  • 交叉验证法评估结果的稳定性和保真性很依赖K的取值,K通常取10,常用有5,20等
  • 给定k值,仍有多种划分方式。故通常要随机使用不同的划分重复p次,最终的评估结果是这p次k折交叉验证结果的均值,常见有10次10折交叉验证

特例:留一法(Leave-One-Out,简称LOO)
定义:假定数据集D中包含m个样本,令k=m
优点:评估结果准确
缺点:数据集较大时,训练模型的计算开销太大

以下为交叉验证代码,其中参数NFOLDS用来控制折数

from sklearn.model_selection import KFold
NFOLDS = 5 #五折交叉验证
folds = KFold (n_split = NFOLDS,Shuffle=True,random_state=2021)#random_state只要是一个固定的值就可以了,不一定是2021
for trn_idx,val_idx in folds.split(X_train,y_train):
	train_df,train_label = X_train.iloc[trn_idx, :],y_train[trn_idx]
	valid_df,valid_label = X_train.iloc[val_idx, :],y_train[val_idx]
  • 参数random_state 默认设置为None,这意为着每次进行 KFold(…, shuffle=True) 时,打散都是不同的。
  • 为了保证结果的可重复性(在相同的平台上),应该给 random_state 设定一个固定的值。

参考资料

  1. 《机器学习》周志华
  2. Sklearn 中文文档
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值