线性模型:从原理到实践

第一章:机器学习基本概念(附代码)
第二章:KNN算法:从思想到实现(附代码)
第三章:决策树算法:从思想到实现(附代码)
第四章:机器学习简单案例:如何预测客户是否流失(附代码)
第五章:理解数据标准化处理
第六章:线性模型:从原理到实践
第七章:KMeans 聚类算法:从理论到实践(附代码)
第八章:搞懂线性回归与梯度下降原理(附代码)
第九章:深度学习框架PyTorch
第十章:逻辑回归:从基础到实践(附代码)
第十一章:集成学习(一):从理论到实战(附代码)
第十二章:集成学习(二):从理论到实战(附代码)
第十三章:机器学习算法大比武(附代码)
第十四章:理解并解决欠拟合与过拟合
第十五章:机器学习案例:幸福感指数预测

一、线性模型概述

线性模型是机器学习中最基础且重要的模型类型,其核心思想是通过特征的线性组合进行预测。主要分为线性回归和逻辑回归两大类型。

1.1 线性回归(Linear Regression)

  • 核心公式y = w₁x₁ + w₂x₂ + ... + wₙxₙ + b
  • 参数解析
    • 权重(Weight):w 表示各特征对结果的贡献程度(斜率)
    • 偏置(Bias):b 表示基础偏移量(截距)
  • 参数特性
    • 可学习参数:模型自动优化的 wb
    • 超参数:需人工设置的参数(如学习率)
  • 初始化特性:模型参数初始化为随机值,需通过数据训练优化

1.2 逻辑回归(Logistic Regression)

  • 核心改进:在线性回归基础上增加 sigmoid 激活函数
  • 函数形式σ(z) = 1/(1+e⁻ᶻ)
  • 应用场景:专门处理二分类问题,输出概率值

二、核心概念解析

2.1 "线性"的本质

  • 自变量与因变量呈一次方关系,因变量 y 是自变量x的线性组合
  • 表现形式:
    • 一维空间:直线 y = kx + b
    • 二维空间:平面 y = k₁x₁ + k₂x₂ + b
    • 高维空间:超平面 y = k₁x₁ + ... + kₙxₙ + b

三、迭代优化思想

问题不能一步到位的解决,采用迭代的思想来解决!

3.1 迭代法三要素

  1. 随机初始化:要有随机 random 的初始化(rough start)【普适性】
  2. 优化策略:要有一个逐步变好的策略(优化细节)
  3. 终止条件:要有一个退出的条件(适时退出),收敛阈值或最大迭代次数

3.2 典型应用场景

  • 无监督学习:K-Means 聚类
  • 深度学习:梯度下降法
    • 批量梯度下降(BGD)
    • 随机梯度下降(SGD)
    • 小批量梯度下降(Mini-batch GD)

迭代优化思想在线性模型的学习过程中扮演了至关重要的角色,尤其是在确定模型参数的过程中。

3.3 迭代优化与线性模型的关系

1. 参数学习的基础
  • 初始化:在训练线性模型之前,所有的权重(w)和偏置(b)都是随机初始化的。这意味着模型最初对数据的理解是完全随机的,并不能准确预测目标值。
  • 逐步优化:通过迭代优化方法,如梯度下降法,可以逐渐调整这些参数,使得模型的预测结果越来越接近真实值。
2. 损失函数与梯度下降
  • 损失函数:用于衡量模型预测值与实际值之间的差距。对于线性回归问题,常用的损失函数包括均方误差(MSE)等。
  • 梯度下降:是一种常见的迭代优化算法,它通过计算损失函数关于每个参数的梯度,并按照梯度的反方向更新参数,从而最小化损失函数。这个过程需要多次迭代,每次迭代都会使模型更接近最优解。
3. 线性回归中的应用
  • 在线性回归中,利用迭代优化的方法来寻找最佳的权重和偏置,以最小化预测值与真实值之间的差异。例如,使用批量梯度下降、随机梯度下降(SGD)或小批量梯度下降等方法来更新模型参数。
  • 对于逻辑回归,虽然其本质上是一个分类问题,但同样采用了类似的迭代优化策略,通过最大化似然估计(或最小化损失函数)来调整模型参数。

