【问题标题】:Sklearn Pipelines: Value Error - Expected number of featuresSklearn Pipelines:值错误 - 预期的功能数量
【发布时间】:2021-03-27 19:52:14
【问题描述】:

我创建了一个管道,它基本上循环模型和缩放器并执行递归特征消除 (RFE),如下所示:

def train_models(models, scalers, X_train, y_train, X_val, y_val):
  best_results = {'f1_score': 0}

  for model in models:
    for scaler in scalers:
        for n_features in list(range(
            len(X_train.columns), 
            int(len(X_train.columns)/2), 
            -10
        )):
            rfe = RFE(
                estimator=model, 
                n_features_to_select=n_features, 
                step=10
            )
            
            pipe = Pipeline([
                ('scaler', scaler), 
                ('selector', rfe),
                ('model', model)
            ])

            pipe.fit(X_train, y_train)
            
            y_pred = pipe.predict(X_val)
            results = evaluate(y_val, y_pred) #Returns a dictionary of values
            results['pipeline'] = pipe
            results['y_pred'] = y_pred
            
            if results['f1_score'] > best_results['f1_score']:
                best_results = results
                print("Best F1: {}".format(best_results['f1_score']))
        
  return best_results

管道在函数内部运行良好,能够正确预测和评分结果。

但是,当我在函数外部调用 pipeline.predict() 时,例如

best_result = train_models(models, scalers, X_train, y_train, X_val, y_val)
pipeline = best_result['pipeline']
pipeline.predict(X_val)

我收到以下错误:

这是pipeline 的样子:

Pipeline(steps=[('scaler', StandardScaler()),
                ('selector',
                 RFE(estimator=LogisticRegression(C=1, max_iter=1000,
                                                  penalty='l1',
                                                  solver='liblinear'),
                     n_features_to_select=78, step=10)),
                ('model',
                 LogisticRegression(C=1, max_iter=1000, penalty='l1',
                                    solver='liblinear'))])

我猜测管道中的 model 预计有 48 个功能而不是 78 个,但我不明白数字 48 的来源,因为 n_features_to_select 在上一个 RFE 步骤中设置为 78!

任何帮助将不胜感激!

【问题讨论】:

    标签: python machine-learning scikit-learn pipeline feature-selection


    【解决方案1】:

    我没有你的数据。但是根据你分享的信息做一些数学和猜测,48 似乎是你的嵌套循环尝试的最后一个n_features。这让我怀疑罪魁祸首是浅拷贝。我建议您更改以下内容:

        pipe = Pipeline([
            ('scaler', scaler), 
            ('selector', rfe),
            ('model', model)
        ])
    

        pipe = Pipeline([
            ('scaler', scaler), 
            ('selector', rfe),
            ('model', copy.deepcopy(model))
        ])
    

    然后再试一次(当然,在第一次做 import copy 之后)。

    【讨论】:

      猜你喜欢
      • 2020-10-13
      • 2017-08-22
      • 2017-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-03
      • 1970-01-01
      相关资源
      最近更新 更多