python - 如何处理 sci-kit 学习模型中不断变化的基数
问题描述
我正在尝试在 sci-kit 学习模型中使用高基数特征(siteid),并正在使用 get_dummies 对该特征进行一次性编码。我得到了大约 800 个新的二进制列,它们使用逻辑回归返回了不错的准确性。我的问题是,当我通过我的模型传递一个新数据集时,我在这个特性上有一个不同的基数,比如 300 个唯一值,并且模型正确地问,你训练我的其他 500 列在哪里?我该如何解决这个问题?
我不想在每次基数改变时都训练模型,也不想在我的 SQL 数据加载中对这些列进行硬编码。
cat_columns = ["siteid"]
df = pd.get_dummies(df, prefix_sep="__",
columns=cat_columns)
解决方案
我建议使用 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']])
这将对相同的类别进行热编码,并忽略您的模型不习惯的任何新类别。
推荐阅读
- c - malloc 然后 strcpy 与将其设置为等于字符串之间的区别
- marklogic - MarkLogic:XML 到 JSON 转换中的数组规范
- asp.net - 从 NEST asp.net mvc 中的 elasticsearch 响应中获取亮点
- jquery - 使用ajax重定向到索引
- java - 加载 hdfs 分区文件列表
- ios - 将应用程序上传到应用程序商店是否需要隐私政策 url
- scikit-learn - MXNetError - 数据集没有以有效的幻数开头
- javascript - 有没有一种方法可以同时添加 onkeypress 和 onclick 事件监听器?
- javascript - 为什么在反应中将数据存储在状态中
- javascript - 为什么 parseInt(021, 8) === 15?