predict_proba 对于交叉验证模型
predict_proba for a cross-validated model
我想通过交叉验证预测逻辑回归模型的概率。我知道你可以获得交叉验证分数,但是是否可以 return 来自 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_val_predict
可以为您提供预测值,但是 "predict_proba" 还没有这样的函数。也许我们可以将其作为一个选项。
一个简单的解决方法是创建一个包装器 class,对于您的情况来说是
class proba_logreg(LogisticRegression):
def predict(self, X):
return LogisticRegression.predict_proba(self, X)
然后将其实例作为 classifier 对象传递给 cross_val_predict
# cross validation probabilities
probas = cross_val_predict(proba_logreg(), X, y, cv=cv)
这现在作为 scikit-learn 0.18 版的一部分实现。您可以将 'method' 字符串参数传递给 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
这很容易实现:
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)
这个returnspredict_proba。
如果您同时需要预测和 predict_proba 只需更改 predict
和 combine
参数:
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)
我想通过交叉验证预测逻辑回归模型的概率。我知道你可以获得交叉验证分数,但是是否可以 return 来自 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_val_predict
可以为您提供预测值,但是 "predict_proba" 还没有这样的函数。也许我们可以将其作为一个选项。
一个简单的解决方法是创建一个包装器 class,对于您的情况来说是
class proba_logreg(LogisticRegression):
def predict(self, X):
return LogisticRegression.predict_proba(self, X)
然后将其实例作为 classifier 对象传递给 cross_val_predict
# cross validation probabilities
probas = cross_val_predict(proba_logreg(), X, y, cv=cv)
这现在作为 scikit-learn 0.18 版的一部分实现。您可以将 'method' 字符串参数传递给 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
这很容易实现:
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)
这个returnspredict_proba。
如果您同时需要预测和 predict_proba 只需更改 predict
和 combine
参数:
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)