在 cross_validate() 函数中使用 Pipeline 来测试不同的机器学习算法

Posted

技术标签:

【中文标题】在 cross_validate() 函数中使用 Pipeline 来测试不同的机器学习算法【英文标题】:Using Pipeline in a cross_validate() function for testing different ML algorithms 【发布时间】:2022-01-22 01:04:42 【问题描述】:

我有一个包含 17 个特征 (x) 和二元分类结果 (y) 的数据集。我已经准备好数据集并对其执行了train_test_split()。我正在使用以下脚本在数据集上运行不同的 ML 算法以进行比较:

def run_exps(X_train: pd.DataFrame , y_train: pd.DataFrame, X_test: pd.DataFrame, y_test: pd.DataFrame) -> pd.DataFrame:
  
  # Lightweight script to test many models and find winners
  # :param X_train: training split
  # :param y_train: training target vector
  # :param X_test: test split
  # :param y_test: test target vector
  # :return: DataFrame of predictions

  models = [
            ('LogReg', LogisticRegression()),
            ('RF', RandomForestClassifier()),
            ('KNN - Euclidean', KNeighborsClassifier(metric='euclidean')),
            ('SVM', SVC()),
            ('XGB', XGBClassifier(use_label_encoder =False, eval_metric='error'))
            ]

  names = []
  scoring = ['accuracy', 'precision_weighted', 'recall_weighted', 'f1_weighted', 'roc_auc']

  # For Loop that takes each model and perform training, cross validation, prediction and evaluation
  for name, model in models:

    # Making pipleline that normalize, oversmaple the dataset
    pipe = Pipeline([
            ('normalization', MinMaxScaler()),
            ('oversampling', SMOTE())
    ])

    kfold = StratifiedKFold(n_splits=5)

    # How can I call the pipeline inside the cross_validate() Function ?
    cv_results = cross_validate(model, X_train, y_train, cv=kfold, scoring=scoring, verbose=3)

    clf = model.fit(X_train, y_train)
    y_pred = clf.predict(X_test)

    print('''
    
    
    
    ''' .format(name, classification_report(y_test, y_pred), confusion_matrix(y_test, y_pred)))

    names.append(name)

我注意到,在我运行脚本之前,我使用的数据需要进行标准化和过采样。

但是,由于我在脚本中使用了cross_validate() 函数,因此我需要对每个折叠执行归一化和过采样。

为了做到这一点,我在 for 循环(获取每个模型并执行训练、交叉验证、预测和评估)内创建了一个管道(对数据集进行规范化和过采样),但我不知道如何调用由于cross_validate() 中的estimator 参数已经使用model 变量来执行基于它的预测,因此管道。

这种情况我该怎么办?

【问题讨论】:

【参考方案1】:

您可以将您的模型集成到您的管道中,然后在您的管道上调用cross_validate,如下所示:

pipe = Pipeline([
            ('normalization', MinMaxScaler()),
            ('oversampling', SMOTE()),
            ('name', model)
])

cv_results = cross_validate(pipe, X_train, y_train, cv=kfold, scoring=scoring, verbose=3)

【讨论】:

以上是关于在 cross_validate() 函数中使用 Pipeline 来测试不同的机器学习算法的主要内容,如果未能解决你的问题,请参考以下文章

管道中的自定义 sklearn 转换器为 cross_validate 抛出 IndexError 但在使用 GridSearchCV 时不会

使用 cross_validate 生成混淆矩阵

使用 cross_validate 的结果制作 ROC 曲线?

由于不可克隆性,将 KerasRegressor 与 cross_validate 一起使用失败

如何在 scikit learn 中为 cross_validate 制作自定义评分指标?

嵌套交叉验证:cross_validate 如何处理 GridSearchCV 作为其输入估计器?