Pipeline和GridSearchCV,以及XGBoost和RandomForest的多类别挑战

我正在使用Pipeline和GridSearchCV进行工作流程的开发。

RandomForest的MWE如下所示,

################################################################## Libraries#################################################################import timeimport pandas as pdimport numpy as npfrom sklearn.pipeline import Pipelinefrom sklearn.model_selection import GridSearchCVfrom sklearn.model_selection import train_test_splitfrom 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 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#################################################################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) ################################################################## Modeling#################################################################start_time = time.time()grid_rf.fit(X_train, y_train)#Calculate the score once and use when neededmae = grid_rf.score(X_valid,y_valid)print("Best params                        : %s" % grid_rf.best_params_)print("Best training data MAE score       : %s" % grid_rf.best_score_)    print("Best validation data MAE score (*) : %s" % mae)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_rf.predict(x)# Transform numpy array to dataframey_pred = pd.DataFrame(y_pred)# Rearrange dataframey_pred.columns = ['prediction']y_pred.insert(0, 'id', x['id'])# Save to CSVy_pred.to_csv("data_predict.csv", index = False, header=True)#Output# id,prediction# 11066,0# 18000,2# 16964,0# ...., ....

如下是XGBoost的MWE

################################################################## Libraries#################################################################import timeimport numpy as npimport pandas as pdfrom sklearn.model_selection import train_test_splitimport xgboost as xgbfrom sklearn.pipeline import Pipelinefrom sklearn.model_selection import GridSearchCV################################################################## Data loading and Symlinks#################################################################train = pd.read_csv("data_train.csv")test = pd.read_csv("data_test.csv")################################################################## 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)################################################################## DMatrix#################################################################dtrain = xgb.DMatrix(data=X_train, label=y_train)dtest = xgb.DMatrix(data=test)params = {    'max_depth': 6,    'objective': 'multi:softprob',  # error evaluation for multiclass training    'num_class': 3,    'n_gpus': 0}################################################################## Modeling#################################################################start_time = time.time()bst = xgb.train(params, dtrain)################################################################## Prediction##################################################################Predict using the test data with selected featuresy_pred = bst.predict(dtest)# Transform numpy array to dataframey_pred = pd.DataFrame(y_pred)# Rearrange dataframey_pred.columns = ['prediction_0', 'prediction_1', 'prediction_2']y_pred.insert(0, 'id', x['id'])# Save to CSVy_pred.to_csv("data_predict_xgb.csv", index = False, header=True)# Expected Output:# id,prediction_0,prediction_1,prediction_2# 11066,0.4674369,0.46609518,0.06646795# 18000,0.7578633,0.19379888,0.048337903# 16964,0.9296321,0.04505246,0.025315404# ...., ...., ...., ....

问题:

  1. 如何将XGBoost的MWE转换为使用Pipeline和GridSearchCV技术的RandomForest的MWE?需要使用’num_class’,但XGBRegressor()不支持这个参数。

  2. 如何让RandomForest输出多类别的预测结果,如XGBoost那样(即predict_0, predict_1, predict_2)?上述MWE中给出了样本输出。我发现RandomForestClassifier不支持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

回答:

我猜你在第一个问题中并不是指XGBRegressor

为了让XGBClassifier在pipeline中运行,你只需更改pipeline的初始定义:

params = {    'max_depth': 6,    'objective': 'multi:softprob',    'num_class': 3,    'n_gpus': 0}pipe_xgb = Pipeline([    ('clf', xgb.XGBClassifier(**params))])

(注意:我已经将pipeline名称改为pipe_xgb,所以你需要在代码的其他部分也进行相应的更改。)

正如从这个问题的答案中可以看到,如果目标变量中有超过两个类别,XGBoost会自动切换到多类别分类。所以你既不能,也没必要指定num_class

你还应该将度量标准更改为分类度量标准,因为在你的每个例子中都使用了MAE,这是一个回归度量标准。

这里是一个完整的示例代码,使用XGBClassifier并以accuracy作为度量标准:

################################################################## 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)

编辑以回答评论中的额外问题。

你可以使用xgbsklearnAPI的predict_proba方法来获取每个类别的概率:

y_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

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注