第一章:机器学习基本概念(附代码)
第二章:KNN算法:从思想到实现(附代码)
第三章:决策树算法:从思想到实现(附代码)
第四章:机器学习简单案例:如何预测客户是否流失(附代码)
第五章:理解数据标准化处理
第六章:线性模型:从原理到实践
第七章:KMeans 聚类算法:从理论到实践(附代码)
第八章:搞懂线性回归与梯度下降原理(附代码)
第九章:深度学习框架PyTorch
第十章:逻辑回归:从基础到实践(附代码)
第十一章:集成学习(一):从理论到实战(附代码)
第十二章:集成学习(二):从理论到实战(附代码)
第十三章:机器学习算法大比武(附代码)
第十四章:理解并解决欠拟合与过拟合
第十五章:机器学习案例:幸福感指数预测
一、线性模型概述
线性模型是机器学习中最基础且重要的模型类型,其核心思想是通过特征的线性组合进行预测。主要分为线性回归和逻辑回归两大类型。
1.1 线性回归(Linear Regression)
- 核心公式:
y = w₁x₁ + w₂x₂ + ... + wₙxₙ + b - 参数解析:
- 权重(Weight):
w表示各特征对结果的贡献程度(斜率) - 偏置(Bias):
b表示基础偏移量(截距)
- 权重(Weight):
- 参数特性:
- 可学习参数:模型自动优化的
w和b - 超参数:需人工设置的参数(如学习率)
- 可学习参数:模型自动优化的
- 初始化特性:模型参数初始化为随机值,需通过数据训练优化
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 迭代法三要素
- 随机初始化:要有随机 random 的初始化(rough start)【普适性】
- 优化策略:要有一个逐步变好的策略(优化细节)
- 终止条件:要有一个退出的条件(适时退出),收敛阈值或最大迭代次数
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.84 | 33.45 |
| KNN回归(k=5) | 3.51 | 35.67 |
| 决策树回归 | 3.58 | 36.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


1093

被折叠的 条评论
为什么被折叠?



