機械学習
#AI
統計を使って成功する確率が高い方法を見つけ出す
統計分析から生まれた分析手法などが機械学習の中で使われている
ベイズ推定
マルコフ過程
etc
ネットワークを使った機械学習
ニューラルネットワーク
入力されたデータ(問題)に対して、それを処理するネットワーク間のパラメータを調整することで、適切な出力(解答)だす手法
重み
ベイジアンネットワーク
データ構造をグラフ構造で作り、データ同士の繋がりをベイズ推定で、もっともらしさ(尤度)と言う指標で評価する
尤度とは、観測値が与えられたとき、それを説明するモデルや分布などの母数(パラメーター)の値の尤もらしさのこと、読み方は「ゆうど」
ディープラーニング
学習モデル自らが特徴量を抽出して学習していく
教師あり学習
分からないのは正しい答えの出し方で、解答自体は分かっているケースで使う学習
画像認識などでいうと、その写真は猫だと分かっているが、その画像を猫と判別するための方法が分かっていないなど
人間が感覚的にやっているタスクや経験則などを判断する場合に最適な方法
分類(機械学習)
回帰
教師なし学習
答えが分からない問題に使う
たくさんのデータの中から「変わったもの」や「共通するもの」を見つける
データの特徴を捉える
人間が気づいていない分類方法や分類のきっかけづくりとして使える
クラスタリング
次元削除
データマイニング
オントロジー
強化学習
囲碁や将棋などのゲームAIを作る際に重要な手法
答えというはっきりしたものではなく、方向性や目標を示す形で機械に学習させる方法
与えられた環境とのやりとりから、自らの成果を最大化するように試行錯誤を繰り返して、最適な挙動をするように学習する
たくさんある選択肢の中から1つを選んで、その結果を受けて、行動とその利益の法則を導いていく方法
法則をコンピューターが覚えさせることで、最善の行動が選択できるようになる
Q学習
統計との違い
厳密に線を引く事は難しい
統計は、なぜこのようなデータが出るのか?を教えてくれる
過去を教えてくれる
データを説明する
機械学習は、これからのデータがどうなっていくのか?を教えてくれる
未来を教えてくれる
データを予測する
相関係数
項目間の相関関係の強さを測る指標の1つ
特徴量と正解データの相関係数が大きいほど、特徴量が予測に与える影響が大きい
外れ値の影響を受けやすい
外れ値の除去後に見るのが良い
散布図やヒストグラムなどで見た後に、より厳密に比較したい時に利用するのがよい
過学習
モデルが訓練データに対して過度に適合し、新しい未知のデータに対する予測性能が低下する現象
訓練データに関しては、誤差も少なく精度が高い状態
未知のデータに関しては、誤差が大きくなってしまう
バイアスに対して、バリアンスガ高い状態のことをいう
モデルを必要以上に複雑にした結果、バリアンスが異常に高くなる
モデルが複雑ということは、あるデータセットに完璧にフィットするように学習されてしまっている
5つのデータセットがあった場合に、それぞれに完璧にフィットさせていると、当然異なる予測結果が返ってくる
5つのデータセットとしては、元としては同じデータになるが、サンプリングの過程で、どうしても偏りみたいなものは出てくる
実際の予測値との誤差
バイアス
正解データの平均値と予測結果の平均値の誤差
予測結果自体は密集しているが、根本的に予測結果が想定している位置からずれている
モデルや推定値が真の値からどれだけずれているかを示す尺度
真の関係性やパターンからどれだけずれているかを示す
バイアスが高い状態を回避するには
モデルを複雑にして、訓練データ内のさまざまな法則を学習させる
たとえば、
重回帰分析では特徴量の列を増やしたり
決定木では木の深さを増やしたり
ただし、やりすぎると過学習を発生させてしまう
バリアンス
予測結果の分散
データセット内のデータポイントやモデルの予測値のばらつきや散らばりを示す指標
データやモデルのばらつきの度合いを表現し、モデルの安定性や予測の信頼性を評価する際に役立つ
母集団からランダムにサンプリングでデータセットを作り、それぞれで訓練データとしてモデルに学習させ、いくつかのモデルを作った時に、微妙に異なる(回帰の場合は係数や定数)モデルが出来上がる
これらで予測をした場合に、だいたい同じ予測結果を出すはずだが、大きく違う予測を出してしまっている状態
低く抑えるためには
データの件数を増やす
簡単ではあるが、常にできるとは限らない
現実世界のデータは、いきなり増えることはない
未来としては増えていくが、今あるデータ量は基本的には変わらない
データセットが偏ったとしても、同じような学習結果になる分析手法を選択する
ノイズ
正解データの分散
現実世界では必ず発生してしまう誤差
これはしょうがないので、バイアスやバリアンスを考慮していくことになる
データ分割
ホールドアウト法
学習に利用するデータと予測性能をテストするデータを分割すること
scikit-learnでは、sklearn.model_selection の train_test_split関数で実現できる
問題点
外れ値の影響を受けやすい
訓練データは外れ値が少ないが、テストデータは外れ値が多いとなった場合に、トライアル&エラーの沼にハマる
訓練時は外れ値が少ない状態でチューニングして、性能が上がっている
テスト自は、外れ値が多い状態でテストするので、性能が上がらない
ランダムに分割しているため、分割のされ方によって、外れ値の影響を受けたり受けなかったりする
偏りが出てしまう可能性がある
ランダムなため、訓練データとテストデータで、データの偏りが出てしまう場合がある
データ数が少ないと顕著になる
K分割交差検証
ホールドアウト法の欠点を改善するための方法
分割時のデータの偏りの影響を少なくするための方法
訓練データ(訓練&検証データ)をK個に分割し、分割したデータをそれぞれ使って、訓練と検証を行う
たとえば3つに分割した場合、同じモデルに対して、以下の3パターンで利用する
1、2のデータを訓練に使い、3のデータを検証で使う
1、3のデータを訓練に使い、2のデータを検証で使う
2、3のデータを訓練に使い、1のデータを検証で使う
これらの検証結果の平均を取ることで、偏りの影響を抑えた検証結果となる
デメリットとしては、K回学習することになるため、時間がかかってしまう
分類モデルの場合の注意点
分割したデータの中で、正解データに偏りが発生しやすくなって、結局良いモデルが作れない
正解データに偏りが出ると、不均衡データになり、根本的に予測性能が高いモデルが作れない
分類モデルの場合には、分割条件を指定する際に「各分割データの正解データが均等になるようにする」という条件をつける
scikit-learnの場合は、KFoldではなく、StratifiedKFoldを利用する
流れ
データ準備
データ分析
データの前処理
利用サービスの選定
Sass、Pass?オンプレ?など
モデル作成
モデルの学習と評価
モデルの配備
データ分析
まずはデータ分析を行い、解決したい課題が機械学習で行うことなのかを検証する必要がある
機械学習で解決したい課題の仮説を立てる
それを分析して検証することで、どの項目が影響を与えているかわかるようになる
どのデータが必要で、どんなアルゴリズムを用いて機械学習を行えば良いかわかる
データの前処理
データの統合
複数ファイルに分かれているデータをまとめる
欠損値の処理
何かしらの理由で欠損している値を補完する
平均値や中央値などで補完する
外れ値の処理
他のデータに対して、明らかに大きい、小さいなどのデータを調整する
データを除去する
露骨な外れ値は除去するが、ある程度の外れ値は残しておく
外れ値を除去することで、性能は上がるが、外れ値に全く対応ができないモデルが出来上がってしまう
データの標準化
データの分布に偏りが内容に調整する
不均等データ
正解データの件数の比率に大きな際があると、予測がうまくいかない
多重共線性の回避
特徴量として用いる項目間で強い相関がある場合は、どちらかの要素を除去する
データの変換
名寄せや、数値に変換する
文字列から数値への変換
ダミー変数化をする
データの分割前に実施する
利用サービスの選定
Sass、Pass、Iassなど外部のサービスを利用するか、オンプレで構築するかなど
AWSであれば
まずは学習済みのモデルが提供されているサービスを検討
画像認識や音声認識であれば、それ用のサービスがすでにある
売り上げ予測
該当するものがなければ、SageMakerやAWS Deep Learning AMIを検討
ライブラリなど
pandas
scikit-learn
matplotlib