我有一个包含23k 行的不平衡数据集 85/15 比率的数据集,10 个变量(其中 9 个是分类变量),我使用CatBoost和XGBoost进行二进制分类。我对分类变量应用了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()