Skip to content

Latest commit

 

History

History
242 lines (163 loc) · 11.5 KB

File metadata and controls

242 lines (163 loc) · 11.5 KB

Cuisine classifiers 2

この第2の分類レッスンでは、数値データを分類するさらなる方法を探ります。また、異なる分類器の選択がもたらす影響についても学びます。

前提条件

前回のレッスンを完了し、この4レッスンフォルダーのルートにあるdataフォルダーにクリーンなデータセット cleaned_cuisines.csv があることを前提とします。

準備

クリーンデータセットを読み込んだ_notebook.ipynb_ ファイルを用意しており、モデル構築プロセスのためにXとyのデータフレームに分割しています。

分類マップ

前回は、Microsoftのチートシートを使った分類のさまざまな選択肢について学びました。Scikit-learnにも類似でより詳細なチートシートがあり、それによって推定器(分類器の別称)をさらに絞り込むことができます。

ML Map from Scikit-learn

ヒント: このマップをオンラインでご覧ください そして、パスをクリックしてドキュメントを読んでみましょう。

計画

データに明確な理解があれば、このマップはとても役立ちます。パスを「歩く」ことで決断に導きます:

  • サンプル数は50以上
  • カテゴリを予測したい
  • ラベル付きデータがある
  • 10万サンプル未満
  • ✨ Linear SVCを選択できる
  • それでうまくいかなければ、数値データなので
    • ✨ KNeighbors Classifierを試すことができる
      • それでもうまくいかなければ、✨ SVC と ✨ Ensemble Classifiers を試す

これは非常に役立つ道筋です。

演習 - データの分割

このパスに従い、最初にいくつかのライブラリをインポートしましょう。

  1. 必要なライブラリをインポートします:

    from sklearn.neighbors import KNeighborsClassifier
    from sklearn.linear_model import LogisticRegression
    from sklearn.svm import SVC
    from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier
    from sklearn.model_selection import train_test_split, cross_val_score
    from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report, precision_recall_curve
    import numpy as np
  2. トレーニングデータとテストデータを分割します:

    X_train, X_test, y_train, y_test = train_test_split(cuisines_features_df, cuisines_label_df, test_size=0.3)

Linear SVC分類器

サポートベクタークラスタリング(SVC)は、サポートベクターマシンのファミリーに属するML手法の一つです(以下で詳しく説明します)。この方法では、「カーネル」を選択してラベルのクラスタリング方法を決めます。パラメータ 'C' は「正則化」を意味し、パラメータの影響力を制御します。カーネルは複数の中から選べますが、ここでは線形SVCを使うために'linear'に設定しています。確率はデフォルトで 'false' ですが、ここでは確率推定を取得するために 'true' に設定しています。データをシャッフルして確率を得るために乱数状態を'0'に設定しています。

演習 - 線形SVCを適用する

まず、分類器の配列を作成します。テストしながら順次分類器をこの配列に追加します。

  1. Linear SVCで始めましょう:

    C = 10
    # 異なる分類器を作成します。
    classifiers = {
        'Linear SVC': SVC(kernel='linear', C=C, probability=True,random_state=0)
    }
  2. Linear SVCを使ってモデルを訓練し、レポートを表示します:

    n_classifiers = len(classifiers)
    
    for index, (name, classifier) in enumerate(classifiers.items()):
        classifier.fit(X_train, np.ravel(y_train))
    
        y_pred = classifier.predict(X_test)
        accuracy = accuracy_score(y_test, y_pred)
        print("Accuracy (train) for %s: %0.1f%% " % (name, accuracy * 100))
        print(classification_report(y_test,y_pred))

    結果はかなり良好です:

    Accuracy (train) for Linear SVC: 78.6% 
                  precision    recall  f1-score   support
    
         chinese       0.71      0.67      0.69       242
          indian       0.88      0.86      0.87       234
        japanese       0.79      0.74      0.76       254
          korean       0.85      0.81      0.83       242
            thai       0.71      0.86      0.78       227
    
        accuracy                           0.79      1199
       macro avg       0.79      0.79      0.79      1199
    weighted avg       0.79      0.79      0.79      1199
    

K-Nearest Neighbors分類器

K-Nearest Neighborsは「隣接点」ファミリーのML手法で、教師あり・教師なし学習の両方に使われます。この方法は、予め定めた数の点を作成し、その周辺にデータを集めてデータの一般化したラベルを予測します。

演習 - K-Nearest Neighbors分類器を適用する

