我想对已经训练好的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
模型?
潘达斯导致的问题。你传递给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)