K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:在特征空间中,如果一个样本附近的k个最近(即特征空间中最邻近)样本的大多数属于某一个类别,则该样本也属于这个类别。
#importing libraries #导入相对应的库函数(第一个是用来使用k n n的,第二个是用来网格搜索,第三个用来归一化)
from sklearn import neighbors
from sklearn.model_selection import GridSearchCV
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler(feature_range=(0, 1))
使用上一节中相同的训练和验证集:
#scaling data 处理数据(归一化)、将数据集转化为pandas的执行规格
x_train_scaled = scaler.fit_transform(x_train)
x_train = pd.DataFrame(x_train_scaled)
x_valid_scaled = scaler.fit_transform(x_valid)
x_valid = pd.DataFrame(x_valid_scaled)
#using gridsearch to find the best parameter 用网格搜索寻找最优参数
params = {'n_neighbors':[2,3,4,5,6,7,8,9]}
knn = neighbors.KNeighborsRegressor()
#建立模型
model = GridSearchCV(knn, params, cv=5)
#fit the model and make predictions 给模型喂数据并预测
model.fit(x_train,y_train)
preds = model.predict(x_valid)
结果
#rmse计算r m s
rms=np.sqrt(np.mean(np.power((np.array(y_valid)-np.array(preds)),2)))
#这里显示结果,可不执行
rms
115.17086550026721
RMSE值并没有太大的差异,但是一个预测值和实际值的曲线图应该可以提供一个更清晰的理解。
#plot 绘图 画出训练的数据(绿线)、预测值(蓝线)与训练集的观测值(橙线)
valid['Predictions'] = 0
valid['Predictions'] = preds
plt.plot(valid[['Close', 'Predictions']])
plt.plot(train['Close'])
推论
RMSE值与线性回归模型近似,图中呈现出相同的模式。与线性回归一样,kNN也发现了2018年1月的下降,因为这是过去几年的模式。
我们可以有把握地说,回归算法在这个数据集上表现得并不好。
参考:https://www.jiqizhixin.com/articles/2019-01-04-16