Могу ли я использовать XGBoost для усиления других моделей (например, Naive Bayes, Random Forest)? - PullRequest
1 голос
/ 26 октября 2019

Я работаю над проектом по анализу мошенничества, и мне нужна помощь в повышении. Ранее я использовал SAS Enterprise Miner, чтобы больше узнать о методах повышения / ансамбля, и узнал, что повышение может помочь улучшить производительность модели.

В настоящее время моя группа завершила следующие модели на Python: Наивный Байес, Случайный лес и нейронная сеть Мы хотим использовать XGBoost, чтобы улучшить результат Ф1. Я не уверен, возможно ли это, так как я сталкиваюсь только с уроками о том, как делать XGBoost или Naive Bayes самостоятельно.

Я ищу урок, где они покажут вам, как создать наивную байесовскую модельа затем использовать повышение. После этого мы можем сравнить показатели с повышением и без него, чтобы увидеть, улучшилось ли оно. Я относительно новичок в машинном обучении, поэтому могу ошибаться в этом понятии.

Я думал о замене значений в XGBoost, но не уверен, какое из них изменить или можно ли вообще так работать.

Наивный байесовский

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X_sm,y_sm, test_size = 0.2, random_state=0)

from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import confusion_matrix, confusion_matrix, accuracy_score, f1_score, precision_score, recall_score

nb = GaussianNB()
nb.fit(X_train, y_train)
nb_pred = nb.predict(X_test)

XGBoost

from sklearn.model_selection import train_test_split
import xgboost as xgb
from xgboost import XGBClassifier
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X_sm,y_sm, test_size = 0.2, random_state=0)
model = XGBClassifier(base_score=0.5, booster='gbtree', colsample_bylevel=1,
colsample_bynode=1, colsample_bytree=0.9, gamma=0,
learning_rate=0.1, max_delta_step=0, max_depth=10,
min_child_weight=1, missing=None, n_estimators=500, n_jobs=-1,
nthread=None, objective='binary:logistic', random_state=0,
reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=None,
silent=None, subsample=0.9, verbosity=0)

model.fit(X_train, y_train)
y_pred = model.predict(X_test)
predictions = [round(value) for value in y_pred]

1 Ответ

5 голосов
/ 26 октября 2019

В теории , повысить любой (базовый) классификатор легко и просто с помощью scikit-learn's AdaBoostClassifier. Например, для наивного байесовского классификатора должно быть:

from sklearn.ensemble import AdaBoostClassifier
from sklearn.naive_bayes import GaussianNB

nb = GaussianNB()
model = AdaBoostClassifier(base_estimator=nb, n_estimators=10)
model.fit(X_train, y_train)

и т. Д.

В практике , мы никогда используем наивный байесовскийили Нейронные сети как базовые классификаторы для повышения (не говоря уже о случайных лесах, которые сами являются методом ансамбля).

Adaboost (и аналогичные методы повышения, которые были получены впоследствии, такие как GBM и XGBoost) были задуманны с использованием деревьев решений(DT) в качестве базовых классификаторов (более конкретно, решение пни , то есть DT с глубиной только 1);есть веская причина, почему до сих пор, если вы не укажете явно аргумент base_classifier в scikit-learn AdaBoostClassifier выше, он принимает значение DecisionTreeClassifier(max_depth=1), то есть пень решения.

DTпригодны для такого ансамбля, потому что они по существу являются нестабильными классификаторами, что не относится к другим упомянутым алгоритмам, следовательно, последние не должны предлагать что-либо, когда они используются в качестве базовых классификаторов для повышения алгоритмов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...