为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕盖茨4494581 2022-09-20 17:39:29
我正在使用流水线和网格搜索CV处理工作流。随机森林的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) 问题:如何在随机森林的MWE中使用管道和网格搜索CV技术转换XGBoost的MWE?必须使用 XGB 回归器 () 不支持的“num_class”。如何将随机森林的多类预测输出作为XGBoost(即predict_0,predict_1 predict_2)?示例输出在上述 MWE 中给出。我发现num_class是随机森林分类器不支持的。我花了几天时间研究这个问题,但仍然被阻止了。感谢一些前进的指针。数据:data_train: https://www.dropbox.com/s/bnomyoidkcgyb2y/data_train.csvdata_test: https://www.dropbox.com/s/kn1bgde3hsf6ngy/data_test.csv
查看完整描述

1 回答

?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

我推测,在你的第一个问题中,你不是故意要提到.XGBRegressor


为了允许在管道中运行,您只需更改管道的初始定义:XGBClassifier


params = {

    '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 time

import pandas as pd

import numpy as np

from sklearn.pipeline import Pipeline

from sklearn.metrics import accuracy_score

from sklearn.model_selection import GridSearchCV

from sklearn.model_selection import train_test_split

from sklearn.ensemble import RandomForestClassifier


import 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 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

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

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 needed

acc = 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 features

y_pred = grid_xgb.predict(X_valid)


# Transform numpy array to dataframe

y_pred = pd.DataFrame(y_pred)


# Rearrange dataframe

y_pred.columns = ['prediction']

y_pred.insert(0, 'id', x['id'])

accuracy_score(y_valid, y_pred.prediction)

编辑以解决评论中的其他问题。


您可以使用 的 API 的方法获取每个类的概率:predict_probaxgbsklearn


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_2

0  11066      0.490955      0.436085      0.072961

1  18000      0.718351      0.236274      0.045375

2  16964      0.920252      0.052558      0.027190

3   4795      0.958216      0.021558      0.020226

4   3392      0.306204      0.155550      0.538246


查看完整回答
反对 回复 2022-09-20
  • 1 回答
  • 0 关注
  • 94 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信