|
2 weeks ago | |
---|---|---|
.. | ||
solution | 3 weeks ago | |
README.md | 2 weeks ago | |
assignment.md | 3 weeks ago | |
notebook.ipynb | 3 weeks ago |
README.md
料理分類器 1
このレッスンでは、前回のレッスンで保存した、料理に関するバランスの取れたクリーンなデータセットを使用します。
このデータセットを使って、さまざまな分類器を用いて_材料のグループに基づいて特定の国の料理を予測_します。その過程で、分類タスクにアルゴリズムを活用する方法についてさらに学びます。
講義前のクイズ
準備
レッスン1を完了している場合、これら4つのレッスンのルート/data
フォルダに_cleaned_cuisines.csv_ファイルが存在することを確認してください。
演習 - 国の料理を予測する
-
このレッスンの_notebook.ipynb_フォルダで作業し、そのファイルとPandasライブラリをインポートします:
import pandas as pd cuisines_df = pd.read_csv("../data/cleaned_cuisines.csv") cuisines_df.head()
データは以下のように見えます:
Unnamed: 0 | cuisine | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1 | 1 | indian | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
2 | 2 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
3 | 3 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
4 | 4 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
-
次に、いくつかのライブラリをインポートします:
from sklearn.linear_model import LogisticRegression 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 from sklearn.svm import SVC import numpy as np
-
X座標とy座標を2つのデータフレームに分割してトレーニング用に準備します。
cuisine
をラベルデータフレームとして使用します:cuisines_label_df = cuisines_df['cuisine'] cuisines_label_df.head()
以下のように表示されます:
0 indian 1 indian 2 indian 3 indian 4 indian Name: cuisine, dtype: object
-
Unnamed: 0
列とcuisine
列をdrop()
を使って削除します。残りのデータをトレーニング可能な特徴として保存します:cuisines_feature_df = cuisines_df.drop(['Unnamed: 0', 'cuisine'], axis=1) cuisines_feature_df.head()
特徴データは以下のようになります:
almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | artemisia | artichoke | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
これでモデルのトレーニングを開始する準備が整いました!
分類器の選択
データがクリーンでトレーニングの準備が整ったら、どのアルゴリズムを使用するかを決定する必要があります。
Scikit-learnは分類を教師あり学習のカテゴリに分類しており、その中で多くの分類方法を提供しています。その種類は最初は非常に多くて混乱するかもしれません。以下の方法はすべて分類技術を含んでいます:
- 線形モデル
- サポートベクターマシン
- 確率的勾配降下法
- 最近傍法
- ガウス過程
- 決定木
- アンサンブル法(投票分類器)
- マルチクラスおよびマルチ出力アルゴリズム(マルチクラス分類、マルチラベル分類、マルチクラス・マルチ出力分類)
ニューラルネットワークを使ってデータを分類することもできますが、このレッスンの範囲外です。
どの分類器を選ぶべきか?
では、どの分類器を選ぶべきでしょうか?多くの場合、いくつか試して良い結果を探すのが一つの方法です。Scikit-learnはKNeighbors、SVC(2種類)、GaussianProcessClassifier、DecisionTreeClassifier、RandomForestClassifier、MLPClassifier、AdaBoostClassifier、GaussianNB、QuadraticDiscriminationAnalysisを比較し、結果を視覚化したサイドバイサイド比較を提供しています:
Scikit-learnのドキュメントで生成されたプロット
AutoMLはこれらの比較をクラウドで実行し、データに最適なアルゴリズムを選択できるため、この問題を簡単に解決します。こちらで試してみてください。
より良いアプローチ
しかし、無作為に推測するよりも、ダウンロード可能なMLチートシートのアイデアに従う方が良い方法です。ここでは、マルチクラス問題に対していくつかの選択肢があることがわかります:
Microsoftのアルゴリズムチートシートの一部、マルチクラス分類オプションを詳細に説明
✅ このチートシートをダウンロードして、印刷して壁に貼りましょう!
推論
制約を考慮して、異なるアプローチを推論してみましょう:
- ニューラルネットワークは重すぎる。クリーンで最小限のデータセットを使用し、ノートブックを介してローカルでトレーニングを実行するため、ニューラルネットワークはこのタスクには重すぎます。
- 2クラス分類器は使用しない。2クラス分類器は使用しないため、one-vs-allは除外されます。
- 決定木またはロジスティック回帰が適している可能性がある。決定木またはマルチクラスデータに対するロジスティック回帰が適している可能性があります。
- マルチクラスブースト決定木は異なる問題を解決する。マルチクラスブースト決定木は非パラメトリックタスク、例えばランキングを構築するタスクに最適であり、私たちには適していません。
Scikit-learnの使用
Scikit-learnを使用してデータを分析します。ただし、Scikit-learnでロジスティック回帰を使用する方法は多数あります。渡すべきパラメータを確認してください。
基本的に、ロジスティック回帰を実行する際に指定する必要がある重要なパラメータは2つあります - multi_class
とsolver
です。multi_class
値は特定の動作を適用します。solverの値は使用するアルゴリズムを指定します。すべてのsolverがすべてのmulti_class
値とペアリングできるわけではありません。
ドキュメントによると、マルチクラスの場合、トレーニングアルゴリズムは以下のように動作します:
- one-vs-rest (OvR)方式を使用する場合、
multi_class
オプションがovr
に設定されている場合 - クロスエントロピー損失を使用する場合、
multi_class
オプションがmultinomial
に設定されている場合。(現在、multinomial
オプションは‘lbfgs’, ‘sag’, ‘saga’, ‘newton-cg’ソルバーのみでサポートされています。)
🎓 ここでの「方式」は、'ovr'(one-vs-rest)または'multinomial'のいずれかです。ロジスティック回帰は基本的にバイナリ分類をサポートするように設計されているため、これらの方式はマルチクラス分類タスクをより適切に処理できるようにします。出典
🎓 「solver」は「最適化問題で使用するアルゴリズム」と定義されています。出典
Scikit-learnは、solverが異なるデータ構造によって引き起こされる課題をどのように処理するかを説明するこの表を提供しています:
演習 - データを分割する
前回のレッスンでロジスティック回帰について学んだばかりなので、最初のトレーニング試行ではロジスティック回帰に焦点を当てることができます。
train_test_split()
を呼び出してデータをトレーニングとテストグループに分割します:
X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3)
演習 - ロジスティック回帰を適用する
マルチクラスの場合、使用する_方式_と設定する_ソルバー_を選択する必要があります。multi_classをovr
に設定し、solverをliblinear
に設定してロジスティック回帰を使用します。
-
multi_classを
ovr
に設定し、solverをliblinear
に設定したロジスティック回帰を作成します:lr = LogisticRegression(multi_class='ovr',solver='liblinear') model = lr.fit(X_train, np.ravel(y_train)) accuracy = model.score(X_test, y_test) print ("Accuracy is {}".format(accuracy))
✅ デフォルトとしてよく設定される
lbfgs
のような別のソルバーを試してみてください
注意が必要な場合、データを平坦化するには、Pandasの
ravel
関数を使用してください。 精度は80%以上で良好です!
-
データの1行(#50)をテストして、このモデルの動作を確認できます:
print(f'ingredients: {X_test.iloc[50][X_test.iloc[50]!=0].keys()}') print(f'cuisine: {y_test.iloc[50]}')
結果が出力されます:
ingredients: Index(['cilantro', 'onion', 'pea', 'potato', 'tomato', 'vegetable_oil'], dtype='object') cuisine: indian
✅ 別の行番号を試して結果を確認してください。
-
さらに掘り下げて、この予測の精度を確認できます:
test= X_test.iloc[50].values.reshape(-1, 1).T proba = model.predict_proba(test) classes = model.classes_ resultdf = pd.DataFrame(data=proba, columns=classes) topPrediction = resultdf.T.sort_values(by=[0], ascending = [False]) topPrediction.head()
結果が出力されます - インド料理が最も確率が高いと予測されています:
0 indian 0.715851 chinese 0.229475 japanese 0.029763 korean 0.017277 thai 0.007634 ✅ なぜモデルがこれをインド料理だと確信しているのか説明できますか?
-
回帰のレッスンで行ったように、分類レポートを出力して詳細を確認してください:
y_pred = model.predict(X_test) print(classification_report(y_test,y_pred))
precision recall f1-score support chinese 0.73 0.71 0.72 229 indian 0.91 0.93 0.92 254 japanese 0.70 0.75 0.72 220 korean 0.86 0.76 0.81 242 thai 0.79 0.85 0.82 254 accuracy 0.80 1199 macro avg 0.80 0.80 0.80 1199 weighted avg 0.80 0.80 0.80 1199
🚀チャレンジ
このレッスンでは、クリーンアップしたデータを使用して、材料の組み合わせから国の料理を予測する機械学習モデルを構築しました。Scikit-learnが提供するデータ分類の多くのオプションをじっくり読んでみてください。さらに「solver」の概念を掘り下げて、裏で何が行われているのかを理解してください。
講義後のクイズ
レビューと自己学習
ロジスティック回帰の数学的背景について、このレッスンを掘り下げて学んでください。
課題
免責事項:
この文書は、AI翻訳サービス Co-op Translator を使用して翻訳されています。正確性を期すよう努めておりますが、自動翻訳には誤りや不正確さが含まれる可能性があります。元の言語で記載された原文を信頼できる情報源としてご参照ください。重要な情報については、専門の人間による翻訳を推奨します。本翻訳の利用に起因する誤解や誤認について、当方は一切の責任を負いません。