「Approaching (Almost) Any Machine Learning Problem」(ほとんどすべての機械学習問題へのアプローチ)のメモ

IT
スポンサーリンク

 “「Approaching (Almost) Any Machine Learning Problem」(ほとんどすべての機械学習問題へのアプローチ)のメモ” はロックされています。 「Approaching (Almost) Any Machine Learning Problem」(ほとんどすべての機械学習問題へのアプローチ)のメモ

スポンサーリンク

はじめに

機械学習に関する知識を持ちたいため、少しずつ関連記事を読んでいます。

「Approaching (Almost) Any Machine Learning Problem」という記事を読んだので、メモを残します。

リンク:http://blog.kaggle.com/2016/07/21/approaching-almost-any-machine-learning-problem-abhishek-thakur/

Google翻訳を使いながら、自分の解釈でメモをしていますので、記載に誤りがある可能性があることにご留意ください。

スポンサーリンク

メモ

前提

  • データを機械学習に適用させるまでの60-70%の時間をデータ整形やデータ変換に費やしている
  • 機械学習には前処理はつきもの

データ

  • データを機械学習に適用させる前に、表形式に変換する必要がある。
  • Data Munging(データフォーマット変換)やデータ変換に労力を費やす。
  • 表形式データは機械学習やデータマイニングによく使われる。
  • 以降、データを「X」、ラベルを「Y」で表す

ラベルのタイプ

  • ひとつの列、バイナリ値
    • 分類問題。1サンプルは1つのクラスのみに属する。2つの分類しかない
  • ひとつの列、実数値
    • 回帰問題。1つの値のみの予測?
  • 複数の列、バイナリ値
    • 分類問題。1サンプルは1つのクラスのみに属する。2つ以上の分類がある
  • 複数の列、実数値
    • 回帰問題。複数の値の予測
  • 複数ラベル
    • 分類問題。1サンプルはいくつものクラスに属する

評価指標

機械学習をやるのであれば、結果の評価方法や評価指標、目的を明らかにしておく必要がある

  • a skewed binary classification problem(?)
    • the receiver operating characteristic curve (ROC AUC or simply AUC)
  • multi-label or multi-class classification problems(分類問題)
    • categorical cross-entropy(交差エントロピー?) もしくは multiclass log loss(?)
  • regression problems(回帰問題)
    • mean squared error(平均二乗誤差)

機械学習フレームワーク

※ピンク線:最も一般的な経路

参照:Approaching (Almost) Any Machine Learning Problem | Abhishek Thakur | No Free Hunch

問題の特定

  • 最初のステップは問題の特定。ラベルを見ることで実施する
  • 問題が、二項分類なのか、マルチクラスなのか、マルチラベル分類なのか、回帰問題なのか

データセットの分割

  • 問題を特定したら、「学習用」「検証用」の2セットにデータを分ける
  • 分け方は「必ず」ラベルに従って行う

 

  • 分類問題系の場合は、stratified splittingを使う。Pythonのscikit-learnを使えば簡単にできる
  • 回帰問題系の場合は、シンプルなK-Fold splittingで十分

 

  • 分割したデータ同士は触らないように注意する
  • もし学習セット、検証セットを混ぜるようなことをしてしまうと、過学習を引き起こしてしまう

変数の特定

  • 次に、データ内の異なる変数を特定する
  • 通常、「数値」「カテゴリカル」「テキスト」の3種類の変数が扱われる

 

  • まず、数値変数を分ける
  • 何らかの加工処理は必要なく、正規化や機械学習モデルに適用させることができるため

 

  • カテゴリカルデータの取り扱いには2つの道がある
    • ラベルに変換
    • バイナリ値に変換

 

  • テキスト変数について
  • すべてのテキスト変数を1つにまとめてから、テキストデータを処理して数値に変換するアルゴリズムを使うことができる

