
前回は lm()関数でクオリティを推計してみました。今回はglmnetパッケージを使ってクオリティを推計してみます。lm()関数での正解率は53.9%でしたので、この正解率を上回って欲しいです。
glmnetパッケージのcv.glmnet()関数でLASSO回帰で、family="multinomial"にしてモデルを生成します。

11件の警告があるようです。
warnings()関数で警告を見てみます。

意味はよくわからないので、Copilotに聞いてみました。

どうやら、分類対象のクラスのうち、1つ以上が8件未満で極端に少ないようです。
再度、クオリティの度数を確認してみます。

9が5つしかないですね。9を8にしてしまいましょう。

3のクオリティもトレーニングデータには8個以下かもしれないので、確認します。

3は20個あるので大丈夫でした。
それでは、もういちどモデルを推定しなおします。

今度は警告がでませんでした。
plot()関数を使って、lasso_modelのプロットを描いてみます。


coef()関数でモデルの係数を確認します。



LASSO回帰では、重要でない変数の係数は0になりますが、今回はどの変数もモデルに採用されました。
predict()関数でトレーニングデータで予測します。

実際の値との比較してみます。

モデルの予測では、4、5、6、7しか予測しないで、3と8はありませんでした。
正解率は、(2 + 379 + 612 + 73) / 1950 = 54.7% でした。

lm()関数でのモデルの正解率は53.9%でしたので、少し良くなりましたが、誤差の範囲のような気がします。今回は以上です。
次回は、
です。
はじめから読むには、
です。
今回のコードは以下になります。
#
# LASSO回帰によるMultinominal Model
set.seed(199)
lasso_model <- cv.glmnet(
x = mtx[idx, -13],
y = mtx[idx, 13],
family = "multinomial",
type.multinomial = "grouped",
alpha = 1
)
#
# 警告の確認
warnings()
#
# qualityの度数の確認
mtx[ , "quality"] |> table()
#
# 9を8にする
nine_index <- mtx[ , "quality"] == 9
mtx[nine_index, "quality"] <- 8
mtx[ , "quality"] |> table()
#
# トレーニングデータでのqualityの度数
mtx[idx, "quality"] |> table()
#
# 再度モデルを推定
set.seed(223)
lasso_model <- cv.glmnet(
x = mtx[idx, -13],
y = mtx[idx, 13],
alpha = 1,
family = "multinomial",
type.multinomial = "grouped"
)
#
# lasso_modelのプロット
plot(lasso_model)
#
# lasso_modelの係数
coef(lasso_model, s = "lambda.min")
#
# トレーニングデータで予測
lasso_pred <- predict(lasso_model,
newx = mtx[-idx, -13],
type = "class",
s = "lambda.min")
head(lasso_pred)
#
# 実際の値と比較
table(
lasso_pred,
mtx[-idx, "quality"]
)
#
# 正解率の計算
(2 + 379 + 612 + 73) / nrow(mtx[-idx, ])
#
(冒頭の画像は、Bing Image Creator で生成しました。プロンプトは natural grass field, small river, tender daylight, close up of dandelion flowers, photo です。)