読書・NBA・ポケモン

読書・ポケモン・NBA・統計学について書きます

RでLightGBM――Titanicデータを例に

○この記事を書こうと思ったきっかけ

 RでLightGBMを使ったシンプルな分析が日本語ではほとんど公開されていなかったので、自分で作ろうと思いました。自分も間違っているところがあるかもしれないません。間違っているところはガンガン指摘してほしいです。
 データセットはこちらのタイタニックを使います(Titanic: Machine Learning from Disaster | Kaggle)。LightGBMを知っている方にはタイタニックの説明は不要かと思われますので、EDAやデータの説明は特にしません。

○コード

#必要なパッケージの読み込み
#tidyverseとplyrはデータハンドリング用のため、コードの書き方によっては不要。
library(tidyverse)
library(lightgbm)
library(plyr)

#データセットの読み込み
data=read.csv("train.csv",stringsAsFactors = F,na.strings = c("NA",""))
test=read.csv("test.csv",stringsAsFactors = F,na.strings = c("NA",""))

#乗客IDの削除およびテストデータへの生存NAの付与
data$PassengerId=NULL
ID=test$PassengerId
test$PassengerId=NULL
test$Survived=NA

#訓練データとテストデータの結合
all=rbind(data,test)

#不要な列の削除
all$Name=NULL
all$Ticket=NULL
all$Cabin=NULL

#カテゴリカル変数をコーディングする
all$Sex=revalue(all$Sex,c("male"=1,"female"=0))
all$Embarked=revalue(all$Embarked,c("S"=0,"C"=1,"Q"=2))

#カテゴリカル変数をnumeric型にする。
#これを忘れるとlightGBMがうまくカテゴリカル変数を認識してくれないので注意
all$Sex=as.numeric(all$Sex)
all$Embarked=as.numeric(all$Embarked)
all$Pclass=as.numeric(all$Pclass)

#allを訓練データとテストデータに分割する
data=all[!is.na(all$Survived),]
test=all[is.na(all$Survived),]

#dataをさらに検証データに分ける
set.seed(2020)
s=sample(1:nrow(data),0.8*nrow(data))
train=data[s,]
valid=data[-s,]

#テストデータと検証データをlightBGMに入れられる用に整形する
train %>% select(-Survived) %>% as.matrix()->train_x
train %>% select(Survived) %>% as.matrix()->train_y
valid %>% select(-Survived) %>% as.matrix()->valid_x
valid %>% select(Survived) %>% as.matrix()->valid_y

#データセットの作成
category_feature=c("Sex","Embarked","Pclass")
train_lgb=lgb.Dataset(data=train_x,label=train_y)#dataが特徴量(説明変数)、labelが被説明変数

#lightGBMで学習
model=lgb.train(objective="binary",#モデルが学習する課題の設定
                data=train_lgb,
                min_data_in_leaf=4,#一枚の葉の中にあるデータの最小数。デフォルトは20。
                num_iterations=10,#決定木の本数。デフォルトは100。
                max_depth=-1,#決定木の深さ。デフォルトは-1で、0以下の値は制限なしを意味する。
                learning_rate=0.1,#デフォルトは0.1
                metric="binary_logloss",
                categorical_feature = category_feature#カテゴリカル変数の指定
               )


#検証データでモデルを評価
predict(model,valid_x)
table(valid_y,predict(model,valid_x)>0.5)

このコードはとりあえず動かすことを目的としているので、精度はよくありません。
本当はlgb.cvという関数を使うことで、パラメータのチューニングが行えるのですが、力不足で使いこなせていません。誰か教えてくれ……

○より詳しい情報源

Welcome to LightGBM’s documentation! — LightGBM 2.3.2 documentation LightGBMを開発したマイクロソフト社のドキュメントです。
Titanic LightGBM modeling with R | Kaggle 韓国の方が書いたRのコードです。