Update 2021.04.15 2020.01.20

「AIエンジニア/データサイエンティスト」の必須スキル
機械学習,統計モデリング,多変量解析の全部が必要か
定番テキストも紹介する,Kaggleの攻略も紹介する

追記最終2022-07-29

◆◆AIエンジニアとデータサイエンティストの違いは◆◆

広義のAIエンジニアと広義のデータサイエンティストはほぼほぼ同じであると言われています。世の中ではこの2つを区別していない人の方が多いです(特にマスコミ)。

しかし,狭義ではまったく違います。AIエンジニアとは今では機械学習エンジニア(MLエンジニア)といった方がよいと思います。

判りやすいように割り切ると,AIエンジニアの仕事はアプリ開発であり,データサイエンティストの仕事はコンサルティングです。

◆◆AIエンジニアの仕事の典型例:パン屋のレジ◆◆

パン屋のパンには,バーコードも値札も付いていません。レジでは,パンを1つ1つに分けてから,パンの種類を特定して,その値段を打ち込みます。大変な記憶力が必要な作業です(パン屋のバイトは難しいです)。これらの作業をAIによって自動化されたレジが最近になって導入されています。パンの種類を特定するのがディープラーニングです。

◆◆データサイエンティストの仕事の典型例:売れ筋のコンサルティング◆◆

市場調査によりユーザの声を集めたビッグデータをつくり,これを様々な手法で分析し,売れ筋を絞り,クライアントにコンサルティングします。これはマーケティングの分野の例でありほんの1例です。他に生物統計(医療統計)などがあります。

◆◆AIエンジニア/データサイエンティストの分析手法の一覧◆◆

以下はデータサイエンティストの会社である(株)ALBERTとAIエンジニアの会社である(株)Preferred NetworksのHPを参考にしました。古典的統計学は省略してあります。

  多変量解析
    線形回帰分析
    主成分分析
    因子分析
    多次元尺度構成法
    階層的クラスタリング
  統計モデリング
    一般化線形モデル
    混合効果モデル
    階層ベイズモデル
    時系列解析(AR, MA, ARIMA)
    状態空間モデル
  機械学習
    教師あり学習
      分類
      回帰
    教師なし学習
    強化学習
  機械学習シャローラーニング
    ロジスティック回帰
    サポートベクターマシン
    決定木
    ランダムフォレスト
    勾配ブースティング
    k近傍法
    k-means
    LDA(Latent Dirichlet Allocation)
    多層パーセプトロン
  機械学習ディープラーニング
    CNN, RNN, LSTM, Tensorflow/Keras, PyTorch
      画像認識
      音声認識
      自然言語処理

◆◆AIエンジニア/データサイエンティストの必須スキルは上の全部?◆◆

AIエンジニアが仕事に使う必須スキルは機械学習特にディープラーニングであり,統計手法の基礎は素養として知っておかなければならない。

データサイエンティストが仕事に使う必須スキルは統計手法であり,機械学習の基礎は素養として知っておかなければならない。

回帰を例にとろう。scikit-learn の Boston Housing データセットを使います。サンプル数は506,説明変数は13,ラベルは住宅価格です。

データサイエンティストは線形重回帰を使います。AIエンジニアは例えばランダムフォレストを使います。決定係数R^2は,前者は0.60前後,後者は0.90以上だすことも可能です。

R^2が低いのにもかかわらずデータサイエンティストが線形重回帰を使う理由は,説明変数の寄与の解釈を解析的に説明したいためです。ランダムフォレストはR^2が高くても説明変数の寄与の解釈はできません。データサイエンティストはアナリストでもあるのです。

AIエンジニアが機械学習を使う理由は予測精度を上げたいためです。例として,場所による不動産価格の違いを予測して商売に利用するような場合です。

また,特徴量エンジニアリングが適切に行われているか判断するのは機械学習の方が効率的です。データサイエンティストも機械学習のシャローラーニングくらいは日常的に使うことができる方がよいでしょう。

上に挙げたのは統計関係だけであるが,他にSQLサーバー,WEB,クラウド,環境構築などのIT技術の知識も必須となります。

◆◆統計学の定番テキスト◆◆

AIエンジニアもデータサイエンティストも統計学の素養は必須です。文系も理系も下の II も III もみた方がよいでしょう。

確率とか線形代数も必須です。

『統計学入門 (基礎統計学Ⅰ) 』東京大学教養学部統計学教室 (編集)


『人文・社会科学の統計学 (基礎統計学 II ) 』東京大学教養学部統計学教室 (編集)


『自然科学の統計学 (基礎統計学 III ) 』東京大学教養学部統計学教室 (編集)


(2022-07-29追記)
日本統計学会公式認定 統計検定1級対応 『統計学』


東大本よりも実用的で役に立ちます。Rをやっている人はこちらの方が良いと思います。

改訂版 日本統計学会公式認定 統計検定2級対応 『統計学基礎』


東大本よりも実用的で役に立ちます。Rをやっている人はこちらの方が良いと思います。

◆◆AIエンジニア/データサイエンティストのプログラミング言語◆◆

機械学習のフリーソフトウエアは,Python しかないでしょう。

統計手法で一番使われてるフリーソフトウエアは,R 言語です。統計用ライブラリ EZR (Easy R)はGUIでありマウスで操作できるので定型作業にはよいでしょう。 定型作業の有料ソフトウエアには,SAS, SPSS があります。また,Python も統計手法に使われる例が増えています。Python の統計手法の本も確実に増えています。

機械学習シャローラーニングには,ライブラリscikit-learnをインポートすると,モデルのアルゴリズムとデータセットが簡単に入手できます。データセットの処理や計算には,ライブラリNumpy, Scipy, Pandas, Matplotlib をインポートします。開発環境には,Jupyter Notebook を使います。プログラムの run 結果が残りとても便利です。

機械学習ディープラーニングには,フレームワーク TensorFlow/Keras, PyTorch を使うのがあたりまえになっています。Chainer は使われなくなるでしょう。教科書どおりのモデルを使うなら,TensorFlow/Keras がよいでしょう。モデルを新しく開発するなら,PyTorch がよいでしょう。これは研究者に支持されているようです。

◆◆シャローラーニング(Python)の定番テキストはRaschka著です◆◆

