Skip to content

Latest commit

 

History

History
242 lines (163 loc) · 9.66 KB

File metadata and controls

242 lines (163 loc) · 9.66 KB

Cuisine classifiers 2

在第二課分類課程中,你將探索更多分類數值資料的方法。你也會了解選擇不同分類器的影響。

先備知識

我們假設你已完成先前課程並已在此 4 課資料夾根目錄的 data 資料夾中,準備好一份名為 cleaned_cuisines.csv 的清理後資料集。

準備工作

我們已在你的 notebook.ipynb 檔案中載入清理後的資料集,並將其分割成 X 和 y 的資料框,準備進行模型建立流程。

分類地圖

之前,你已透過 Microsoft 的流程圖學習如何分類資料。Scikit-learn 提供了一個類似但更加細緻的流程圖,能協助你縮小估計器(另一種稱呼為分類器)的選擇範圍:

ML Map from Scikit-learn

提示: 線上造訪此地圖 並沿路徑點擊以閱讀文件。

計畫

當你清楚掌握資料時,這張地圖非常有用,你可以沿著路徑“走”到決定點:

  • 我們有超過 50 筆樣本
  • 我們想要預測一個類別
  • 我們有標記資料
  • 樣本數少於 10 萬筆
  • ✨ 我們可以選擇 Linear SVC
  • 若不行,因為我們有數值資料
    • 我們可以嘗試 ✨ KNeighbors 分類器
      • 若還不行,再試 ✨ SVC 和 ✨ 集成分類器

這是一條非常實用的路徑可循。

練習 - 分割資料

沿著這條路徑,我們應先匯入一些庫。

  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)

線性 SVC 分類器

支持向量聚類 (SVC) 是支持向量機家族的子集(下方可查看更多關於 SVM 介紹)。此方法中,您可選擇「核函數」決定標籤如何聚類。「C」參數指的是「正則化」,用來調節參數的影響力。核函數可從多種選擇中設定(詳見多種核函數);這裡我們設為 'linear' 確保使用線性 SVC。機率預設為 'false',這裡設為 'true' 以獲得機率估計。random_state 設為 '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-Neighbors 分類器

K-Neighbors 屬於「鄰居」系列的機器學習方法,可用於監督式與非監督式學習。此方法會建立預定數量的點,再根據這些點聚集資料,從而對資料做出一般化標籤預測。

練習 - 套用 K-Neighbors 分類器

前一個分類結果不錯並且與資料相符,但也許還能得到更佳準確度。試試 K-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 透過「將訓練範例映射到空間點」的方式,最大化兩類別之間的距離。後續資料映射到此空間,以便預測其類別。

練習 - 使用支持向量分類器

讓我們試著用支持向量分類器提升準確度。

  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
    

    ✅ 了解更多 支持向量

集成分類器

即使前面測試結果相當不錯,讓我們一路沿著路徑嘗試集成分類器,特別是隨機森林和 AdaBoost:

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

結果非常好,尤其是隨機森林:

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

✅ 了解更多 集成分類器

此機器學習方法「結合多個基礎估計器的預測」,以提升模型品質。範例中,我們使用了隨機森林與 AdaBoost。

  • 隨機森林 是一種平均法,建立多棵帶有隨機性的「決策樹」森林以避免過擬合。n_estimators 參數設定樹的數量。

  • AdaBoost 會先將分類器擬合到資料集,然後複製該分類器並再次擬合同一資料集。它會關注錯誤分類項的權重,並調整下一個分類器以糾正。


🚀挑戰

這些技術都有大量可調整的參數。請研究它們的預設參數,並思考參數微調會如何影響模型品質。

回顧與自學

這些課程中有許多術語,花點時間複習這份有用的術語列表

作業

參數調整遊戲


免責聲明
本文件乃透過人工智能翻譯服務 Co-op Translator 翻譯而成。雖然我們致力於確保準確性,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應視為權威來源。對於重要資訊,建議使用專業人工翻譯。我們不對因使用本翻譯而引起的任何誤解或曲解承擔責任。