当我注释掉下方代码中的knn.fit(x_tr,y_tr)
并运行时,会出现一个错误NotFittedError: This KNeighborsClassifier instance is not fitted yet. Call 'fit' with appropriate arguments before using this method.
knn = KNeighborsClassifier(n_neighbors=1)print(knn)# knn.fit(x_tr, y_tr)# print(knn)pred = knn.predict(x_cv)acc = accuracy_score(y_cv, pred, normalize=True) * float(100)
我的疑惑是,我并没有将knn.fit(...)
保存到任何变量中,程序是如何知道我没有拟合的?
另外,当我在初始化后和拟合后打印模型时…它们看起来完全相同
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski', metric_params=None, n_jobs=None, n_neighbors=1, p=2, weights='uniform')KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski', metric_params=None, n_jobs=None, n_neighbors=1, p=2, weights='uniform')
回答:
如果你查看KNeighborsClassifier
的代码,会发现knn
实例会将训练后的参数/信息存储在self
中。这就是程序知道的原因。
更多细节,当knn.predict
被触发时,
- 它首先在
sklearn\neighbors\_classification.py
(第175行)调用neigh_dist, neigh_ind = self.kneighbors(X)
- 接着,在
sklearn\neighbors\_base.py
(第585行)调用check_is_fitted(self)