NotFittedError(实例尚未安装)调用 cross_validate

问题描述 投票:0回答:1

这是我最小的可复制示例:

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(...)
次吗?

python machine-learning scikit-learn cross-validation
1个回答
0
投票

仔细查看

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
一般只返回诊断和评估所需的分数,而不用于拟合模型用于预测。

© www.soinside.com 2019 - 2024. All rights reserved.