祭囃子は遠く、

祭囃子は遠く、

無職のハッピーエヴリディを書いていきます。

データ解析諸々まとめ(R編)

例にもよって自分用、Rのコードでまとめていきます。

多分同じ内容でPython編も書きます。


以下目次

・はじめに

この記事ではパッケージの導入から基本操作をそれぞれまとめていく。
まだまだ触ったことがない手法が多いので使ったらどんどん追記していくスタイルにしておく。

あと、まだ使ってないけど使いたいやつは空でも章だけ作ってます。



~表記上の決まりごと~
train:訓練データ
test:テストデータ
y:目的変数


~環境(2018/7/11時点)~
・MacbookPrp HighSierra :  Rstudio ver.1.1.453 , R ver.3.5
・Windows10 : Rstudio ver.1.1.453 , R ver.3.5



あんまり解析手法の理論を理解していないのでヤバいこと書いちゃうかも>

・便利パッケージの導入と使い方

まずは補助的なパッケージの導入について

基本的に導入に詰まったところはRとRstudio のアップデートで解決した。

・R自体の更新方法
Rが3.5.0へメジャーアップデートしたので簡単アップデート - 清水誠メモ
・Rstudio の更新方法
HelpからCheck for Updates

・dplyr

フィルタリングとかグルーピングとかデータフレームの操作が早いやつ。
C++で書かれてるかららしい。

~導入手順~

  1. 各種ソフトアップデート確認
  2. R(Rstudio)のコンソールでinstall.packages("tidyverse")
  3. library(tidyverse)で確認

~基本操作~
ここに書くと膨大になってしまうので参考にした記事のリンクをはる。
dplyrを使いこなす!基礎編

行ごとに操作するのは簡単だが、列をある条件で動かしたりするのは厳しいっぽい。(多分、誰か知ってたら教えて)
例えば定数のカラムを消したい場合は

train_var <- train%>%dplyr::summarise_all(funs(var))#分散をそれぞれのカラムで計算し、代入
dropcol<-c()#落とすカラム名を入れていくやつ
for(i in 1:length(train)){
  if(dtrain_var[1,i]==0){
    dropcol<-append(dropcol,names(train)[i])#分散が0ならカラム名を追加
  }
}
train<-train[,-dropcol]#落とすやつ以外を訓練データに回す。

あと、%>%の記法もこいつらの中に入ってるぽい?
これは右に左のやつを引数として渡すという意味

scaled_data<-data%>%scale()

上のようにdplyr::を使わなくても良い(例はあるデータを正規化するコマンド)
可読性は高いか低いかわからないけどユーザーは割と見る。

・caret

ハイパーパラメータのグリッドサーチしてくれたりする。
対応してないパッケージもある(LightGBMとか・・・)

~導入手順~

  1. 各種ソフトアップデート確認
  2. R(Rstudio)のコンソールでinstall.packages("caret")
  3. library(caret)で確認

~基本操作~
これも膨大になるので参考記事を貼って主要部分のみ説明する。
Rによる機械学習:caretパッケージの使い方 | Logics of Blue

今の僕が詰まったのはtuneGrid
環境的な問題かもしれないけど、グリッドするパラメータを全指定する必要がある。

tuneGrid = expand.grid(mtry=1:20,splitrule="variance",min.node.size=5)

上はまた後ほど紹介するランダムフォレストのパッケージrangerのもの。(同様の内容を下でまた書きそう)
mtryは1から20の間でグリッドサーチ、splitrule、min.node.sizeは固定(最適化しない)
中身に適当なこと書いてエラーを見ると何を指定すべきか見れる。

~例文~
一応rangerでの例を挙げておきます。

modelRanger <- train(
  formula = y ~., 
  data = train, 
  method = "ranger", 
  tuneLength = 4,
  preProcess = c('center', 'scale'),
  num.trees = 500,
  tuneGrid = expand.grid(mtry=1:20,splitrule="variance",min.node.size=5),
  trControl = trainControl(method = "cv"),
  importance = 'impurity'
)
パラメータ名 デフォルト値 説明 推奨
method - 解析パッケージ指定 -
tuneLength - 各パラメータを何通りずつ試すか。 -
preProcess - 解析データの加工、この場合は正規化 -
tuneGrid - グリッドサーチするパラメータと範囲をあらわに指定 -
trControl - どのように解析するか、この場合はクロスバリデーション -

・doParallel

caretを使う場合にはセットで読み込んでおいたほうが良さそうな並列化のパッケージ。
現段階ではどの範囲で並列してくれるのかわかってません。(caret以外で)

~導入手順~

  1. 各種ソフトアップデート確認
  2. R(Rstudio)のコンソールでinstall.packages("doParallel")
  3. library(caret)で確認

~基本操作~
caretを使う前に以下を実行する

cl <- makePSOCKcluster(detectCores())#何コアで並列するか
registerDoParallel(cl)#並列するコアの登録?

detectCores()で使っているパソコンの最大コア数を取得できる。
上の例は実行環境での最大並列

