predict_proba用于交叉验证的模型

dYz*_*dYz 19 python scikit-learn cross-validation logistic-regression

我想用Logistic回归模型预测交叉验证的概率.我知道您可以获得交叉验证分数,但是可以从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)
Run Code Online (Sandbox Code Playgroud)

ron*_*han 36

现在,这是作为scikit-learn版本0.18的一部分实现的.您可以将'method'字符串参数传递给cross_val_predict方法.文档在这里.

例:

proba = cross_val_predict(logreg, X, y, cv=cv, method='predict_proba')
Run Code Online (Sandbox Code Playgroud)

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

from sklearn.model_selection import cross_val_predict
Run Code Online (Sandbox Code Playgroud)


小智 12

一个简单的解决方法是创建一个包装类,根据您的情况

class proba_logreg(LogisticRegression):
    def predict(self, X):
        return LogisticRegression.predict_proba(self, X)
Run Code Online (Sandbox Code Playgroud)

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

# cross validation probabilities
probas = cross_val_predict(proba_logreg(), X, y, cv=cv)
Run Code Online (Sandbox Code Playgroud)

  • @vlsd,它确实有效-您需要为predict_proba添加`[:,1]`,因为它会返回每个类的概率(“ 0”,“ 1”),并且您可能会对“ 1”感兴趣课 (2认同)

And*_*ler 5

有一个函数cross_val_predict可以为您提供预测值,但是“predict_proba”还没有这样的函数。也许我们可以把它作为一个选择。