Python 使用从pandas数据框构建的模型绘制部分依赖关系

Python 使用从pandas数据框构建的模型绘制部分依赖关系,python,pandas,dataframe,plot,Python,Pandas,Dataframe,Plot,我有一个从熊猫数据帧训练的模型。它可以毫无问题地预测数据帧输入: from xgboost import XGBClassifier clf = XGBClassifier() clf = clf.fit(X_train, y_train) # X_train is a pandas dataFrame with 5 columns: a,b,c,d,e. clf.predict_proba(X_train) 但是,当我使用精确的数据和模型绘制部分依赖关系图时,我有以下错误: ValueEr

我有一个从熊猫数据帧训练的模型。它可以毫无问题地预测数据帧输入:

from xgboost import XGBClassifier
clf = XGBClassifier()
clf = clf.fit(X_train, y_train) # X_train is a pandas dataFrame with 5 columns: a,b,c,d,e.
clf.predict_proba(X_train) 
但是,当我使用精确的数据和模型绘制部分依赖关系图时,我有以下错误:

ValueError: feature_names mismatch: ['a', 'b', 'c', 'd', 'e'] ['f0', 'f1', 'f2', 'f3', 'f4']
expected b, a, d, c, e in input data
training data did not have the following fields: f2, f3, f1, f0, f4
我使用的代码是:

plot_partial_dependence(estimator=clf, X=X_train, features=[0,1])
我知道我可以在训练模型之前将X_train转换为numpy.ndarray,它解决了问题。但是,由于实际的分类器非常大,而且已经花了很长时间进行训练,因此我想重新使用用pandas dataframe训练的分类器

有办法吗?多谢各位

编辑OP以包含一些示例数据:

X_列车头(10):

y_列车头(10):


恭喜你!您发现
sklearn
xgboost
之间存在缺陷

使用回溯来指导我,我将一个
打印(data.feature\u name)
作为输入的第一行。当我运行您的方法(使用我创建的虚拟数据)时,我得到如下输出:

['a', 'b', 'c', 'd', 'e']
.
.
.
['a', 'b', 'c', 'd', 'e']
['f0', 'f1', 'f2', 'f3', 'f4']
要素名称正确的前几行来自拟合模型。显然,在进行拟合时,可以设置特征名称。最后一行来自调用
plot\u partial\u dependency
。似乎sklearn无法使用此方法将列名传播到xgboost,因此后者默认为“f0”、“f1”等

警告:我不确定以下面描述的方式禁用功能验证是否会产生不利影响(即,功能名称混淆)。很难说什么时候像我一样使用虚拟数据。对由此产生的部分依赖图持保留态度。作为预防措施,您可能需要对照sklearn的GradientBoostingClassifier检查XGBClassifier的结果。或者,在培训之前,将列重命名为['f0','f1','f2','f3','f4']

从好的方面来说,你不需要改变列名就可以解决这个问题。理想情况下,
plot\u partial\u dependency
函数将允许我们指定要传递给
response\u方法的关键字参数列表(即
clf.predict\u proba
),因为理想情况下我们将传递
validate\u features=False
。为了替代此接口,我提出了以下破解方案:

# store keyword argument default values
tmpdefaults = XGBClassifier.predict_proba.__defaults__
# change default value of validate_features to False
XGBClassifier.predict_proba.__defaults__ = (None, False)

# plot
plot_partial_dependence(estimator=clf, X=X_train, features=[0, 1], feature_names=X_train.columns.tolist())
plt.show()

# reset default keyword argument values to original
XGBClassifier.predict_proba.__defaults = tmpdefaults

当您调用
plot\u partial\u dependence
时,可以尝试
X=X\u train[['b','a','d','c','e']]
以防像列的顺序这样愚蠢。谢谢您的评论。但是,我试过了,仍然看到相同的错误。因此,我的下一步将是检查数据帧。请您编辑您的帖子,将
X\u train.head()
的输出也包括在内,或者
y\u train.head()
的输出也包括在内。下面是对不同
sklearn
类的行为的另一种解释:
['a', 'b', 'c', 'd', 'e']
.
.
.
['a', 'b', 'c', 'd', 'e']
['f0', 'f1', 'f2', 'f3', 'f4']
# store keyword argument default values
tmpdefaults = XGBClassifier.predict_proba.__defaults__
# change default value of validate_features to False
XGBClassifier.predict_proba.__defaults__ = (None, False)

# plot
plot_partial_dependence(estimator=clf, X=X_train, features=[0, 1], feature_names=X_train.columns.tolist())
plt.show()

# reset default keyword argument values to original
XGBClassifier.predict_proba.__defaults = tmpdefaults