【发布时间】:2017-08-17 06:23:51
【问题描述】:
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 建议使用自定义编码策略。
【问题讨论】:
-
Pandas.Categorical 只是用 Nan 填充它们。 Scikit-learn 也不处理新数据,它们很可能会被删除或替换为 Nan。尝试对未见数据使用 LabelEncoder,您将获得
ValueError: y contains new labels:。 -
为什么这个问题被否决了?我想一个小的可重复数据集和一个期望的数据集可以帮助更好地理解问题......
-
@MaxU 也许是因为在我看来它更多的是算法方法问题而不是编程问题。这是机器学习中关于如何处理看不见的数据的常见问题,Cross-validated 是解决此问题的正确位置。
-
我没有足够的权限自己这样做。如果其他人也有这种感觉,那么只有它可以被移动。这只是我的看法,但我认为这可能会得到更好的关注。
-
真正的解决方案是在github.com/scikit-learn/scikit-learn/pull/9151 和github.com/scikit-learn/scikit-learn/pull/9012 中,遗憾的是它们还没有合并。 LabelEncoder + OneHotEncoder 或 LabelBinarizer 或 CountVectorizer(tokenizer=lambda x: x) 都是可能的解决方法(尽管没有一个很好)。
标签: python pandas scikit-learn categorical-data lightgbm