一、第一阶段:准备工作
在开始比赛时,需要做好一系列的准备工作,为后续的数据分析和模型构建奠定基础。
-
明确预测类型
拿到题目后,首先要确定这是回归、二分类还是多分类预测问题。这一步至关重要,因为不同类型的预测问题可能需要采用不同的模型和方法。为了更好地理解这些概念,建议快速浏览《西瓜书》,不过不需要对每个公式进行详细推导,重点是了解监督、半监督、非监督等基本概念。 -
特征工程
-
了解数据:特征工程是比赛中最为关键的部分,通常需要花费大约60%的时间。在进行特征工程之前,需要先深入了解数据。这就要求熟练掌握pandas工具,它就像操作数据库中的表一样方便。为了学习pandas,首先要安装anaconda,这是一个科学研究工具,包含了jupyter、pandas、numpy等基本所需的工具。如果要进行深度学习,还需要另外安装tensorflow、pytorch等。安装完成后,使用anaconda/bin/jupyter运行一个jupyter工作环境,这个环境可以保存之前执行的结果,方便进行实验。学习pandas可以从官网的“10 min to learn”教程开始,对于merge、concat、join等复杂操作,可以在使用时逐步查询和学习。通过对数据的整理和绘图,可以更深入地理解数据的分布和业务意义,从而构造或提取出有用的特征。
-
构造特征:构造特征是特征工程中最重要的部分,需要投入大量的时间和精力。所谓特征,就是训练数据集中除去label以外的所有列。以商品预测比赛为例,可以从不同的角度将特征进行分类整理分析。不同的比赛,特征构造提取的过程也会有所不同。在涉及时间的比赛中,通常需要设计时间窗口,即将数据按照一定的时间进行划分。例如,用前五天的数据预测后一天的数据,而总的数据集是两个月的,这时就需要合理划分训练集和验证集。同时,由于更早之前的数据对现在的预测影响可能较小,所以需要为不同的模型设置不同的权重。例如,最接近预测日的模型权重可以设置为0.7,最远的模型权重设置为0.05。
-
处理数据不平衡:,数据不平衡(Class Imbalance) 是指训练数据中不同类别的样本数量差异很大(例如:正负样本比例为1:100)。这会使得模型偏向多数类,导致少数类的预测效果差。这时候就需要进行欠采样或过采样处理。欠采样是指随机减少某个数据较多类别的训练数据;过采样则是使用smote方法为数据较少的类别插值添加数据。数据不平衡的处理也是特征工程的一部分,虽然还有其他处理方法,但不太常用,可以大致了解一下。
-
过采样与欠采样:
-
1. 欠采样(Undersampling)
做法:随机减少多数类样本的数量,使其与少数类样本数量接近。
例子:
-
-
原始数据:
- 类别A(多数类):1000条
- 类别B(少数类):100条
-
欠采样后(随机删除900条类别A样本):
- 类别A:100条
- 类别B:100条
2. 过采样(Oversampling)
做法:增加少数类样本的数量,使其与多数类样本数量接近。常见方法包括:
- 随机复制少数类样本(简单但可能过拟合)。
- SMOTE(Synthetic Minority Oversampling Technique) :通过插值生成合成样本。
SMOTE的原理:
- 对每个少数类样本,找到其最近的k个同类样本。
- 随机选择一个邻居,并在两者连线上的随机位置生成新样本。
例子:
-
原始数据:
- 类别A:1000条
- 类别B:100条
-
过采样后(用SMOTE生成900条合成样本):
-
类别A:1000条
-
类别B:1000条
-
-
特征管理:为了避免特征混淆,每个特征都应该取一个合适的名字。同时,由于在进行模型融合时需要有特征多样性,可能需要将不同的特征簇输入到不同的模型中,因此做好文件管理非常重要。建议比赛工程文件按照以下结构组织:result文件夹用于存放不同的结果,并且要进一步细分文件夹;experiment文件夹用于存放jupyter实验文件,这样可以方便管理大量的实验文件。
二、第二阶段:模型阶段
在完成特征工程后,就进入了模型阶段,需要选择合适的模型并进行调参优化。
-
熟悉模型:需要对各种常见的模型有清晰的了解,包括Logistic Regression(逻辑回归)、SVM(支持向量机)、GDBT(梯度提升决策树)、Naive Bayes(朴素贝叶斯)、Xgboost(极限梯度提升)、Adaboost(自适应提升)等。建议熟读《西瓜书》和李航的《统计学习方法》,以深入理解这些模型的原理。这些模型基本都有现成的库,而且大部分集中在sklearn中,除了lightGBM。
-
模型调用与保存:可以参考相关资料进行模型的简单调用,使用起来相对容易方便。但要注意保存模型和结果,并且要严格按照规定的文件路径进行保存,以免后续出现混乱。sklearn的编程方式虽然博大精深,但api使用相对简单,通过学习一些相关的学习笔记,可以快速熟练掌握。
-
XGBoost调参:XGBoost是一个可以并行运算的回归树,在现在的比赛中使用非常频繁且有效。在系统上安装XGBoost非常方便,只需要使用pip install命令即可,而在其他系统上安装可能会比较麻烦。XGBoost运行后的效果通常较好,但为了获得更优的结果,需要对其进行调参。调参是一个体力活,需要不断尝试不同的参数组合,以找到最优的参数设置。
三、第三阶段:模型融合
模型融合是提升比赛成绩的重要手段,不同的预测结果有不同的融合方式。
-
融合方式:模型融合的方式有很多种,bagging、voting、stacking都是ensembling的方法。对于多标签分类问题,比较常用的是投票器;而对于回归问题,融合的方式则更加多样化,还可以进行分层处理。
-
投票器示例:以投票器为例,需要对不同模型的结果进行投票,选择得票数最高的结果作为最终预测结果。在投票中,需要为每个模型设置不同的票数,以体现其重要性。同时,为了避免得票相同的情况,可以选择得票相同情况下的后者作为最终结果。
-
bagging、voting、stacking介绍
1. Bagging(Bootstrap Aggregating,自助聚合)
核心思想
- 通过有放回抽样(Bootstrap Sampling) 生成多个不同的训练子集,每个子集训练一个基模型,最后汇总所有模型的预测结果(分类任务用投票,回归任务用平均)。
- 代表算法:随机森林(Random Forest)。
2. Voting(投票法)
核心思想
-
用多个不同的基模型独立训练,最终通过投票或加权投票决定预测结果。
-
分为:
- 硬投票(Hard Voting) :直接统计票数,选择最多票的类别。
- 软投票(Soft Voting) :考虑模型预测概率(如平均概率最大的类别胜出)。
3. Stacking(堆叠泛化)
核心思想
- 用多层模型:第一层(基模型)的预测结果作为第二层(元模型)的输入,进一步优化预测。
- 关键点:避免数据泄露,需用交叉验证生成基模型的输出。
四、实用技巧
在比赛中,还可以尝试一些实用的技巧,虽然这些技巧不一定每次都有效,但有时候可以带来意想不到的效果。
-
找比赛leak:通过分析测试集的一些特性,找出能够大幅提高成绩的“golden feature”。这就像钻空子一样,需要对测试集进行深入分析,挖掘其中隐藏的信息。
-
利用叶子节点信息:可以利用GDBT或XGBoost的叶子节点信息创建新的特征,一般来说,这种方法可以提高成绩,但训练速度会非常慢。为了加快训练速度,可以将训练集分散到不同的电脑上进行并行训练。