【发布时间】:2018-12-05 10:41:44
【问题描述】:
如何告诉 CatBoost 将分类值与少量样本组合在一起。 例如,假设我有一个名为 Country 的列,其中只有 1 个“柬埔寨”样本和 2 个“蒙古”样本,以及 999,998 个其他国家/地区,每个国家/地区至少有 100 个样本。 我想告诉 CatBoost 不要费心在那些稀有国家/地区使用它的 CTR 魔术,而只是将它们视为“其他”。
【问题讨论】:
如何告诉 CatBoost 将分类值与少量样本组合在一起。 例如,假设我有一个名为 Country 的列,其中只有 1 个“柬埔寨”样本和 2 个“蒙古”样本,以及 999,998 个其他国家/地区,每个国家/地区至少有 100 个样本。 我想告诉 CatBoost 不要费心在那些稀有国家/地区使用它的 CTR 魔术,而只是将它们视为“其他”。
【问题讨论】:
假设您有一个 pandas 数据框,并且您有一个要转换的训练/测试集。小代码 sn-p 会将您的低计数转换为“其他”。我设置了 100 的阈值,但是您可以将其更改为您需要的!
基本上,代码会获取计数较低的值列表并将其替换为所需的值。
注意:在转换类别列之前,您可以在列上运行 .value_counts() 以查看其中的内容。
def transform_lowcount_cat(train=train, test=test, colstoreplace=colstoreplace, replaceval = 'other', threshold=100):
for col in colstoreplace:
unique_vals_cat = pd.DataFrame(train[col].value_counts())
low_val_cat = unique_vals_cat[unique_vals_cat[col] < threshold].index.values
train[col].replace(low_val_cat, replaceval, inplace=True)
print(col + ' - TRAIN set transformed')
if test == None:
print('TEST set NOT transformed')
else:
test[col].replace(low_val_cat, replaceval, inplace=True)
print(col + ' - TEST set transformed')
然后您创建一个您希望转换的列/列的列表,并使用您想要的替换值和阈值限制运行代码。请注意,这会进行就地转换。
colstoreplace = ['Col1','Col2']
transform_lowcount_cat(train=train, test=test, colstoreplace=colstoreplace, replaceval='whatever you want!', threshold = 100)
【讨论】: