どうも、solobochiのbochiです。
昨年、データサイエンティスト協会主催のデータサイエンティスト養成講座を受講し、その中でRを使ったデータ分析手法を学んだのでその復習兼ねてまとめておきます。
目次
-
- 概要(※前回記事参照)
- データセット(※前回記事参照)
- データ分析(※前回記事参照)
- 前処理(※前回記事参照)
- モデル構築
- 改善
- 評価
5.モデル構築
前回記事↓まででデータ分析で最も手間のかかる前処理工程は終わったので、サクッと機械学習アルゴリズムを用いてのモデル構築を行う。
アルゴリズムはいくつかありますが、ここでは、決定木、ランダムフォレスト、XGBoostについて実装していきます。
決定木
1 2 3 4 5 6 7 8 9 10 11 12 |
library(rpart) library(partykit) library(rpart.plot) train_data_ohe3 <- train_data_ohe2[, -which(colnames(train_data_ohe2) %in% c("id","age","balance","contact","day","month","campaign","previous","poutcome"))] tree1 <- rpart(y ~ .,data=train_data_ohe3,maxdepth=5,method="class") summary(tree1) rpart.plot(tree1) plot(as.party(tree1)) |
👉決定木では、情報利得(親ノードと子ノードの不純度の差)を最大にしたい
👉不純度:異なるデータの含まれる割合
👉情報利得:不純度をより減らせると大きな利得が得られる
使ったコマンド
rpart
使用目的:決定木モデル構築
使用方法:rpart(目的変数 ~説明変数(.は目的変数以外のすべての変数) , data=dataframe , maxdepth=n , method="class"/"anova")
maxdepth:木の深さ
summary
使用目的:決定木モデルでの分析結果を確認
使用方法:summary(tree)
rpart.plot
使用目的:決定木モデルの可視化
使用方法:rpart.plot(tree)
👉duration(接触時間)、poutcome(前回実績)が効いている模様
👉cp:complexity parameter(複雑性パラメータ)が小さいほど木が深くなる。枝刈り、木の剪定。
👉rpart.plotによる可視化
👉partykitライブラリパッケージのplot(as.party)による可視化
続けてホールドアウト法で訓練データとテストデータを分割してモデルの評価を実施する。
まずは訓練データとテストデータの作成。
1 2 3 4 5 6 7 8 9 10 |
# Hold-Out and then rpart rate <- 0.8 #訓練データの割合 x <- as.integer(nrow(train_data_ohe2) * rate) #訓練データ数(少数切り捨て) # サンプル抽出(行番号指定) s <- sample(1:nrow(train_data_ohe2),x,replace = FALSE) train_Bank_x <- train_data_ohe2[s,] test_Bank_x <- train_data_ohe2[-s,] |
続いて訓練データでのモデル構築(学習)。
1 2 3 4 5 6 7 8 9 10 11 |
# Hold-Out and then rpart # 学習 library(rpart) library(partykit) library(rpart.plot) tree2 <- rpart(y ~ .,data=train_train_Bank,maxdepth=5,method="class") summary(tree2) rpart.plot(tree2) plot(as.party(tree2)) |
👉Variable Importance(変数重要度)は、duration > poutcome2 となった。
モデルは構築できたので、これを先ほど作成したテストデータにて検証する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# Hold-Out and then rpart # 未知のデータで精度を測定 x_train_test <- select(train_test_Bank,-y) y_train_test <- as.factor(train_test_Bank$y) # predict library(pROC) pred <- predict(tree2,x_train_test)[,2] # auc auc <- roc(y_train_test, pred) print(auc) |
使ったコマンド
as.factor
使用目的:因子型変数に変換
使用方法:as.factor(xxx)
predict
使用目的:モデルにより予測
使用方法:predict(model, dataframe)
roc
使用目的:ROC曲線の取得、AUCの算出
使用方法:roc(正解ラベル、予測値)
👉決定木だと約74.4%の精度
👉ROC曲線
キリがいいので一旦ここまで。
ランダムフォレストとXGBoostは別記事で。
以上
続く