また、原因はよくわかっていないが同じコードでもMac(4コア)では動かずWindows(8コア)では動いたことがあった。
初期化がどうこうとかよくわからないエラーが出るが、スペックの問題と思われる。(検索してもあんまりわからなかった)

・解析用パッケージの導入と基本操作

解析を実行するパッケージの導入方法と基本操作をまとめる。
この場合も各種アップデートは必須。あとは64bitじゃないパソコンはドブに捨てましょう。

・線形回帰

実はあんまりやったことないので使ったら書きます。

・主成分解析(PCA)

よくPCA(Principle Component Analysis)って略されるやつですね。
分散が大きい特徴量であるほどデータの本質を捉えているはず!という仮定から生まれた手法です。
直感的にもまぁそんな気がするなぁという。
そこで特徴量の分散が最大になる軸でデータを再構成し直す解析手法です。この辺の説明はネットに無限に転がっているので検索しよう。

一番参考にしたサイト
Practical Guide to Principal Component Analysis (PCA) in R & Python


~導入手順~
デフォルトで入ってます。

~基本操作~

result.pca <- prcomp(train,scale=T)

ほとんど上のコマンドで尽きています。
trainは解析したいデータで、scaleは正規化するかしないか。

~詰まったところ~
定数列があった場合スケールができないのでエラーが出る。
→上に書いた処理(分散が0の列を落とす)などを挟んでどうにかする。

~実行後~

#old.op <- options(max.print=999999)#特徴量がバカ多い場合は表示が溢れるのでこれをやる
sink("component.txt")#標準出力先を切り替える
round(result.pca$rotation, 3)#主成分を出力
sink("summary.txt")
summary(result.pca)#主成分が何パーセントデータを説明しているかがわかる。
sink()

f:id:ta_ichi:20180712010401p:plain

これのCumulative Proportionがそう

~その他応用~
成分解析→回帰に使う場合は目的変数を外して主成分解析、9割以上(一般的に何パーがいいのかは知らない)の主成分を拾ってきて回帰させる。

train <- data.frame(result.pca$x)
train<-train[,1:m]#mまでの主成分を拾ってくる(結果を見て変える)

これで適当な回帰にぶっこむ

・決定木系

決定木系の解析がkaggleとかだと一番使われてそうと思っている。
(決定木をスッキリ説明する語彙力がない)
理論の気持ちとかも充実させていきたいから勉強したらその辺も追記したい。

以下にわかりやすい図とかが乗っている気がします。
KaggleのHousePrices問題を決定木系のアンサンブルで解く - mirandora.commirandora.com

あと、決定木系は線形分離問題に弱いらしい。
そのためかXGBには線形用っぽい関数があります。

・決定木

実は使ったことがない、使ったら書きます。

・ランダムフォレスト(randomForest、ranger)

アンサンブル学習の一つ。弱学習機を〜〜って説明されます。
簡単に説明すると、多数決みたいなもんです。アンサンブル学習は全部多数決(アンサンブル平均をとる)ですけどね。
この場合は多数決取る人たち(決定木)は変わりません。変わる奴がXGBとかLGBMとかですね。

~導入手順(randomForest)~

  1. 各種ソフトアップデート確認
  2. R(Rstudio)のコンソールでinstall.packages("randomForest")
  3. library(randomForest)で確認

基本的に上のやつでいいとは思いますが、今はもっと高速な奴があります。
rangerって奴です。データが小さい場合は上のものでいいですが、特徴量が多い場合やデータが膨大な場合はこれが早いです。
あとcaretにも対応しているので使わない手はない(?)

速度比較
[1508.04409] ranger: A Fast Implementation of Random Forests for High Dimensional Data in C++ and R


~導入手順(ranger)~

  1. 各種ソフトアップデート確認
  2. R(Rstudio)のコンソールでinstall.packages("ranger")
  3. library(ranger)で確認

説明書(デフォルト値などはここで確認、しかしnum.treesのデフォルト値がよくわからない)
https://cran.r-project.org/web/packages/ranger/ranger.pdf


~基本操作~
・最小構成

ranger=ranger(y ~. , data=train.data)

分類も回帰もひとまずはこれで実行可能。分類の場合一応fcator(y)をかけといた方がいいかも?

・そこそこじっくり使うくらいの構成(回帰を想定した数値)

ranger = ranger(
    formula = y ~ .,
    data = train,
    num.trees = 100,
    mtry = 5,
    splitrule="variance",min.node.size=5,
    write.forest = TRUE,
    importance = 'impurity'
  )

これらのパラメータは重要そうなので説明します。(説明できないところはわかったら追記)

パラメータ名 デフォルト値 説明 推奨
num.trees - 決定木の数 -
mtry 特徴量のルート個数 1つの決定木がいくつの変数を持つか デフォルトの√n個らしい
splitrule "variance" - -
min.node.size 分類は1回帰は5 - -
write.forest True オブジェクトの保存をするかしないか Trueがいいと思います。
importance - 変数の重要度をどう表すか? -

赤くしたパラメータがcaretでグリッドサーチできる(しなければならない)ものです。

・caretでのグリッドサーチ

modelRanger <- train(
  formula = y ~., 
  data = train, 
  method = "ranger", 
  tuneLength = 4,
  preProcess = c('center', 'scale'),
  num.trees = 500,
  tuneGrid = expand.grid(mtry=1:20,splitrule="variance",min.node.size=5),
  trControl = trainControl(method = "cv"),
  importance = 'impurity'
)

上で同じコードを例に出していますが、なるべく章ごとに閉じた作りにもしたいのでもう一回貼ります。

パラメータ名 デフォルト値 説明 推奨
method - 解析パッケージ指定、今回はranger -
tuneLength - 各パラメータを何通りずつ試すか。 -
preProcess - 解析データの加工、この場合は正規化 -
tuneGrid - グリッドサーチするパラメータと範囲をあらわに指定 -
trControl - どのように解析するか、この場合はクロスバリデーション -

ランダムフォレストは結構使うので充実させたいね。

・Xgboost

まだ使ってないので、詳しくは使ったら。
導入と軽い調べ物だけしたので

~導入手順(Xgboost)~

  1. 各種ソフトアップデート確認
  2. R(Rstudio)のコンソールでinstall.packages("xgboost")
  3. library(xgboost)で確認

説明書
https://cran.r-project.org/web/packages/xgboost/xgboost.pdf

参考(パラメータなどについて)
xgboost のパラメータ - puyokwの日記

・LightGBM

XGBに対抗してマイクロソフトが作ったとか言われてるやつ。
基本はXGBと一緒らしい。そのライト版かつ正確な(と主張している)解析手法。
問題設定にもよりそうだけどkaggleでXGB と共にめちゃくちゃ流行ってるみたい。

残念ながらcaretには対応してないっぽい。

~導入手順(LightGBM)~
結構めんどい。
LightGBM/R-package at master · Microsoft/LightGBM · GitHub
一応ここに全部書いてあるので確認してください。あとMacでやったのでMac想定です。
gitとかもう入ってるよ〜って人はそこは飛ばして次に行ってください。

1.各種アップデート(R,Rstudio,Homebrewなど)
2.gitコマンドをターミナルで使えるようにする。

brew update
brew install git

3.Cmakeなどを使えるようにする。
gccがインストールされていないと多分動きません。

brew install gcc

この時バージョンも確認しておきましょう。僕は脳筋なのでgcc-7,gcc-8と打っていってコマンドが認識されたバージョンとしました。

brew install cmake

思ったよりインストールが長かった。待とう
4.公式のコマンドを入力

git clone --recursive https://github.com/Microsoft/LightGBM
cd LightGBM/R-package
# export CXX=g++-7 CC=gcc-7  # for macOS (replace 7 with version of gcc installed on your machine)
R CMD INSTALL --build . --no-multiarch

これでエラーでなければ多分大丈夫
5.Rのコンソールでlibrary(lightgbm)を確認

各種パラメータ
LightGBM/Parameters.rst at master · Microsoft/LightGBM · GitHub


~基本操作~
正直日本語でかつRで使ってる人全然いない(記事を書いてくれていない)ので、細かいところまでわかってないです。

・最小構成(最小もよくわかってないからとりあえず空)

empty

追記するので、それまではこの記事みてください、下の方にRで簡単なirisの分類をしてます。
LightGBM ハンズオン - もう一つのGradient Boostingライブラリ

・僕が今使ってるやつ(こっちは回帰)

#訓練用と評価用に分割
set.seed(123)
inTrain <- createDataPartition(y, p=.9, list = F)#caretの関数、均等な分割をしてくれるらしい
tr <- train[inTrain,]
va <- train[-inTrain,]
tr_ta <- y[inTrain]
va_ta <- y[-inTrain]
#lgb用のデータセット作成
lgb.train = lgb.Dataset(data.matrix(tr), label = tr_ta)
lgb.valid = lgb.Dataset(data.matrix(va), label = va_ta)

#ここから解析
params.lgb = list(
  objective = "regression"
  , metric = "rmse"
  , min_data_in_leaf = 5
  , min_sum_hessian_in_leaf = 100
  , feature_fraction = .5
  , bagging_fraction = .5
  , bagging_freq = 4
)

lgb.model <- lgb.train(
  params = params.lgb
  , data = lgb.train
  , valids = list(val = lgb.valid)
  , learning_rate = 0.003
  , num_leaves = 180
  , num_threads = 2
  , max_depth = 8
  , reg_alpha = .3
  , reg_lambda = .1
  , min_child_weight = 33
  , zero_as_missing = T
  , nrounds = 5000
  , early_stopping_rounds = 600
  , eval_freq = 50
)

実行すると環境によるかもしれませんがWarningがアホほど出てきますが、無視してオーケーです。
ちなみにこんなやつ
[LightGBM] [Warning] No further splits with positive gain, best gain: -inf

ハイパーパラメータの推奨値や意味はある程度まとまったら追記します。

パラメータ名 デフォルト値 説明 推奨
- - - -
- - - -
- - - -
- - - -
- - - -

SVM

使ったら書きます。