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

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

UCIのDry Bean Datasetのデータ分析3 - RのglmnetパッケージでElastic-Net Regression

Bing Image Creatorで生成: Photo of many flowers of morning glory on the wild grass field, background beautiful sky

www.crosshyou.info

の続きです。前回はRのrpartパッケージを使ってRegression Treeのモデルを推定してDERMASONとSIRAの分類をしてみました。結果は、91.7%の正解率でした。

今回はRのglmnetパッケージを使ってElastic-Net Regressionで分類してみましょう。

まず、glmnetパッケージを読み込みます。

glmnetでは、マトリックス型のオブジェクトを説明変数、被説明変数に格納しないといけないので、df_trainとdf_testをglmnetパッケージのmakeX()関数を使ってマトリックス型に変換します。

class()関数でマトリックス型になっているかどうか確認してみます。

ちゃんとマトリックス型になっていますね。

head()関数ではじめの数行を表示します。

makeX()関数を使うと、データフレームのClassから自動的に1か0のダミー変数を作成してくれます。ダミー変数はどちらか一つあればいいので、ClassDERMASONを削除します。

Elastic-Net Regressionはalphaとlambdaのハイパーパラメータがあります。まずfor loopで最適なalphaを決めて、クロスバリデーションで最適なlambdaを決める、という順番になります。

まず、alphaの候補の数列を用意します。

次にMSE(mean squared error)を格納する箱を用意します。

for loopでalpを試して、一番mseが小さいalphaを見つけます。

glmnetでクロスバリデーションをするときは、並列処理しないと時間がかかるようなので、並列処理の準備をします。

それでは、for loopで最適なalphaを見つけます。

mseのいろいろなalphaで計算したMSE(Mean Squared Error)が格納されています。一番MSEが小さいalphaが最適なalphaです。

0.965が最適なalphaの水準でした。

次はcv.glmnet関数で最適なlambdaをみつけるために、クロスバリデーションをします。

plot関数で結果をグラフにします。

最適なlambdaを確認しましょう。

これでalphaとlambdaが決まりましたので、最終モデルを推定します。

lambdaのところは、一つのラムダ渡すよりも、上のように段階的に小さくなるような複数の値を渡すほうが良いようです。glmnetのhelpに

coef()関数でモデルの係数をみてみます。

MinorAxisLength, EquivDiameter, Compactness, ShapeFactor 3は必要ない変数だと判断されたことがわかります。

このモデルで予測してみましょう。

実際の値と比較します。

正解率は、(872 + 571) / (872 + 571 + 55 + 68) = 92.14%でした。

前回のrpartパッケージのDecision Treeモデルの正解率は、91.7%でしたのでほぼ同じですね。

今回は以上です。

次回は、

www.crosshyou.info

です。

初めから読むには、

www.crosshyou.info

です。