『Python 機械学習プログラミング』[第2版] 達人データサイエンティストによる理論と実践 (impress top gear) Sebastian Raschka (著), Vahid Mirjalili (著), 福島真太朗 (その他), 株式会社クイープ (翻訳)

シャローラーニングの定番実践本ハンズオンです。教師ありの分類,回帰,教師なしの主成分分析,クラスタリングなどほぼ全部入りです。ライブラリはscikit-learnを使い,開発環境はJupyter Notebookです。サンプルコードはWebからDLできます。

ディープラーニングTensorFlowについても書かれているが,スクラッチでコードを書いているので,やや理論寄りであり,モデルのアルゴリズムを開発したい人に向いている。教科書どおりのアルゴリズムを勉強したい人には不向きである。ディープラーニングはその専門書もたくさんあるのでそちらをお薦めします。

Raschka著だけでもかなりのところまで学べるが,応用範囲を広げたい人には次のMuller著をお薦めします。ライブラリ,開発環境,サンプルコードについてはRaschka著と同じです。

『Pythonではじめる機械学習』 scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎 Andreas C. Muller (著), Sarah Guido (著), 中田 秀基 (翻訳)

機械学習については日本人の書いた本でお薦めできるものはあまりないのですが,どうしても1つといったら,有名な東大・松尾研の人気講座を書籍化したものがあります。 ライブラリ,開発環境,サンプルコードについてはRaschka著と同じです。

『東京大学のデータサイエンティスト育成講座』 ~Pythonで手を動かして学ぶデ―タ分析~ 塚本邦尊 (著), 山田典一 (著), 大澤文孝 (著), 中山浩太郎 (監修), 松尾 豊[協力] (その他)

内容は,統計・確率,データ分析ツール,機械学習シャローラーニングです。ページの半分は統計・確率,データ分析ツールなので,機械学習の部分はやや希薄です。

教師あり学習では,ランダムフォレストと勾配ブースティングが扱われていません。

Raschka著とMcKinney著も一緒に参考にした方が理解が進むと思います。

◆◆機械学習の混同行列,古典統計学の仮説検定,ベイズ統計の事後リスク◆◆

「R」のプログラムと手計算で詳細に解説しました。
https://yamakatsusan.web.fc2.com/medical_statistics_today_le11_sensitivity_inhtml.html
『感度・特異度を仮説検定,混同行列,ベイズ法で説明する』

機械学習の混同行列と統計学の仮説検定とベイズ統計の事後リスクはどのような関係があるのでしょうか。

病気の診断に例えるのが理解しやすいのではと。

インフルエンザを体温で1次診断するという仮想的な例で議論を進めます。

統計学の仮説検定の図を出します。横軸は体温(検定統計量),縦軸は厳密には確率密度関数ですが人数と思っていただいてかまいません。

閾値は37.5度とイメージしてください。それ以上をとりあえずインフルエンザ陽性と診断します。

病気の診断は普通は2段階でします。例えば,健康診断と確定診断,心疾患でもガンでもそうやります。

この仮想的な例では,確定診断は鼻や喉からの検体をチェックするウイルスマーカーとしておきます。

さて図の説明をします。H0は実際にインフルエンザでない人の分布,H1は実際にインフルエンザである人の分布。

体温が高くてインフルエンザと1次診断されて(検査陽性)も確定診断でインフルエンザでないとされるときそれを,type I error, α-errorと言います。

体温が低くてインフルエンザでないと1次診断されて(検査陰性)も確定診断でインフルエンザとされるときそれを,type II error, β-errorと言います。

体温が高くて実際にインフルエンザである,体温が低くて実際にインフルエンザでない,というグループを含めて,図は4つのグループからできています。

◆◆仮説検定◆◆

上のことを古典的統計学で説明しておきます。帰無仮説H0を,インフルエンザではないとし,対立仮説H1を,インフルエンザであるとします。

type I error, α-error:H0が正しいのに誤ってH1を採択する(H0を棄却する)確率

type II error, β-error:H0が正しくないのに誤ってH0を採択する(棄却しない)確率

検出力 power(1 - β):H0が正しくないとき正しくH1を採択する(H0を棄却する)確率

仮説検定の目的は,病気の診断法が有効であるかを有意差があるかどうかで判断することです。

仮説検定では,α-error が有意水準0.05より小さく,検出力(1 - β)が0.8 以上ならば,有意であるとします。検出力を決めてそれからサンプル数を算出します。

上の仮説検定の言い回しを次の混同行列と比べてみると随分と簡単になることが判ります。

◆◆混同行列の解釈◆◆

機械学習で病気の1次診断する例は多くあります。必ず確定診断と比較して学習します。

1次診断の結果をPredicted予測,確定診断の結果をActual実際と言います。

コンピュータから出力した上の4つのグループをConfusion Matrix混同行列と言います。

Predicted   0 1
Actual 0[[TN FP]
    1 [FN TP]]

(Jupyter Notebook の出力の)Confusion Matrixの座標の取り方を説明します。

昔のコンピュータスクリーンのように左上が原点です。横軸が Pridicted Label であり,右向きに 0, 1 となり,縦軸が Actual Label であり,下向きに 0, 1 となります。

「0」は Negative,「1」は Positive です。医療関係では伝統的に,菌や病原が検出されることを Positive 陽性と表現します。 Pridicted に対して使い,Actual に対しては使いません。

従って,左半分が Negative ,右半分が Positive となり,Pridicted と Actual が一致する左上と右下が True ,一致しない右上と左下が False となります。

これを覚えておくと,TN, FP, FN, TP の位置をマチガイません。

上の図の
type I error, α-error は FP(FalsePositive),
type II error, β-error は FN(FalseNegative)
です。

◆◆4つのグループは,TrueNegative, FalsePositive, FalseNegative, TruePositive◆◆

4つのグループで様々な指標を算出できます。

Predicted   0 1
Actual 0[[TN FP]
    1  [FN TP]]

正解率 accuracy(ACC) = $\dfrac{TP+TN}{all}$

感度 sensitivity(TPR) = $\dfrac{TP}{TP+FN}$ = $1-\beta$-error = 再現率recall

偽陰性率 False Negative Rate(FNR) = $\dfrac{FN}{TP+FN}$ = $\beta$-error

特異度 specificity(TNR) = $\dfrac{TN}{FP+TN}$ = $1-\alpha$-error

