【问题标题】:predict_proba for a cross-validated modelpredict_proba 用于交叉验证模型
【发布时间】:2015-05-01 11:44:18
【问题描述】:

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

【问题讨论】:

    标签: python scikit-learn logistic-regression cross-validation


    【解决方案1】:

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

    【讨论】:

    • 开发版有cross_val_predict吗?这将是一个不错的选择。
    • 哦,你是对的,它还没有发布。这应该在接下来的三周内解决。
    • @AndreasMueller 这个选项有没有被添加到cross_val_predict
    • @AndreasMueller,见here
    【解决方案2】:

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

    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)
    

    【讨论】:

    • 仅供参考:我刚刚用RandomForestClassifier 尝试过这个并得到了这个错误ValueError: Can't handle mix of binary and continuous-multioutput
    • @vlsd,它确实有效 - 您需要为您的 predict_proba 添加 [:,1],因为它返回每个类别的概率(“0”,“1”),您可能感兴趣在“1”类中
    【解决方案3】:

    这现在作为 scikit-learn 0.18 版的一部分实现。您可以将“方法”字符串参数传递给 cross_val_predict 方法。文档是here

    例子:

    proba = cross_val_predict(logreg, X, y, cv=cv, method='predict_proba')
    

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

    from sklearn.model_selection import cross_val_predict
    

    【讨论】:

      【解决方案4】:

      这很容易实现:

      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。 如果您同时需要 predict 和 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)
      

      【讨论】:

        猜你喜欢
        • 2013-05-19
        • 2014-02-18
        • 2013-12-08
        • 2016-05-26
        • 2020-03-26
        • 2015-12-22
        • 2017-01-27
        • 2021-06-09
        • 1970-01-01
        相关资源
        最近更新 更多