流水线和网格搜索CV,以及XGBoost和随机森林的多类挑战

我正在使用流水线和网格搜索CV处理工作流。


随机森林的MWE,如下所示,


#################################################################

# Libraries

#################################################################

import time

import pandas as pd

import numpy as np

from sklearn.pipeline import Pipeline

from sklearn.model_selection import GridSearchCV

from sklearn.model_selection import train_test_split

from sklearn.ensemble import RandomForestClassifier


#################################################################

# Data loading and Symlinks

#################################################################

train = pd.read_csv("data_train.csv")

test = pd.read_csv("data_test.csv")


#################################################################

# Train Test Split

#################################################################

# Selected features - Training data

X = train.drop(columns='fault_severity')


# Training data

y = train.fault_severity


# Test data

x = test


# Break off validation set from training data

X_train, X_valid, y_train, y_valid = train_test_split(X, y, train_size=0.8, test_size=0.2, random_state=0)


#################################################################

# Pipeline

#################################################################

pipe_rf = Pipeline([

    ('clf', RandomForestClassifier(random_state=0))

    ])


parameters_rf = {

        'clf__n_estimators':[30,40], 

        'clf__criterion':['entropy'], 

        'clf__min_samples_split':[15,20], 

        'clf__min_samples_leaf':[3,4]

    }


grid_rf = GridSearchCV(pipe_rf,

    param_grid=parameters_rf,

    scoring='neg_mean_absolute_error',

    cv=5,

    refit=True) 


问题:

  1. 如何在随机森林的MWE中使用管道和网格搜索CV技术转换XGBoost的MWE?必须使用 XGB 回归器 () 不支持的“num_class”。

  2. 如何将随机森林的多类预测输出作为XGBoost(即predict_0,predict_1 predict_2)?示例输出在上述 MWE 中给出。我发现num_class是随机森林分类器不支持的。

我花了几天时间研究这个问题,但仍然被阻止了。感谢一些前进的指针。

数据:

  1. data_train: https://www.dropbox.com/s/bnomyoidkcgyb2y/data_train.csv

  2. data_test: https://www.dropbox.com/s/kn1bgde3hsf6ngy/data_test.csv


慕盖茨4494581
浏览 96回答 1
1回答

慕田峪4524236

我推测,在你的第一个问题中,你不是故意要提到.XGBRegressor为了允许在管道中运行,您只需更改管道的初始定义:XGBClassifierparams = {    'max_depth': 6,    'objective': 'multi:softprob',    'num_class': 3,    'n_gpus': 0}pipe_xgb = Pipeline([    ('clf', xgb.XGBClassifier(**params))])(注意:我已将管道名称更改为 ,因此您需要在代码的其余部分中更改此名称。pipe_xgb从这个问题的答案可以看出,如果目标变量中有两个以上的类,XGBoost 会自动切换到多类分类。因此,您既不能也不需要指定 。num_class您还应该将指标更改为一个用于分类,因为在每个示例中,您都使用 MAE,这是一个回归指标。下面是一个完整的代码示例,使用 with 作为指标:XGBClassifieraccuracy################################################################## Libraries#################################################################import timeimport pandas as pdimport numpy as npfrom sklearn.pipeline import Pipelinefrom sklearn.metrics import accuracy_scorefrom sklearn.model_selection import GridSearchCVfrom sklearn.model_selection import train_test_splitfrom sklearn.ensemble import RandomForestClassifierimport xgboost as xgb################################################################## Data loading and Symlinks#################################################################train = pd.read_csv("https://dl.dropbox.com/s/bnomyoidkcgyb2y/data_train.csv?dl=0")test = pd.read_csv("https://dl.dropbox.com/s/kn1bgde3hsf6ngy/data_test.csv?dl=0")################################################################## Train Test Split################################################################## Selected features - Training dataX = train.drop(columns='fault_severity')# Training datay = train.fault_severity# Test datax = test# Break off validation set from training dataX_train, X_valid, y_train, y_valid = train_test_split(X, y, train_size=0.8, test_size=0.2, random_state=0)################################################################## Pipeline#################################################################params = {    'max_depth': 6,    'objective': 'multi:softprob',  # error evaluation for multiclass training    'num_class': 3,    'n_gpus': 0}pipe_xgb = Pipeline([    ('clf', xgb.XGBClassifier(**params))    ])parameters_xgb = {        'clf__n_estimators':[30,40],         'clf__criterion':['entropy'],         'clf__min_samples_split':[15,20],         'clf__min_samples_leaf':[3,4]    }grid_xgb = GridSearchCV(pipe_xgb,    param_grid=parameters_xgb,    scoring='accuracy',    cv=5,    refit=True)################################################################## Modeling#################################################################start_time = time.time()grid_xgb.fit(X_train, y_train)#Calculate the score once and use when neededacc = grid_xgb.score(X_valid,y_valid)print("Best params                        : %s" % grid_xgb.best_params_)print("Best training data accuracy        : %s" % grid_xgb.best_score_)    print("Best validation data accuracy (*)  : %s" % acc)print("Modeling time                      : %s" % time.strftime("%H:%M:%S", time.gmtime(time.time() - start_time)))################################################################## Prediction##################################################################Predict using the test data with selected featuresy_pred = grid_xgb.predict(X_valid)# Transform numpy array to dataframey_pred = pd.DataFrame(y_pred)# Rearrange dataframey_pred.columns = ['prediction']y_pred.insert(0, 'id', x['id'])accuracy_score(y_valid, y_pred.prediction)编辑以解决评论中的其他问题。您可以使用 的 API 的方法获取每个类的概率:predict_probaxgbsklearny_pred = pd.DataFrame(grid_xgb.predict_proba(X_valid),                      columns=['prediction_0', 'prediction_1', 'prediction_2'])y_pred.insert(0, 'id', x['id'])使用上面的代码,具有以下格式:y_pred      id  prediction_0  prediction_1  prediction_20  11066      0.490955      0.436085      0.0729611  18000      0.718351      0.236274      0.0453752  16964      0.920252      0.052558      0.0271903   4795      0.958216      0.021558      0.0202264   3392      0.306204      0.155550      0.538246
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python