偽陽性率 False Positive Rate(FPR) = $\dfrac{FP}{FP+TN}$ = $\alpha$-error = 誤警報

陽性的中率 Positive Predictive Value(PPV) = $\dfrac{TP}{TP+FP}$ = 適合率precision

陰性的中率 Negative Predictive Value(PPV) = $\dfrac{TN}{FN+TN}$

有病率・疾病率・罹患率 morbidity = $\dfrac{TP+FN}{all}$

具体的な例

Predicted   0 1
Actual 0[[9215 485]
    1  [6    294]]

罹患率 = (6+294)/(6+294+9215+485) = 0.03

感度 = 294/(6+294) = 0.98

特異度 = 9215/(9215+485) = 0.95

陽性的中率 = 294/(294+485) = 0.377

◆◆1次診断と確定診断の誤診断◆◆

機械学習ではconfusion matrixの解釈を次のように考えてみればいかがでしょう。

1次診断(健康診断など)では,type II error, β-error,FN(FalseNegative)を減らしたい。

理由は,実際には病気であるのに病気でないと予測(False Negative)されるのはまずいから(治療を受けられないリスク)。

確定診断のための精密検査では,type I error, α-error,FP(FalsePositive)を減らしたい。
理由は,実際には病気でないのに病気であると予測(False Positive)されるのはまずいから(不要な手術のリスク)。実際には,確定診断は100%正しいと想定しています。

FN と FP は同時に減らすことはできません。トレードオフの関係にあります。

◆◆ROC(Receiver Operating Characteristic)曲線◆◆

機械学習では,ROC曲線をプロットすることもできます。

ROC曲線の横軸は,
α-error(False Positive Rate),1 - 特異度
であり,縦軸は,
1 - β-error(True Positive Rate ), 感度,power, recall なのです。

ROC曲線の意味することは,ラベルの閾値を変えることにより,ROC曲線上で α-error と β-error をトレードオフできるのです。


生物統計(医療統計)の世界で例えば薬効の治験(臨床試験)では仮説検定は必ず使われます。いわゆる薬事申請のときに必要となります。 一方,医薬の開発途上では機械学習の方が役に立つと思われます。

◆◆病気診断とベイズ統計◆◆

AIエンジニア/データサイエンティストの現場では,ベイズ統計モデル特にMCMCはよく使いますが,それ以外のベイズ統計の基礎の部分はあまり使いません。

ベイズ統計モデル以外のトピックを少し紹介します。確かに,現場ではあまり使わないのですが,入社試験に出たりします。基礎は教養として必要です。

(2022-07-29)
『R 4.2.1 感度(sensitivity)・特異度(specificity)の完全マスター』の詳細
https://yamakatsusan.web.fc2.com/medical_statistics_today_le11_sensitivity_inhtml.html

◆ 病気の検査・診断法の問題です。

1. 実際に病気である人に,検査をすると,98%が陽性である。

2. 実際に病気でない人に,検査をすると,95%が陰性である。

3. 検査を受ける人の全体では,実際に病気である人と病気でない人の割合は3%,97%です。

4. ある人の検査結果が陽性であるとき本当に病気である確率は?

与えられた数字を整理するために Confusion Matrix を図に書きます。

Confusion Matrix のマスの中の記号は上で説明済です。

横軸が予測(検査の結果),縦軸が実際の病気の罹患になります。

図を拡大するときは,CTRL + "+",戻すときは,CTRL + "0"です。


上の問題はベイズの定理の説明で必ずと言っていいほど出てくる問題です。設問1つ1つに意味があるからです。

問題文1は,Sensitivity感度(TPR)であり,1 - β-error(Type II error)(FNR)です。

問題文2は,Specificity特異度(TNR)であり,1 - α-error(Type I error)(FPR)です。

問題文3は,全体の病気の罹患率です。ベイズ統計では事前リスクと言います。

問題文4は,陽性的中率です。ベイズ統計では事後リスクと言います。これが意外と低くなるのがこの問題の特徴です。

これをベイズ定理で解きましょう。

$$ P\left(B|A\right) = \dfrac {P\left(B\right)P\left(A|B\right)}{P\left(A\right)} $$ $$ where P\left(A\right) = P\left(B\right)P\left(A|B\right) + P\left( B^{c}\right)P\left( A | B^{c}\right) $$

\(P\left(A\right)\);事象Aが起こる確率

\(P\left(B\right)\);事象Bが起こる確率

\(P\left(B|A\right)\);事象Aの条件下で事象Bが起こる確率

\(P\left(A|B\right)\);事象Bの条件下で事象Aが起こる確率

上の問題をベイズ定理に当てはめると,

事象A;検査は陽性(Positive)である

事象B;実際に病気である

問題文1.;\(P\left(A|B\right)\)

問題文2.;\(P\left(A^{c}|B^{c}\right)\)

問題文3.;\(P\left(B\right)\),\(P\left(B^{c}\right)\)

問題文4.;\(P\left(B|A\right)\)

上のwhereの式の2つの項は次です。

TP = $ P\left(B\right)P\left(A|B\right) $

FP = $ P\left( B^{c}\right)P\left( A | B^{c}\right) $

ベイズの定理の公式を使って上の問題を解きます。Confusion Matrixの図のマスの中の記号を使うとベイズの定理の公式が次のように書き替えることができます。

解は,P(B|A) = TP / ( TP + FP ) = 0.377(Precision,陽性的中率とか言います)

機械学習の混同行列,古典統計学の仮説検定,ベイズ統計の事後リスクは同じことを異なる言葉で表現しているのです。

◆◆ベイズ統計のモンティホール問題◆◆

米国のTV番組からです。実際の賞品は車だったそうです。

0:三つの扉がある。一つは正解。二つは不正解。

1:挑戦者は三つの中から一つ扉を選ぶ。

2:司会者(モンティ)は答えを知っており,残り二つの扉の中で不正解の扉を一つ選んで開ける。

3:挑戦者は残り二つの扉の中から好きな方を選べる。このとき扉を変えるべきか?変えないべきか?

挑戦者は扉を変えたほうがよい。扉を変えない場合,正解の確率は 1/3 であるが,扉を変えれば正解の確率は 2/3 になるからである。

実は普通の確率論では解けないそうです。どちらの扉も正解の確率は 1/2 であると考える人はけっこういるそうです。

