跨验证模型的predict_proba函数

32
我希望能够使用交叉验证从逻辑回归模型中预测概率。我知道可以获取交叉验证分数,但是是否有可能返回predict_proba的值而不是分数?

我希望能够使用交叉验证从逻辑回归模型中预测概率。我知道可以获取交叉验证分数,但是否可能返回predict_proba的值而不是分数?

# imports
from sklearn.linear_model import LogisticRegression
from sklearn.cross_validation import (StratifiedKFold, cross_val_score,
                                      train_test_split)
from sklearn import datasets

# setup data
iris = datasets.load_iris()
X = iris.data
y = iris.target

# setup model
cv = StratifiedKFold(y, 10)
logreg = LogisticRegression()

# cross-validation scores
scores = cross_val_score(logreg, X, y, cv=cv)

# predict probabilities
Xtrain, Xtest, ytrain, ytest = train_test_split(X, y)
logreg.fit(Xtrain, ytrain)
proba = logreg.predict_proba(Xtest)
4个回答

52
这现在已经作为scikit-learn 0.18版本的一部分实现了。您可以向cross_val_predict方法传递一个“method”字符串参数。文档在这里
示例:
proba = cross_val_predict(logreg, X, y, cv=cv, method='predict_proba')

请注意,这是新的sklearn.model_selection包的一部分,因此您需要进行以下导入:
from sklearn.model_selection import cross_val_predict

13
一个简单的解决方法是创建一个包装类,对于您的情况,它应该是:

这个问题的一个简单解决方法是创建一个包装类,对于你的情况,这个类会是


class proba_logreg(LogisticRegression):
    def predict(self, X):
        return LogisticRegression.predict_proba(self, X)

然后将其作为分类器对象的实例传递给cross_val_predict

# cross validation probabilities
probas = cross_val_predict(proba_logreg(), X, y, cv=cv)

FYI:我刚刚尝试使用RandomForestClassifier,但出现了这个错误ValueError: Can't handle mix of binary and continuous-multioutput - vlsd
2
@vlsd,它确实有效 - 你需要为你的predict_proba添加[:,1],因为它返回每个类别(“0”,“1”)的概率,而你可能对“1”类别感兴趣。 - ihadanny

5

有一个名为cross_val_predict的函数可以给出预测值,但是目前还没有类似于“predict_proba”的函数。也许我们可以将其作为一个选项。


交叉验证预测函数在开发版本中吗?这将是一个不错的选择。 - Mads Jensen
哦,你说得对,它还没有发布。这应该在接下来的三周内解决。 - Andreas Mueller
@AndreasMueller 这个选项有被添加到 cross_val_predict 中吗? - Ryan
@AndreasMueller,请看这里 - merritts

2
这很容易实现:
def my_cross_val_predict(
            m, X, y, cv=KFold(),
            predict=lambda m, x: m.predict_proba(x),
            combine=np.vstack
            ):

        preds = []

        for train, test in cv.split(X):
            m.fit(X[train, :], y[train])
            pred = predict(m, X[test, :])
            preds.append(pred)

        return combine(preds)

这个函数返回predict_proba。如果你需要同时预测概率和结果,只需要更改predictcombine参数即可。
def stack(arrs):
    if arrs[0].ndim == 1:
        return np.hstack(arrs)
    else:
        return np.vstack(arrs)

def my_cross_val_predict(
        m, X, y, cv=KFold(),
        predict=lambda m, x:[ m.predict(x)
                            , m.predict_proba(x)
                            ],
        combine=lambda preds: list(map(stack, zip(*preds)))
        ):
    preds = []
    for train, test in cv.split(X):
        m.fit(X[train, :], y[train])
        pred = predict(m, X[test, :])
        preds.append(pred)

    return combine(preds)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接