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