ベイズの公式に当てはめるのは他書を参照していただくとして,ここでは直感で扉を変えた方がよいことを説明しましょう。

といっても,ばかばかしくなるほどの仮定です。

扉が10コあったとしましょう。最初にあなたが1つの扉を選びます。司会者は残りの扉のうち1つを残して8つのハズレの扉を開けます。あなたは司会者が残した扉が正解である確率は非常に高いことに気付くでしょう。その確率は 9/10 です。あなたが最初に選んだ扉が正解である確率は 1/10 のままです。

◆◆なぜベイズ統計モデルはよく使われ,なぜモデル以外のベイズ推定は使われないのか◆◆

話を簡単にするため極端な例をだします。

コイントスで,表が3回続けて出たあと4回目に表が出る確率は,古典的確率論では 1/2 です。また,4回続けて表が出る確率は 1/16 です。

ベイズ推定では確率は 1/2 でもなく 1/16 でもない答えを出すことができます。

似て非なる問題として,男の子が3人つづけて産まれたら4人目にまた男の子が産まれる確率は,ベイズ推定できるのか。

ベイズ推定では,最初の問題と同じ方法を使います。簡単に言えば,3つ目までの事前分布から4つ目の事後分布をベイズ統計で算出します。もちろん,事前分布と事後分布は同じ種類の分布になるように分布を選びます。しかし,選ぶ分布は解析的に明確になっているとは限らず,任意に選ぶことも可能です。そして,選ぶ分布が違えば,得られる事後分布は違ってきます。

データサイエンティストの統計の課題では,説明がつく解釈が求められます。それなので解釈が曖昧になりやすいベイズ推定はあまり使われません。

モデルが複雑になってくると話はガラッと変わります。多変量の場合はもはや変数やパラメータの意味付けは難しくなり,推定の確からしさが求められるようになります。

事後分布の確率密度関数には積分計算が必要になるが,解析的には算出がほぼ不可能なので,確率的プログラミングといわれる MCMC (Markov chain Monte Carlo)が使われます。

実は,データサイエンティストが使うベイズ統計は,ほとんどが MCMC であると言われています。多変量解析の分野である回帰分析,因子分析,マルチレベル分析などができるそうです。たぶんですが,本来の多変量解析よりも複雑なモデルが扱えると思います。

◆◆KaggleのTitanicと特徴量エンジニアリング◆◆

Kaggleはデータサイエンティストなら知らない人はいないくらいの機械学習のコンペです。Kaggle社は2010年に設立されて2017年にはGoogleの傘下になりました。

2020.01.13現在,コンテスト数は370,データセット数は約2万です。Activeなコンテストは14件で,2~3か月程度で締め切られます。優勝者には賞金がでます。百万ドルも珍しくありません。

コンテストは個人または数人のチームで参加します。日本からも無償で簡単に参加できます。私はGoogleアカウントでログインしています。 コンテストの成績の上位1パーセントがmasterと呼ばれ,IT企業(DeNAなど)にすぐ就職できるくらいすごい資格です。機械学習の腕だめしにはぴったりで「AI道場」と言われています。

KaggleのCompetitionsのHPはここです。
https://www.kaggle.com/competitions

Kaggleのコンテストのテーマは企業から提供され,架空の課題ではなく企業が本当に解決したい課題がテーマになっています。賞金も多額なことから参加者は本気モードでコンテストに参加してきます。実際に有用な解決策が多く提案されています。

コンテストのテーマは過去370もあり,内容をよく読んでいくと自分の課題に近いものがけっこうみつかります。そしてNotebooksタブには有志がアップしたサンプルコードとその解説があるのです。前処理とモデルをマネできるものがきっとみつかります。

◆◆KaggleのTitanicから何を学ぶのか◆◆

さて,コンテストTitanic(上のHPの最初にあります)ですが,かなり前に締め切られたものですが,特別扱いにより今でも submit ができて順位も知らされます。

コンペの内容は,生死が判っている891人のtrain dataから,生死が不明の418人のtest dataの生死を予測するというものです。特徴量(説明変数)は11です。いわゆる二値分類の課題です。data setはDataタブにあります。

一般的には,test dataはモデル選択の検証に使えませんので, hold out 法によりtrain dataからvalid data(サンプルコードではこれがtest data)を差し引きモデル選択の検証に使います。 Titanicの場合は,train dataが少なく,さらに少なくなる hold out 法は使いません。 scikit-learnにある GridSearchCVを使って train data 全部をtrainします。 それの検証はsubmitすればよいのです。

submitはLeaderboardタブででき,全員の順位と自分の順位が判ります。

実際にKaggleに参加するときはOverviewタグに課題がありますが,いきなりコードを書き始めることはしないで,他の参加者のコードを参照します。それはNotebooksタブにあります。参照したコードをJupyter Notebookでrunさせて結果をsubmitしてください。成績はそんなに上位にいかないはずです。その理由は前処理を少し手抜きしてモデルは平凡なのもを採用しているからです。まだ締め切られていないactiveなテーマでは成績が上位のものをそのまま開示するわけがありません。それでも十分に参考になります。

TitanicのNotebooksタブで上から6番目にある(順番はすぐ変わります,近くを見て)ものは4千人以上から参照されていて役立つようです。
https://www.kaggle.com/startupsci/titanic-data-science-solutions
『Titanic Data Science Solutions』

サンプルコードの大半は前処理です。前処理は単純なデータ加工や特徴量エンジニアリングなどがあります。特徴量エンジニアリングとは簡単に言ってしまえば,特徴量を減らしたり増やしたりその意味付けを変えたりすることです。そしてモデルが受け付けるデータの種類に変換します。

特徴量エンジニアリングのテキストはほとんどなく経験工学みたいなものです。ツールは pandas や matplotlib などです。 Titanicに限らずKaggleのNotebooksタブにあるサンプルコードは特徴量エンジニアリングの勉強の参考になるのです。

上に紹介したNotebooksタブのサンプルコードのモデルはそのまま採用しても良い成績は得られませんが,Kaggleにsubmitするための形式の作り方のコードがありますので参照してください。

モデルは前に紹介した定番テキストのものを使ってください。sickit-learnにあるモデルで良い成績がえられるのはランダムフォレストや勾配ブースティングの決定木の仲間です。それでも成績上位10パーセントに入ることはできません。もっと成績を上げる方法はあとで書きます。

