Полагаю, в вашем первом вопросе вы не имели в виду обращение к 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
.
Вы также должны изменить метри c на единицу для классификации, так как в каждом из ваших примеров вы используете MAE, который является метрикой регрессии c.
Вот полный пример вашего кода с использованием XGBClassifier
с accuracy
в качестве метри c:
#################################################################
# 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)
Редактирование для адресации дополнительного вопрос в комментарии.
Вы можете использовать метод predict_proba
API xgb
sklearn
, чтобы получить вероятности для каждого класса:
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