Python Scikit 学习 Knn 最近邻回归

Posted

技术标签:

【中文标题】Python Scikit 学习 Knn 最近邻回归【英文标题】:Python Scikit learn Knn nearest neighbor regression 【发布时间】:2017-12-11 00:55:42 【问题描述】:

我在 Python 中使用来自 Scikit-learn 的最近邻回归,其中 20 个最近邻作为参数。我训练了模型,然后使用以下代码保存了它:

knn = neighbors.KNeighborsRegressor(n_neighbors, weights='uniform')
knn.fit(trainInputs, trainOutputs)
filename = "KNN_model_%d_%d.sav" % (n_neighbors,windowSize)
pickle.dump(knn, open(filename, 'wb'))

现在我正在尝试使用此方法加载模型并预测新输入的输出值:

filename = 'KNN_model_20_720.sav'
loaded_knn_model = pickle.load(open(filename, 'rb'))
nextPrediction = loaded_knn_model.predict(data_pred_input_window)

但是,当我这样做时,我得到了这个错误:

--------------------------------------------------------------------------- ValueError                                Traceback (most recent call last) <ipython-input-1-bc1f744a44b3> in <module>()
     26 filename = 'KNN_model_20_720_Solar11months.sav'
     27 loaded_knn_model = pickle.load(open(filename, 'rb'))
---> 28 nextPrediction = loaded_knn_model.predict(data_pred_input_window)
     29 
     30 print(nextPrediction)

C:\ProgramData\Anaconda3\lib\site-packages\sklearn\neighbors\regression.py in predict(self, X)
    142         X = check_array(X, accept_sparse='csr')
    143 
--> 144         neigh_dist, neigh_ind = self.kneighbors(X)
    145 
    146         weights = _get_weights(neigh_dist, self.weights)

C:\ProgramData\Anaconda3\lib\site-packages\sklearn\neighbors\base.py in kneighbors(self, X, n_neighbors, return_distance)
    341                 "Expected n_neighbors <= n_samples, "
    342                 " but n_samples = %d, n_neighbors = %d" %
--> 343                 (train_size, n_neighbors)
    344             )
    345         n_samples, _ = X.shape

ValueError: Expected n_neighbors <= n_samples,  but n_samples = 1, n_neighbors = 20

我不知道为什么会这样。我知道我只为预测测试提供 1 个输入,但这不应该不会引发错误,因为我会假设保存的模型会保存历史数据以运行 knn?我该如何解决这个问题?

【问题讨论】:

能否添加 KNN_model_20_720.sav 文件以便我们重现错误? 在 fit-call 和酸洗之前显示 print(trainInputs.shape) 【参考方案1】:

Scikit-Learn docs 建议使用 joblib 进行模型持久化。

from sklearn.externals import joblib 

knn = neighbors.KNeighborsRegressor(n_neighbors, weights='uniform')
knn.fit(trainInputs, trainOutputs)
joblib.dump(knn, f"KNN_model_n_neighbors_windowSize.joblib")

# load the model from a file
model = joblib.load(f"KNN_model_n_neighbors_windowSize.joblib")

另外,在您的原始代码中,我注意到opening your files 时您没有使用上下文块。这可能会使您的原始代码正常工作,也可能不会。

【讨论】:

以上是关于Python Scikit 学习 Knn 最近邻回归的主要内容,如果未能解决你的问题,请参考以下文章

转载: scikit-learn学习之K最近邻算法(KNN)

[机器学习与scikit-learn-18]:算法-K近邻算法KNN的原理与代码实例

KNN库简介

机器学习算法之KNN最近邻详解和python实现

Scikit Learn: 在python中机器学习

Scikit Learn: 在python中机器学习