文章目錄
- 一、核心概念:數據分類的"切分線"
- 二、工作原理:從"找分界線"理解
- 二、常見算法
- 1、邏輯回歸:二分類
- 2、線性判別分析(LDA):分類與降維
- 3、兩種算法對比分析
- 三、實際應用:用代碼"切分"糖尿病數據
- 四、應用場景:線性分類的"用武之地"
?
一、核心概念:數據分類的"切分線"
線性分類就像用一把刀"切蛋糕"。如果蛋糕只有兩種口味(比如巧克力味和草莓味),你只需要一刀就能把它們完美地分開。這"一刀"就是我們機器學習中的 “決策邊界” 。它是一條直線、一個平面,或者在更高維度上的一個超平面,用來區分不同的數據類別。
核心定義:
線性分類算法通過學習數據特征,找到一個最佳的超平面,將不同類別的數據點分隔開。這個超平面就是模型的"分界線",它決定了新來的數據點屬于哪個類別。
?
二、工作原理:從"找分界線"理解
線性分類算法的工作流程可以簡單概括為以下幾步:
-
數據準備:首先,我們需要收集帶有明確標簽的數據。比如,如果你想識別貓和狗,就需要大量的貓圖片(標記為"貓")和狗圖片(標記為"狗")。
-
特征提取:計算機無法直接理解圖片或文字,所以我們需要將這些原始數據轉換為算法能理解的數字特征。比如,圖片的顏色、紋理、形狀等都可以轉化為數字向量。
-
模型學習:算法會通過學習這些帶有標簽的特征,自動找到一條最佳的"切分線"(決策邊界),使得不同類別的數據點盡可能地被這條線分開。
-
預測分類:當有新的、未知的圖片(比如一張你不知道是貓還是狗的圖片)進來時,算法會根據它落在"切分線"的哪一邊,來判斷其類別。
?
二、常見算法
在眾多線性分類算法中,**邏輯回歸(Logistic Regression, LR)和線性判別分析(Linear Discriminant Analysis, LDA)**是兩種非常經典且常用的方法。
1、邏輯回歸:二分類
LR 不直接預測類別,而是預測一個事件發生的概率。它通過一個特殊的"S"形函數(Sigmoid函數),將線性模型的輸出值映射到0到1之間,表示屬于某個類別的概率。
LR 假設數據服從伯努利分布(即只有兩種結果,成功或失敗),并且特征與對數幾率之間存在線性關系。當預測概率大于某個閾值(通常是0.5)時,就歸為一類;否則歸為另一類。這個閾值對應的就是它的決策邊界。
?
2、線性判別分析(LDA):分類與降維
核心思想
LDA是一個既做分類又做降維的算法。它的核心思想是:找到一個最佳投影方向,讓不同類別的數據投影后分得最清楚,同時讓同一類別的數據投影后聚得最緊。想象你有一堆不同顏色的球散落在三維空間里,LDA就是找到一個角度,從這個角度看過去,不同顏色的球能分得最清楚。
LDA用公式 類間距離類內距離\frac{\text{類間距離}}{\text{類內距離}}類內距離類間距離? 來衡量投影效果。它要最大化這個比值,讓分子(類間距離)越大越好,分母(類內距離)越小越好。通過求解這個優化問題,LDA找到最優的投影方向。
?
分類與降維
LDA既可以做二分類,也可以做多分類。在二分類中,它找到一個投影方向將數據投影到一條直線上;在多分類中,它找到多個投影方向將數據投影到低維空間。 同時,LDA還具有降維功能:二分類從任意維度降到1維,C分類從任意維度降到(C-1)維。
?
假設與應用條件
LDA假設數據像鐘形曲線一樣分布,且不同類別的"鐘形"形狀相同。 如果這個假設成立,LDA效果很好;如果不成立,效果就會變差。與邏輯回歸相比,LDA像是一個"幾何學家",專注于找到最好的觀察角度,而邏輯回歸像是一個"概率學家",專注于計算每個樣本屬于各類別的概率。
?
3、兩種算法對比分析
特性 | 邏輯回歸 (LR) | 線性判別分析 (LDA) |
---|---|---|
核心 | 預測概率,通過 Sigmoid 函數映射 | 尋找最佳投影方向,最大化類間散度,最小化類內散度 |
輸出 | 概率值 (0-1) | 判別函數值 |
假設 | 數據服從伯努利分布,特征與對數幾率線性相關 | 數據服從高斯分布,各類別協方差矩陣相同 |
優點 | 簡單高效,輸出概率直觀,易于解釋 | 在類別區分度高時表現良好,對多分類問題處理自然 |
缺點 | 對異常值敏感,對數據分布有一定要求 | 對數據分布(高斯分布、同協方差)有較強假設 |
?
三、實際應用:用代碼"切分"糖尿病數據
我們用 Python 的 scikit-learn
庫,在著名的 Pima Indians 糖尿病數據集上,實際操作一下線性分類算法。這個數據集包含了印第安女性的健康數據,目標是預測她們是否患有糖尿病。
from pandas import read_csv
from sklearn.model_selection import KFold, cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
import pandas as pd# 1. 導入數據
filename = 'pima_data.csv' # 假設文件在當前目錄下
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename, names=names)# 2. 將數據分為輸入特征 (X) 和輸出結果 (Y)
array = data.values
X = array[:, 0:8] # 前8列是特征
Y = array[:, 8] # 最后一列是目標變量 (是否患糖尿病)# 3. 設置交叉驗證 (KFold)
n_splits = 10 # 分成10份
seed = 7 # 隨機種子,確保每次運行結果一致
kfold = KFold(n_splits=n_splits, random_state=seed, shuffle=True)# 4. 創建模型并評估
models = {'LR': LogisticRegression(solver='liblinear', max_iter=200), # solver='liblinear' 適用于小數據集'LDA': LinearDiscriminantAnalysis()
}results = {}
for name, model in models.items():# 使用交叉驗證評估模型性能scores = cross_val_score(model, X, Y, cv=kfold, scoring='accuracy')results[name] = (scores.mean(), scores.std())# 5. 打印結果
print("模型準確率 (平均值 ± 標準差):")
for name, (mean, std) in results.items():print(f"{name}: {mean:.4f} (±{std:.4f})")# 示例輸出
模型準確率 (平均值 ± 標準差):
LR: 0.7696 (±0.0495)
LDA: 0.7670 (±0.0480)
這告訴我們:
- LR 模型在預測糖尿病方面的平均準確率約為 76.96%,其性能在不同數據子集上的波動(標準差)約為 4.95%。
- LDA 模型的平均準確率約為 76.70%,性能波動約為 4.80%。
從結果來看,兩種線性分類模型在 Pima Indians 糖尿病數據集上的表現非常接近,準確率都在76%左右,且波動范圍不大。這意味著它們都能有效地對糖尿病進行初步預測。
你可以嘗試修改 LogisticRegression
中的 solver
參數(例如改為 'saga'
或 'lbfgs'
),或者調整 max_iter
(最大迭代次數),觀察模型性能是否會有變化。這能幫助你理解不同參數對模型訓練的影響。
?
四、應用場景:線性分類的"用武之地"
線性分類算法因其簡單、高效和易于解釋的特點,在許多實際場景中都有廣泛應用:
-
實際案例1:垃圾郵件識別
- 場景:你的郵箱每天都會自動將郵件分為"正常郵件"和"垃圾郵件"。
- 選擇指導:邏輯回歸常用于此,因為它能給出郵件是垃圾郵件的概率。你可以根據這個概率設置一個閾值,比如概率超過80%就直接扔進垃圾箱,低于20%就肯定是正常郵件,中間的再人工判斷。
-
實際案例2:客戶流失預測
- 場景:一家電信公司想知道哪些客戶可能很快會停止使用他們的服務(流失)。
- 選擇指導:邏輯回歸可以根據客戶的通話時長、套餐類型、投訴記錄等特征,預測客戶流失的概率。公司可以根據這些概率,提前對高風險客戶采取挽留措施,比如提供優惠套餐。
-
實際案例3:醫療診斷輔助
- 場景:醫生根據患者的各項體征數據(如血壓、血糖、年齡等),輔助診斷某種疾病(如糖尿病、心臟病)。
- 選擇指導:LR 和 LDA 都可以作為初步的診斷模型。LR 提供患病概率,便于醫生評估風險;LDA 在類別區分度高時,能更好地找到疾病和健康人群之間的界限。