お勉強ドットねっと

機械学習の工程を学ぶ!

Kaggleのタイタニックで機械学習を経験してみていかがですか?

タイタニック号の事故から生存できる条件をデータの中からソフトウェアが自動的に学ぶ。

つまり、機械学習とは、データの中にあるパターンを自動的に見つけ出すこと。

でも、データにもいろいろあるし、モデルもどれを使えば良いのか?

この記事ではそんな疑問に答えていきます。

繰り返しますが、機械学習では過去のデータから認識されたパターンによって新しいデータから予測をすることを目的としています。

データがとても重要になります。

さらに、データによって向いてるモデルとそうでないものがあります。

モデルの選択は人間が行うことになります。

モデルを選んだ後は、トレーニングを行うのですが、いくつか注意点があります。

これも解説します。

結論から言うと、機械学習には段取りがあります。

よって、この記事では、機械学習の手順について解説します。

    目次
  1. データの特徴を見つけ出す。
  2. データを綺麗にする。
  3. データの特徴をつくり出す。
  4. 単純なモデルから試す。
  5. トレーニングする。
  6. テストする。
  7. 最後に

データの特徴を見つけ出す。

データの統計、例えば平均値や分散などを調べたりグラフやチャートにして特徴を見つけます。

タイタニックの場合、年齢や性別と生存率の関係をみたりします。

要するに、データの中を探索しながら特徴を見出す作業です。

この作業を英語では、「Exploratory Data Analysis」と言います。

日本語では、「探索的データ解析」と訳されています。

長いので「EDA」と言うことが多いです。

Kaggleのコンペでも参加者が最初にやるのはEDAになります。

データを綺麗にする。

タイタニックでは年齢などのデータで欠けている場合があります。

これは、Kaggleの問題ではなく、実世界のデータでは情報が欠損していたりノイズが混ざっているのは普通のことです。

なので、年齢が欠けている場合は中央値(Median)で補ったりする必要があります。

こういった作業を「Data cleaning」と言います。

日本語でも「データのクリーニング」なので、そのままですね。

データの特徴をつくり出す。

年齢を中央値で置き換えるよりもっといい方法があるかもしれません。

たとえば、年齢を性別やクラスなど他の情報から推測するモデルを機械学習で作るとういうやり方もあります。

つまり、まず年齢を予測するモデルを作ってそれによって得られた予想された年齢を他の入力データ同様に扱う方法です。

つまり、データの特徴を創造しています。

生のデータについて詳しい人ほどこういった作業を有利に進められます。

たとへば、金融関係のデータを扱う場合は、金融の知識があった方が有利なわけです。

EDAから学んだことや専門知識(Domain Knowledge)を生かして、データから特徴を引き出すことを「Feature engineering」と言います。

日本語では「特徴量エンジニアリング」と訳されています。

特徴を引き出すことによってモデルがデータ間の差を区別しやすくなり予測の精度が上がります。

タイタニック号の乗客の生存予測〜80%以上の予測精度を超える方法(探索的データ解析編)

もう一つ注意点として、データのスケールを揃える標準化あるいは正規化を行う場合があります。

これは、
「scikit-learn 標準化」
「scikit-learn 正規化」
で検索してみてください。

ここまでで、データを観察し、データを綺麗にし、特徴を引き出しました。

以上のような訓練のための準備をまとめて「データ前処理」(data preprocessing)と呼びます。

次は、モデルを選びます。

単純なモデルから試す。

データや課題によってどのモデルを使えば良いかは経験を積んで勉強してください。

KaggleやQiitaなどで他の人がどんなんモデルをどんなデータに適用しているのか学ぶのが良い方法です。

ただし、初めからものすごく複雑なモデルを適用するのではなく、より単純なモデルから始めて、結果を見て必要ならばもっと複雑なモデルを試すのが良いやり方です。

モデルのパラメータを調節したり、より複雑なモデルを試してみたりして結果の比較をし、どのモデルが一番有効かを見極めます。

【翻訳】scikit-learn 0.18 チュートリアル 適切なモデルの選択

トレーニングする。

訓練をする際に、データを

  • 訓練用のトレーニング・セット
  • 評価用のバリデーション・セット

にわけます。

7対3とかぐらいでわけておいてトレーニング・セットで訓練をしバリデーション・セットで点数をチェックします。

scikit-learnにはデータを分割する便利な機能があるので、それを利用します。

scikit-learnでデータを訓練用とテスト用に分割するtrain_test_split

評価点を見てモデルのパラメータを調節します。
時には、モデルの変更も必要かもしれません。

そして、トレーニング・セットで訓練を行い、バリデーション・セットで評価します。

この作業を繰り返します。

モデルがバリデーション・セットで高得点を出せるように訓練していきます。

テストする。

訓練したモデルが、どの程度有効なのかテストします。

Kaggleでは、訓練したモデルを使ってテストデータから予測した値を提出すると採点してもらえます。

Kaggleの本当のコンペではさらに最終評価用のデータが用意されていてそれは最後まで隠されています。

なので、テストで評価された点数でモデルを調整しすぎると最終評価用のデータで点数が低くなったりするのでテストで提出するのは必要最小限にしたほうがいいです。

もしかすると、ぼくが言っている意味がわからない人もいるかもしれません。

この辺は、また掘り下げて話します。

ちなみに、実際のシステムだと、これがプロダクション環境でモデルの有効性を試す段階になります。

最後に

お疲れ様でした。

機械学習の全体的な作業工程が見えてきたでしょうか。

こんな記事も参考になります。

機械学習案件を料理に例えると分かりやすい件

ひょっとしたら、ここで疑問がわくかも。

Kaggleみたいにテストデータで採点できるならなぜバリデーション・セットなんて必要なのか?

実はこの辺は、「過学習」などを議論して解説する必要があります。

機械学習の学習不足と過学習