先日、Oracle主催の**「R超入門 機械学習をはじめよう」**に参加してきたのでレポートにまとめてみます。
当日の資料はこちらにアップされています。
勉強会概要
講師:日本オラクル 小川幹雄(オガワミキオ)さん
講義内容:「R」とは、にはじまり、各自のPCに「R」をインストールし、テストデータをもとに予測モデルを作成する。
「R」のダウンロード&インストール
「R」は統計数理研究所からダウンロードしました。私の環境は Mac でしたので何も考えることなく数クリックでインストール完了。(Windows 版でも別に難しくない感じです)
「R」ってなに?
- 統計解析とビジュアライズのプログラミング言語/環境。
- 「言語」とは言い切りにくい部分もあるので、「環境」とのこと。
- GNUライセンス
- なので無料で利用できるけれど、「R」を組み込んでパッケージソフトを開発すると、ライセンス規約上、ソース公開する必要があるので、そういった使い方を考えてる人は要注意(「R」に限らずGNUライセンスの話)
- CRAN
- 「R」の母体。最新情報を得たいなら、とりあえずCRANをチェックしとけば良い。
なぜ今「R」なのか
- 2015 Top Ten Programming Languages で第6位
- 前回9位だったが、Ruby、Javascript、PHPを抜いた
- (2016年版では、更に1Rank-up して第5位のようです)
- Kaggleで利用されているツールランキングでは、ダントツの1位
なぜOracleが「R」の勉強会を?
Oracle R Distribution という製品を展開。Oracle がサポートするオープンソースRのディストリビューション。無償DL可能、有償サポート。あと、Oracle R Enterpriseという製品も。Oracle のデータに対して直接「R」の操作ができるらしい。内部的にSQLクエリに変換して、なんとかカントカ・・・。時間の都合上、さらっと紹介程度でした。(自社製品の紹介を割愛して、ハンズオンに時間とってくださるあたり、男前でした!)
「R」の基本
- 変数への代入や、数値演算、関数の使い方など
- <- でも = でも代入はできるが、R 技術者は <- に慣れてるので = だと戸惑うらしい。(ちなみに -> としても代入可能)
- 出力は print(変数名) か、そのまま「変数名」を実行すれば出力される
- 「^」で累乗も表現できる
- 数学基本関数、統計基本関数が標準で搭載されている
- 「関数名(引数)」で実行。また pi なども予約変数として登録されている
「R」のデータ構造
ベクトル(配列のこと)、データフレームの操作について
- c(要素1,要素2,要素3,…)で定義。
- 要素を
c(1:6)
のように書けば、「1 2 3 4 5 6」 と規則性のある数字が入る
- 要素を
- 型は自動で判別
-同じ型しかいれることは出来ないので、例えばc(1, 2 ,'a')
のように入れると、文字列として 1, 2 は扱われることになる。 - ベクトルを束にして、データフレームにする。
- 各行・列はラベル名を必ずもつ。
df <- data.frame(ID = c(1:3), Name = c("山田","佐藤","鈴木"))
のようなデータフレームを作る。以下のように、変数名を実行すれば表示される。
> df
ID Name
1 山田
2 佐藤
3 鈴木
データフレーム操作
> df$ID
[1] 1 2 3
> df[1,]
ID Name
1 山田
> df[,2]
[1] 山田 佐藤 鈴木
Levels: 佐藤 山田 鈴木
> df[1,-2]
[1] 1
$ はラベルを抽出。
[1, ] は 1行目を抽出。
[ ,2] は 2列目を抽出。Levels:〜 は、全部でこれらのデータ(カテゴリ?)があることを表現している。データ3つで、3つとも表示されているので判りにくい例かもしれません、、、。
[1,-2] は1行目・2列目以外を抽出。
データの読み込み
今回は csv ファイルを読み込み、そのままデータフレームとして使用。read.table 、read.csv など読み込みコマンドはいくつかあって、それぞれオプションのデフォルト値が異なるので状況にあわせて使い分け。
df_default <- read.table("creditdefault.csv", skip = 1, header = T, sep = ",")
skip は1行目をとばす。
header = T (T は TRUE )
は最初の行をラベルとして使用する。なので、いきなりデータから始まるようなデータでは、header = F(FALSE)
とする。
sep = ","
は、カンマを区切り文字とする。
「R」でグラフ描写
- 標準で作図関数 plot が搭載されているが、あまり使わない
- Rにおけるデファクト・スタンダードは ggplot2 なので入れておくべき。
install.packages("ggplot2", dep=T)
library(ggplot2)
dep=T
は依存パッケージもあわせてインストールする指定。
library(関数名)
は、ダウンロードした関数を読み込み。
数字型をフラグとして扱う場合は、factor関数を使う。
> x <- c(1,0,99) \> y <- factor(c(1,0,99)) \> x
[1] 1 0 99
> y
[1] 1 0 99
Levels: 0 1 99
「1:異常 0:正常 99:不明」のように、フラグとして数値を使用している場合、数値として扱わないことを指定する。
「R」で機械学習を使って予測モデルを作成
その前に、、、。
使用したテストデータは講師の方がすでに整形したキレイなデータ。本来のデータはもっと汚い(重複、データの内容がわからない、データの欠損、”男”/”男性”/”Male” 表現がバラバラ…etc)機械学習、Machine Learning、データサイエンティスト・・・華やかなイメージを持たれるが、実は使えるデータに仕上げるまでのデータ整形はかなり泥臭い、とのことでした。
今回は1つのデータを学習用データと、テスト用データに仕分けて使用。sample関数を使用して、ランダムに 6:4 に分けた。
indexes <- sample(1:nrow(df_default), size=0.4*nrow(df_default))
test <- df_default[indexes, ]
train <- df_default[-indexes, ]
nrow は全行数。
sample 関数で、1行目〜最終行(nrow)までのデータの内、40%(0.4*nrow) をindexes に入れている。
train には、[-indexes, ] で40%以外のデータ(つまり 60%)を入れている。
予測モデル作成には、今回ランダムフォレストを使いましたが、ランダムフォレストのベースとなる、決定木についても学習しました。
決定木
- データ内の特徴量から簡単なルールで分岐を作り、判別や回帰モデルを作る
- ジニ係数やエントロピーに基いて分割
- (正直、なんのこっちゃよく判っていない。。)
pre <- predict(rp, test, type = "class")
tes <- test[,24]
> table(tes,pre)
pre
tes 0 1
0 8970 397
1 1759 874
test[ , 24]
は test データの24列目、ここには default になった人、なってない人のフラグが入ってます。
table 関数でクロス計算しています。つまり pre, tes が共に 0 , 0 だったもの、1, 1 だったものが正解数。
predict
の type = class は何だったかな、、、。説明を聞き逃したか、説明がなかったかもしれません。
(ご存じの方おられましたら、コメントにて教えてください)
ランダムフォレスト
- 決定木を弱学習器とするアンサンブル学習アルゴリズム
- 決定木に比べて負荷は高いが、手軽で高精度
- 古くからあるアルゴリズムだが、まだ現役で多くの場面で使われてる
- いくつもの決定木分析(デフォルトで500?)から、強化学習(多数決)する。
> library(randomForest)
> rf <- randomForest(factor(default)~., data = train, importance = T)
library(randomForest)
で、関数を読み込み。
あとはほぼ、rpart と同じ。importance は重要度を与えるんでしたっけ?
importance = F
だと、MeanDecreaseGini というクラスだけでしたが、importance = T
にすると、MeanDecreaseGini と MeanDecreaseAccuracy の2つが表示されたので、重要度の分析手法(指標?)が何か増えた感じでしょうか?(これまた詳しい人、教えてください。。)
「R」vs「Python」
- R と並んで機械学習言語とされてる Python 。いったい、どっちが良いのという話。
- 給料はRの方が高いw
- Rできる人、Pythonできる人、それぞれ半分くらいの人はどちらも出来る
- レポート向けなら「R」向き
- 画像、機械学習でアプリ作るなら「Python」向き
- 「R」でもできるが、コミュニティが圧倒的に小さい(=情報が少ない)
まとめ
というような感じで、ひととおり「R」の使い方についてハンズオンいただきました。「R」の手軽さ?(ほんとはもっと泥臭いところがあるのでしょうけど、、)と、なんとなく「俺、機械学習できてる感」を感じるには十分なセミナーでした。
2016-09-27 at 22:54
説明が足りず、申し訳ありません。。
predict関数は実は第一引数として指定したモデルの種類によって動きが変わります。決定木rpartの場合、typeでclassを指定することによって、AかBか?のような分類分析の結果をfactor型で返すという動作になります。他にもAになる確率自体を出したりすることもできます!
https://stat.ethz.ch/R-manual/R-devel/library/rpart/html/predict.rpart.html
2016-09-28 at 00:32
小川さん、直々にご説明いただき恐縮です(汗)
なるほど、第一引数のモデルによって異なる動きになるのですね。
>他にもAになる確率自体を出したりすることもできます!
link を参照いたしますと、type=prob がそれにあたるワケですね。
ご親切にありがとうございます。知識が全然追いついておりませんので、ご紹介されていた「みんなのR」をAmazonで注文します♪