この第2の分類レッスンでは、数値データを分類するさらなる方法を探ります。また、異なる分類器の選択がもたらす影響についても学びます。
前回のレッスンを完了し、この4レッスンフォルダーのルートにあるdataフォルダーにクリーンなデータセット cleaned_cuisines.csv があることを前提とします。
クリーンデータセットを読み込んだ_notebook.ipynb_ ファイルを用意しており、モデル構築プロセスのためにXとyのデータフレームに分割しています。
前回は、Microsoftのチートシートを使った分類のさまざまな選択肢について学びました。Scikit-learnにも類似でより詳細なチートシートがあり、それによって推定器(分類器の別称)をさらに絞り込むことができます。
ヒント: このマップをオンラインでご覧ください そして、パスをクリックしてドキュメントを読んでみましょう。
データに明確な理解があれば、このマップはとても役立ちます。パスを「歩く」ことで決断に導きます:
- サンプル数は50以上
- カテゴリを予測したい
- ラベル付きデータがある
- 10万サンプル未満
- ✨ Linear SVCを選択できる
- それでうまくいかなければ、数値データなので
- ✨ KNeighbors Classifierを試すことができる
- それでもうまくいかなければ、✨ SVC と ✨ Ensemble Classifiers を試す
- ✨ KNeighbors Classifierを試すことができる
これは非常に役立つ道筋です。
このパスに従い、最初にいくつかのライブラリをインポートしましょう。
-
必要なライブラリをインポートします:
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
-
トレーニングデータとテストデータを分割します:
X_train, X_test, y_train, y_test = train_test_split(cuisines_features_df, cuisines_label_df, test_size=0.3)
サポートベクタークラスタリング(SVC)は、サポートベクターマシンのファミリーに属するML手法の一つです(以下で詳しく説明します)。この方法では、「カーネル」を選択してラベルのクラスタリング方法を決めます。パラメータ 'C' は「正則化」を意味し、パラメータの影響力を制御します。カーネルは複数の中から選べますが、ここでは線形SVCを使うために'linear'に設定しています。確率はデフォルトで 'false' ですが、ここでは確率推定を取得するために 'true' に設定しています。データをシャッフルして確率を得るために乱数状態を'0'に設定しています。
まず、分類器の配列を作成します。テストしながら順次分類器をこの配列に追加します。
-
Linear SVCで始めましょう:
C = 10 # 異なる分類器を作成します。 classifiers = { 'Linear SVC': SVC(kernel='linear', C=C, probability=True,random_state=0) }
-
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は「隣接点」ファミリーのML手法で、教師あり・教師なし学習の両方に使われます。この方法は、予め定めた数の点を作成し、その周辺にデータを集めてデータの一般化したラベルを予測します。
前の分類器は良好に機能しましたが、精度向上を狙いましょう。K-Nearest Neighbors分類器を試します。
-
分類器配列に行を追加します(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
サポートベクター分類器は、分類や回帰タスクに用いられるサポートベクターマシンファミリーの一部です。SVMは「訓練サンプルを空間上の点にマップし」、2つのカテゴリ間の距離を最大化します。その空間に新たなデータをマッピングしてカテゴリを予測します。
サポートベクター分類器で少し精度向上を目指しましょう。
-
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)を使用して翻訳されました。正確性を期しておりますが、自動翻訳には誤りや不正確な部分が含まれる場合があります。原文の母国語による文書が正式な情報源とみなされるべきです。重要な情報については、専門の人間による翻訳を推奨します。本翻訳の利用により生じたいかなる誤解や誤訳に関しても、当方は責任を負いかねます。
