
在機器學習的學習之路上線性回歸和邏輯回歸是兩塊重要的基石。今天我們將通過兩個實戰案例從理論到代碼全面掌握這兩種算法的應用案例一多元線性回歸—— 根據體重和年齡預測血壓收縮壓案例二邏輯回歸—— 信用卡欺詐交易檢測Kaggle 經典數據集。一、多元線性回歸1.1 什么是多元線性回歸簡單線性回歸使用一個自變量來預測因變量而多元線性回歸則使用兩個或以上的自變量。其數學表達式為y β? β?x? β?x? ... β?x? ε其中y是目標變量因變量x?, x?, ..., x?是特征自變量β?是截距β?, β?, ..., β?是回歸系數ε是誤差項。1.2 實戰血壓預測數據集我們使用的數據集包含三個字段體重、年齡、血壓收縮共 14 條記錄。體重(kg)年齡(歲)血壓收縮(mmHg)76.05012091.52014185.52012482.53012679.030117.........完整代碼import pandas as pd from sklearn.linear_model import LinearRegression 1. 讀取數據 data pd.read_csv(多元線性回歸.csv, encodinggbk, enginepython) 2. 查看相關性 —— 了解各特征與目標變量之間的關系 corr data[[體重, 年齡, 血壓收縮]].corr() print( 相關性矩陣 ) print(corr) 3. 創建模型 lr_model LinearRegression() 4. 準備特征和目標變量 x data[[體重, 年齡]] # 特征矩陣 y data[血壓收縮] # 目標變量 5. 訓練模型 lr_model.fit(x, y) 6. 模型評估 —— R2 分數 score lr_model.score(x, y) print(f\n模型 R2 分數: {score}) 7. 查看模型參數 print(f\n回歸系數: {lr_model.coef_}) print(f截距: {lr_model.intercept_:.2f})運行結果 相關性矩陣 體重 年齡 血壓收縮 體重 1.000000 -0.700283 0.906402 年齡 -0.700283 1.000000 -0.382773 血壓收縮 0.906402 -0.382773 1.000000 模型 R2 分數: 0.9461441227520285結果深度解讀1. 相關性矩陣分析體重 年齡 血壓收縮 體重 1.000000 -0.700283 0.906402 年齡 -0.700283 1.000000 -0.382773 血壓收縮 0.906402 -0.382773 1.000000從相關性矩陣中可以得出以下結論關系相關系數解讀體重 ? 血壓收縮0.906強正相關—— 體重越大收縮壓越高。這是影響血壓的最主要因素年齡 ? 血壓收縮-0.383弱負相關—— 在這組數據中年齡與血壓呈現輕微負相關體重 ? 年齡-0.700中等負相關—— 數據中體重和年齡存在一定的負相關關系關鍵發現體重的相關系數高達 0.906說明體重是影響收縮壓的核心因素。而年齡在本數據集中與收縮壓呈弱負相關-0.383這可能與樣本特性有關。2. R2 分數分析模型 R2 分數為0.9461這意味著模型能夠解釋94.61%的血壓收縮壓變化。擬合效果非常好說明體重和年齡這兩個特征對血壓有很強的解釋力。不過需要注意這里 R2 是在訓練集上計算的沒有做訓練集/測試集劃分14 條數據太少。在實際項目中應該劃分數據集并用測試集來評估避免過擬合。二、邏輯回歸 —— 信用卡欺詐檢測2.1 什么是邏輯回歸盡管名字里有回歸但邏輯回歸是一種分類算法。它通過 Sigmoid 函數將線性回歸的輸出映射到 [0, 1] 區間從而得到屬于某個類別的概率P(y1|x) 1 / (1 e^-(β? β?x? ... β?x?))對于二分類問題通常設定閾值為 0.5概率 ≥ 0.5 → 正類1欺詐交易概率 0.5 → 負類0正常交易。2.2 數據集介紹本案例使用的是Kaggle 信用卡欺詐檢測數據集包含約 28.5 萬條交易記錄。字段說明Time交易時間秒V1 ~ V28PCA 降維后的特征脫敏處理Amount交易金額Class標簽0 正常交易1 欺詐交易2.3 完整代碼詳解Step 1讀取數據并查看基本信息import pandas as pd data pd.read_csv(r./creditcard.csv) print(data.head())輸出結果前 5 行Time V1 V2 V3 V4 V5 ... V27 V28 Amount Class 0 0.0 -1.359807 -0.072781 2.536347 1.378155 -0.338321 ... 0.133558 -0.021053 149.62 0 1 0.0 1.191857 0.266151 0.166480 0.448154 0.060018 ... -0.008983 0.014724 2.69 0 2 1.0 -1.358354 -1.340163 1.773209 0.379780 -0.503198 ... -0.055353 -0.059752 378.66 0 3 1.0 -0.966272 -0.185226 1.792993 -0.863291 -0.010309 ... 0.062723 0.061458 123.50 0 4 2.0 -1.158233 0.877737 1.548718 0.403034 -0.407193 ... 0.219422 0.215153 69.99 0 [5 rows x 31 columns]數據共有 31 列包含 28 個 PCA 特征V1~V28、Time、Amount 和 Class 標簽。可以看到 Amount 列的數值149.62, 2.69, 378.66...差異很大后面需要進行標準化處理。Step 2數據預處理 —— Z-score 標準化from sklearn.preprocessing import StandardScaler scaler StandardScaler() data[Amount] scaler.fit_transform(data[[Amount]]) data data.drop([Time], axis1)為什么要對 Amount 做標準化Amount列的數值范圍0 ~ 25691遠大于 V1~V28經過 PCA 后基本在 [-5, 5] 范圍內。如果不進行標準化模型會錯誤地認為 Amount 比其他特征重要得多從而影響模型效果。Z-score 標準化公式z?? (x?? - x??) / s?x??該特征的均值數學期望s?該特征的標準差標準化后數據均值為 0標準差為 1。這里我們把Time列刪除了 —— 交易發生的絕對時間與欺詐行為之間通常沒有直接的線性關系保留它反而可能引入噪聲。Step 3數據可視化 —— 查看正負樣本分布import matplotlib.pyplot as plt from pylab import mpl 解決中文顯示問題 mpl.rcParams[font.sans-serif] [Microsoft YaHei] mpl.rcParams[axes.unicode_minus] False 統計類別數量并繪圖 labels_count data[Class].value_counts() print(labels_count) plt.title(正負樣本分布) plt.xlabel(類別) plt.ylabel(頻數) labels_count.plot(kindbar) plt.show()輸出結果Class 0 284315 1 492 Name: count, dtype: int64這個結果非常震撼類別數量占比正常交易0284,31599.83%欺詐交易14920.17%關鍵發現正常交易和欺詐交易的比例約為578:1這意味著每 579 筆交易中才可能出現 1 筆欺詐交易 —— 這是一個極度不平衡的數據集。Step 4劃分訓練集和測試集from sklearn.model_selection import train_test_split X_model data.drop([Class], axis1) # 特征矩陣29列 y_model data.Class # 標簽列 X_train_w, X_test_w, y_train_w, y_test_w train_test_split( X_model, y_model, test_size0.3, # 30% 作為測試集 random_state1000 # 隨機種子保證結果可復現 )train_test_split 參數說明參數含義test_size0.330% 的數據劃分為測試集70% 為訓練集random_state1000固定隨機種子確保每次運行得到相同的劃分結果Step 5訓練邏輯回歸模型from sklearn.linear_model import LogisticRegression C 是正則化強度的倒數C 越小正則化越強模型越簡單 lr LogisticRegression(C0.01) lr.fit(X_train_w, y_train_w)關于參數 C 的深入理解C是正則化強度的倒數。C 0.01正則化非常強 → 防止模型過擬合。邏輯回歸默認使用L2 正則化嶺回歸。這里選較小的 C 值是因為數據極度不平衡需要用強正則化來約束模型。Step 6模型評估test_predicted lr.predict(X_test_w) # 對測試集進行預測 result lr.score(X_test_w, y_test_w) # 計算準確率 print(f模型準確率: {result})輸出結果模型準確率: 0.9990168884519505運行結果深度解讀準確率高達99.90%這看起來非常優秀但這里有一個重要陷阱準確率 99.90% 并不意味著模型真的很好還記得我們之前統計的類別分布嗎欺詐交易只占 0.17%。如果我們寫一個傻瓜模型——把所有交易都預測為正常交易# 傻瓜策略全部預測為 0 dummy_accuracy (y_test_w 0).sum() / len(y_test_w) print(f全部預測為正常的準確率: {dummy_accuracy}) # 輸出約: 0.9983 (99.83%)這個什么都不做的策略也能達到99.83%的準確率所以核心結論在不平衡數據集中準確率Accuracy不是一個可靠的評估指標。我們需要關注的是精確率Precision被預測為欺詐的交易中有多少是真正的欺詐召回率Recall真正的欺詐交易中有多少被模型檢測出來了F1 分數精確率和召回率的調和平均。AUC-ROC模型區分正負樣本的能力。三、線性回歸 vs 邏輯回歸對比總結對比維度線性回歸邏輯回歸任務類型回歸預測連續值分類預測離散類別輸出范圍(-∞, ∞)[0, 1]概率值損失函數均方誤差MSE交叉熵損失Log Loss激活函數無線性輸出Sigmoid 函數評估指標R2, MAE, MSE, RMSE精確率、召回率、F1、AUC-ROC典型應用房價預測、氣溫預測垃圾郵件檢測、欺詐檢測、疾病診斷四、實戰經驗總結4.1 兩個案例的對比啟示維度案例一線性回歸案例二邏輯回歸數據量14 條小樣本28.5 萬條大數據特征數2 個29 個核心挑戰樣本太少容易過擬合樣本極度不平衡R2/準確率0.9461優秀0.9990看似優秀實則存疑可信度需更多數據驗證不能只看準確率4.2 關鍵R2 0.9461 說明什么體重和年齡共同解釋了 94.61% 的血壓變異。但 14 條數據太少模型可能過擬合需要更多樣本驗證。準確率 99.90% 說明什么單獨看模型表現極好。結合類別分布看幾乎所有樣本都是負類全部預測為 0也有 99.83%。真相模型的提升僅為 0.07%這點提升來自正確識別了極少數的欺詐交易。數據預處理的重要性Amount 標準化消除量綱差異避免大數值特征主導模型Time 刪除去除與目標變量無關的特征減少噪聲相關性分析中體重與血壓的相關性0.906遠超年齡-0.383。五、進階建議針對信用卡欺詐檢測案例可以從以下方向繼續優化處理樣本不平衡設置class_weightbalanced讓模型自動按類別頻率調整權重或用 SMOTE 過采樣random_state42固定隨機種子保證結果可復現。更全面的模型評估不平衡數據中準確率不可靠應關注精確率、召回率、F1 和 AUC用classification_report和roc_auc_score全面評估。