特徴量エンジニアリングの全体像を上手くまとめたものが次のサイトにあります。76枚のスライドです。
https://www.slideshare.net/HJvanVeen/feature-engineering-72376750
『FEATURE ENGINEERING』

◆◆前処理に使うデータ分析の定番テキストはMckinney著です◆◆

『Pythonによるデータ分析入門』 第2版 ―NumPy、pandasを使ったデータ処理 Wes McKinney (著), 瀬戸山 雅人(翻訳), 小林 儀匡 (翻訳), 滝口 開資 (翻訳)

ほとんどの洋書は原著がWebで入手することができます。原題プラスpdfでググってください。すぐみつかります。原著ではコピペができますのでコードをドラッグしてJupyter Notebookにペーストできます。

タイトルがデータ分析となっていますが,分析手法ではなく分析ツールの定番実践本ハンズオンです。著者はデータ構造変換ツールであるpandasの発明者です。上に紹介したKaggleのTitanicのサンプルコードの前半は特徴量エンジニアリングなどの前処理ですが,それに使われるツールの本です。 ツールはNumpy, pandas, Matplotlibを使い,開発環境はJupyter Notebookです。サンプルコードはWebからDLできます。

McKinney著だけでもかなりのところまで学べるが,応用範囲を広げたい人には次のVanderPlas著をお薦めします。ツール,開発環境,サンプルコードについてはMcKinney著と同じです。

『Pythonデータサイエンスハンドブック』 ―Jupyter、NumPy、pandas、Matplotlib、scikit-learnを使ったデータ分析、機械学習 Jake VanderPlas(著), 菊池 彰 (翻訳)

◆◆Kaggleの成績上位者は勾配ブースティングを使っている(シャローラーニングでは)◆◆

上のことはWebでググってみればいくらでも見つかります。

勾配ブースティングは決定木のアンサンブルであって,scikit-learnにもありますがあまり使われていません。有名なのは,XGBoost, LightGBM, CatBoostであり,この順でリリースされました。一番使われているのがLightGBMです。

データサイズが大きい場合は,LightGBMしか選択肢がないそうです。逆にデータサイズが小さい場合は過学習になりやすいそうです。パラメータチューニングが難しいという話も聴きます。

TitanicではLightGBMを使えば前処理とチューニングしだいですが上位3パーセントくらいに入れます。scikit-learnのモデルを使うと前処理を上手くやっても上位20パーセントくらいです。

ここでは,使い方の話はしませんが,ググればいくらでもサンプルコードは入手できますし,チュートリアルも多いです。

さて,LightGBM のパラメータチューニングがうまくいったとして,これ以上成績を上げるためには前処理しかありません。すごい裏技に手入力でラベルを書き替えるというものがあります。

普通に前処理をやっていると気が付かないかもしれませんが,Titanicでは大家族は全滅しています。train dataだけでは大家族と判らない人でもtest dataと合わせると大家族と判明することもあります。そういう人はラベルを生から死へと替えてしまいます。

大家族は全滅ということと対照的な話があります。「釜石の奇跡」と呼ばれる事例です。3.11のとき釜石市内の小中学生ら約3千人のうち亡くなられたのはわずか5人です。津波におそわれたとき大半の生徒は津波被害地にいたそうですが,「てんでんこ」を合言葉に肉親を待たずにまた会いにいかず避難したそうです。

Titanicでは大家族は全滅したわけは家族を探したり待ったりして非難が遅れたと思われます。

Name列の中に敬称が入っていますが,これを抜き出してどうようにまとめるかで成績にかなり差がでます。masterで1歳未満なんてどう整理したらよいか迷います。 また,captainは死を選ぶだろうなと(test dataにはいない)。 生死を分ける確率が 0.5 付近に注目して生死を入れ替えるなんて荒技をする人もいます。 1人正解が増えると0.2%成績が上がります。上位ではかなり順位が上がります。

チームで参加しているときは,結果をアンサンブルのようなミックスをすると成績が上がることもあります。

◆◆ディープラーニングが流行るきっかけになった ILSVRC ◆◆


ILSVRC は画像分類の世界的コンペです。データセットは IMAGENET といい巨大な画像データです。毎年この中の一部が課題に出されるのです。近年は成績が良くなりすぎて2017年を最後に終了しました。画像分類にチャレンジしたい人は Kaggle をすすめられます。

2012年に初めてディープラーニングが1位をとりました。カナダのトロント大学のAlexNetです。同じ年にGoogleが衝撃的な発表をしました。それは,コンピュータが初めて猫を認識したということです。この2つのディープラーニングはNVIDIAのGPUを使っていたのです。GPUはディープラーニング用につくられたものではありません。GPUはゲーミングPCやビットコインのマイニングに使われていたのです。

2010年の1位はNEC,2011年の1位はXerox,2012年の2位は東大でした。推測ですがいずれもシャローラーニングのサポートベクタと使っていたと思われます。

今でもテキストによってはシャローラーニングで画像分類をしているものがあります。決して精度はでませんのでマネしないでください。

画像分類の分野では,1995年にLeNet(ルネット)が発表されてから米国のごく一部ではずっとCNNが研究されていて,日本ではずっとシャローラーニングが研究されていました。NECが顔認証の研究をしていたのは有名です。GPUの発達がディープラーニングの発達を促進したのです。

2012年に2位になった東大の先生は,これからはディープラーニングだと言ったらしいです。

ちなみに豆知識ですが,2014年に2位になったのが VGG です。

◆◆ディープラーニングでは定番テキストはありません◆◆

私がサンプルコードを実際にrunさせていた本を紹介します。おすすめは洋書です。ディープラーニングの分野ではサンプルコードのない本がけっこう多くそれがベストセラーになっているのもありますがまったく役に立ちません。

『PythonとKerasによるディープラーニング』 Francois Chollet (著), 巣籠 悠輔 (その他), 株式会社クイープ (翻訳)

『直感 Deep Learning』 ―Python×Kerasでアイデアを形にするレシピ Antonio Gulli (著), Sujit Pal (著), 大串 正矢 (翻訳), 久保 隆宏 (翻訳), 中山 光樹 (翻訳)

この本は不思議なことに原著と翻訳本とではサンプルコードがまったく違います。両方とも入手できます。そして両方ともとても役に立ちます。

