分类平衡目标 y [0,1] 但不平衡特征 x [许多 0 ,少数 1s] ,最大化精度

数据挖掘 喀拉斯 决策树 xgboost
2022-02-17 11:47:17

我有一个简单的数据集,其中包含平衡的目标 y(0 或 1)和不平衡的特征(很多 0,少数 1)

我的目标是获得高精度(不关心召回)

如果我只分配 y=1 if x=1 但是当我训练 DecisionTree、xgboost、randomforest 时,我可以获得 0.53 的高精度,它们都生成模型,只为任何特征值输出 1,即他们找不到那个简单的规则(y =1 if x=1) (使用这些算法我得到的精度仅为 0.38)。

我应该使用什么算法以及如何让一些 ML 算法学习该简单规则以最大化精度,并且不会退化为始终输出 1。

请注意,实际问题将涉及许多功能,因此需要强大的 ML 算法。

# sample synthetic data,  DecisionTree fails to find the simple rule
df=pd.DataFrame({'x':np.random.choice([0, 1], size=10000, p=[.99, .01])})
df['y']=np.random.randint(0,2,10000)
df.loc[df.x==1,'y']=1

#precision by using rule  y=1 if x==1 else y=0
df.query('x==1')['y'].mean() # = 1.0 
1个回答

我有一个简单的数据集,其中包含平衡的目标 y(0 或 1)和不平衡的特征(很多 0,少数 1)

首先,让我注意,如果你只有一个布尔特性,那么使用 ML 是没有意义的:唯一可能的模型可以用简单的if .. else ...

如果我只分配 y=1 if x=1,我可以获得 0.53 的高精度

这仅意味着 53% 的具有 1 作为特征的实例属于 1 类。换句话说,这个分​​数没有考虑到大多数实例,因为大多数实例都具有 0 作为特征。

但是当我训练 DecisionTree、xgboost、randomforest 时,它们都生成模型,只为任何特征值输出 1,即它们找不到那个简单的规则(如果 x=1,y=1)(使用这些算法我得到的精度仅为 0.38) .

这仅仅意味着如果考虑到所有实例,这个规则就不是一个好规则。由于没有更好的选择,模型只是将每个实例预测为多数类。

你的错误是只看精度分数。您还应该考虑召回,这样您会看到多数基线是比此规则更好的选择。或者您可以在这种情况下查看准确性,因为您的课程是平衡的。