1

pandas categorical https://pandas.pydata.org/pandas-docs/stable/categorical.html如何处理新的和看不见的关卡?我正在考虑一个类似 scikit-learn 的设置。目前,我有类似的东西: https ://gist.github.com/geoHeil/5caff5236b4850d673b2c9b0799dc2ce

def: fit() 
  for each column:
   fit a label encoder:
def: transform()
  for each column:
     check if column was unseen
       yes(unseen) replace 
       no: label encode

但这很慢。

显然,像 xgboost 或 lightbm 这样的决策树可以直接处理分类数据,即不需要手动处理这种缓慢的转换。但是当查看他们的代码 https://github.com/Microsoft/LightGBM/blob/master/python-package/lightgbm/sklearn.py#L532时,他们似乎使用LGBMLabelEncoder的是标准的 scikit-learn LabelEncoder

我想知道如何处理看不见的数据。

如果需要手动转换,pandas.Categorical 是否允许更快的转换——即使新数据中有未见过的级别?

编辑

请参阅https://github.com/geoHeil/pythonQuestions/blob/master/categorical-encoding.ipynb了解我如何无法让 scikit-learn 的常见嫌疑人工作的概述。仍在寻找比我的解决方案更高效的东西。lightGBM https://github.com/Microsoft/LightGBM/issues/789还建议使用自定义编码策略。

4

1 回答 1

0

可能有一个 pandas 解决方案,但它可能最适合 sklearns LabelBinarizer

from sklearn.preprocessing import LabelBinarizer
df= pd.DataFrame({'A':['a','b','c','a']})
lb = LabelBinarizer()
lb.fit(df["A"])
lb.transform(df["A"])

[[1 0 0]
 [0 1 0]
 [0 0 1]
 [1 0 0]]

df2 = pd.DataFrame({'A':['a','b','d']})
lb.transform(df2['A'])
[[1 0 0]
 [0 1 0]
 [0 0 0]]

所以我们看到“d”本质上既不映射到“a”、“b”也不映射到“c”。但是请注意,有一个错误可能会在下一个 sklearn 版本中得到解决。

LabelBinarizer 在训练期间适合并调用传递给它的值。新值被映射到全零。使用 pandas get_dummies 编写一个转换器(如编辑前所见)可能更可行。

由于列的名称匹配,这可能非常简单。在第一步中拟合并存储列名,而不仅仅是在转换步骤中进行转换,而是只保留您在拟合中标识的列名(如果测试集中不存在训练级别,可能会添加 zome zero 列)。然后你就完成了;)

于 2017-08-17T11:58:02.560 回答