また,ほとんどの洋書は原著がWebで入手することができます。原題プラスpdfでググってください。すぐみつかります。

『詳解ディープラーニング』 第2版 ~TensorFlow/Keras・PyTorchによる時系列データ処理~ (Compass Booksシリーズ) 巣籠 悠輔 (著)

『TensorFlowではじめるDeepLearning実装入門 』(impress top gear) 新村 拓也 (著)

◆◆ディープラーニングの画像分類では定番のテーマがあります◆◆

これは画像分類ではありませんが,人工のtoy dataのTwo Moonsを分類したものです。

KerasではDense層DNNが2層だけでできます。中間層が少なすぎてディープラーニングとは言えないかもしれません。

これくらいだとスクラッチでも書けます。



これはMNISTという手書き数字のdata setです。train dataが5万,test dataが1万です。ラベルは0~9の10クラスです。

モデルは1995年に発表されたLeNet(ルネット)を使います。CNNの原型といわれたものです。CNNが2層,DNNが2層でありシンプルです。

パラメータは,61,706コあります。Test accuracy: 0.9874となりました。

これはCIFAR10という画像データです。横方向1列が同じラベルです。ラベルが10クラスあります。

train dataが5万,test dataが1万です。

モデルはVGG16を使いました。その名の通り16層です。これはGPUがないと無理です。パラメータは33,638,218コあります。Test accuracy: 0.7303でした。

accuracyを上げる方法は後述します。

これら以外のディープラーニングの課題とデータセットは ,専門書を参考にしてもいいですが, Kaggle もぜひ参考にしてください。

◆◆音声認識,自然言語処理の分野を扱った本はほとんどありません◆◆

RCCやLSTMを使った分野では,本には評判分析や時系列分析があるだけで,音声認識,自然言語処理の分野を扱った本はほとんどありません。あったとしても基礎の基礎だけしか触れていません。

例えば,ポケトークやスマホのGoogleアシスタントの音声通訳なんて仕組みを本にできるほど簡単なものではないと思われます。AIスピーカなども同様だと思われます。それが本が少ない理由でしょう。

囲碁や将棋の対局AIは強化学習を採用しますが,これも本にできるほど簡単ではないと思われます。

◆◆画像分類の実用的な応用;転移学習◆◆

私がスクールの卒業プロジェクトでつくった画像分類の応用である画像キャプションを紹介します。ほとんどマネですけど。これはオリジナルですけど,大相撲の写真に例えば「土俵入り」,サッカーの写真に例えば「ゴールにシュート」というようにキャプショニングします。

画像分類をまともに応用してモデルを学習させても精度はなかなか上がりません。必ず転移学習が必要になります。そのあたりを詳細に説明します。

まず最初にpre-trainされたモデルをキャプショニング用に再学習させます。pre-trainされたモデルは inception-v3 を使いました。1400万枚の画像を高性能GPUで1月以上学習させたものです。ラベルは2万2千種類だそうです。これはWebで簡単に入手できます。

(2020.02.13追記)

上の数字は Imagenet data set のものであり,InceptionV3.layers で出力したところ,最終段の prediction の unit 数は,1000でした。ファインチューニング(転移学習)では,最終段は使いません。新しく付加するクラスラベルの数に合わせて prediction します。

これをキャプショニング用に再学習します。キャプション用data setはMS-COCO2014を使います。train data約8万,test data約4万,valid data約4万あります。ラベルは80です。

このMS-COCOの再学習(転移学習)にはGPU1080で約24時間かかりました。もしGPUが無かったら約50倍かかります。

それから大相撲とサッカーの写真でさらに再学習させます。写真は合計で100枚くらいです。再学習時間は10分もかかりませんでした。別の写真を再学習させることができます。このときはMS-COCOの再学習は不要です。これもpre-trainとして扱えます。

最後に未来データのためのサーバーサイドのWebアプリを用意します。

大相撲とサッカーの写真を採用した理由は,inception-v3もMS-COCOも学習データ(米国製)の中におそらく大相撲とサッカーは無いと思われるので,転移学習の効果が明確になるからです。

普通の画像分類でも必ず転移学習は必要です。精度を上げるためでもありますが,一番の理由は,学習させる写真が少なくてすむからです。

◆◆GPUが入ったPC◆◆

私のPCの仕様は,
・OS:Windows10 HOME
・CPU:Intel Core i7-8700K
・GPU:NVIDIA GTX 1080
・RAM:64.0GB

実はこれは Mouse社のゲーミングPCであり,25万円です。ビッグデータを扱うのでRAMは多い方がよいです。RAMが少ないと分割ロードするのでプログラムがかなり面倒くさくなります。

最近に家族が買ったMouse社のゲーミングPCのGPUは2080でしたが値段は同じくらいでした。もっともRAMは8GBでした。ゲーム用ならRAMは少なくてもかまいません。

理想を言えば,AIのプログラム開発には,Linux Ubuntuの方がよいです。理由は,LinuxはUnix系であり,プログラムの開発環境の構築がやりやすいからです。Windows10ではPythonのライブラリでいくつかインストールできないものがありました。何よりGPUのTensorFlow用のドライバを導入するのに1月かかりました。

GPUを使わなくてもすむディープラーニングやシャローラーニングのためにはMacBookが一番です。Mac OSもUnix系です。私のいたスクールでは教師も生徒もほぼ全員がMacBookであり,GPUが必要なときにはAWSを使っていました。また,自宅には,自作のLinuxマシンにGPUを入れている人もけっこういました。

◆◆統計モデリング◆◆

「R」大改正GLMM(lme4::glmer),GEE(gee::gee),(MCMCglmm, RStan brms)
https://yamakatsusan.web.fc2.com/kubo_data_analysis_statistical_model_inhtml.html
『データ解析のための統計モデリング入門』

統計モデルとは,観測されたデータにうまくあてはめられるような数理モデルです。あてはめによって,観測されたパターンをうまく説明できたり,現象の背後にある法則性を利用した予測が可能になります。

データの可視化などデータ分析ツールのスキルも必須です。

統計モデリングの分野の全体像を見わたせる本はなかなかありません。もしあったとしても1つのテーマが希薄になってしまうでしょう。

『データ解析のための統計モデリング入門』 一般化線形モデル・階層ベイズモデル・MCMC (確率と情報の科学) 久保 拓弥 (著)

