管道OrdinalEncoder ValueError找到未知类别

时间:2019-02-22 22:27:06

标签: python-3.x scikit-learn pipeline valueerror ordinal

请放心。我正在将职业转移到数据科学领域,没有CS或编程背景,所以我可能做的事情非常愚蠢。我研究了几个小时都没有成功。

目标:使管道与OrdinalEncoder一起运行。

问题:带有OrdinalEncoder调用的代码无法运行。它确实不带OrdinalEncoder运行。据我所知,我可以传递两个参数,即 categories dtype 。都没有帮助。

我正在将公开diabetes data设置为模型。这是问题吗? IOW,将高基数特征传递给OrdinalEncoder会在模型建立后在火车/测试数据之间引起问题,即测试分割的值是否为火车集合没有的值?

{
  ["x-ms-range"]=>"bytes=3000000-5999999"
  ["content-length"]=>3000000
  ["x-ms-write"]=>"Update"
}

这是我遇到的错误:

from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import OrdinalEncoder
from sklearn.ensemble import RandomForestClassifier

pipe = Pipeline([
    ('imputer', SimpleImputer()),
    ('ordinal_encoder', OrdinalEncoder()),
    ('classifier', RandomForestClassifier(criterion='gini', n_estimators=100))])

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

# Construct model
model = pipe.fit(X_train, y_train)

# Show results
print("Hold-out AUC score: %.3f" %roc_auc_score(model.predict_proba(X_test),y_test))

我在做什么错了?

设置:

ValueError: Found unknown categories [17.0] in column 0 during transform

7 个答案:

答案 0 :(得分:2)

您的问题是模型在测试数据中遇到了训练数据中未曾看到的值。这可以。您只需要在编码器中添加'handle_unknown'参数即可。

您应该fit对训练数据(而不是测试数据)进行编码和缩放,然后将它们用于transform训练和测试数据。因此,您必须计划测试数据中可能出现意外值的可能性。

答案 1 :(得分:1)

我遇到了完全相同的问题,我只是使用了 OneHotEncoder(handle_unknown='ignore') 而不是 OneHotEncoder() 并且问题得到了解决。

答案 2 :(得分:0)

在这种情况下,我认为OrdinalEncoder不是正确的选择。糖尿病数据集由连续特征而不是分类特征组成。如OrdinalEncoder的文档所述:

  

此转换器的输入应为类似整数或字符串的数组,表示分类(离散)特征所采用的值。

话虽这么说,但没有追溯或您的设置的额外输出,我不能确切地说出为什么会收到错误。我能够使用load_diabetes函数加载的数据成功拆分并执行上述代码。我的猜测是,在您的情况下,您确实错失了将编码器与类别“ 17.0”配合使用的情况,但是在这种情况下,我不建议您使用分类编码器。

答案 3 :(得分:0)

我在进行ColumnTransformer()操作的“ OneHoteEncoder()”操作时遇到了同样的错误,我怀疑这是因为编码器需要将2D数组输入到编码器中。

您可以尝试使用.apply(lambda x: [x])或一些与序数值类似的函数来增加其条件性。

答案 4 :(得分:0)

我迟到了游戏,但是我登陆了此页面,所以我想我还是会回复。

您在评论中说过:“ 对于给定的测试/训练划分,糖尿病数据集的许多功能中的值太多,都无法反映所有值

当测试集包含训练期间未看到的数据时,编码器会发生此错误。

答案 5 :(得分:0)

我遇到了同样的问题,对X进行编码,然后分派给我和培训人员。分割前进行编码使所有类别都被注册

答案 6 :(得分:0)

我会考虑在训练期间将序数值存储为json文件,并在测试时读取相同的编码。在测试或评估之前,应对未看到的进入测试数据集的任何新值进行处理。