前の分類器は良好に機能しましたが、精度向上を狙いましょう。K-Nearest Neighbors分類器を試します。

  1. 分類器配列に行を追加します(Linear SVCの要素の後ろにカンマを追加):

    'KNN classifier': KNeighborsClassifier(C),

    結果は少し悪くなります:

    Accuracy (train) for KNN classifier: 73.8% 
                  precision    recall  f1-score   support
    
         chinese       0.64      0.67      0.66       242
          indian       0.86      0.78      0.82       234
        japanese       0.66      0.83      0.74       254
          korean       0.94      0.58      0.72       242
            thai       0.71      0.82      0.76       227
    
        accuracy                           0.74      1199
       macro avg       0.76      0.74      0.74      1199
    weighted avg       0.76      0.74      0.74      1199
    

    K-Neighborsについて学ぶ

サポートベクター分類器

サポートベクター分類器は、分類や回帰タスクに用いられるサポートベクターマシンファミリーの一部です。SVMは「訓練サンプルを空間上の点にマップし」、2つのカテゴリ間の距離を最大化します。その空間に新たなデータをマッピングしてカテゴリを予測します。

演習 - サポートベクター分類器を適用する

サポートベクター分類器で少し精度向上を目指しましょう。

  1. K-Neighborsの項目の後ろにカンマを追加し、次の行を加えます:

    'SVC': SVC(),

    結果はかなり良いです!

    Accuracy (train) for SVC: 83.2% 
                  precision    recall  f1-score   support
    
         chinese       0.79      0.74      0.76       242
          indian       0.88      0.90      0.89       234
        japanese       0.87      0.81      0.84       254
          korean       0.91      0.82      0.86       242
            thai       0.74      0.90      0.81       227
    
        accuracy                           0.83      1199
       macro avg       0.84      0.83      0.83      1199
    weighted avg       0.84      0.83      0.83      1199
    

    サポートベクターについて学ぶ

アンサンブル分類器

前回の結果は良好でしたが、一番最後のパスに従って「アンサンブル分類器」、特にRandom ForestとAdaBoostを試しましょう:

  'RFST': RandomForestClassifier(n_estimators=100),
  'ADA': AdaBoostClassifier(n_estimators=100)

結果は非常に良好で、特にRandom Forestが優れています:

Accuracy (train) for RFST: 84.5% 
              precision    recall  f1-score   support

     chinese       0.80      0.77      0.78       242
      indian       0.89      0.92      0.90       234
    japanese       0.86      0.84      0.85       254
      korean       0.88      0.83      0.85       242
        thai       0.80      0.87      0.83       227

    accuracy                           0.84      1199
   macro avg       0.85      0.85      0.84      1199
weighted avg       0.85      0.84      0.84      1199

Accuracy (train) for ADA: 72.4% 
              precision    recall  f1-score   support

     chinese       0.64      0.49      0.56       242
      indian       0.91      0.83      0.87       234
    japanese       0.68      0.69      0.69       254
      korean       0.73      0.79      0.76       242
        thai       0.67      0.83      0.74       227

    accuracy                           0.72      1199
   macro avg       0.73      0.73      0.72      1199
weighted avg       0.73      0.72      0.72      1199

アンサンブル分類器について学ぶ

この機械学習の方法は「複数の基本推定器の予測を組み合わせる」ことでモデルの品質を向上させます。例ではRandom TreesとAdaBoostを使いました。

  • Random Forest は平均化手法で、「決定木」の「森林」を作り、過学習を避けるためにランダム性を注入します。n_estimatorsは木の数に設定します。

  • AdaBoost はデータセットに対して分類器を訓練し、その分類器のコピーを同じデータセットに適用します。誤分類された項目の重みを重視し、次の分類器の適合を調整してエラーを修正します。


🚀チャレンジ

これらの手法は多くのパラメータを持っており、調整が可能です。それぞれのデフォルトパラメータを調べ、パラメータの調整がモデルの品質にどのような意味を持つか考えてみましょう。

復習&自主学習

このレッスンには多くの専門用語が登場しますので、こちらの用語集をざっと確認してみてください!

課題

パラメータ遊び


免責事項
本書類はAI翻訳サービス「Co-op Translator」(https://github.com/Azure/co-op-translator)を使用して翻訳されました。正確性を期しておりますが、自動翻訳には誤りや不正確な部分が含まれる場合があります。原文の母国語による文書が正式な情報源とみなされるべきです。重要な情報については、専門の人間による翻訳を推奨します。本翻訳の利用により生じたいかなる誤解や誤訳に関しても、当方は責任を負いかねます。