目标均值编码比使用 GBDT ( XGBoost, CatBoost ) 的序数编码差

数据挖掘 分类 xgboost 准确性 阶级失衡 编码
2022-02-28 23:51:58

我有一个包含23k 行的不平衡数据集 85/15 比率的数据集,10 个变量(其中 9 个是分类变量),我使用CatBoostXGBoost进行二进制分类。我对分类变量应用了cv(5 次迭代循环)均值目标编码,并获得了一定的准确性。分类特征的序数编码比均值编码的准确度更高。这怎么可能?如果我的理解是正确的,意思是目标编码不仅对“对象”类型的变量进行数字编码,而且还排序他们使用它们对目标值的影响,并且数字编码的新变量之间的差异也基于类别对目标的影响 为什么 GBDT随机编码的变量上比“良好编码”的变量表现更好过拟合?还是 GBDT 的( catboost/xgboost )处理序数编码足够好以至于不需要编码?或者是其他东西?

这是我如何使用 alpha = 10 的平滑进行交叉验证均值编码

编辑:通过将平滑值增加到 30 得到了稍微好一点的结果,但与序数编码相比,均值编码仍然表现不佳。

   ## inside the loop
   means1 =  X_val.groupby(column1).bank_account.agg('mean')
   nrows1 = X_val.groupby(column1).size()
   score1 = (np.multiply(means1,nrows1)  + globalmean*alpha) / (nrows1+alpha)
   X_val.loc[:,encoded_column1] = X_val[column1]
   X_val.loc[:,encoded_column1] = X_val[column1].map(score1)
## After the loop is over, i average the encodings for each category across all folds and update the value for my new encoded column
meanz1 = train_new.groupby(column1)[encoded_column1].mean()
train_new[encoded_column1] = train_new[column1].map(meanz1).copy()
0个回答
没有发现任何回复~