如何从 scikit-learn 中与 predict_proba 一起使用的 cross_val_predict 获取类标签
Posted
技术标签:
【中文标题】如何从 scikit-learn 中与 predict_proba 一起使用的 cross_val_predict 获取类标签【英文标题】:How to get classes labels from cross_val_predict used with predict_proba in scikit-learn 【发布时间】:2017-01-08 10:31:12 【问题描述】:我需要使用 3 折交叉验证来训练 Random Forest classifier。对于每个样本,当它恰好在测试集中时,我需要检索预测概率。
我正在使用 scikit-learn 版本 0.18.dev0。
此新版本添加了使用方法cross_val_predict() 和附加参数method
来定义估计器需要哪种预测的功能。
在我的例子中,我想使用predict_proba() 方法,它在多类场景中返回每个类的概率。
但是,当我运行该方法时,我会得到预测概率矩阵,其中每一行代表一个样本,每一列代表特定类的预测概率。
问题是方法没有指明每一列对应哪个类。
我需要的值是相同的(在我的情况下使用RandomForestClassifier
)在属性classes_中返回定义为:
classes_ : 形状数组 = [n_classes] 或此类数组的列表 类标签(单输出问题),或类标签数组列表(多输出问题)。
predict_proba()
需要它,因为在其文档中写道:
类的顺序与属性classes_中的顺序相对应。
一个最小的例子如下:
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_predict
clf = RandomForestClassifier()
X = np.random.randn(10, 10)
y = y = np.array([1] * 4 + [0] * 3 + [2] * 3)
# how to get classes from here?
proba = cross_val_predict(estimator=clf, X=X, y=y, method="predict_proba")
# using the classifier without cross-validation
# it is possible to get the classes in this way:
clf.fit(X, y)
proba = clf.predict_proba(X)
classes = clf.classes_
【问题讨论】:
对于您无法访问y
的情况?
@juanpa.arrivillaga 我可以访问y
,但我不知道标签的排序顺序。我可能推测它们是按升序排列的,但我不完全确定。
抱歉,我还没有 0.18,所以我无法对此进行测试,这可能很明显,但 clf
对象现在不包含 classes_
属性吗?跨度>
Np。不,我对其进行了测试,但它没有 classes_
属性。也许分类器被复制到cross_val_predict()
方法中,而原始的没有更新。
你是对的!它does.
【参考方案1】:
是的,它们将按排序顺序排列;这是因为DecisionTreeClassifier
(这是RandomForestClassifier
的默认base_estimator
)uses np.unique
to construct the classes_
attribute 返回输入数组的排序唯一值。
【讨论】:
很高兴听到 :) 谢谢。因此,如果我在调用之前使用np.unique
,我应该得到相同的classes_
属性?
是的,我认为应该这样做
其他分类器呢?是否始终保证类按标签顺序排列?
@simon 我想是这样,但不幸的是,这是为每个分类器单独实现的(即代码不共享),因此如果需要,您必须逐个检查某些以上是关于如何从 scikit-learn 中与 predict_proba 一起使用的 cross_val_predict 获取类标签的主要内容,如果未能解决你的问题,请参考以下文章
python TF IDF在Python中与Scikit-Learn实现一起解释