首页 > 技术文章 > 比赛经验学习1

yuyingblogs 2021-09-28 11:32 原文

1 比赛

常见名词:

  • Feature 特征变量,也叫自变量,是样本可以观测到的特征,通常是模型的输入。
  • Label 标签,也叫目标变量,需要预测的变量,通常是模型的标签或者输出。
  • Train Data 训练数据,有标签的数据,由举办方提供。
  • Test Data 测试数据,标签未知,是比赛用来评估得分的数据,由举办方提供。
  • Train Set 训练集,从Train Data中分割得到的,用于训练模型(常用于交叉验证)。
  • Valid Set 验证集,从Train Data中分割得到的,用于验证模型(常用于交叉验证)。

1.1 分析题目

第一步就是要破题,我们需要将问题转化为相应的机器学习问题。其中,Kaggle 最常见的机器学习问题类型有:

  • 回归问题
  • 分类问题(二分类、多分类、多标签) 多分类只需从多个类别中预测一个类别,而多标签则需要预测出多个类别。

1.2 数据分析(Data Exploration)

  • 数据应该怎么清洗和处理才是合理的?
  • 根据数据的类型可以挖掘怎样的特征?
  • 数据中的哪些特征会对标签的预测有帮助?

1.2.1 统计分析

  • 对于数值类变量(Numerical Variable),我们可以得到min,max,mean,meduim,std等统计量,用pandas可以方便地完成

  • 上图中可以观察Label是否均衡,如果不均衡则需要进行over sample少数类,或者down sample多数类。我们还可以统计Numerical Variable之间的相关系数,用pandas就可以轻松获得相关系数矩阵:

1.2.2 可视化

  • 常用的可视化工具有matplotlib和seaborn

1.3 数据预处理(Data Preprocessing)

  • 对于数值型变量(Numerical Variable),需要处理离群点,缺失值,异常值等情况。
  • 对于类别型变量(Categorical Variable),可以转化为one-hot编码。

1.4 特征工程(Feature Engineering)

  • 特征为王,特征是决定效果最关键的一环
  • 利用人为先验知识,从数据中总结出特征。

1.4.1 特征抽取(Feature Extraction)

  • 对于Numerical Variable,可以通过线性组合、多项式组合来发现新的Feature。
  • 对于文本数据,有一些常规的Feature。比如,文本长度,Embeddings,TF-IDF,LDA,LSI等,你甚至可以用深度学习提取文本特征(隐藏层)。
  • 如果你想对数据有更深入的了解,可以通过思考数据集的构造过程来发现一些magic feature,这些特征有可能会大大提升效果。
  • 通过错误分析也可以发现新的特征

1.4.2 特征选择(Feature Selection)

  • 最简单的是相关度系数(Correlation coefficient),它主要是衡量两个变量之间的线性关系,数值在[-1.0, 1.0]区间中。
    • 数值越是接近0,两个变量越是线性不相关。但是数值为0,并不能说明两个变量不相关,只是线性不相关而已。

相关系数矩阵是一个对称矩阵,所以只需要关注矩阵的左下角或者右上角。我们可以拆成两点来看:

  • Feature和Label的相关度可以看作是该Feature的重要度,越接近1或-1就越好。

  • Feature和Feature之间的相关度要低,如果两个Feature的相关度很高,就有可能存在冗余。

  • 可以训练模型来筛选特征,比如带L1或L2惩罚项的Linear Model、Random Forest、GDBT等,它们都可以输出特征的重要度,将不同方法的平均重要度作为最终参考指标,筛选掉得分低的特征。

1.5 建模(Modeling)

1.5.1 模型

机器学习模型有很多,建议均作尝试,不仅可以测试效果,还可以学习各种模型的使用技巧。其实,几乎每一种模型都有回归和分类两种版本,常用模型有:

  • KNN
  • SVM
  • Linear Model(带惩罚项)
  • ExtraTree
  • RandomForest
  • Gradient Boost Tree
  • Neural Network

这些模型都已经有现成的工具(如scikit-learn、XGBoost、LightGBM等)可以使用,不用自己重复造轮子。但是我们应该要知道各个模型的原理,这样在调参的时候才会游刃有余。当然,你也使用PyTorch/Tensorflow/Keras等深度学习工具来定制自己的Deep Learning模型,玩出自己的花样。

1.5.2 错误分析

通过错误分析->发现新特征->训练新模型->错误分析,可以不断地迭代出更好的效果,并且这种方式还可以培养我们对数据的嗅觉。

1.5.3 调参

  • 根据经验,选出对模型效果影响较大的超参
  • 按照经验设置超参的搜索空间,比如学习率的搜索空间为[0.001,0.1]。
  • 选择搜索算法,比如Random Search、Grid Search和一些启发式搜索的方法。
  • 验证模型的泛化能力(详见下一小节)。

1.5.4 模型验证(Validation)

在Test Data的标签未知的情况下,我们需要自己构造测试数据来验证模型的泛化能力,因此把Train Data分割成Train Set和Valid Set两部分,Train Set用于训练,Valid Set用于验证。

  • 简单分割
    将Train Data按一定方法分成两份,比如随机取其中70%的数据作为Train Set,剩下30%作为Valid Set,每次都固定地用这两份数据分别训练模型和验证模型。这种做法的缺点很明显,它没有用到整个训练数据,所以验证效果会有偏差。通常只会在训练数据很多,模型训练速度较慢的时候使用。
  • 交叉验证
    交叉验证是将整个训练数据随机分成K份,训练K个模型,每次取其中的K-1份作为Train Set,留出1份作为Valid Set,因此也叫做K-fold。至于这个K,你想取多少都可以,但一般选在3~10之间。我们可以用K个模型得分的mean和std,来评判模型得好坏(mean体现模型的能力,std体现模型是否容易过拟合),并且用K-fold的验证结果通常会比较可靠。 如果数据出现Label不均衡情况,可以使用Stratified K-fold,这样得到的Train Set和Test Set的Label比例是大致相同。

1.6 模型集成(Ensemble)

Feature为主,Ensemble为后”。Feature决定了模型效果的上限,而Ensemble就是让你更接近这个上限
常见的Ensemble方法有Bagging、Boosting、Stacking、Blending。

2 工具篇

  • Numpy | 必用的科学计算基础包,底层由C实现,计算速度快。
  • Pandas | 提供了高性能、易用的数据结构及数据分析工具。
  • NLTK | 自然语言工具包,集成了很多自然语言相关的算法和资源。
  • Stanford CoreNLP | Stanford的自然语言工具包,可以通过NLTK调用。
  • Gensim | 主题模型工具包,可用于训练词向量,读取预训练好的词向量。
  • scikit-learn | 机器学习Python包 ,包含了大部分的机器学习算法。
  • XGBoost/LightGBM | Gradient Boosting 算法的两种实现框架。
  • PyTorch/TensorFlow/Keras | 常用的深度学习框架。
  • StackNet | 准备好特征之后,可以直接使用的Stacking工具包。
  • Hyperopt | 通用的优化框架,可用于调参。

3.总结和建议

  • 参加比赛前,先判断机器资源能否支撑你完成比赛
  • 在打比赛的过程中可以学习别人的分析方法,有利于培养自己数据嗅觉
  • 要足够地重视Ensemble
  • 将比赛代码的流程自动化,是提高比赛效率的一个关键

https://mp.weixin.qq.com/s/2g6ixFDhGDV4l8jO3CPTng

推荐阅读