- How to Win a Data Science Competition: Learn from Top Kagglers
- 网易公开课
概念
-
Data
-
Model
-
Submission
-
Evaluation
-
Leaderboard
-
类似的一些问题众包平台
相关理论
- 真实的世界和竞赛之间的联系和区别
- 竞赛中数据为王,需要更好的理解数据,需要一些对于数据的灵感
- 一切服务于解决问题,所以不要自我设限
- 在比赛中需要保持创造性,对于算法需要一些理解和改进的时候,我们也得撸袖子往上干
- 不要害怕失败,经验的提升才是最大的收获!
常见的机器学习
- 没有一种算法可以适用于所有的业务场景/问题
Linear
- 使用超平面分割特征空间
- 对于特征空间的不断划分,不能很好的捕获线性依赖
- LR,SVM
Tree-based
- 非常适合表格类的数据分析
-
- Scikit-learn的RF效果不错,XGBoost和lightGBM效果更好
- DT、RF、GBDT
KNN-based
Neural Network
- pytorch
可视化工作
- decision surfaces
特征
数字特征
特征预处理
- 树型算法往往不依赖特征归一化,而一些非树算法是极其依赖的
- 归一化:线性归一化【0,1】、whiting【mean,std】
- 离群点处理:阈值裁剪、
- 排序rank编码:特征有一些典型特征值,可以进行排序得到每个特征的名次作为特征
- 特定函数映射:log,sqrt、
特征Generate
- 先验设计
- Exploration Data Analysis
Categorical / Ordinal 特征
- 类别数据(female \ male)、序号特征(A、B、C、D,等)可以使用 标签编码(label encoding)
- label encoding:
- 连续数字映射:female:1;male:0
- 用出现频率值替代
- one-hot编码
时间 / 坐标(位置) 特征
缺失值
- 发现缺失值:NAN,-1,inf,可以画图通过离群点的分布值范围判断
- 直接忽略出现缺失值的样本
- Fillna方法
- 使用-1等特殊值替代
- 使用均值中位数替代
- 重新设计方法用于缺失值的重构
- isnull特征,缺失为1,不缺为0
- 时序特征可以用相邻值来估计、如邻域插值等
- 统计“某个类别”样本关于缺失特征的均值等统计值来替代,
- 比如样本中为女性的平均年龄是25,我们就可以把25作为女性缺失年龄的替代值
-
- 将异常值作为缺失症,可以填充之后重新训练
- 有一些可以应对NAN的算法,比如 XGBoost
文本特征提取-BoW
- 从复杂数据中提取特征,如文本或者图像
Bag of words
- 为文本或者图像创建新词,然后统计每个词出现的频率,作为特征向量
- 文本特征提取中 TFiDF (用于bag of words的特征加权的过程):
- TF:term frequency,每个样本中某个word出现的频率,即每个样本特征维度的归一化
- iDF:inverse Document frequency,每个文档的出现频率,即越常出现(在多个文档中出现)的word的权重越低(通用词不够有代表性,不适用用于分类)
N-grams
- 将n个word组成一个n行n列的“关系矩阵”,表面词之间的关联性;N表示选择几个词来判断关联性(关联性计算用传统概率论的贝叶斯后验概率可以计算出来)
文本词预处理
- lowercase:大小写统一
- lemmatization:词性统一
- stemming:
- stopwords:
文本特征提取-Embedding
- 一般是预训练网络提取的特征
- word2vec
图像特征提取
预训练网络特征
- 数据增光,网络finetune
*手工特征
探索性数据分析
- Exploration Data Analysis:
- 理解数据
- 树立直觉
- 建立假设
- 激发灵感
- 竞赛不要一开始就从stacking开始,从EDA开始一点点的解构问题可能有更好的帮助
- 一个重要的EDA方法就是 可视化 visualization
- 通过EDA发现 对于解决问题十分有帮助的 Magic feature
熟悉数据/问题
- 获取相关领域的基本知识
探索匿名标签的数据
- 样本的特征标签不是明文,而是使用一些手段进行加密的
- 可以通过学习算法发现这些匿名特征中重要性最大的几个特征,然后分析这些特征的统计特性,试着反向推导得到其原始的数值,进而弄清楚这个特征的物理意义
样本可视化
- 是EDA的重要工具
- 直方图: p l t . h i s t ( x ) plt.hist(x) plt.hist(x)
- 曲线: p l t . p l o t ( x , ′ . ′ ) plt.plot(x, '.') plt.plot(x,′.′)
- 散点图: p l t . s c a t t e r ( r a n g e ( l e n ( x ) ) , x , c = y ) plt.scatter(range(len(x)), x, c=y) plt.scatter(range(len(x)),x,c=y)
- 统计量: d f . d e s c r i b e ( ) df.describe() df.describe()
- x . v a l u e c o u n t s ( ) x.value_counts() x.valuecounts()
- x . i s n u l l ( ) x.isnull() x.isnull()
- 相关性: d f . c o r r ( ) df.corr() df.corr()
- p l t . m a t s h o w ( ) plt.matshow() plt.matshow()
- d f . m e a n ( ) . p l o t ( s t y l e = ′ . ′ ) df.mean().plot(style='.') df.mean().plot(style=′.′)
- 排序: d f . m e a n ( ) . s o r t v a l u e s ( ) . p l o t ( s t y l e = ′ . ′ ) df.mean().sort_values().plot(style='.') df.mean().sortvalues().plot(style=′.′)
- etc.
数据清洗
- 重复值,恒常值 :删去
- d a t a . n u n i q u e ( a x i s = 1 ) = = 1 data.nunique(axis=1) == 1 data.nunique(axis=1)==1
- d a t a . T . d r o p _ d u p l i c a t e s ( ) data.T.drop\_duplicates() data.T.drop_duplicates()
- d a t a . f a c t o r i z e ( ) data.factorize() data.factorize()
- 检查重复样本的标签是否一致
- 检查数据是否被重复的 shuffled!
- 分析每个特征的取值集合是什么, d a t a . n u n i q u e ( d r o p n a = F a l s e ) data.nunique(dropna=False) data.nunique(dropna=False)
- 挑选非数值型特征:
c a t i d x s = l i s t ( d f . s e l e c t _ d t y p e s ( i n c l u d e = [ ′ o b j e c t ′ ] ) . c o l u m n s ) cat_idxs = list(df.select\_dtypes(include=['object']).columns) catidxs=list(df.select_dtypes(include=[′object′]).columns)
n u m i d x s = l i s t ( d f . s e l e c t _ d t y p e s ( e x c l u d e = [ ′ o b j e c t ′ ] ) . c o l u m n s ) num_idxs = list(df.select\_dtypes(exclude=['object']).columns) numidxs=list(df.select_dtypes(exclude=[′object′]).columns) - 替换: d f . r e p l a c e ( ′ N A N ′ , − 999 , i n p l a c e = T r u e ) df.replace('NAN', -999, inplace=True) df.replace(′NAN′,−999,inplace=True)
验证和过拟合
- 特别说明一下Kaggle 在计算得分的时候,有Public Leaderboard (LB)和 Private LB 之分。具体而言,参赛选手提交整个测试集的预测结果,Kaggle 使用测试集的一部分计算得分和排名,实时显示在 Public LB上,用于给选手提供及时的反馈和动态展示比赛的进行情况;测试集的剩余部分用于计算参赛选手的最终得分和排名,此即为 Private LB,在比赛结束后会揭晓。用于计算 Public LB 和 Private LB 的数据有不同的划分方式,具体视比赛和数据的类型而定,一般有随机划分,按时间划分或者按一定规则划分。大家可以合理利用Public Leaderboard的排名和反馈来适当调整自己的策略,但是不要太过依赖Public Leaderboard,有些时候它的数据分布和Private Leaderboard会有差异,不要在Public Leaderboard上过拟合哦,还是好好利用你的validation set吧,以便得到更好的泛化能力。
- Holdout: s k l e a r n . m o d e l s e l e c t i o n . s h u f f l e s p l i t sklearn.model_selection.shufflesplit sklearn.modelselection.shufflesplit,讲数据集分成不重叠的两部分:训练集和验证集
- Kfold: s k l e a r n . m o d e l s e l e c t i o n . K f o l d sklearn.model_selection.Kfold sklearn.modelselection.Kfold,会出现重叠的Holdout,(多个holdout)
- LeaveOneOut: s k l e a r n . m o d e l s e l e c t i o n . L e a v e O n e O u t sklearn.model_selection.LeaveOneOut sklearn.modelselection.LeaveOneOut,
- Stratification:
s
k
l
e
a
r
n
.
m
o
d
e
l
s
e
l
e
c
t
i
o
n
.
S
t
r
a
t
i
f
i
e
d
S
h
u
f
f
l
e
S
p
l
i
t
sklearn.model_selection.StratifiedShuffleSplit
sklearn.modelselection.StratifiedShuffleSplit 分层拆分,保证划分的训练集和验证集的不同类别的样本占比在一个训练中相同
- 训练集和验证集合如何划分:
- 随机(Rowwise)
- TimeWise
- IdWise
- Combine
- 验证集结果和提交测试结果差距过大:尽量保证验证集样本分布和提交测试集样本分布一致
Data Leakage
- 数据泄露
- 数据中存在倒“因”为“果”的feature的现象,叫数据竞赛中的Data Leakage。
- 靠着对极个别特征feature的充分利用(被称为魔法属性),立即将对手超越,成功霸占冠军位置。然而,这可能是竞赛方数据准备过程中出现的失误,使模型沿着有纰漏的,甚至是颠倒的因果关系进行预测,但在测试数据中得到预测结果是极好的。
Metrics
-
- 分类
- AUC of ROC
优化
Mean Encoding
- 适用条件:存在一个 类别特征,是一个2分类问题
- 步骤:统计每个类别下的GT均值(0~1)作为该类别的映射值
- Pros of MeanEncoding:
- Capture information within the label, therefore rendering more predictive features
- Creates a monotonic relationship between the variable and the target
- Cons of MeanEncodig:
- It may cause over-fitting in the model.
正则化
- 交叉验证
- 平滑
- 增加噪声
- Expanding mean:
Hyperparameters Tuning
- 如何调试
- 一些调参库
- 不同的类型算法的超参
实用建议
kaggle 日程(参考)
矩阵因子
- PCA
可视化 - tSNE
集成学习
Catboost
Titanic
Kaggle数据分析工作流程
- 1 问题定义:先阅读题目弄清题意
- 2 获取数据集(训练(包括交叉验证)+测试)
- 3 数据预处理(Wrangle, prepare, cleanse)
- 数据争用是数据格式转换,转换成方便后续处理的结构形式
- 数据清理是消除不正确的数据或对其进行修改的过程
- 4 数据预分析:分析定义模式 以及 充分的挖掘数据内在的联系
- 5 算法模型建立和问题解决
- 6 展示问题解决步骤以及最终结构包括可视化
- 7 提交结果文件
- PS:算法建模之前的数据无处理和分析过程是彼此交融联系紧密的两个步骤,其先后顺序不重要;会存在不断迭代优化设计的过程,不会一次流程就能解决全部问题
数据分析工作中的关键因素
- 分类:对于数据样本需要进行充分全面的分类,知道不同类别之间的潜在关系
- 相关性:需要判断特征和目标之间的关系强弱,以及特征对于目标影响方向(有助还是有害?);可能也需要判断特征之间的关联性,特征之间可能会存在什么样潜在的关系,相互独立还是彼此互补亦或是彼此重复冗余
- 转换:不同的算法可能需要特定格式的数据,因此需要对于问题给出的数据集进行必要的格式转变
- 补全:对于样本和特征错误的检测和纠正(异常值、明显离群点),甚至是发现一些对于最终结果没有任何贡献或是显著扭曲结果的样本和特征,完全丢弃它们
- 创造:可能需要对于现有的特征基础上创造出新的特征,并测试新特征对于结果是否有提升,这是个不断迭代更新的过程!特别是在传统的机器学习里,特征工程的部分是耗时耗力的,好的设计需要靠灵感以及经验的激发
- 可视化:结合数据的本质和问题目标,挑选最适合且正确的图表进行可视化
让我们开始吧!
获取数据
- Kaggle的数据获取方法略
- 我们使用官网上的
notebook
进行代码编写,简单
了解数据集
- 加载数据,查看样本特征属性名和类型
- 查看数据是否有丢失,如缺失的特征等
- 查看数据的基本统计分布情况
分析数据
- 查看不同特征和目标之间的关联性的相对强弱关系,作为对问题的基础认知
- 对于存在缺失的特征,我们需要尽可能的补充这部分缺失信息(理论上讲给出的所有特征都值得我们尽可能的利用,每个特征都可能有助于结果/指标的提升,特别是在我们没有尝试它们的情况下我们更应该重视)
- 该问题中,Age和Embarked两种特征存在缺失,年龄和登录的港口名
- 一般补全方法:
- 1 使用数据样本均值和标准差来随机取值
- 2 使用特定样本子集的均值/中位数替代
- 3 使用特定样本子集的均值和标准差进行随机取值
- 4 使用算法进行预测,如使用 RandomForestClassifier 填补缺失的年龄属性
- 1/3方法引入随机性会导致每次运行的结果不同,不好比较,先使用方法2(如选择性别相同阶级类似的群体的年龄类似)
- 特征校正:
- 船票编号 特征 可能重要性较低,因为其有很大的冗余度(22%)且从经验上看船票和存活之间的关系很弱
- 船舱编号 特征 其样本中缺失的概率很大(训练和测试数据),导致其重要性也较低
- 乘客编号 维度和存活没有关系,可以忽略
- 人名特征缺乏有效的标准化方法,重要性不高
- 特征设计(新特征)
- 登船的旅客很多是以家庭为单位,因此可以建立一个 familysize 特征,和存活关系较大
- 人名中存在一些 title,可以提取出来用于属性的补充验证 以及 建立新特征
- 年龄是连续值,如果对其进行分段,年龄分段 特征 可能对于该问题的鲁棒性更好
- 船上消费额 进行分段可能效果也不错
- 一些额外的先验知识:
- 女人,小孩 以及 上流阶层的存活率更高
上手
- My-notebook;别人的-notebook
- 学到了一个新框架,autogluon.tabular,是一个AutoML的框架:大部分automl框架是基于超参数搜索技术,例如基于贝叶斯搜索的hyperopt技术等;AutoGluon则依赖融合多个无需超参数搜索的模型,三个臭皮匠顶个诸葛亮
- stacking: 在同一份数据上训练出多个不同类型的模型,这些模型可以是KNN、tree、核方法等,这些模型的输出进入到一个线性模型里面得到最终的输出,就是对这些输出做加权求和,这里的权重是通过训练得出。
- K-则交叉Bagging:Bagging是训练同类别的多个模型,他们可能使用不同的初始权重或者数据块,最终将这些模型的输出做平均来降低模型的方差。
- K-则交叉Bagging,源自于K-则交叉验证。相同点都是对数据集做K折
- K-则交叉验证:相同的初始参数,训练多次,对每次的误差求平均后作为这些初始参数的最终误差,为了最大化利用数据集,可以有效避免过拟合和欠拟合。(是为了验证初始参数)
- K-则交叉Bagging:每一则对应不同的初始参数,训练出多个模型,对结果求平均(3个臭皮匠顶个诸葛亮)
- 多层Stacking:将多个模型输出的数据,合并起来,再做一次Stacking。在上面再训练多个模型,最后用一个线性模型做输出。
为了避免后面层过多拟合数据,多层Stacking通常配合K-则交叉Bagging使用,也就是说这里的每个模型是K个模型的Bagging。它对下一层stacking的输出,是指每个bagging模型对应验证集上输出的合并