线性回归和逻辑回归模型在训练时,实际上是在执行某种形式的梯度下降(或其他优化算法),以找到最优的参数组合。

四、线性回归案例

波士顿房价预测

4.1 数据准备

import pandas as pd
# 读取数据集,波士顿房价数据
data = pd.read_csv("./boston_house_prices.csv", skiprows=1)
data.info()
X = data.drop(columns=["MEDV"]).to_numpy()  # 特征矩阵
y = data["MEDV"].to_numpy()                # 目标值(房价)

data.info()输出
在这里插入图片描述

4.2 数据预处理

from sklearn.model_selection import train_test_split

# 数据拆分(训练集80%,测试集20%)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=0)

# 标准化处理(Z-score标准化)
mu = X_train.mean(axis=0)       # 计算均值
sigma = X_train.std(axis=0)     # 计算标准差
X_train_norm = (X_train - mu) / sigma
X_test_norm = (X_test - mu) / sigma

4.3 模型训练与评估

4.3.1 线性回归
from sklearn.linear_model import LinearRegression

# 创建并训练模型
lr = LinearRegression()
lr.fit(X_train_norm, y_train)

# 查看模型参数
print("权重系数:", lr.coef_)     # 各特征权重(w₁~wₙ)
print("截距项:", lr.intercept_)  # 偏置项(b)

# 预测与评估
y_pred = lr.predict(X_test_norm)
# 平均绝对误差 
# 输出 3.8429092204444952
mae = abs(y_pred - y_test).mean()           
# 均方误差 
# 输出33.44897999767651
mse = ((y_pred - y_test) ** 2).mean()       
print(f"线性回归MAE: {mae:.2f}, 线性回归MSE: {mse:.2f}")

权重系数:array([-0.97082019, 1.05714873, 0.03831099, 0.59450642, -1.8551476 ,
2.57321942, -0.08761547, -2.88094259, 2.11224542, -1.87533131,
-2.29276735, 0.71817947, -3.59245482])

截距项:22.611881188118836

线性回归MAE: 3.84, 线性回归MSE: 33.45

y_pred输出

array([24.88963777, 23.72141085, 29.36499868, 12.12238621, 21.44382254,
       19.2834443 , 20.49647539, 21.36099298, 18.8967118 , 19.9280658 ,
        5.12703513, 16.3867396 , 17.07776485,  5.59375659, 39.99636726,
       32.49654668, 22.45798809, 36.85192327, 30.86401089, 23.15140009,
       24.77495789, 24.67187756, 20.59543752, 30.35369168, 22.41940736,
       10.23266565, 17.64816865, 18.27419652, 35.53362541, 20.96084724,
       18.30413012, 17.79262072, 19.96561663, 24.06127231, 29.10204874,
       19.27774123, 11.15536648, 24.57560579, 17.5862644 , 15.49454112,
       26.20577527, 20.86304693, 22.31460516, 15.60710156, 23.00363104,
       25.17247952, 20.11459464, 22.90256276, 10.0380507 , 24.28515123,
       20.94127711, 17.35258791, 24.52235405, 29.95143046, 13.42695877,
       21.72673066, 20.7897053 , 15.49668805, 13.98982601, 22.18377874,
       17.73047814, 21.58869165, 32.90522136, 31.11235671, 17.73252635,
       32.76358681, 18.7124637 , 19.78693475, 19.02958927, 22.89825374,
       22.96041622, 24.02555703, 30.72859326, 28.83142691, 25.89957059,
        5.23251817, 36.72183202, 23.77267249, 27.26856352, 19.29492159,
       28.62304496, 19.17978838, 18.97185995, 37.82397662, 39.22012647,
       23.71261106, 24.93076217, 15.88545417, 26.09845751, 16.68819641,
       15.83515991, 13.10775597, 24.71583588, 31.25165267, 22.16640989,
       20.25087212,  0.59025319, 25.44217132, 15.57178328, 17.93719475,
       25.30588844, 22.3732326 ])

y_test输出:

