Rで何かをしたり、読書をするブログ

政府統計の総合窓口のデータや、OECDやUCIやのデータを使って、Rの練習をしています。ときどき、読書記録も載せています。

UCI Machine Learning Repository の Bike Sharing のデータの分析4 - k-Nearest Neighbors で予測する

Bing Image Creator で生成: Close up of Tulip flowers, background is blue sky and white clouds, photo

www.crosshyou.info

の続きです。

今回は、R の FNN パッケージを使って、k-Nearest Neighbors で予測してみます。

そうしたら、knn.reg() 関数を使って予測します。

予測値を df_results データフレームに追加します。

7 番目、9 番目、10 番目の予測値は、線形回帰モデルで予測した値よりも実際の値に近いですね。

予測値と実際の値のグラフを描いてみます。

どうでしょうか?線形回帰モデルで予測したときよりは、ずれているように見えます。RMSEを計算してみます。

線形回帰モデルで予測したときの RMSE は、824 でしたので、グラフの印象どおり、k-Nearest Neighbors で予測したときのほうが誤差が大きいですね。

ただ、k-Nearest Nighbors は、k = というハイパーパラメータがあります。上記は k = 3 でやっていますが、他の値のほうがよいかもしれません。k を1 ~ 50 で試してみます。

上のように、for ループを回して、k = 1 から k = 50 までの RMSE を計算しました。

rmses をグラフにしてみてみましょう。

k = 13 のときが一番小さな RMSE になるようです。

k = 13 で予測しなおします。

df_results のデータフレームを更新します。

もう一度、予測値と実際の値のグラフを描きます。

k = 3 のときのグラフよりは、こちらのグラフのほうが実際の値に近いように見えます。

RMSE を計算します。

k = 3 のときと比べると、300 ぐらい RMSE が小さくなりました。それでもまだ線形回帰モデルで予測したときよりは大きな RMSE の値ですね。
今回は以上です。

次回は、

www.crosshyou.info

です。

初めから読むには、

www.crosshyou.info

です。

今回のコードは以下になります。

#
# 予測モデル2: k-Nearest Neighborsで予測
# FNNパッケージの読み込み
library(FNN)
#
# knn() 関数で予測
pred_knn <- knn.reg(train = df_train[ , -1],
                test = df_test[ , -1],
                y = df_train$cnt,
                k = 3)$pred
#
# 予測値を df_resultsに追加
df_results <- df_results |> 
  mutate(knn = pred_knn)
df_results  
#
# 予測値と実際の値のグラフ
df_results |> 
  ggplot(aes(x = time)) +
  geom_line(aes(y = knn), color = "red") +
  geom_line(aes(y = jissai))
#
# RMSE の計算
rmse_knn <- sqrt(mean*1
rmse_knn
#
# k を 1~ 50 で試してみる
rmses <- numeric(50) # RMSE を格納するベクトル
for (i in 1:50) {
  # knn.reg() で予測する
  predicted <- knn.reg(train = df_train[ , -1],
                       test = df_test[ , -1],
                       y = df_train$cnt,
                       k = i)$pred
  # 予測値の RMSE を計算して、rmses の i 番目に格納する
  rmses[i] <- sqrt(mean*2
}
#
# rmses のグラフ
tibble(k = 1:50,
       RMSE = rmses) |> 
  ggplot(aes(x = k, y = RMSE)) +
  geom_line() +
  geom_point()
#
# 最小の RMSE のときの k
which.min(rmses)
#
# k = 13 で予測しなおす。
pred_knn <- knn.reg(train = df_train[ , -1],
                    test = df_test[ , -1],
                    y = df_train$cnt,
                    k = 13)$pred
#
# df_results の更新
df_results <- df_results |> 
  mutate(knn = pred_knn)
#
# 予測と実際の値のグラフ
df_results |> 
  ggplot(aes(x = time)) +
  geom_line(aes(y = knn), color = "red") +
  geom_line(aes(y = jissai))
#
# RMSE の計算
rmse_knn <- sqrt(mean*3
rmse_knn
#

 










 

*1:pred_knn - df_test$cnt)^2

*2:predicted - df_test$cnt)^2

*3:pred_knn - df_test$cnt)^2