言語は R です。ライブラリに WinBUGS を使っています。Stan の方がポビュラーだと思いますが。

テーマとして,GLM(一般化線形モデル),GLMM(一般化線形混合モデル),MCMC(Markov chain Monte Carlo)が扱われています。


GLM(一般化線形モデル)とは,回帰の1種ですが,線形予測子とリンク関数の概念を導入して,あてはまりの精度を上げたものです。確率分布を使いますが,選ぶ分布によってまったく違う結果になります。

GLMM(一般化線形混合モデル)とは,GLMでは説明できない個体差,場所差などを扱います。GLMよりパラメータを増やしたモデルになります。

階層ベイズモデルとは,GLMMを発展させ,個体差,場所差を同時に推定するものです。不可分ではないが,デフォルトして,MCMC(Markov chain Monte Carlo)とコラボすることが多いです。しかし,わざわざコラボなんて言わないでも,階層ベイズモデルと言えばMCMCを使うことを前提としています。また,逆に,階層ベイズモデルと言わずにMCMCとしか言わないと人もいます。

また,次の言葉も使い分けしていません。ベイズ統計,ベイズ推定,ベイズ推論,ベイズ分析,ベイズ手法,等々。本当はニュアンスが違うかもしれません。

◆◆ベイズ推論とMCMC(Markov chain Monte Carlo)◆◆

『Pythonで体験するベイズ推論』 ーPyMCによるMCMC入門ー キャメロン デビッドソン=ピロン (著), 玉木 徹 (翻訳)

言語は Python です。ライブラリに PyMC2, PyMC3, TensorFlow を使っていてそれぞれのサンプルコードがあります。(2020.03.08追記)

テーマは,MCMC(Markov chain Monte Carlo)ですが,data setが人工のtoy dataではないですので,推論が正しいことを検証している方法がすごく役に立ちます。


課題の1つを紹介しよう。受信メッセージ数に変化はあるか?


上の2つの図のうち1番目の図はある人の日ごとの受信メッセージ数を棒グラフにしたものです。この図を詳細に観察しても受信数に変化があるようには見受けられません。

2番目の図はMCMCを使って受信数の期待値をグラフにしたものです。明らかに40日過ぎに特異点がみられます。あるサービスに参加したとか料金が値下げされたとかが推測されるそうです。

次の課題は,Kaggle の「ダークマターの観測」です。


課題の写真は何の変哲もない天体望遠鏡の写真であり,上の写真のように黒ずんだところは見えず同じ大きさの星が写っているだけです。上の写真はMCMCの事後分布です。どのような仕組みでダークマターを見つけるのかは本をみてください。

もう1つの課題は,Kaggle の「米国国勢調査の回答率」です。国勢調査の項目は,収入,女性の数,駐車場の数,子供の数,等々であり,調査の返送率を予測するというものです。

想像がつくと思いますが,平凡な分析手法では成績が上がらないと思います。Kaggle の結果を見てみる価値はありそうです。

(2020.03.08追記)
『Pythonによるベイズ統計モデリング』PyMCでのデータ分析実践ガイド  Osvaldo Martin (原著), オズワルド マーティン (著), 金子 武久 (翻訳)

言語は Python です。ライブラリに PyMC3 を使っています。

テーマは,MCMC(Markov chain Monte Carlo)ですが,混合モデルや階層モデルも扱っていますので応用範囲が広くなります。原著には,2nd edition がありますので,そのサンプルコードもとても役に立ちます。


◆◆統計モデリング;時系列分析,状態空間モデル◆◆

『時系列分析と状態空間モデルの基礎』 RとStanで学ぶ理論と実装 馬場 真哉 (著)

言語は R です。ライブラリはStan です。

この本は所持していないので,正直よく判りません。レビューは良好のようです。


ここでは,時系列解析と言えば,AR/MA/ARMA/ARIMA などを指していますが,状態空間モデルも時系列分析ができますし,性能も高いと思われます。

私は,現代制御理論を学んでいたときにカルマンフィルターの状態空間モデルを知りましたが,結局,PID しか使わなかったような気がします。不安定な動作の制御には強化学習を使ったような気がします。

私は,時系列分析の課題の時は,ディープラーニングのRNN を使いました。教科書どおりにやればそんなに難しくなかったように思いました。

どれを選べば良いかよく判りませんが,やはり,Kaggle で類似テーマを見つけるのが一番かと思います。

◆◆多変量解析(Multivariate analysis)◆◆

Pythonのライブラリ scikit-learn を使った多変量解析をまとめた本はほとんどありません。Pythonでスクラッチで書いた本はいくつかありますが素人くさいです。前に紹介した機械学習の本やデータ分析の本に scikit-learn を使った多変量解析が断片的にでてきます。それらを紹介します。

Web検索するときなるべく Google USA を使いましょう。これは機械学習のチュートリアルを検索するときも同じです。 Google USA は日本語の Google ではなかなか見つからないので次を参照してください。

https://www.google.com/webhp?gl=us&hl=en&gws_rd=cr&pws=0

Web検索ページの上の方に「About Store Gmail Image」というように英語で書かれているはずです。google.com だけだと日本語の検索ページにリダイレクトされてしまいます。

多変量解析の手法をまとめてみましょう。Webから借用しました。下線があるのはリンクの痕跡ですが下のはリンクしていません。


◆ 線形回帰分析(regression analysis)

多変量解析ということで重回帰だけが挙げられていますが,単回帰もよく使われます。よくあるマチガイですが,ロジスティック回帰は二値分類に使われます。

scikit-learn を利用した回帰分析は機械学習シャローラーニングの本,特に,Raschka著に詳しく書かれています。データの可視化については散布図行列や相関行列や残差プロットなど簡単にコードが書けます。

正則化のRidge回帰やLASSO回帰も数行のコードで実現できます。また,多項式単回帰もできます。また,予測精度を上げたいだけの場合は非線形のランダムフォレスト回帰を使う手もあります。

ただ,回帰式の解釈ついては触れていません。交絡因子や多重共線性の扱いなどは生物統計(医療統計)や市場調査など対象分野の専門書でないと役に立ちません。また,ドメイン知識も必要だと思われます。

例えば,作物収量を目的変数とし,説明変数に降雨量と気温とすると,単回帰と重回帰では係数と正負が逆になったりすることがあります。ドメイン知識があっても解釈は難しいように思われます。そもそも線形回帰でよいのでしょうか。降雨量も気温も極端は良くないと考えられるのですが(多項式か高次曲線か?)。

