Pab*_*ney 7 pipeline ordinal python-3.x scikit-learn valueerror
请对我放轻松。我正在将职业转向数据科学,并且没有 CS 或编程背景——所以我可能会做一些非常愚蠢的事情。我已经研究了几个小时没有成功。
目标:让 Pipeline 与 OrdinalEncoder 一起运行。
问题:代码无法在 OrdinalEncoder 调用下运行。它确实在没有 OrdinalEncoder 的情况下运行。作为最好的,我可以告诉我可以通过两个参数,即类和D型。都不帮忙。
我正在将公共糖尿病数据集传递给模型。这是问题吗?IOW,将高基数特征传递给 OrdinalEncoder 是否会在构建模型后导致训练/测试数据之间出现问题,即测试分割具有训练集没有的值?
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))
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误:
ValueError: Found unknown categories [17.0] in column 0 during transform
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
设置:
The scikit-learn version is 0.20.2.
3.7.2 (v3.7.2:9a3ffc0492, Dec 24 2018, 02:44:43)
[Clang 6.0 (clang-600.0.57)]
sys.version_info(major=3, minor=7, micro=2, releaselevel='final', serial=0)
Run Code Online (Sandbox Code Playgroud)
jrr*_*eda 11
这将解决您的问题:
OrdinalEncoder(handle_unknown='use_encoded_value', unknown_value=-1)
Run Code Online (Sandbox Code Playgroud)
请注意,要实现此功能,您必须使用 Scikit Learn 0.24 或更高版本。
您的问题是模型在测试数据中遇到了它在训练数据中没有看到的值。这可以。您只需将 'handle_unknown' 参数添加到您的编码器。
您应该fit对训练数据(但不是测试数据)进行编码器和缩放器,然后将它们用于transform训练和测试数据。因此,您必须计划测试数据中出现意外值的可能性。
小智 5
我迟到了,但我登陆了这个页面,所以我想无论如何我都会回复。
您在评论中说过:“对于给定的测试/训练分割,糖尿病数据集的许多特征都有太多值,无法反映所有值”
当测试集包含训练期间未看到的数据时,编码器会发生此错误。
我认为 OrdinalEncoder 在这种情况下不是正确的选择。糖尿病数据集由连续特征组成,而不是分类特征。如文档中所述OrdinalEncoder:
该转换器的输入应该是类似整数或字符串的数组,表示分类(离散)特征所采用的值。
话虽如此,如果没有回溯或您的设置的额外输出,我无法明确说明为什么您会收到您所做的错误。我能够使用函数加载的数据成功地拆分并执行上述代码load_diabetes。我的猜测是,在您的情况下,您确实错过了将编码器与类别“17.0”相匹配,但我再次建议在这种情况下使用分类编码器。