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

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

一、不平衡数据的概念

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

第34步 机器学习实战DLC:不平衡数据处理(上)_第1张图片 顾名思义,就是你的因变量1和0的样本数差距有点大,大到影响了模型性能。举个栗子,一个盒子里有100个红球,10个黄球,我们随机盲抽一个球,然后猜颜色,你会怎么猜?是不是无脑猜红球就得了。这么训练的话,模型永远达不到我们的要求。

二、不平衡数据的处理

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

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

再看看小Bing怎么说:

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

总结一下:

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

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

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

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

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

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

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

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

(1)Xgboost调参法

(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值是很好看的:

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

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

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

(b)scale_pos_weight参数:

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

第34步 机器学习实战DLC:不平衡数据处理(上)_第7张图片 scale_pos_weight:在样本十分不平衡时,把这个参数设定为一个正值,可以使算法更快收敛。通常可以将其设置为负样本的数目与正样本数目的比值。

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

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

如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%,提升了不少了,足以说明这个数据不平衡对性能的影响有多大哦。

(2)Catboost调参法

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

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

 同样,问一下用法:

第34步 机器学习实战DLC:不平衡数据处理(上)_第10张图片所以跟Xgboost的参数用法大同小异的,这里就不演示了。

(3)LightGBM调参法

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

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

看起来有点不靠谱。

(4)RF调参法

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

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

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

四、总结

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

你可能感兴趣的:(《100,Steps,to,Get,ML》—JET学习笔记,机器学习,python,人工智能)