【发布时间】:2020-05-17 09:27:21
【问题描述】:
我有一些pandas.Series - s,下面 - 我想一次性编码。我通过研究发现'b' 级别对于我的预测建模任务并不重要。我可以像这样从我的分析中排除它:
import pandas as pd
from sklearn.preprocessing import OneHotEncoder
s = pd.Series(['a', 'b', 'c']).values.reshape(-1, 1)
enc = OneHotEncoder(drop=['b'], sparse=False, handle_unknown='error')
enc.fit_transform(s)
# array([[1., 0.],
# [0., 0.],
# [0., 1.]])
enc.get_feature_names()
# array(['x0_a', 'x0_c'], dtype=object)
但是当我去转换一个新系列时,一个同时包含'b' 和一个新关卡'd',我得到一个错误:
new_s = pd.Series(['a', 'b', 'c', 'd']).values.reshape(-1, 1)
enc.transform(new_s)
Traceback(最近一次调用最后一次): 文件“”,第 1 行,在 文件“/Users/user/Documents/assets/envs/data-science/venv/lib/python3.7/site-packages/sklearn/preprocessing/_encoders.py”,第 390 行,在转换中 X_int, X_mask = self._transform(X, handle_unknown=self.handle_unknown) 文件“/Users/user/Documents/assets/envs/data-science/venv/lib/python3.7/site-packages/sklearn/preprocessing/_encoders.py”,第 124 行,在 _transform 引发 ValueError(味精) ValueError:在转换期间在第 0 列中发现未知类别 ['d']
这是意料之中的,因为我在上面设置了handle_unknown='error'。但是,我想在拟合和后续转换步骤中完全忽略除['a', 'c'] 之外的所有类。我试过这个:
enc = OneHotEncoder(drop=['b'], sparse=False, handle_unknown='ignore')
enc.fit_transform(s)
enc.transform(new_s)
Traceback(最近一次调用最后一次): 文件“”,第 1 行,在 文件“/Users/user/Documents/assets/envs/data-science/venv/lib/python3.7/site-packages/sklearn/preprocessing/_encoders.py”,第 371 行,在 fit_transform self._validate_keywords() _validate_keywords 中的文件“/Users/user/Documents/assets/envs/data-science/venv/lib/python3.7/site-packages/sklearn/preprocessing/_encoders.py”,第 289 行 "
handle_unknown在 drop 参数为 " 时必须为 'error' ValueError:handle_unknown在指定 drop 参数时必须为 'error',因为两者都会创建全为零的类别。
scikit-learn 似乎不支持这种模式。有谁知道完成这项任务的 scikit-learn 兼容模式?
【问题讨论】:
标签: python machine-learning scikit-learn