第34步 机器学习实战DLC:不平衡数据处理(上)

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

失踪人口回归的第一期来说一说不平衡数据。

一、不平衡数据的概念

什么是不平衡数据我们先来看看小Chat怎么说的

 顾名思义就是你的因变量1和0的样本数差距有点大大到影响了模型性能。举个栗子一个盒子里有100个红球10个黄球我们随机盲抽一个球然后猜颜色你会怎么猜是不是无脑猜红球就得了。这么训练的话模型永远达不到我们的要求。

二、不平衡数据的处理

处理的其实方法挺多的首先看看小Chat怎么说

再看看小Bing怎么说

总结一下

1把少数类的变多就是用各种算法生成新数据填充进去个人觉得有点失真我一般不用这种方法有兴趣的可以自己试试。

2把多数类的变少缺点很明显就是样本量少了。不过个人常用这个方法具体来说就是倾向性评分匹配俗称PSM法。

3用集成学习法也就是使用Xgboost、Catboost等boost字辈的模型其实他们是有参数来处理不平衡数据的后面细说。

所以我介绍的是第二第三种方法。

先从最简单的第三种方法开始吧

三、不平衡数据的处理实战

我就随便拿一个数据来演示了比如说这个数据类别0是1671例类别1是158例两者相差10倍多一丢丢。

1Xgboost调参法

a基础模型

首先用Xgboost的随便一个参数来跑一下

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.30, random_state = 6588)   

#模型构建

boost = xgb.XGBClassifier(

                          n_estimators=200,

                          max_depth=9,

                          min_child_weight=3,

                          subsample=0.9,

                          colsample_bytree=0.9,

                          gamma=0.1,

                          reg_alpha=7,

                          )

boost.fit(X_train, y_train)

看看结果

测试集和测试集的灵敏度和特异度

辣眼睛

此时ROC曲线和AUC值是很好看的

但是敢说这个模型很好么这个就是无脑猜红球的模型是没有什么使用价值的。所以要处理

bscale_pos_weight参数

之前我们在介绍Xgboost的时候传送门其实列出过这个参数

 scale_pos_weight在样本十分不平衡时把这个参数设定为一个正值可以使算法更快收敛。通常可以将其设置为负样本的数目与正样本数目的比值。

我们可以试试调整它那么设置为多少合适呢遇事不决就问小Chat

如TA所说“例如如果负样本数目为1000正样本数目为100那么可以将scale_pos_weight设置为10。”那么我们的负样本0数目是正样本1数目的10倍所以设置为10好像有点猛保守点​先用6试一试

#模型构建

boost = xgb.XGBClassifier(

                          n_estimators=200,

                          max_depth=9,

                          min_child_weight=3,

                          subsample=0.9,

                          colsample_bytree=0.9,

                          scale_pos_weight=6,

                          gamma=0.1,

                          reg_alpha=7,

                          )

boost.fit(X_train, y_train)

看看结果

测试集和测试集的灵敏度和特异度

似乎比基础模型好些了吧就是看起来过拟合了。

要不就大胆点试一试scale_pos_weight=10

看起来测试集的灵敏度52%可能到极限了但是存在过拟合而且特异度还是很高的似乎有在操作的空间。

一顿操作主要调整过拟合的参数min_child_weight=2subsample=0.1reg_alpha=8

#模型构建

boost = xgb.XGBClassifier(

                          n_estimators=800,

                          max_depth=6,

                          min_child_weight=2,

                          subsample=0.1,

                          colsample_bytree=0.5,

                          scale_pos_weight=10,

                          gamma=0.1,

                          reg_alpha=8,



                          )

boost.fit(X_train, y_train)

提升不多

 测试集灵敏度涨了大概0.2左右估计在调调能到56%不过应该不会超过60%了可能数据就这样了吧。不过相较于最初的37%提升了不少了足以说明这个数据不平衡对性能的影响有多大哦。

2Catboost调参法

同样的Catboost模型也会提供一些参数来处理不平衡数据传送门

 同样问一下用法

所以跟Xgboost的参数用法大同小异的这里就不演示了。

3LightGBM调参法

LightGBM模型也会提供一些参数来处理不平衡数据传送门

看起来有点不靠谱。

4RF调参法

既然集成模型都有那么RF应该也有类似功能传送门

看着名字肯定是和Xgboost的参数用法大同小异的这里就不演示了。

四、总结

可以看到通过调整某些模型的特定参数是可以提升不平衡数据的预测性能但是这是指算法层面的调整了肯定是有其上限的。要想继续突破上限只能从数据入手下一步我会介绍如何用PSM进行筛选数据。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: 机器学习