第二章 数据
补充内容
数据篇(三)讲解了多客群数据的融合过程。本篇文章是对上章内容的补充,目的是讲解如何更合理的融合数据。
在这里,先抛出一个问题。
若观察到模型在某个客群的表现比较差,直接添加相应客群的表现最好的原数据到样本中是否就可以?
本章就是来解答这个问题。之前有提到过不同客群坏账率不一致的问题,坏账率差距过大将导致客群差距过大,差距较大的客群在不同特征上的表现必然也会不一样并最终会反应到模型上。
下面看一张图:
这张图反应的是不同特征在各个客群上的IV值(信息价值),可以观察到同一特征在不同客群上的IV值可能存在很大的差异。这也进一步说明客群会直接影响特征的重要性。
所以,在进行多客群样本融合之前,需要额外对数据做一些处理,减小不同客群的差异带来的影响。
从数据层面来看,可以选择调整样本的坏账率。如果坏账率很小,且样本数量足够,可以选择适当减少“0”样本,从而提升坏账率。
下面给出调整坏账率的函数
def adjust_bad_rate(pri_data_path, bad_rate_limit, target='y'):
"""
pri_data_path: str 数据源路径
bad_rate_limit:int 目标坏账率
"""
df_pri = pd.read_csv(pri_data_path) # 读取想要调整的数据。数据篇(一)有提到我们一般会统一放在一个数据文件夹中
cnt_all = df_pri.shape[0]
bad_rate = df_pri[target].sum() / cnt_all
del_n = int(cnt_all * (1 - bad_rate / bad_rate_limit)) # 需要删除的0样本的个数,和当前坏账和目标坏账率有关
random_indices = np.random.choice(df_pri[df_pri[target] == 0].index, size=del_n, replace=False) # 随机挑选指定个数的需要删除的样本
df_pri = df_pri.drop(random_indices)
print(df_pri.shape[0], df_pri[target].sum(),
df_pri[target].sum() / df_pri.shape[0])
df_pri.to_csv(pri_data_path, index=False)
最终获得处理完之后的样本,并返回到原数据源路径。