这是我最小的可复制示例:
x = np.array([
[1, 2],
[3, 4],
[5, 6],
[6, 7]
])
y = [1, 0, 0, 1]
model = GaussianNB()
scores = cross_validate(model, x, y, cv=2, scoring=("accuracy"))
model.predict([8,9])
我打算做的是实例化一个高斯朴素贝叶斯分类器并使用sklearn.model_selection.cross_validate交叉验证我的模型(我使用
cross_validate
而不是cross_val_score
因为在我的真实项目中我需要精度,召回和 f1 以及)。
我在文档中读到
cross_validate
确实“通过交叉验证评估指标并记录适合/得分时间。”
我预计我的
model
会安装在x
(特征),y
(标签)数据上但是当我调用model.predict(.)
时我得到:
sklearn.exceptions.NotFittedError:此 GaussianNB 实例尚未拟合。在使用此估算器之前,使用适当的参数调用“fit”。
当然它说我在“使用估算器”之前调用
model.fit(x,y)
(即在调用model.predict(.)
之前。
当我调用
cv=2
时,模型不应该被安装cross_validate(...)
次吗?
仔细查看
cross_validate
文档表明它包含一个论点:
return_estimator : bool, default=False
是否返回安装在每个拆分上的估计器。
所以,默认情况下它不会返回任何拟合估计量(因此它不能用于
predict
)。
为了使用拟合估计器进行预测,您需要将参数设置为
True
;但要注意,您将 not 得到一个 single 拟合模型,但是许多模型等于您的 cv
参数值(这里是 2):
import numpy as np
from sklearn.naive_bayes import GaussianNB
from sklearn.model_selection import cross_validate
x = np.array([
[1, 2],
[3, 4],
[5, 6],
[6, 7]
])
y = [1, 0, 0, 1]
model = GaussianNB()
scores = cross_validate(model, x, y, cv=2, scoring=("accuracy"), return_estimator=True)
scores
# result:
{'fit_time': array([0.00124454, 0.00095725]),
'score_time': array([0.00090432, 0.00054836]),
'estimator': [GaussianNB(), GaussianNB()],
'test_score': array([0.5, 0.5])}
因此,为了从每个拟合模型中获得预测,您需要:
scores['estimator'][0].predict([[8,9]])
# array([1])
scores['estimator'][1].predict([[8,9]])
# array([0])
这可能看起来不方便,但它是这样设计的:
cross_validate
一般只返回诊断和评估所需的分数,而不用于拟合模型用于预测。