2024-08-24|閱讀時間 ‧ 約 19 分鐘

【資料分析】python機器學習-監督式學習常用方法選擇與基礎操作語法彙整

raw-image

監督式學習(Supervised Learning)是一種機器學習方法,其中模型在訓練階段利用標註過的數據進行學習。標註數據集包含輸入特徵(Features)和對應的正確結果或標籤(Labels)。模型通過學習輸入特徵與標籤之間的映射關係,來預測新數據的結果。監督式學習可分為分類和回歸兩類問題:分類旨在將數據點分配到預定義的類別中,而回歸則用於預測連續數值。


# 可使用目錄功能快速確認要閱覽的主題


方法選擇參考

  • 線性回歸: 當需要建立一個簡單且解釋性強的模型來預測連續數值,並且特徵與目標之間是線性關係時,選擇線性回歸。
  • 邏輯回歸: 當在處理二分類問題時,希望得到一個易於解釋且能預測樣本屬於某一類別的概率的模型,選擇邏輯回歸。
  • 決策樹: 當需要一個簡單易懂、能夠處理非線性關係且方便可視化的模型來做分類或回歸時,選擇決策樹。
  • 支持向量機 (SVM): 當需要一個強大的分類器來處理高維數據,尤其是當數據不可線性分離時,選擇支持向量機。
  • k-近鄰算法 (KNN): 當需要一個基於鄰近點進行分類或回歸的模型,且不需要提前訓練的情況下,選擇 KNN。
  • 隨機森林: 當想要一個具有高準確性且能夠自動處理過擬合的集成模型,尤其是面對高維數據或異常值時,選擇隨機森林。
  • 梯度提升機 (GBM): 當需要一個強大的集成模型來解決複雜的分類或回歸問題,且不介意較長的訓練時間,選擇梯度提升機。


線性回歸 (Linear Regression)

線性回歸是一種用於預測連續變量的方法。它假設兩個變量之間存在線性關係,即自變量(輸入特徵)和因變量(目標值)之間可以用一條直線來表示。


應用場景

  • 預測房價、銷售額等連續變量
  • 分析自變量與因變量之間的關係
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

# 假設 df 是你的資料框,其中包含特徵和目標值
X = df.drop(columns=['target']) # 自變量
y = df['target'] # 因變量

# 分割數據
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 建立線性回歸模型
model = LinearRegression()
model.fit(X_train, y_train)

# 預測
y_pred = model.predict(X_test)

# 計算均方誤差
mse = mean_squared_error(y_test, y_pred)
print(f'Mean Squared Error: {mse}')


線性回歸優點與缺點


優點

  • 簡單易解釋: 線性回歸模型簡單,容易理解和解釋。模型中的每個係數都能說明該特徵對目標變數的影響。
  • 計算效率高: 線性回歸的計算成本較低,適合大數據集的回歸問題。
  • 適合線性關係: 當特徵和目標變數之間的關係是線性的時,線性回歸表現良好。

缺點

  • 對異常值敏感: 線性回歸對異常值(outliers)非常敏感,異常值可能會極大影響模型的性能。
  • 不能捕捉非線性關係: 線性回歸只能捕捉線性關係,對於複雜的非線性數據表現較差。
  • 假設過於簡單: 假設特徵之間是獨立的,這在實際應用中可能不成立,影響模型的準確性。


邏輯回歸 (Logistic Regression)

邏輯回歸是一種用於分類問題的模型,特別適合於二元分類(如判斷是否生存)。雖然名稱中有「回歸」,但邏輯回歸實際上是用來預測一個二元結果(0或1,True或False)。


應用場景

  • 二元分類問題,如垃圾郵件檢測、疾病診斷
  • 預測某事件發生的概率
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 假設 df 是你的資料框,其中包含特徵和二元目標值
X = df.drop(columns=['target']) # 自變量
y = df['target'] # 因變量

# 分割數據
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 建立邏輯回歸模型
model = LogisticRegression(max_iter=3000)
model.fit(X_train, y_train)

# 預測
y_pred = model.predict(X_test)

# 計算準確率
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy}')



邏輯回歸優點與缺點


