首页 > 解决方案 > 如何处理 sci-kit 学习模型中不断变化的基数

问题描述

我正在尝试在 sci-kit 学习模型中使用高基数特征(siteid),并正在使用 get_dummies 对该特征进行一次性编码。我得到了大约 800 个新的二进制列,它们使用逻辑回归返回了不错的准确性。我的问题是,当我通过我的模型传递一个新数据集时,我在这个特性上有一个不同的基数,比如 300 个唯一值,并且模型正确地问,你训练我的其他 500 列在哪里?我该如何解决这个问题?

我不想在每次基数改变时都训练模型,也不想在我的 SQL 数据加载中对这些列进行硬编码。

cat_columns = ["siteid"]

df = pd.get_dummies(df, prefix_sep="__",
                              columns=cat_columns)

标签: pythonpandasmachine-learningscikit-learncardinality

解决方案


我建议使用 scikit-learn 的 OneHotEncoder。

文档在这里

在您的情况下,用法看起来像

from sklearn.preprocessing import OneHotEncoder

enc = OneHotEncoder(handle_unknown='ignore')
enc.fit(df[['cat_columns']])

categories = [cat for cats in enc.categories_ for cat in cats]

df[categories] = enc.transform(df[['cat_columns']])

参数是handle_unknown关键,enc对象是新数据的可重复性所必需的。

在您将运行的新数据帧上

df_new[categories] = enc.transform(df_new[['cat_columns']])

这将对相同的类别进行热编码,并忽略您的模型不习惯的任何新类别。


推荐阅读