有可能操纵一个记分器,使其返回预测,尽管这是一个小技巧。以下是操作方法:
这个
cross_validate()
函数可以采用自定义评分函数。评分函数必须返回一个数字,但是在函数中可以做任何您想做的事情。既然你有
clf
clf.predict()
然后返回一个虚拟值以使记分员满意。请参阅上的sklearn文档
Implementing your own scoring object
更多。
from sklearn import svm, datasets
from sklearn.model_selection import train_test_split, cross_validate, cross_val_predict
# example data
iris = datasets.load_iris()
X, y = iris.data, iris.target
clf = svm.SVC(probability=True, random_state=0)
定义自定义
get_preds()
scorer
:
def get_preds(clf, X, y): # y is required for a scorer but we won't use it
with open("pred.csv", "ab+") as f: # append each fold to file
np.savetxt(f, clf.predict(X))
return 0
scoring = {'preds': get_preds,
'accuracy': 'accuracy',
'recall': 'recall_macro'} # add desired scorers here
k = 5
cross_validate(clf, X, y,
scoring=scoring,
return_train_score=True,
cv = k)
获取preds()
preds = np.loadtxt("pred.csv").reshape(k, len(X))
my_preds = np.mean(my_preds, axis=0).round()
比较
cross_val_predict()
预言:
cv_preds = cross_val_predict(clf, X, y, cv=k)
np.equal(my_preds, cv_preds).sum() # 487 out of 500
我们看到临时工之间几乎达成了完美的协议
接近和
交叉值预测()
. 小的分歧可能是由于我的平均方法不同于
cross_val_predict
sklearn
cross-validation docs
: