机器学习03 线性回归
什么是线性回归?
线性回归是一种统计建模方法,用于分析因变量(目标变量)与一个或多个自变量(预测变量)之间的线性关系。其核心假设是变量间存在线性关系,通过拟合一条直线(或超平面)来预测或解释数据。
可以看做一个函数,其中预测值为y,已知值为x,有多少个已知条件就有多少个x
同时,y与x的关系也可以对应x的n次幂
即求y=f(x1,x2,x3,,,,,xn)的关系也就是y=ax1**n+bx2**n+cx3**n........+b(b为常量)
不过一般也没这么复杂,下面讲解一下基础一元线性回归,也就是日常常见的身高体重问题
身高体重线性回归
假如有了以下身高和体重数据.假如已知播仔的身高,你能预测up主体重吗?
|
1 |
160 |
56.3 |
|
2 |
166 |
60.6 |
|
3 |
172 |
65.1 |
|
4 |
174 |
68.5 |
|
5 |
178 |
75 |
|
6 |
181 |
? |
用数学来推测:用一条线来拟合身高和体重之间的关系,再对新数据进行预测
方程 Y = kX + b k160 + b = 56.3 - - (1) k166 + b = 60.6 –- (2)
这样的方式对于标准线性数据是非常好用的,不过现实情况往往更加复杂,毕竟不是每个人都长的那么标准,个体之间的差异也就是数据之间的噪声不可避免,这时候就可以用上我们的线性回归api
线性回归API介绍
使用介绍

代码实现简单线性回归
# 导包
from sklearn.linear_model import LinearRegression
# 准备数据
x_train = [[160], [166], [172], [174], [180]]
y_train = [56.3, 60.6, 65.1, 68.5, 75]
x_test = [[176]]
# 创建模型
model = LinearRegression()
# 训练模型
model.fit(x_train, y_train)
print('---------------------------------------')
# 了解下模型算出的系数和截距
print(f"模型系数为:{model.coef_}") # 0.92942177
print(f"模型截距为:{model.intercept_}") # -93.27346938775517
print('---------------------------------------')
# 预测结果
# 一元线性公式: y = w * x + b = 0.92942177 * 176 - 93.27346938775517 = 70.3047
y_predict = model.predict(x_test)
print(f"预测结果为:{y_predict}")
机器学习如果单使用还是很简单的,下面是一些概念,仅使用可以不看,跳到后面即可
通过线性回归API可快速的找到拟合结果,那是怎么求解的呢?
衡量标准:损失函数
1.误差概念:用预测值y – 真实值y就是误差
2、损失函数:衡量每个样本预测值与真实值效果的函数,也叫代价函数、成本函数、目标函数
常见损失函数

当损失函数取最小值时,这时候的k就是最优解(对于样本数据来说)
这里假设b为100来演示计算

线性回归问题求解需要什么

导数:略 矩阵:略 考个研就会了,只是调api就不要自讨苦吃了
正规方程:略
梯度下降算法:人工智能核心算法
什么是梯度下降算法
梯度下降算法概述
梯度下降是一种用于优化目标函数的迭代算法,通过计算函数的梯度(导数)并沿负梯度方向更新参数,逐步逼近最小值。广泛应用于机器学习(如线性回归、神经网络)中的参数优化。
比喻手法
梯度下降如同一位蒙眼登山者,在浓雾弥漫的山间寻找谷底。他每一步都小心翼翼地用脚试探四周的坡度(计算梯度),专挑脚下最陡的方向(负梯度方向)迈步(参数更新)。步长(学习率)若是太大,可能一脚踩空滚落山崖(发散);步长太小,又像裹足不前的老者,迟迟找不到盆地(收敛过慢)。有时他会误入小土坑(局部最优),以为到达了目的地,殊不知真正的深渊还在远方(全局最优)。聪明的登山者会随身携带可变长度的探路杖(自适应学习率算法),在陡坡时小步挪动,缓坡时大胆跨越,最终触摸到大地的肚脐(全局最小值)。
什么是梯度
单变量函数中,梯度就是某一点的切线斜率即导数:有方向为函数增长最快的方向
多变量函数中,梯度就是某一个点的偏导数,方向为偏导数分量的向量方向
梯度下降公式

重点说一下多变量的梯度
单变量是切线斜率很好理解,多变量就是由每一个变量的偏导数的切线的斜率组成的向量,如图所示

举个例子,这里的函数为x1**2+x2**2,所以看起来很简单,可以自行设置一个多变量n次幂函数来测试一下

梯度下降与梯度
梯度下降分类

回归模型评估方法 MAE MSE RMSE

线性回归多元案例
这边先介绍一下几个案例,具体实操在后面
1.经典案例 波士顿房价数据集:初学者首选,但是由于内个问题,已被下架,不过pycharm给出了解决方案,报错代码
这是sklearn中最经典的回归数据集之一,包含506个样本和13个特征(如犯罪率、房间数、到就业中心的距离等),目标变量是房屋的中位数价格
from sklearn import datasets
boston = datasets.load_boston()
X, y = boston.data, boston.target
2.糖尿病数据集 (Diabetes Dataset)
包含442个患者的10个生理特征(如年龄、BMI、血压等),目标变量是一年后疾病进展的量化指标。
示例代码:
from sklearn import datasets
diabetes = datasets.load_diabetes()
X, y = diabetes.data, diabetes.target
自己练习可以使用第二个
波士顿放假预测案例背景

导入库
# 1. 导入所需的包
# pandas 用于数据处理
import pandas as pd
# numpy 用于数值计算
import numpy as np
# train_test_split 用于将数据集划分为训练集和测试集
from sklearn.model_selection import train_test_split
# StandardScaler 用于对数据进行标准化处理
from sklearn.preprocessing import StandardScaler
# SGDRegressor 用于实现线性回归模型(使用随机梯度下降优化)
from sklearn.linear_model import SGDRegressor
# mean_squared_error, mean_absolute_error, root_mean_squared_error 用于评估模型性能
from sklearn.metrics import mean_squared_error, mean_absolute_error, root_mean_squared_error
模型训练与评价
SGDRRegressor 模型简介
SGDRRegressor(Stochastic Gradient Descent with Warm Restarts Regressor)是一种基于梯度下降的回归模型,结合了周期性学习率重启策略(Cosine Annealing with Warm Restarts)以提升性能。该模型通过动态调整学习率,避免陷入局部最优,适用于回归任务。
# 2.加载数据
# 定义数据集的URL
data_url = "http://lib.stat.cmu.edu/datasets/boston"
# 从URL读取数据到一个DataFrame中,数据以一个或多个空格分隔,跳过前22行,不使用表头
raw_df = pd.read_csv(data_url, sep="\\s+", skiprows=22, header=None)
# 构建最终数据集,将DataFrame中的偶数行和奇数行的前两列合并
data = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]])
# 提取目标变量,即奇数行的第三列
target = raw_df.values[1::2, 2]
# 3.数据切割(train_test_split)
X_train, X_test, y_train, y_test = train_test_split(data, target, test_size=0.2, random_state=666)
# 4.数据预处理(标准化)
ss = StandardScaler()
# 先处理训练集
X_train = ss.fit_transform(X_train)
# 再处理测试集
X_test = ss.transform(X_test)
# TODO 5.创建模型(正规方程或者梯度下降)
"""
'constant'固定学习率,简单直接
'optimal'默认推荐,动态调整
'invscaling'配合power_t幂律衰减,可调节衰减速率
'adaptive'自动调整,提高收敛稳定性
"""
# 创建模型, 使用随机梯度下降优化,学习率为0.01
model = SGDRegressor(learning_rate="constant", eta0=0.01)
# 6.模型训练
model.fit(X_train, y_train)
# 7.模型预测
print(f"回归系数:{model.coef_}")
print(f"截距:{model.intercept_}")
y_predict = model.predict(X_test)
print(f"预测结果为:{y_predict}")
# 8.模型评估(MAE,MSE,RMSE)
print(f"MSE:{mean_squared_error(y_test, y_predict)}")
print(f"MAE:{mean_absolute_error(y_test, y_predict)}")
print(f"RMSE:{root_mean_squared_error(y_test, y_predict)}")
求出系数k为,截距b为
回归系数:[-0.15438958 1.46638353 0.14779825 0.40349525 -1.9962366 2.8071541
-0.07672922 -2.58228539 1.85829992 -2.37171592 -2.3471212 0.72962069
-3.81268453]
截距:[22.21650387]
线性回归中的欠拟合与过拟合
可以看出,在模型复杂度适中的时候相对训练误差和测试误差最小
模拟欠拟合与过拟合
欠拟合模拟
因为原函数是x的2次幂,而传入的参数确实一次,所以训练出的回归线也是一次的,属于欠拟合
# 1.导包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
# 2.准备数据
# 为了保证数据的一致性,这里设置随机数种子
np.random.seed(666)
# 模拟随机生成n维数组
x = np.random.uniform(-3,3,100)
# TODO 注意:加噪声目的是为了让点随机不规则,如果不加就是一个线性关系,加了模拟真实企业的数据
y = 0.5 * x ** 2 + x + 2 + np.random.normal(0,1,size=100)
# 3.创建模型
# TODO 注意: 此处使用的是线性回归模型,只能识别线性关系
model = LinearRegression()
# 4.训练模型
# TODO reshape把(n,)变成了(n,1)列向量,reshape(-1,1)其中的-1代表自动识别大小,1代表一列
X1 = x.reshape(-1,1)
# TODO y是二次函数而模型是线性回归(y=kx+b),X1就是一列数据
model.fit(X1,y)
# 5.模型预测
y_predict = model.predict(X1)
# 6.模型评估
print(f'均方误差: {mean_squared_error(y,y_predict)}') # 均方误差: 3.0750025765636577
# 7.可视化模型拟合效果
plt.scatter(x,y) # TODO 散点图
plt.plot(x,y_predict,color='red') # TODO 画出拟合的直线
plt.show()
过拟合模拟
Lasso模型概述
Lasso(Least Absolute Shrinkage and Selection Operator)是一种线性回归的改进方法,通过引入L1正则化项实现特征选择和模型复杂度控制。其核心目标是最小化损失函数与正则化项的加权和,从而在拟合数据的同时避免过拟合。
这里我们传入大量的数据从x的一次幂到二十次幂,可以看出结果与初始设定的二次幂相差很远,这就是过拟合,模型过于复杂
# 1.导包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression,Lasso
from sklearn.metrics import mean_squared_error
# 2.准备数据
# 为了保证数据的一致性,这里设置随机数种子
np.random.seed(666)
# 模拟随机生成n维数组
x = np.random.uniform(-3, 3, 100)
# TODO 注意: 此处噪声你可以尝试去掉,观察最终效果(原始数据和预测数据重合为一条曲线)
# 建议加上噪声,模拟真实企业数据,不可能完全拟合,因为真实企业数据一般不会完全符合线性关系
y = 0.5 * x ** 2 + x + 2 + np.random.normal(0, 1, 100)
# 3.创建模型
# model = LinearRegression()
model = Lasso(alpha=0.1)
# 4.训练模型
X1 = x.reshape(-1, 1)
# TODO y是二次函数而模型转换后X2也包含了X1的平方(二次项),最终训练X2
X2 = np.hstack([X1** I for I in range(1, 20)])
print(X2)
model.fit(X2, y)
# 5.模型预测
y_predict = model.predict(X2)
# 6.模型评估
print(f'均方误差: {mean_squared_error(y, y_predict)}') # 均方误差: 3.0750025765636577
# 7.可视化模型拟合效果
plt.scatter(x, y)
# TODO np.sort(x) : 升序排列x
# TODO np.argsort(x): 拿到x排序后的索引,再通过索引拿到y_predict的值
# TODO y_predict[np.argsort(x)] : 根据x所以找到对应的y_predict值
plt.plot(np.sort(x), y_predict[np.argsort(x)], color='red')
plt.show()

