目录
问题建模主要可以分为赛题理解、样本选择、线下评估策略三个部分.
1. 赛题理解
赛题理解其实是从直观上梳理问题,分析问题可解的方法、赛题背景、赛题的主要痛点。
理清⼀道赛题要从赛题背景引发的赛题任务出发,理解其中的业务逻辑以及可能对赛题有意义的外在数据有哪些,并对于赛题数据有⼀个初步的了解,如知道现在和任务相关的数据有哪些,其中数据之间的关联逻辑是什么样的。
通常,赛题任务会给出赛题背景、赛题数据和评价指标。赛题理解的这⼀部分工作会成为竞赛的重要组成部分和先决条件,通过对赛题的理解,对真实业务的分析,我们可以用自身的先验知识进行初步分析,很好地为接下来的部分做出铺垫。
1.1 业务背景
将业务背景与竞赛目标结合起来看
1.2 数据理解
将数据理解分为两个部分,分别是数据基础层和数据描述层。
- 数据基础层。各种竞赛主办方提供的原始数据质量良莠不齐,数据形态如数据类型、存储格式等也是多种多样。为了进⼀步分析和建模,往往需要对原始数据进行清洗、加工和计算等处理。数据基础层重点关注的是每个数据字段的来源、生产过程、取数逻辑、计算逻辑等,了解了这些才能正确地理解、选取并使用每⼀个原始字段,从而加工计算得出所需的更多衍生字段,数据最终的呈现方式通常是数据表格。
- 数据描述层。数据描述层主要是在处理好的数据基础层上进行统计分析和概括描述,这个层面的重点在于尽可能地通过⼀些简单统计量(如均值、最值、分布、增幅、趋势等)来概括整体数据的状况,也使得参赛者能够清晰地知晓数据的基本情况。然而具体使用哪些统计量,并没有统⼀的标准,这要根据数据呈现的具体场景而定。比如,对于时间序列问题,可以统计其增幅、趋势和周期;对于常规的数值特征,则可以观察其均值、最值和方差等统计量;对于存在多类别的样本集合,则可以使用分布、分位点等进行描述。
1.3 评价指标
1.3.1 分类指标
-
错误率与精度
在分类问题中,错误率是分类结果错误的样本数占样本总数的比例,精度则是分类结果正确的样本数占样本总数的比例。即有:错误率 = 1 – 精度。 -
准确率与召回率
准确率又称为查准率(Precision),召回率又称查全率(Recall)。- 准确率:指被分类器判定为正类的样本中真正的正类样本所占的比重,即被分类器判为正类的所有样本中有多少是真正的正类样本,其公式定义为 P = T P T P + F P P = \frac{TP}{TP + FP} P=TP+FPTP由此易知,如果只做⼀个单独的正样本预测,并且预测类别正确,则通过此公式可得到 100% 的准确率。但这没有什么意义,这会使得分类器忽略除正样本之外的数据,因此还需考虑另⼀个指标,即召回率 R。
- 召回率:指被分类器正确判定的正类样本占总的正类样本的比重,即所有正类样本中有多少被分类器判为正类样本,定义如式
R
=
T
P
T
P
+
F
N
R = \frac{TP}{TP + FN}
R=TP+FNTP
准确率和召回率反映了分类器性能的两个方面,单依靠其中⼀个并不能较为全面地评价⼀个分类器的性能。⼀般来说,鱼与熊掌不可兼得,你的准确率越高,召回率越低;反之,召回率越高,准确率越低。继而为了平衡准确率和召回率的影响,较为全面地评价⼀个分类器,便有了 F1-score 这个综合了这两者的指标。
混淆矩阵:以简单二分类问题为例,有如下混淆矩阵
- True Positive(TP):预测类别为 1,真实类别为 1,预测正确。
- False Positive(FP):预测类别为 1,真实类别为 0,预测错误。
- True Negative(TN):预测类别为 0,真实类别为 0,预测正确。
- False Negative(FN):预测类别为 0,真实类别为 1,预测错误。
-
F1-Score
很多机器学习分类问题都希望准确率和召回率能同时都高,所以可以考虑使用调和平均公式,以均衡这两个指标,从而避免在使用算术平均时,由于其中⼀个较高,另⼀个较低,出现均值虚高的现象。F1-score 就能起到这样⼀个作用,其定义如式 F1-Score = 2 × P × R P + R \text{F1-Score} = 2 \times \frac{P \times R}{ P + R} F1-Score=2×P+RP×R其最大值是 1,最小值是 0。 -
ROC 曲线
常用于度量分类中的非均衡性的工具,即 ROC 曲线(接受者操作特征曲线)。Q:已经有了这么多评价指标,那么为什么还要使⽤ ROC 曲线呢?
A:在实际的数据集中,经常会出现正负样本不均衡的现象,即负样本比例正样本多很多(或者相反),而且测试集中正负样本的分布也可能随着时间发生变化。ROC 曲线有⼀个很好的特质,那就是在这种情况下,它依然能够保持不变。 -
AUC 值
它定义为 ROC 曲线下的面积,因为 ROC 曲线⼀般都处于这条直线的上方,所以取值范围在 0.5 和 1 之间。之所以使用 AUC 作为评价指标,是因为 ROC 曲线在很多时候并不能清晰地说明哪个分类器的效果更好,而 AUC 作为⼀个数值,其值越大就代表分类器的效果越好。值得⼀提的是 AUC 的排序特性。相对于准确率、召回率等指标,AUC 指标本身和模型预测的概率绝对值无关,它只关注样本间的排序效果,因此特别适合用作排序相关问题建模的评价指标。
AUC 是⼀个概率值,随机挑选⼀个正样本和⼀个负样本,由当前的分类算法根据计算出的分数将这个正样本排在负样本前面的概率就是 AUC 值。所以,AUC 值越大,当前的分类算法就越有可能将正样本排在负样本值前面,即能够更好地分类。
Q:既然 AUC 与模型预测的分数值无关,那这为何是很好的特性?
A:假设你采用的是准确率、F1-score 等指标,而模型预测的分数是个概率值,那么就必须选择⼀个阈值来决定把哪些样本预测为 1,哪些预测为 0。阈值的选择不同,准确率、召回率与 F1-score 的值就会不同,而 AUC 可以直接使用模型预测分数本身,参考的是相对顺序,更加好用。在竞赛任务中,参赛者更是省去了试探阈值的麻烦。 -
对数损失
该指标可用于评价分类器的概率输出。对数损失通过惩罚错误的分类来实现对分类器的准确度的量化。最小化对数损失基本等价于最大化分类器的准确度。为了计算对数损失,分类器必须提供概率结果,即把输⼊样本喂入模型后,预测得到每个类别的概率值(0 和 1 之间),而不只是预测最可能的类别。对数损失函数的函数标准形式: l o g l o s s = − l o g ( Y ∣ X ) logloss = - log(Y | X) logloss=−log(Y∣X)对于样本点 ( x , y ) (x,y) (x,y) 来说, y y y 是真实标签,在⼆分类问题中,其取值只可能为 0 或 1。假设某个样本点的真实标签为 y i y_i yi,该样本点取 y i = 1 y_i=1 yi=1 的概率为 y p y_p yp,则该样本点的损失函数如式: l o g l o s s = − 1 N ∑ i = 1 ( y i l o g p i + ( 1 − y i ) l o g ( 1 − p i ) ) logloss = -\frac{1}{N} \sum_{i=1}(y_i logp_i + (1 - y_i)log(1 - p_i)) logloss=−N1i=1∑(yilogpi+(1−yi)log(1−pi))Q:AUC 同样是只需要给出模型预测的概率值,就能计算并衡量模型效果,那么对数损失与它的区别在哪⾥呢?
A:对数损失主要是评价模型预测的概率是否足够准确,它更关注和观察数据的吻合程度,而 AUC 评价的则是模型把正样本排到前面的能⼒。由于两个指标评价的侧重点不⼀样,因此参赛者考虑的问题不同,所选择的评价指标就会不同。对于广告 CTR 预估问题,如果考虑广告排序效果,就可以选择 AUC,这样也不会受到极端值的影响。此外,对数损失反映了平均偏差,更偏向于将样本数量多的那类划分准确。Q:在各种数据竞赛的分类问题中,AUC 和对数损失基本是最常见的模型评价指标。通常来说,AUC 和对数损失比错误率、精度、准确率、召回率、F1-score 更常用,这是为什么呢?
A:因为很多机器学习模型对分类问题的预测结果都是概率值,如果要计算上述这些指标,就需要先把概率转化成类别,这需要人为设置⼀个阈值,如果对⼀个样本的预测概率高于这个阈值,就把这个样本判到相应类别里面;如果低于这个阈值,则放进另⼀个类别里面。所以阈值的选取在很大程度上影响了分值的计算,不利于准确评价参赛者的模型效果,而使用 AUC 或者对数损失则可以避免把预测概率转换成类别的麻烦。
1.3.2 回归指标
-
平均绝对误差
平均绝对误差(MAE,Mean Absolute Error),又被称为 L1 范数损失,其定义如式: MAE ( y , y ′ ) = 1 m ∑ i = 1 n ∣ y i − y i ′ ∣ \text{MAE}(y, y') = \frac{1}{m} \sum_{i=1}^n |y_i - y_i'| MAE(y,y′)=m1i=1∑n∣yi−yi′∣平均绝对误差虽然解决了残差加和的正负抵消问题,能较好衡量回归模型的好坏,但是绝对值的存在导致函数不光滑,在某些点上不能求导,即平均绝对误差不是⼆阶连续可微的,同时⼆阶导数总为 0。在 XGBoost ⾥⾯,可以使用平均绝对误差作为损失函数进行模型训练,但是由于其存在局限性,大家通常会选择 Huber 损失进行替换。那为何要使用 Huber 损失呢?由于平均绝对误差并不是连续可导的(在 0 处不可导),所以需要使用可导目标函数来逼近平均绝对误差。而对于下述将会讲到的均方误差(MSE),梯度又会随着损失的减小而减小,使预测结果更加精确。在这种情况下,Huber 损失就非常有用,它会由于梯度的减小而落在最小值附近。比起均方误差,Huber 损失对异常点更具健壮性。因此,Huber 损失结合了平均绝对误差和均方误差的优点。但是,Huber 损失的问题可能需要我们不断地调整超参数 delta。
-
均方误差
和平均绝对误差对应的还有均方误差(MSE,Mean SquaredError),又被称为 L2 范数损失,其定义如式: MSE ( y , y ′ ) = 1 m ∑ i = 1 n ( y i − y i ′ ) 2 \text{MSE}(y, y') = \frac{1}{m} \sum_{i=1}^n (y_i - y_i')^2 MSE(y,y′)=m1i=1∑n(yi−yi′)2由于均⽅误差与数据标签的量纲不⼀致,因此为了保证量纲⼀致性,通常需要对均方误差进行开方,这也就出现了均方根误差(RMSE)。Q:那么平均绝对误差与均⽅误差有何区别呢?
A:均⽅误差对误差(真实值–预测值)取了平方,因此若误差> 1,则均方误差会进⼀步增大误差。此时如果数据中存在异常点,那么误差值就会很大,而误差的平方则会远大于误差的绝对值。因此,相对于使用平均绝对误差计算损失,使用均方误差的模型会赋予异常点更大的权重。也就是说,均方误差对异常值敏感,平均绝对误差对异常值不敏感。 -
均方根误差
均⽅根误差用来评价回归模型的好坏,是对均方误差进行开方,缩小了误差的数值,其定义如式: RMSE ( y , y ′ ) = 1 m ∑ i = 1 n ( y i − y i ′ ) 2 \text{RMSE}(y, y') = \sqrt{ \frac{1}{m} \sum_{i=1}^n (y_i - y_i')^2} RMSE(y,y′)=m1i=1∑n(yi−yi′)2均方根误差也存在⼀定的局限性。例如,在计算广告的应用场景中,需要预测⼴告的流量情况时,某些离群点可能导致均方根误差指标变得很差,即使模型在 95% 的数据样本中,都能预测得很好。如果我们不选择过滤掉离群点,就需要找⼀个更合适的指标来评价广告流量的预测效果。 -
平均绝对百分比误差
平均绝对百分比误差(MAPE)与平均绝对误差的二阶导数都是不存在的。但不同于平均绝对误差,平均绝对百分比误差除了考虑预测值与真实值的误差,还考虑了误差与真实值之间的比例,比如 2019 腾讯广告算法大赛,虽然预测值与真实值的差值是⼀样的,但是由于使用了平均绝对百分比误差来评测,因此其真实值越大,误差反而越小,平均绝对百分比误差的定义如式: MAPE ( y , y ′ ) = 1 m ∑ i = 1 n ∣ y i − y i ′ ∣ y i ′ \text{MAPE}(y, y') = \frac{1}{m} \sum_{i=1}^n \frac{|y_i - y_i'|}{y_i'} MAPE(y,y′)=m1i=1∑nyi′∣yi−yi′∣MAPE相当于把每个点的误差进行了归⼀化,降低了个别离群点对绝对误差带来的影响。
2. 样本选择
影响结果的四个主要原因:分别是数据集过大严重影响了模型的性能,噪声和异常数据导致准确率不够高,样本数据冗余或不相关数据没有给模型带来收益,以及正负样本分布不均衡导致数据存在倾斜。
2.1 主要原因
-
数据集过大
过大的数据集会严重影响各种特征工程和建模方式的快速验证。在大多数情况下,我们的计算资源有限,需要考虑数据采样处理,然后在小数据集上建模分析。此外,在特定的业务场景下,也许可以过滤掉⼀些对建模没有意义的数据,这样可以帮助提高模型性能。 -
数据噪声
数据的噪声主要有两种来源,⼀种是采集数据时操作不当导致信息表征出现错误,另⼀种则是数据本身的特性存在合理范围内的抖动导致噪声与异常。数据噪声的存在具有两面性,一方面,噪声的存在会导致数据质量变低,影响模型的效果;但另⼀方面,我们也能通过在训练集中引入噪声数据的方法使得模型的健壮性更强。
此外,若是噪声数据的来源为第⼀种,则需要对应地去看是否能够解码出正确数据,这种情况有时会极大地提升建模效果。因此,当需要处理噪声数据的时候,首先考虑是否为采集错误导致的,其次再去权衡模型的泛化性和模型的当前效果。有时候去噪反而会导致模型的泛化性能变差,在换了数据集之后,模型的效果无法得到很好的保证。
要去噪,首先要识别出噪声,然后采取直接过滤或者修改噪声数据等多种办法。噪声数据可能是特征值不对,比如特征值缺失、超出特征值域范围等;也可能是标注不对,比如⼆分类问题的正样本标注成了负样本。数据去噪很多是检测和去除训练数据中标注带噪声的实例。
-
数据冗余
通常来说,数据冗余与数据集过大是不同的概念。提到数据集,会自然而然地想到是样本的集合,它的大小通常表示纵向的样本数量,而数据冗余则侧重于描述数据特征的冗余。数据中存在的冗余不仅会影响到模型性能,更会引入噪声与异常,有可能为模型带来反效果。 -
正负样本分布不均衡
在⼆分类正负样本不均衡的机器学习场景中,数据集往往是比较大的,为了让模型可以更好地学习数据中的特征,让模型效果更佳,有时需要进行数据采样,这同时也避免了因为数据集较大而导致计算资源不足的麻烦。这是比较浅层的理解,更本质上,数据采样就是模拟随机现象,根据给定的概率分布去模拟⼀个随机事件。另外,有⼀种说法是用少量的样本点去近似⼀个总体分布,并刻画总体分布中的不确定性。
大多数竞赛提供的数据都是主办方从真实完整的数据中提取出来的⼀部分,并且会保证数据分布的⼀致性,降低竞赛难度,保证效率。更进⼀步,也可以从总体样本数据中抽取出⼀个子集(训练集)来近似总体分布,然后训练模型的目的就是最小化训练集上的损失函数,训练完成后,需要用另⼀个数据集(测试集)来评价模型。
数据采样也有⼀些高级用法,比如对样本进行过采样或者欠采样,或者在目标信息保留不变的情况下,不断改变样本的分布来适应模型训练与学习,这常⽤于解决样本不均衡的问题。
2.2 准确方法
在竞赛中,若是在拿到数据后发现数据存在数据集过大以及正负样本不均衡这两种情况,则需要在⼀开始就针对性地给出解决方案。即如何处理以下两个问题:在数据量⾮常大的情况下,为了降低成本,如何提高模型训练速度;针对正负样本分布不均衡的场景,如何通过数据采样解决这类问题。
针对第⼀个问题,主要推荐以下两种解决办法。
- 简单随机抽样
这⾥分为无放回和有放回两种,做法均比较简单,不做具体介绍。 - 分层采样
该方法分别对每个类别进行采样。这是从⼀个可以分成不同子集(或称为层、类别)的数据集中,按规定的比例从不同类别中随机抽取样本的方法。其优点是样本的代表性比较好,抽样误差比较小;缺点是抽样过程比简单随机抽样要繁杂些。
针对第⼆个问题,则主要有以下三种解决办法。
-
评分加权处理
分布不均衡的问题时有出现,包括欺诈交易识别和垃圾邮件识别等,其正负样本的数量分布差距极大。对于正样本的重要性高于负样本,在模型训练以及评价的时候就可以设计相应的得分权重,使得模型能够学习到需要获得关注的部分。评分加权处理的办法是比较常见的⼀种。当然,在不同的应用场景中可以选择不同的加权方式,例如多分类问题中的 Micro Fscore 指标以及 KDDCUP 2019 竞赛中采用的 Weighted Fscore 指标,这两种评价指标对不同类别的权重是不⼀样的,通过对不同类别进行加权的方式可以提升模型的预测效果。
此方法具体的操作步骤是,首先遍历所有样本,根据样本是否满足某个要求来给予其权重。例如,在不均衡的二分类中,如果样本的标签为 1,我们就将其权重设置为 w 1 w_1 w1(自定义);如果样本标签为 0,就将其权重设置为 w 2 w_2 w2(自定义定义)。然后将样本权重代入模型进行训练和测试。
加权的直观含义从业务上理解就是认为⼀个正样本的价值大于多个负样本的,因此希望模型在训练的时候能更多地从正样本身上学到关键信息,当它学得不好的时候,就要对它加大惩罚力度。
-
欠采样
从数量较多的一类样本中随机选取一部分并剔除,使得最终样本的目标类别不太失衡。常用的方法有随机欠采样和 TomekLinks,其中 Tomek Links 先是找出两个各项指标都非常接近的相反类样本,然后删除这类样本中标签(label)占比高的,这类算法能够为分类器提供一个非常好的决策边界。 -
过采样
主要是对样本较少的类别进行重新组合,构造新样本。常用的方法有随机过采样和 SMOTE 算法。SMOTE 算法并不是简单复制已有的数据,而是在原有数据的基础上,通过算法产生新生数据。

2.3 应用场景
在什么样的场景下需要处理样本的不均衡问题呢?
- 如果竞赛任务对于召回有特别大的需求,也就是说对每个正样本的预测都远远比对负样本的预测更重要,那么这个时候如果不做任何处理,就很难取得比较好的建模结果。
- 如果竞赛的评价指标是 AUC,那么参赛者在实战过程中就会发现,这个时候处理和不处理样本不均衡问题的差别没那么大。但这也好比⼀个参数的波动,将处理后的结果和不处理的结果进行融合后,评价指标⼀般都是有细微提升的。
- 如果在竞赛任务中正样本和负样本是同等重要的,即预测正确⼀个正样本和预测正确⼀个负样本是同等重要的,那么其实不做其他的处理也影响不大。
3. 线下评估策略(数据划分策略)
3.1 强时序性问题
对于含有明显时间序列因素的赛题,可将其看作强时序性问题,即线上数据的时间都在离线数据集之后,这种情况下就可以采用时间上最接近测试集的数据做验证集,且验证集的时间分布在训练集之后。

例如,天池平台上的 “乘用车零售量预测” 竞赛,初赛提供 2012 年 1 月至 2017 年 10 月盐城分车型销量配置数据,需要参赛者预测 2017 年 11 月的盐城分车型销量数据。这是⼀个很明显的含时间序列因素的问题,那么我们可以选择数据集的最后⼀个月作为验证集,即 2017 年 10 月的数据。
3.2 弱时序性问题
这类问题的验证方式主要为 K 折交叉验证(K-fold Cross Validation),根据 K 的取值不同,会衍生出不同的交叉验证方式,具体如下。
- 当 K=2 时,这是最简单的 K 折交叉验证,即 2 折交叉验证。这个时候将数据集分成两份:D1 和 D2。首先,D1 当训练集,D2 当验证集;然后,D2 当训练集,D1 当验证集。2 折交叉验证存在很明显的弊端,即最终模型与参数的选取将在极大程度上依赖于事先对训练集和验证集的划分方法。对于不同的划分方式,其结果浮动是非常大的。
- 当 K=N 时,也就是 N 折交叉验证,被称作留⼀验证(Leave-oneout Cross Validation)。具体做法是只用⼀个数据作为测试集,其他数据都作为训练集,并重复 次( 为数据集的数据量)。这种方式的优点和缺点都是很明显的。其优点在于,首先它不受测试集和训练集划分方法的影响,因为每⼀个数据都单独做过测试集;其次,它用了 N 个数据训练模型,也几乎用到了所有的数据,从而保证模型的偏差更⼩。同时,其缺点也很明显,那就是计算量过大。如果数据集是千万级的,那么就需要训练千万次。
- 为了解决上面两种划分方式的缺陷,我们⼀般取 K=5 或 K=10,作为⼀种折中处理,这也是最常用的线下验证方式。比如, K=5,如下图所示,我们把完整的训练数据分为 5 份,用其中的 4 份数据来训练模型,用剩余的 1份来评价模型的质量。然后将这个过程在 5 份数据上依次循环,并对得到的 5 个评价结果进行合并,比如求平均值或投票。
