失踪人口回归的第一期,来说一说不平衡数据。
一、不平衡数据的概念
什么是不平衡数据?我们先来看看小Chat怎么说的:
顾名思义,就是你的因变量1和0的样本数差距有点大,大到影响了模型性能。举个栗子,一个盒子里有100个红球,10个黄球,我们随机盲抽一个球,然后猜颜色,你会怎么猜?是不是无脑猜红球就得了。这么训练的话,模型永远达不到我们的要求。
二、不平衡数据的处理
处理的其实方法挺多的,首先看看小Chat怎么说:
再看看小Bing怎么说:
总结一下:
(1)把少数类的变多:就是用各种算法生成新数据填充进去,个人觉得有点失真,我一般不用这种方法,有兴趣的可以自己试试。
(2)把多数类的变少:缺点很明显,就是样本量少了。不过个人常用这个方法,具体来说就是倾向性评分匹配,俗称PSM法。
(3)用集成学习法:也就是使用Xgboost、Catboost等boost字辈的模型,其实他们是有参数来处理不平衡数据的,后面细说。
所以,我介绍的是第二第三种方法。
先从最简单的第三种方法开始吧:
三、不平衡数据的处理实战
我就随便拿一个数据来演示了,比如说这个数据,类别0是1671例,类别1是158例,两者相差10倍多一丢丢。
(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值是很好看的:
但是,敢说这个模型很好么?这个就是无脑猜红球的模型,是没有什么使用价值的。所以,要处理!
(b)scale_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=2、subsample=0.1和reg_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模型也会提供一些参数来处理不平衡数据(传送门):
同样,问一下用法:
(3)LightGBM调参法
LightGBM模型也会提供一些参数来处理不平衡数据(传送门):
看起来有点不靠谱。
(4)RF调参法
既然集成模型都有,那么RF应该也有类似功能(传送门):
看着名字,肯定是和Xgboost的参数用法大同小异的,这里就不演示了。
四、总结
可以看到,通过调整某些模型的特定参数,是可以提升不平衡数据的预测性能,但是这是指算法层面的调整了,肯定是有其上限的。要想继续突破上限,只能从数据入手,下一步我会介绍如何用PSM进行筛选数据。