下面是理想情况的图
测试的时候可以手动改一下其他参数,如size生成的点数

欠拟合(Underfitting)和过拟合(Overfitting)是机器学习模型训练中常见的两类问题,分别对应模型在训练数据上表现不足或过度适应的情况。以下是它们的原因和解决方案的详细总结:
一、欠拟合(Underfitting)
定义:模型在训练集和测试集上表现均不佳,无法捕捉数据的基本规律。
表现:高偏差(High Bias),低方差(Low Variance)。
原因:
- 模型复杂度不足:模型过于简单(如线性模型拟合非线性数据)。
- 特征不足或质量差:特征数量少、信息量不足或未做有效特征工程。
- 训练数据不足:数据量过小,无法学习有效模式。
- 正则化过强:如L1/L2正则化系数过大,过度抑制模型参数。
解决方案:
- 增加模型复杂度:使用更复杂的模型(如用多项式回归替代线性回归、增加神经网络层数)。or 减少正则化强度(如降低L2正则化的λ值)。
- 特征工程:添加更多特征(如组合特征、多项式特征)。or使用领域知识构造更有意义的特征。
- 延长训练时间:对深度学习模型,增加训练轮次(Epochs)。
- 减少数据噪声:清洗数据,去除无关样本或异常值。
二、过拟合(Overfitting)
定义:模型在训练集上表现极佳,但在测试集上表现差,过度记忆训练数据中的噪声或局部特征。
表现:低偏差(Low Bias),高方差(High Variance)。
原因:
- 模型复杂度过高:模型过于复杂(如深度过大的决策树)。
- 训练数据不足或噪声多:数据量小或噪声干扰导致模型学习到无关规律。
- 特征过多:特征数量远大于样本数量,容易学到虚假相关性。
- 训练轮次过多:深度学习模型中训练时间过长(如Epochs过多)。
解决方案:
- 降低模型复杂度:简化模型结构(如减少神经网络层数、降低决策树深度)。使用正则化(L1/L2正则化、Dropout等)。
- 增加数据量:收集更多数据或通过数据增强(如图像旋转、文本替换)生成新样本。
- 特征选择:使用特征重要性分析(如随机森林、PCA)筛选关键特征。
- 早停(Early Stopping):监控验证集性能,在过拟合前终止训练。
- 交叉验证:使用K折交叉验证评估模型泛化能力。
- 集成方法:使用Bagging(如随机森林)或Boosting(如XGBoost)减少方差。
正则化(Regularization)概念
正则化是机器学习中用于防止模型过拟合的一种技术,通过在损失函数中引入额外的约束项,限制模型参数的复杂度,从而提升模型的泛化能力。
正则化的核心思想
- 目标:在最小化训练误差的同时,控制模型复杂度,避免模型过度依赖训练数据中的噪声或局部特征。
- 方法:在损失函数中添加一个与模型参数相关的惩罚项(Penalty Term),平衡“拟合数据”和“参数复杂度”。
L1正则化与L2正则化

LASSO回归 vs Ridge回归:对比与应用
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)