◆ ロジスティック回帰(logistic regression)

回帰という名称がついているが,二値分類に使われます。

統計モデルとして見ると,GLM(一般化線形モデル)の1種である。確率分布は二項分布,リンク関数はロジット関数であり,その逆関数がロジスティック関数です。

Raschka著では,scikit-learn の線形分類器として扱われます。scikit-learn には二値分類のデータセットはたくさんあり,サンプルコードもたくさんあります。また,データの可視化の例も多いです。

有名な二値分類のデータセットとしては,毒キノコの選別,癌の診断などがあるが,線形分類器では役に立たないであろう(Titanicを思い出して)。生物統計(医療統計)や市場調査などでどのような場面で使われるのかよく判りません。ドメイン知識があったとしてもなぜ線形なのかと疑問です。

Raschka著でロジスティック回帰をうまく使っていたのは,映画の評判分析です。scikit-learn はGPUが使えないので,ビッグデータに対して非線形分類器を使うと時間がかかり過ぎます。それで軽いロジスティック回帰をにするとうまく動作するのです。

ただし,GPUマシンでディープラーニングでやる方がよい結果を得られるかも。

◆ 判別分析(discriminant analysis ; LDA)

多クラス分類である。

scikit-learn にあり,Raschka著で扱っています。scikit-learn には多クラス分類のための iris data, wine data などがあります。

線形判別の原理は,重回帰の回帰式のようなものをいくつもつくって閾値で分類しているようなものです。当然ですが,説明変数の数以上には回帰式もどきをつくれません。

線形分類器を使う理由は,説明変数の解釈のためだと思われるが,交絡因子や多重共線性のようなものの影響があるかは判りません。

私は, iris data を LightGBMや2層DNNを使って多クラス分類していました。Accuracyは 100% になります。LightGBMやDNNでは説明変数をあまりいじったことはないのですが,交絡因子や多重共線性のようなものに影響が気になるところです。

◆ 主成分分析(principal component analysis ; PCA)

特徴量抽出の1種です。説明変数の特徴をあまり損なわないで特徴量を削減します。極端な例をだすと,食べ物と健康の関係を調査する場合,食べ物は説明変数として多すぎるので,食べ物を和食と洋食の2つに削減してしまうような方法です。

機械学習の本,Raschka著やMuller著では,scikit-learn にあるPCAを扱っています。cancer dataやwine data を使います。

私が wine data を PCA して,分散説明率を可視化したものです。

主成分の最初の2つだけで60%をカバーしています。また,最初の5つだけで80%をカバーしています。

それぞれ分類器にかけ精度を確認して,特徴量抽出の良否を判断します。


◆ 因子分析(factor analysis ; FA)

特徴量抽出の1種です。観測された多数の変数から,背後に潜んでいる少数の概念を抽出します(観測された変数の方が合成された変数という点で主成分分析と逆)。

Raschka著では扱っていない。Muller著でも解説はないが,scikit-learn のHPにある FA のチュートリアルをすすめています(URLが書かれている)。

◆ クラスタ分析(cluster analysis)

教師なし学習の1種です。ラベルがないのでいくつに分類できるかが重要です。

アルゴリズムはいくつもあるそうですが,Raschka著もMuller著も scikit-learn の階層的クラスタリング(Hierarchical clustering)をすすめています。理由は,このアルゴリズムは樹形図をプロットできることです。

樹形図は二分木の階層クラスタリングを可視化したもので,意味のある分割をすることにより,結果を解釈するのに役立ちます。

分割数を判断する方法は他に,エルボー法とかシルエット分析がありますが,いずれも曖昧であり恣意的なところがあります。

私が 階層的クラスタリングでつくった樹形図です。

色分けからみて,8クラスに分けるのが適切と判ります。

他にヒートマップも描けます。


分類の性能だけを競うなら,DBSCAN アルゴリズムがおすすめです。人工の Toy Data である Two Moons をキレイに分割できるのは, DBSCAN だけです。ただし,いろいろなdata setでうまくいくかは保証のかぎりではありません。

Two Moons をきれいに分割するだけなら,ニューラルネットワークDNNの方よいです。すでにディープラーニングのところで紹介しました。

◆ 多次元尺度構成法(multidimensional scaling ; MDS)

主成分分析 PCA を利用した次元削減(特徴量抽出)は,柔軟かつ高速で,解釈は簡単ですが,データ内に非線形の関係があるとあまりうまく機能しません。

多次元尺度構成法は多様体学習の1種であり,高次元空間に埋め込まれた低次元の多様体を探します。

前に紹介したデータ分析の本,VanderPlas著に scikit-learn の多次元尺度構成法の解説とサンプルコードがあります。私はコーディングしたことがないのでこれ以上の説明はできません。

多様体の応用先として顔画像がありました。1000ピクセルの画像データを1000次元の点の集まりとみなします。この本では,サポートベクターと比較していました。

前にも紹介しましたが,2012年にディープラーニングが注目される以前は,サポートベクターの画像分類が盛んに研究されてきました。

今となっては,高次元データを次元削減しないでそのまま採用する方が多いと思われます。LightGBMやニューラルネットワークのような使い方です。多次元尺度構成法が機械学習の本では紹介されていない理由はそういうことなのかな思います。

◆ 最後に

多変量解析の英語のWikipediaをみると,まだたくさんのアルゴリズムがありました。データサイエンティストの会社である(株)ALBERTのHPに参考にして絞りました。

◆◆統計的因果推論◆◆

データサイエンティスト協会のスキルチェックリスト ver3.00 にはこの言葉はありません。あるベテランのデータサイエンティストがシニアレベルになるための必須スキルとしています。

岩波のデータサイエンスシリーズにこの本がありました。比較的薄い本ですが,内容は相当濃いです。

『岩波データサイエンス Vol.3』 岩波データサイエンス刊行委員会 (編集)  [特集] 因果推論

たとえば「運動している人は元気だ」から「運動すると元気になる」とは言えないなど,なぜそうなるのかを考えるのが因果推論らしい。その中心にあるのは,交絡因子の取り扱いの考え方のようです。

統計手法というより,論理的な考え方という印象をもちました。


以上

トップページに戻る
inserted by FC2 system