array([22.6, 50. , 23. ,  8.3, 21.2, 19.9, 20.6, 18.7, 16.1, 18.6,  8.8,
       17.2, 14.9, 10.5, 50. , 29. , 23. , 33.3, 29.4, 21. , 23.8, 19.1,
       20.4, 29.1, 19.3, 23.1, 19.6, 19.4, 38.7, 18.7, 14.6, 20. , 20.5,
       20.1, 23.6, 16.8,  5.6, 50. , 14.5, 13.3, 23.9, 20. , 19.8, 13.8,
       16.5, 21.6, 20.3, 17. , 11.8, 27.5, 15.6, 23.1, 24.3, 42.8, 15.6,
       21.7, 17.1, 17.2, 15. , 21.7, 18.6, 21. , 33.1, 31.5, 20.1, 29.8,
       15.2, 15. , 27.5, 22.6, 20. , 21.4, 23.5, 31.2, 23.7,  7.4, 48.3,
       24.4, 22.6, 18.3, 23.3, 17.1, 27.9, 44.8, 50. , 23. , 21.4, 10.2,
       23.3, 23.2, 18.9, 13.4, 21.9, 24.8, 11.9, 24.3, 13.8, 24.7, 14.1,
       18.7, 28.1, 19.8])
4.3.2 KNN回归
from sklearn.neighbors import KNeighborsRegressor
# 使用5近邻
knn = KNeighborsRegressor(n_neighbors=5)  
knn.fit(X_train_norm, y_train)
y_pred_knn = knn.predict(X_test_norm)
# 平均绝对误差  Mean Absolute Error MAE 
loss_mae_knn = abs(y_pred - y_test).mean()
print(f"KNN MAE: {loss_mae_knn:.2f}")
loss_mse_knn = ((y_pred_knn - y_test) ** 2).mean()
print(f"KNN MSE: {loss_mse_knn:.2f}")

KNN MAE: 3.51
KNN MSE: 35.67

4.3.3 决策树回归
from sklearn.tree import DecisionTreeRegressor

dtr = DecisionTreeRegressor(random_state=0)
dtr.fit(X_train_norm, y_train)
y_pred_dtr = dtr.predict(X_test_norm)
# 平均绝对误差  Mean Absolute Error MAE
loss_mae_dtr = abs(y_pred - y_test).mean()
print(f"决策树 MAE: {loss_mae_dtr:.2f}")
loss_mse_dtr = ((y_pred_dtr - y_test) ** 2).mean()
print(f"决策树 MSE: {loss_mse_dtr:.2f}")

决策树 MAE: 3.58
决策树 MSE: 36.30

4.3.4 线性模型对比
模型类型平均绝对误差均方误差
线性回归3.8433.45
KNN回归(k=5)3.5135.67
决策树回归3.5836.30

五、逻辑回归案例

使用之前博客中提到的,预测客户流失的模型all_data.lxh,预测客户流失案例中,每一个样本的标签有2个值,流失或者不流失,是一个典型的二分类任务

5.1 二分类任务实现

import joblib
# 加载分类数据集(需提前准备)
_, [X_train_cls, y_train_cls, X_test_cls, y_test_cls] = joblib.load("all_data.lxh")

# 创建逻辑回归模型
from sklearn.linear_model import LogisticRegression
# 增加最大迭代次数
lr_cls = LogisticRegression(max_iter=1000)  
lr_cls.fit(X_train_cls, y_train_cls)

# 模型评估
y_pred_cls = lr_cls.predict(X_test_cls)
accuracy = (y_pred_cls == y_test_cls).mean()
print(f"分类准确率: {accuracy:.2%}")

# 查看模型参数
# 输出形状(1, 19)
print("分类权重:", lr_cls.coef_.shape)
print("分类偏置:", lr_cls.intercept_)

分类准确率: 0.90

分类权重:[[-0.03432062, 0.30570988, 0.16714428, 0.08224422, 0.2046806 ,
0.01729407, 0.09290679, -0.09146421, -0.71263014, 0.5350626 ,
0.53159589, -0.04987557, -0.81509068, 0.02346338, -0.10912122,
1.54194393, -2.69241636, -0.6710327 , 0.01970949]]

分类偏置:-2.96643208

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值