【问题标题】:'MultiOutputClassifier' object is not iterable when creating a Pipeline (Python)创建管道(Python)时,“MultiOutputClassifier”对象不可迭代
【发布时间】:2021-08-29 16:08:34
【问题描述】:

我想创建一个管道,继续编码、缩放,然后使用 xgboost 分类器解决多标签问题。 代码块;

# Create a boolean mask for categorical columns
categorical_columns = X.columns[X.dtypes == 'O'].tolist()

#Distinct columns for to find catagories
unique_list = [X[c].unique().tolist() for c in categorical_columns]

# Create a boolean mask for numerical columns
numerical_columns = X.columns[X.dtypes != 'O'].tolist()

#Encoding & Scaling objects
scaler = StandardScaler()
ohe = OneHotEncoder(categories=unique_list, sparse=False)

#Define a pipeline
pipeline  = Pipeline([("ohe_onestep", ohe.fit_transform(X[categorical_columns])),  
         ("scaler_onestep", scaler.fit_transform(X[numerical_columns])),
         MultiOutputClassifier(xgb.XGBClassifier(objective='binary:logistic'))])

# Cross-validate the model
cross_val_scores = cross_val_score(pipeline, X, y, 
                                   scoring='accuracy', cv=5)

但是当我运行代码时会出现这个错误; 行是;

> pipeline = Pipeline([("ohe_onestep", ohe.fit_transform(X[categorical_columns])),

'MultiOutputClassifier' 对象不可迭代

我该如何解决这个问题?

【问题讨论】:

    标签: python pandas scikit-learn multilabel-classification


    【解决方案1】:

    两件事:首先,您需要将转换器或估计器自己传递给管道,而不是拟合/转换它们的结果(这会将结果数组而不是转换器提供给管道,它会失败)。管道本身将进行拟合/转换。其次,由于您对特定列有特定的转换,因此需要ColumnTransformer

    把这些放在一起:

    from sklearn.compose import ColumnTransformer
    
    col_transformers = ColumnTransformer([
                              # name, transformer itself, columns to apply
                              ("scaler_onestep", scaler, numerical_columns),
                              ("ohe_onestep", ohe, categorical_columns)])
    
    model = MultiOutputClassifier(xgb.XGBClassifier(objective="binary:logistic"))
    
    pipeline = Pipeline([("preprocessing", col_transformers), ("XGB", model)])
    

    现在你可以做

    cross_val_scores = cross_val_score(pipeline, X, y, 
                                       scoring="accuracy", cv=5)
    

    作为额外的,通常你可以使用 make_column_selectordtype 选项让它推断数字和分类 as exemplified here

    最后,出现错误的原因是:Pipeline 需要一个元组列表。您确实为前两项传递了元组,即scalerohe,但您没有将(<name>, model) 元组作为第三项传递;相反,你直接给它模型,它试图迭代它以获得这些名称等,但失败了。

    【讨论】:

    • 感谢您提供的信息丰富的答案和您编写的代码。你真的指导了我。 :)
    猜你喜欢
    • 2020-02-12
    • 1970-01-01
    • 2018-12-14
    • 2011-09-05
    • 2014-05-27
    • 2021-12-13
    • 2013-12-01
    • 2015-04-14
    • 2022-07-01
    相关资源
    最近更新 更多