如何在已经训练好的xgboost模型上使用CalibratedClassifierCV?

问题描述 投票:0回答:1

我想对已经训练好的xgboost模型进行校准,请问如何使用CalibratedClassifierCV?根据文档。

如果传递了 "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: feature_names mismatch: ['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对象中,默认名称为 "xgboost"。f1, f2 等。因此,我曾尝试将 X_test 列使用 X_test.rename(lambda x: x.replace('var', 'f'), axis = 1)但这并不能解决这个问题。所以我的问题是:我怎样才能解决这个错误,并使用 CalibratedClassifierCV 训练有素 xgboost 模型?

python scikit-learn xgboost sklearn-pandas
1个回答
1
投票

潘达斯导致的问题。你传递给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)
© www.soinside.com 2019 - 2024. All rights reserved.