優點

  • 解釋性強: 邏輯回歸模型輸出的權重係數有清晰的物理意義,便於理解和解釋。
  • 適合二分類問題: 非常適合解決二元分類問題,比如醫療診斷、信用風險評估等。
  • 效率高: 計算開銷小,適合大規模數據集。

缺點

  • 不能捕捉複雜關係: 和線性回歸一樣,邏輯回歸假設數據是線性可分的,無法處理非線性可分的數據。
  • 對異常值敏感: 邏輯回歸也對異常值敏感,異常值可能會極大影響模型的性能。
  • 需要特徵工程: 數據可能需要進行大量的預處理和特徵工程才能得到良好的模型性能。


決策樹 (Decision Tree)

決策樹是一種基於樹狀結構的分類和回歸模型。每個節點代表一個特徵,每個分支代表該特徵的一個可能取值,每個葉節點代表一個預測結果。決策樹易於解釋,適合處理非線性數據。


應用場景

  • 分類問題,如用戶行為預測
  • 回歸問題,如預測某些連續變量
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 假設 df 是你的資料框,其中包含特徵和目標值
X = df.drop(columns=['target']) # 自變量
y = df['target'] # 因變量

# 分割數據
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 建立決策樹模型
model = DecisionTreeClassifier()
model.fit(X_train, y_train)

# 預測
y_pred = model.predict(X_test)

# 計算準確率
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy}')


決策樹優點與缺點


優點

  • 簡單易解釋: 決策樹模型的結構直觀,容易可視化和理解,適合展示決策過程。
  • 處理非線性數據: 決策樹可以很好地處理非線性數據,不需要對數據進行線性變換。
  • 特徵選擇自動化: 决策树能够自动处理多重特征的选择,且不需要进行数据标准化。

缺點

  • 容易過擬合: 決策樹容易對訓練數據過度擬合,導致對新數據的泛化能力較差。這需要通過剪枝或其他技術來控制。
  • 不穩定: 決策樹對於數據集的小變動非常敏感,可能導致完全不同的結果。
  • 偏差較高: 單棵決策樹的模型表現可能較差,特別是在數據集複雜的情況下。


支持向量機 (Support Vector Machine, SVM)

支持向量機是一種分類算法,其目的是找到一條最佳的超平面來最大化分類邊界,從而將不同類別的數據點分開。支持向量機在高維空間中特別有效,並且能夠處理非線性問題,這可以通過使用核技巧來實現。


應用場景

  • 二元分類問題,如文本分類、人臉識別
  • 當數據集高維度且類別之間的邊界明確時
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score

# 加載數據集
iris = datasets.load_iris()
X = iris.data
y = iris.target

# 分割數據
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 建立支持向量機模型
model = SVC(kernel='linear')
model.fit(X_train, y_train)

# 預測
y_pred = model.predict(X_test)

# 計算準確率
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy}')


支持向量機優點與缺點


優點

  • 效果好: 支持向量機在高維空間中表現出色,能夠有效處理線性不可分的數據,並且通常有較高的分類準確性。
  • 防止過擬合: SVM使用正則化參數來防止過擬合,在小樣本情況下依然表現良好。
  • 適用於各種場合: SVM能夠處理線性和非線性分類問題,並且在數據集中異常值較少的情況下效果尤為突出。

缺點

  • 計算成本高: 當數據集較大時,SVM的訓練時間和內存消耗會迅速增加,尤其是在選擇非線性核函數時。
  • 對異常值敏感: 雖然正則化可以防止過擬合,但SVM仍對異常值較為敏感,這可能會影響模型的性能。
  • 參數調整複雜: SVM的效果很大程度上依賴於正確選擇核函數和超參數,這通常需要通過交叉驗證進行調整。


k-近鄰算法 (k-Nearest Neighbors, KNN)

k-近鄰算法是一種簡單的非參數分類方法。該算法的基本思想是:對於給定的測試樣本,找出訓練集中與之最接近的k個樣本(鄰居),根據這k個樣本中的多數類別來決定測試樣本的類別。k-NN 對於少量數據集效果較好,但當數據量增大時計算開銷會增加。


應用場景

  • 圖像識別、文本分類等
  • 小型數據集或需要簡單直觀分類方法的情境
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score

# 加載數據集
iris = datasets.load_iris()
X = iris.data
y = iris.target