スタッカ

  • 次にスタッカ
  • これは特徴のスタッカであり、異なる特徴同士を組み合わせることができるようにする
  • 特徴が疎か密かによって、sparse hstack もしくは numpy hstack を使用して、すべての特徴を横に並べてから処理することができる
  • また、pcaや特徴選択のような他処理に備えて、FeatureUnionモジュールで達成することもできる
  • 特徴をスタックすることで、機械学習モデルに適用することができるようになる

 

  • 上記の特徴は正規化されていないため、線形モデルに適用させられない。
  • 線形モデルを使用するために、Scikit-Learnの「Normalizer」「StandardScaler」が使える

 

  • 上記の正規化方法(Normalizerのこと?)は密な特徴に対してのみ機能する
  • 疎な特徴に対してはよい結果は得られない
  • 疎な特徴に対しては、StandardScalerが適用できる?

 

  • 上記の手順で良いモデルが得られれば、ハイパーパラメータの最適化ができる
  • そうでない場合は、次の手順でモデルを改善できる

分解方法

  • 次に、分解方法
  • わかりやすくするために、LDAとQDA変換を省く
  • 高次元データの場合、一般的にはデータ分解のためにPCAが使われる
  • 画像の場合は、10-15のコンポーネントから始まり、結果の品質が十分に改善する限りは、コンポーネントの数を増やす
  • 他タイプのデータについては、最初に50-60のコンポーネントを選択する
    (数値データをそのまま使える限りは、PCAを避ける傾向がある)

 

  • テキストデータの場合、テキストを疎行列に変換した後、特異値分解(SVD)を実行する
  • Scuncit-learnには、TruncatedSVDと呼ばれるSVDのバリエーションがある

 

  • TF-IDFまたはカウントのために一般的に働くSVDコンポーネントの数は、120-200の間
  • さらに数値を増やすことでパフォーマンス向上の可能性はあるが、コンピュートのコストが現実的でない

 

  • モデルのさらなる性能を評価した後、データセットのスケーリングに移り、線形モデルも評価することができる
  • 正規化またはスケーリングされた特徴は、機械学習モデルまたは特徴選択モジュールに送信できるようになる

特徴選択

  • 特徴選択にはいくつかの選択がある
  • 最も一般的な方法は、greedy特徴選択(フォワードもしくはバックワード)
  • greedy特徴選択では、1つの特徴を選択肢、モデル学習と、評価指標を決めた上でのパフォーマンス評価をする
  • 特徴を1つずつ追加・削除して、ステップごとのモデルのパフォーマンスを記録し、評価スコアが一番高かった特徴の組み合わせを選択する

 

  • 特徴選択における、より速い方法として、モデルから選択することもある
  • ロジットモデルの係数を見る、や、ランダムフォレストで特徴を選ぶ
  • その後で、これらを他の機械学習モデルで使用することができる

 

  • 過学習を抑えるために、estimatorを最小限に抑えることと、ハイパーパラメータの最小限の最適化、が求められる

 

  • 特徴選択はGradient Boosting Machinesを利用することでもできる
  • xgboost利用するのが高速でスケーラビリティ高いのでおすすめ

 

  • RandomForestClassifier / RandomForestRegresorとxgboostを使用することで、疎なデータセットの特徴選択もできる

モデル選択+ハイパーパラメータ最適化

機械学習モデルを選択するための過程で、一般的に使用するアルゴリズム

分類問題
  • Random Forest
  • GBM
  • Logistic Regression
  • Naive Bayes
  • Support Vector Machines
  • k-Nearest Neighbors
回帰問題
  • Random Forest
  • GBM
  • Linear Regression
  • Ridge
  • Lasso
  • SVR

 

  • 最良のパラメータを選ぶ方法は、経験がある人が知見を持っている

参照:Approaching (Almost) Any Machine Learning Problem | Abhishek Thakur | No Free Hunch

上記をまとめる

学習

  • 学習用データを「数値」「カテゴリカル」「テキスト」に分類
  • 必要な前処理をして、前処理方法を記録
  • 分解方法を記録
  • 特徴選択をして、特徴選択方法を記録
  • 特徴をスタックして、機械学習モデルを選択し、機械学習モデルを記録

参照:Approaching (Almost) Any Machine Learning Problem | Abhishek Thakur | No Free Hunch

検証

  • 学習で記録した「前処理方法」「分解方法」「特徴選択方法」「機械学習モデル」に対して、検証用データを適用させることで、evaluatorを作成する

参照:Approaching (Almost) Any Machine Learning Problem | Abhishek Thakur | No Free Hunch

コメント

タイトルとURLをコピーしました