机器学习实战

机器学习三把斧

image-20220111213813020

1.数据清洗

image-20220111213958701

1.1缺失值的处理

image-20220111221231326

某一列的特征缺失值达到40%左右,删除这个特征值;或者某一个样本的缺失值过大,那么删除这个样本。

而当某个特征的缺失值较少的时候,不能删除这个特征。

建模预测:把缺失值当做模型的预测值,用预测的值填充缺失值

多重插补:前向填充,后项填充

高维映射:就是把缺失值作为一个新的类,只对分类的变量比较好,在广告CTR(点击率)

1.2异常值的处理

image-20220111223055098

异常:真实的异常,记录的异常。

真实的异常:本来就是这个值,只是和其他样本偏移较大

记录的异常:本来是10,记录成100

1.3数据分桶

image-20220111223741228

数据分桶主要就是连续数据离散化,比如年龄,0-10,10-20,20-30等,然后编号1,2,3

数据分桶可能提升树模型的鲁棒性

1.4数据的标准化

image-20220111224310984

回归中标准化使用较多,分类中大部分也使用,但是分类中的决策数就不需要标准化

2.特征工程

image-20220111225551505

2.1特征构造

image-20220111230337323

对时间的处理

image-20220112112139247

比赛中要看训练集和测试集的特征分布是否一致,删去不一致的特征

2.2特征选择

image-20220112150021397

可能经过特征构造后,你的特征变成成百上千,这时候就需要先进行特征过滤,用集成学习如XGboost等算出每个特征的权重。

2.3特征工程示例

image-20220112151118851

3.模型调参

3.1理解模型

image-20220113150940140

调参的时候首先要理解你使用的模型,了解模型的优点和特性,比如线性回归模型基于标签是高斯分布的

3.2评估性能

image-20220113151501451

评估函数不同,模型的性能可能不一样,比如MSE对异常值很敏感,如果A模型误差为0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,5 ;B模型误差为1,1,1,1,1,1,1,1,1,1。用MSE判断A=25.09,B=10。而用MAE,A=5.9,B=10 。

所以如果使用MSE评估,那么就需要特别对异常值进行精确的处理。不同的评估函数重点考虑的方面是不一样的

有个评估函数后,接下来就是验证方法,比如交叉验证,留一验证,以及时间序列的切分一个时间段去预测。交叉验证是目前比较好的验证方式,但是当你的数据特别大比如几个G,预测一次都需要好久,非常需要内存的话可以考虑切分验证(80%训练,20评估)。

时间序列样本是不能做交叉验证和留一验证的,可能会存在数据信息的泄露。往往是根据时间进行切分构造一个和测试区间类似的区间预测

3.3模型调参

image-20220113154427753

网格搜索特别花费时间,比如按上图如果是五折交叉验证就需要计算36*5=180次的计算。

4.模型集成

前面的特征工程和模型调参在比赛过程中会反复的进行,反复测试。而模型的集成一般是在比赛的后期进行

image-20220113160809140

模型融合的基础是你的单模型要好,

4.1简单加权融合

image-20220113161053047

加权平均时模型的权重最好不要小于0.1,否则这个模型对整体的融合产生不了什么模型收益。

在线提交的时候分数差不多,但是模型的数据差异较大,融合后效果会好(比赛经验)

4.2boosting/bagging

image-20220113162257798

4.3stacking/blending

image-20220113162653446

把结果放到另一个简单模型如线性模型再次进行筛选。

4.模型融合示例

image-20220113163919059

以上的适用于数据挖掘比赛,和(cv)图像处理的有所不同

特征工程

1.特征工程介绍

image-20220116221824662

2.类别特征

image-20220116222721695

image-20220117190343666

ID一般不作为特征,以上数据已经经过脱敏

2.1类别编码

image-20220117191115227

image-20220117191237362

类别编码一般不直接使用,因为red,blue,black本身是没有大小的,变成3,1,2后如果使用的是决策树,那么可能直接会把>2 的区分为一类

2.2 One-Hot编码

image-20220117202956112

使用one-hot编码可以避免上面引入大小的问题,但是不适用于类别特别多的(如果有100个类)会导致特征分布特别稀疏

2.3 Frequency编码

image-20220117203415819

Frequency编码是数据竞赛中使用最为广泛的技术,在90%以上的数据建模的问题中都可以带来提升。因为在很多的时候,频率的信息与我们的目标变量往往存在有一定关联,例如:

  • 在音乐推荐问题中,对于乐曲进行Frequency编码可以反映该乐曲的热度,而热度高的乐曲往往更受大家的欢迎;
  • 在购物推荐问题中,对于商品进行Frequency编码可以反映该商品的热度,而热度高的商品大家也更乐于购买;
  • 微软设备被攻击概率问题中,预测设备受攻击的概率,那么设备安装的软件是非常重要的信息,此时安装软件的count编码可以反映该软件的流行度,越流行的产品的受众越多,那么黑客往往会倾向对此类产品进行攻击,这样黑客往往可以获得更多的利益

2.4 Target编码

image-20220117203651299

前面说Label encoder一般不直接用,但是下面这种情况可以使用,年龄段有相对大小的区分,你可以编码为1,2,3,4

image-20220117205444591

3.数值特征

image-20220117220126123

二值化,阈值threshold=n, 小于等于n的数值转为0, 大于n的数值转为1

指/对数变换对决策树没有意义,因为进行对数变化后数据的相对大小不变,小的还是小,大的还是大

交互特征是灵活性最高的,好的交互特征往往可以对模型起到很大的优化(比如020的)

index_ture = (offline_train['Date']-offline_train['Date_received']).apply(lambda x: x.days <= 15)
# 反例索引
index_false_1 = (offline_train['Date']-offline_train['Date_received']).apply(lambda x: x.days > 15)
index_false_2 = offline_train['Date_received'].notnull() & offline_train['Date'].isnull()

3.1数据分桶

image-20220118152459903

4.时间特征

image-20220118153602049

模型融合

比赛中常用的模型(基于决策树的集成学习)

1.介绍XGBoost模型

XGBoost是2016年由华盛顿大学陈天奇老师带领开发的一个可扩展机器学习系统。严格意义上讲XGBoost并不是一种模型,而是一个可供用户轻松解决分类、回归或排序问题的软件包。它内部实现了梯度提升树(GBDT)模型,并对模型中的算法进行了诸多优化,在取得高精度的同时又保持了极快的速度。

image-20220224183221634

XGBoost相对于GBDT(梯度提升树)有以下好处

image-20220224183347491

2.参数设置

官方文档

image-20220224183804811

过拟合的时候加大r(gamma)的值

image-20220225191622741

image-20220225191653294

image-20220225191926544

XGBoost的调用

image-20220225192136419

2.1参数优化

image-20220225192935335

image-20220225193536541

image-20220225193557669

比较费时间,一般只在后期进行一次,把参数固定下来

使用方法1

使用方法2

3.LightGBM介绍

image-20220225194033354

image-20220305161544290

image-20220305161802736

image-20220305161904063

硬投票,软投票

image-20220305170958061

用第一层的训练结果作为特征,放到第二层(模型四)进行训练,

image-20220305171229683

image-20220305172710449

样本有偏的时候,比如负样本:正样本=10:1

那么,模型可能会更偏向于预测为负样本,这时候就要调节阈值,比如0.5改成0.3

image-20220305174111295

更多推荐