Как использовать CalibratedClassifierCV на уже обученной модели xgboost? - PullRequest
0 голосов
/ 29 апреля 2020

Я хочу откалибровать мою модель xgboost, которая уже обучена. Согласно документации:

Если «prefit» пройден, предполагается, что base_estimator уже установлен, и все данные используются для калибровки.

Итак, у меня есть попытался использовать его следующим образом:

import pandas as pd
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from xgboost import XGBClassifier
from sklearn.calibration import CalibratedClassifierCV

X, y = make_classification()
X = pd.DataFrame(X)
X.columns = ['var' + str(i) for i in range(1, 21)]
y = pd.Series(y)

X_train, X_test, y_train, y_test = train_test_split(X, y)

model = XGBClassifier()
model.fit(X_train, y_train)

calibrated = CalibratedClassifierCV(model, method='isotonic', cv='prefit')
calibrated.fit(X_test, y_test)

К сожалению, это привело к следующей ошибке:

ValueError: несоответствие имя_функции: ['var1', 'var2', 'var3 ',' var4 ',' var5 ',' var6 ',' var7 ',' var8 ',' var9 ',' var10 ',' var11 ',' var12 ',' var13 ',' var14 ',' var15 ', 'var16', 'var17', 'var18', 'var19', 'var20'] ['f0', 'f1', 'f2', 'f3', 'f4', 'f5', 'f6', ' f7 ',' f8 ',' f9 ',' f10 ',' f11 ',' f12 ',' f13 ',' f14 ',' f15 ',' f16 ',' f17 ',' f18 ',' f19 ' ] ожидаемых var12, var10, var3, var1, var20, var15, var2, var9, var16, var7, var17, var11, var8, var5, var13, var4, var14, var6, var19, var18 во входных данных обучения данных не было следующие поля: f2, f5, f16, f17, f13, f11, f18, f6, f9, f1, f12, f10, f19, f15, f14, f3, f7, f0, f4, f8

Я считаю, что это может быть связано с тот факт, что объекты хранятся в объекте xgboost под именами по умолчанию f1, f2 et c. Поэтому я попытался переименовать столбцы X_test, используя X_test.rename(lambda x: x.replace('var', 'f'), axis = 1), но это не решает проблему. Поэтому мой вопрос: как я могу исправить эту ошибку и использовать CalibratedClassifierCV на обученной xgboost модели?

1 Ответ

1 голос
/ 29 апреля 2020

Pandas вызывает проблему. У вас есть имена столбцов, переданные моделям sklearn, что НЕПРАВИЛЬНО.

Используйте X_train, X_test, y_train, y_test = train_test_split(X.values, y.values), и все будет работать нормально.

Вам нужно передать массивы numpy в любую функцию sklearn для полная совместимость

Полный код:

import pandas as pd
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from xgboost import XGBClassifier
from sklearn.calibration import CalibratedClassifierCV

X, y = make_classification()
X = pd.DataFrame(X)
X.columns = ['var' + str(i) for i in range(1, 21)]
y = pd.Series(y)

X_train, X_test, y_train, y_test = train_test_split(X.values, y.values)

model = XGBClassifier()
model.fit(X_train, y_train)

calibrated = CalibratedClassifierCV(model, method='isotonic', cv='prefit')
calibrated.fit(X_test, y_test)
...