Bing Image Creator で生成: Close up of Tulip flowers, background is blue sky and white clouds, photo
の続きです。
今回は、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 の値ですね。
今回は以上です。
次回は、
です。
初めから読むには、
です。
今回のコードは以下になります。
#
# 予測モデル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
#