# 分割數據
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 建立k-NN模型
model = KNeighborsClassifier(n_neighbors=3)
model.fit(X_train, y_train)

# 預測
y_pred = model.predict(X_test)

# 計算準確率
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy}')


k-近鄰算法優點與缺點


優點

  • 簡單易實現: k-NN算法簡單直觀,無需建模、訓練,直接進行分類或回歸,是一種典型的懶惰學習方法。
  • 適用於多類型數據: k-NN可以處理分類和回歸問題,並且不依賴數據的分佈形狀,適用於各種類型的數據集。
  • 無需假設: k-NN不需要對數據做任何假設,對於非線性數據同樣適用。

缺點

  • 計算量大: k-NN需要計算每個樣本與所有訓練數據的距離,當數據集較大時,計算成本較高,且對內存消耗大。
  • 對異常值敏感: k-NN對噪音和異常值較為敏感,這可能導致模型性能下降。
  • 需要調整k值: k值的選擇對結果影響較大,過小的k可能導致過擬合,過大的k可能導致欠擬合。


隨機森林 (Random Forest)

隨機森林是一種集成學習方法,通過結合多棵決策樹的結果來提高模型的準確性和穩定性。它通常比單一的決策樹模型具有更好的表現,並且對於過擬合問題具有更好的抵抗力。


應用場景

  • 複雜的分類和回歸問題
  • 當特徵數量多且特徵之間存在較大關聯時
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 假設 df 是你的資料框,其中包含特徵和目標值
X = df.drop(columns=['target']) # 自變量
y = df['target'] # 因變量

# 分割數據
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 建立隨機森林模型
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)

# 預測
y_pred = model.predict(X_test)

# 計算準確率
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy}')


隨機森林優點與缺點


優點

  • 高準確率: 隨機森林通過集成多棵決策樹,能夠提高模型的準確率和穩定性,並減少過擬合的風險。
  • 適用性廣泛: 隨機森林可以處理分類和回歸問題,且在大部分情況下都能得到較好的效果。
  • 自動特徵選擇: 隨機森林可以自動對特徵進行選擇和篩選,對於高維數據尤其有效。

缺點

  • 計算資源消耗大: 由於隨機森林需要訓練多棵決策樹,因此計算資源和時間消耗較大,尤其是在數據集較大時。
  • 模型解釋性差: 雖然隨機森林能夠給出特徵的重要性排序,但由於其複雜性,模型的整體解釋性較差。
  • 偏差-方差權衡: 隨機森林中個別決策樹的偏差可能會累積,對於某些應用場景而言,模型可能存在過擬合風險。


梯度提升機 (Gradient Boosting Machine, GBM)

梯度提升機是一種集成學習算法,通過多個弱學習器(如決策樹)來生成一個強大的預測模型。GBM的基本思想是逐步構建樹模型,每棵樹都試圖修正前一棵樹的錯誤預測。GBM能夠有效地處理非線性數據,並且在各種數據集上表現出色。


應用場景

  • 複雜的分類和回歸問題
  • 需要高精度預測的應用,如金融風險分析
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.metrics import accuracy_score

# 加載數據集
iris = datasets.load_iris()
X = iris.data
y = iris.target

# 分割數據
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 建立GBM模型
model = GradientBoostingClassifier(n_estimators=100, learning_rate=0.1, random_state=42)
model.fit(X_train, y_train)

# 預測
y_pred = model.predict(X_test)

# 計算準確率
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy}')


梯度提升機優點與缺點


優點

  • 高準確性: GBM通過逐步建立並結合弱學習器(如決策樹),在許多應用中能夠達到非常高的預測準確性。
  • 靈活性強: GBM可以處理各種數據類型,包括數值型和類別型數據,並且能夠用於分類和回歸問題。
  • 對異常值不敏感: 由於每棵樹只關注上一棵樹的殘差,GBM對異常值的影響較小。

缺點

  • 計算成本高: 由於GBM逐步構建樹的過程需要多次迭代,這使得訓練時間較長,計算資源需求較大。
  • 參數調整困難: GBM有許多超參數需要調整,如樹的數量、深度和學習率,這使得調參過程較為繁瑣。
  • 容易過擬合: 如果樹的數量過多或者學習率過高,GBM容易過擬合,需要通過參數調整和正則化來緩解。
分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.