從零開始學機器學習——初探分類器

努力的小雨發表於2024-10-15

首先給大家介紹一個很好用的學習地址:https://cloudstudio.net/columns

在上一節中,我們已經完成了對所有經過均衡和清洗的菜品資料的準備工作。接下來,我們將考慮使用多種演算法,也就是不同的分類器,來構建模型。我們將利用這個資料集和各種分類器,基於一組特定的配料,預測這些菜品屬於哪個國家的美食。

在這一過程中,你將深入學習如何評估和權衡不同分類演算法的優缺點,以及如何選擇最適合當前任務的模型。

選擇你的分類器

Scikit-learn 將分類任務歸類為監督學習的一部分,其中包含了多種可用於分類的演算法和方法。初看之下,這些選擇似乎讓人眼花繚亂。以下是一些可用於分類的主要演算法:

  1. 線性模型(Linear Models):這些模型基於線性假設,透過對特徵進行線性組合來進行分類。
  2. 支援向量機(Support Vector Machines):此演算法透過找到最佳分隔超平面來最大化類別間的間隔,從而實現分類。
  3. 隨機梯度下降(Stochastic Gradient Descent):一種高效的最佳化方法,可以用於訓練各種模型,特別是在處理大規模資料集時。
  4. 最近鄰(Nearest Neighbors):基於例項的學習方法,透過計算樣本之間的距離來進行分類,簡單而有效。
  5. 高斯過程(Gaussian Processes):一種靈活的非引數貝葉斯方法,能夠捕捉資料的潛在分佈並進行分類。
  6. 決策樹(Decision Trees):透過構建樹狀結構來做出決策,根據特徵的不同值逐步劃分資料。
  7. 整合方法(投票分類器)(Ensemble methods — voting classifier):結合多個分類器的預測結果,以提高整體分類效能。
  8. 多類別多輸出演算法(Multiclass and multioutput algorithms):處理多類別分類和多標籤分類問題,能夠同時輸出多個類別的預測結果。

如何選擇分類器?

與其進行無目的的猜測,不如下載這份詳盡的機器學習速查表——微軟原版本的小抄表。該速查表對各種演算法進行了系統的比較和總結,能夠有效地指導我們在選擇適合的分類演算法時做出明智的決策。根據這份速查表,我們可以針對本章節中涉及的多種分類任務,考慮以下幾種演算法選擇:

以下是我自己翻譯後的中文版本,希望可以幫助大家,如圖所示:

image

分析模型選擇

首先,我們的預測值是固定的,並且涉及多類分類的問題,因此我們可以聚焦於多類分類模型的選擇。接下來,我們將逐個分析適合的演算法。

神經網路(Neural Network)雖然強大,但在這個特定任務中顯得過於複雜。我們的資料量較小且相對清晰。

我們可以考慮決策樹和邏輯迴歸這兩種演算法。決策樹是一種直觀且易於解釋的模型,適用於處理多類分類問題。它能夠自動選擇重要特徵並進行資料分割,直觀地展示決策過程。然而,邏輯迴歸也是一個非常實用的選擇,尤其是在處理多型別資料時,它能夠有效地建立類間的線性關係。

儘管增強決策樹在某些場景中非常有效,但它更適合用於非引數化的任務,尤其是在需要進行排序或整合多種模型時。而對於我們當前的任務,增強決策樹並不能提供直接的幫助。

綜合考慮這些因素,我們決定選擇邏輯迴歸作為我們的模型構建方法。

因為我們對 Scikit-learn 庫已經相對熟悉,今天,我們將主要分析 LogisticRegression 這一方法的引數設定,因為不同的引數配置會直接影響底層演算法的運作機制。透過對這些引數的深入理解,我們能夠更好地最佳化模型,以實現更高的分類準確率。

LogisticRegression詳解

當我們使用 Scikit-learn 進行邏輯迴歸運算時,兩個至關重要的引數是 multi_classsolver,它們對於模型的效能和適用性有著直接的影響,因此需要特別關注和詳細說明。

引數 描述 可選值 備註
multi_class 指定分類方式。 - ovr(一對多)
- multinomial(多項式)
- ovr 是預設選項,適用於二分類和多分類
- multinomial 適用於多分類且通常需要softmax輸出。
solver 最佳化演算法選擇,用於求解邏輯迴歸模型的權重。 - liblinear
- newton-cg
- lbfgs
- sag
- saga
- liblinear 僅適用於 ovr
- newton-cglbfgssagsaga 可以與 multinomial 配合使用。

詳細說明

  1. multi_class 引數
    • ovr(一對多):將多類問題轉換為多個二分類問題。對於每個類別,訓練一個分類器來區分該類別與其他所有類別。
    • multinomial(多項式):適用於多類別分類問題,使用softmax函式進行機率估計,通常在類別數量較多時效果較好。
  2. solver 引數
    • liblinear:適用於小資料集和二分類問題,支援 ovr
    • newton-cg:適用於多類別問題,支援 multinomial
    • lbfgs:適用於多類別問題,支援 multinomial,通常在大資料集上效果較好。
    • sag:適用於大資料集,支援 multinomial,加速收斂。
    • saga:適用於大資料集,支援 multinomial,同時支援L1和L2正則化。

