我正在使用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# ...., ...., ...., ....
问题:
-
如何将XGBoost的MWE转换为使用Pipeline和GridSearchCV技术的RandomForest的MWE?需要使用’num_class’,但XGBRegressor()不支持这个参数。
-
如何让RandomForest输出多类别的预测结果,如XGBoost那样(即predict_0, predict_1, predict_2)?上述MWE中给出了样本输出。我发现RandomForestClassifier不支持num_class参数。
我已经花了几天时间在这个问题上,还是被卡住了。希望能得到一些建议来继续前进。
数据:
- data_train: https://www.dropbox.com/s/bnomyoidkcgyb2y/data_train.csv
- 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)
编辑以回答评论中的额外问题。
你可以使用xgb
的sklearn
API的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