Python 预测交叉验证模型的概率

Python 预测交叉验证模型的概率,python,scikit-learn,logistic-regression,cross-validation,Python,Scikit Learn,Logistic Regression,Cross Validation,我想通过交叉验证的逻辑回归模型来预测概率。我知道您可以获得交叉验证分数,但是否可以从predict_proba返回值而不是分数 # imports from sklearn.linear_model import LogisticRegression from sklearn.cross_validation import (StratifiedKFold, cross_val_score, train_test_spl

我想通过交叉验证的逻辑回归模型来预测概率。我知道您可以获得交叉验证分数,但是否可以从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)

有一个函数
cross\u val\u predict
可以提供预测值,但“predict\u proba”还没有这样的函数。也许我们可以把它作为一个选项。

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

class proba_logreg(LogisticRegression):
    def predict(self, X):
        return LogisticRegression.predict_proba(self, X)
然后将它的一个实例作为分类器对象传递给
cross\u val\u predict

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

现在,这是scikit学习版0.18的一部分。您可以将“method”字符串参数传递给cross_val_predict方法。文件是

例如:

proba = cross_val_predict(logreg, X, y, cv=cv, method='predict_proba')
还请注意,这是新的sklearn.model_选择包的一部分,因此您将需要此导入:

from sklearn.model_selection import cross_val_predict

这很容易实现:

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和predict,只需更改
predict
组合
参数:

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)

开发版本中是否有cross_val_predict?这将是一个不错的选择。哦,你是对的,它还没有发布。这应该在接下来的三周内解决。@AndreasMueller这个选项是否被添加到
cross\u val\u predict
?@AndreasMueller,请参考:我刚刚用
RandomForestClassifier
尝试了这个方法,得到了这个错误
ValueError:无法处理二进制和连续多输出的混合
@vlsd,它确实有效-您需要为您的
predict\u proba
添加
[:,1]
,因为它返回每个类的概率(“0”,“1”),并且您可能对“1”类感兴趣