匹配關係

  • liblinear 只與 ovr 相容。
  • newton-cglbfgssagsaga 都可以與 multinomialovr 相容。

關於多項式邏輯迴歸,我們已經有了一定的瞭解,接下來讓我們詳細解釋一下 "ovr"(一對多)是什麼意思,以及它在多類分類中的作用。

ovr詳解

"ovr" 本意為一對其餘(One-vs-Rest,OvR)策略,它涉及將多類資料集拆分為多個二元分類問題。具體而言,這種方法透過將每個類別視為一個獨立的二元分類任務,使得我們可以利用現有的二元分類演算法來解決更復雜的多類分類問題。對於每個二元分類問題,我們都將訓練一個二元分類器,並使用這些分類器中最可靠的模型進行最終預測。

例如,考慮一個多類分類問題,其中有三個類別:“red”、“blue”和“green”。在這種情況下,我們可以將這個多類分類問題拆分為以下三個二元分類資料集:

  1. 二元分類問題 1:判斷樣本是否為“red”,與其他兩個類別(“blue”和“green”)進行區分。
  2. 二元分類問題 2:判斷樣本是否為“blue”,與其他兩個類別(“red”和“green”)進行區分。
  3. 二元分類問題 3:判斷樣本是否為“green”,與其他兩個類別(“red”和“blue”)進行區分。

這種拆分方式使得每個分類器只需關注一個特定類別,從而簡化了模型訓練的過程。由於邏輯迴歸本身是為二元分類設計的,因此它不能直接應用於多類分類任務。然而,透過使用 OvR 策略,我們可以採用一種啟發式的方法,將多類分類問題分解為多個二元分類資料集,併為每個資料集訓練一個獨立的二元分類模型。

解析資料

經過以上分析,我們的模型選擇方案可以是 "ovr"(一對其餘,One-vs-Rest)或 "multinomial"(多項式)。由於邏輯迴歸最初是設計用於二分類任務的,因此這兩個方案引數的選擇都能夠有效地使邏輯迴歸在多類分類任務中發揮出色的效能。

在我們的模型中,我們決定將 multi_class 引數設定為 "ovr",並選擇 solver 設定為 "liblinear" 進行模型訓練。選擇 "liblinear" 作為求解器的原因在於它在處理小型資料集時表現出色,特別是在二元分類的場景中,能夠提供快速的收斂速度和較高的準確率。

分割資料

接下來我們將資料清洗下並進行測試、訓練集分割。

import pandas as pd
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

cuisines_df = pd.read_csv("../../data/cleaned_cuisines.csv")

cuisines_label_df = cuisines_df['cuisine']

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

這段程式碼的整體結構和邏輯我們已經有了相當清晰的印象,因此在此不再詳細解釋其具體實現。

構建模型

建立一個邏輯迴歸模型

lr = LogisticRegression(multi_class='ovr',solver='liblinear')
model = lr.fit(X_train, np.ravel(y_train))

accuracy = model.score(X_test, y_test)

Accuracy is 0.8015012510425354

運算完成後,我們觀察到模型的準確率高達 80%!

接下來,我們將對本輪預測結果進行詳細的檢查,以評估準確率的具體來源。

  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()

執行後的輸出如下——可以看到,根據模型的預測結果,這道菜被識別為日本菜的可能性最大。

japanese 0.935524
indian 0.040175
korean 0.016106
thai 0.005825
chinese 0.002370

與你在之前的迴歸章節中所進行的分析類似,我們同樣可以透過生成分類報告來獲取關於模型的更多詳細資訊。

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       238
      indian       0.92      0.87      0.89       243
    japanese       0.79      0.79      0.79       237
      korean       0.84      0.81      0.82       236
        thai       0.75      0.84      0.79       245

    accuracy                           0.80      1199
   macro avg       0.80      0.80      0.80      1199
weighted avg       0.80      0.80      0.80      1199

至此,本模型的構建過程已圓滿完成!

總結

儘管我們今天對資料的解析仍然採用了之前熟悉的方法,但我們在此基礎上新增了兩個重要的知識點。首先,我們深入探討了分類器的選擇,分析了不同分類器在特定任務中的適用性與表現。這不僅幫助我們更好地理解各類演算法的優勢與侷限性,也為未來的模型選擇提供了理論支援。

其次,我們詳細解析了邏輯迴歸中的引數設定,特別是對“ovr”(一對多)策略進行了深入學習。透過對這一策略的理解,我們能夠更清楚地掌握如何在多類分類問題中有效地應用邏輯迴歸,提高模型的準確性與泛化能力。

接下來我們將繼續深入學習各種分類器的特性與應用以提升整體的分類效能。


我是努力的小雨,一名 Java 服務端碼農,潛心研究著 AI 技術的奧秘。我熱愛技術交流與分享,對開源社群充滿熱情。同時也是一位騰訊雲創作之星、阿里雲專家博主、華為云云享專家、掘金優秀作者。

💡 我將不吝分享我在技術道路上的個人探索與經驗,希望能為你的學習與成長帶來一些啟發與幫助。

🌟 歡迎關注努力的小雨!🌟

相關文章