重生归来,我要成功 Python 高手--day31 线性回归

线性回归:

定义:利用回归方程(函数)对一个或多个自变量(特征值)和因变量(目标值)之间的关系进行建模的一种分析方式

分类:

一元线性回归:目标值只有一个因变量有关

y=wx+b w:权重 b=偏置

多元线性回归:目标值与多一个因变量有关

y=w1x1+w2x2+....+b=WT+b 等于w矩阵的转置为将w和x提取出来就是为对应矩阵相乘,而矩阵相乘的前提就是第一个矩阵的列等于第二个矩阵的行所有将w矩阵进行转置

线性回归的API:

1.导包 2.准备数据 3.实例化线性回归模型 4. 训练 5. 预测

复制代码
# 导包
from sklearn.linear_model import LinearRegression
# 创建数据
x = [[160], [166], [172], [174], [180]]
y = [56.3, 60.6, 65.1, 68.5, 75]
x_test=[[176]]
# 创建模型
model=LinearRegression()
# 模型训练
model.fit(x,y)
# 模型预测
y_pre=model.predict(x_test)
# 输出预测值和权重和偏置
print(f'模型的预测值为:{y_pre}')
print(f'模型的权重是:{model.coef_}')
print(f'模型的偏置是:{model.intercept_}')

损失函数:

误差:预测值-真实值 就是为误差(一个点)

损失函数: 衡量每个样本预测值减去真实值效果的函数(多个点)

最小二乘法:

每个样本之间的预测值减去真实值的平方的和,这个值越小说明说明误差越小,说明模型的效果越好

均方误差(MSE):

计算每个样本的预测值和真实值的差值的平方求和之后求平均数

平均绝对误差(MAE):

计算每个样本的预测值和真实值的绝对值的差值之后求和求平均数

导数和矩阵:

常见的数据表述方式

标量: 一个数值例如 a=10

矢量/向量:有大小有方向,向量,一列顺序排列的元素,默认为列向量例如一个Serise对象

矩阵:二维数组 2*3 两行三列

张量:n维的数组 0为标量 1为向量 2为矩阵

导数:y=f(x) 对他求导 f'(x)

斜率为f'(x)=k, 导数为0是为当前点的极值点

偏导:对那个数求导那么其他的数就为常数

向量和矩阵:

向量:有大小有方法

基本运算:对应元素的位置加减乘除必须形状相同

转置:行转列,列转行 例如:三行一列 变成一行三列

范数:

L1范数:向量中每个元素的绝对值之和

L2范数:向量的模长,每个元素平方求和再开根号

例如:x的转置为(1,2,-3):

l1为:6 l2为:根号下14

l2范数的平方等于x的转置*X 为14

矩阵的运算:

形状相同:对应位置进行加减乘除即可

第一个矩阵的列等于第二个矩阵的行

两行三列*三行两列 最后得到一个两行两列的一个矩阵

正规方程法:

一元线性回归:使用最小二乘:(预测值-真实值)的平方,

为(kx(i)+b-y(i))的平方,对k和b分别求导将x,y带入直接求出k和b

多元线性回归:一个样本有多个特征,每个特征有对应的权重

y=w1x11+w2x12+w3x13+...+b 为预测值

预测值减去真实值的平方

梯度下降:

沿着梯度下降的方法求解最小值

公式:W新=W旧-学习率*梯度

梯度就是损失韩式

学习率:决定了梯度下降迭代的过程中,每一步沿梯度负方向前进的距离

太小:梯度下降的缓慢

太大:容易造成梯度爆炸,错过最低点,梯度震荡

单变量梯度下降;

W新=W旧-学习率*梯度

多变量梯度下降

对多个变量分别进行求偏导然后更新这个值重复步骤

常见的梯度下降算法:

FGD:全梯度下降,每次迭代时用所有样本的梯度值

SGD: 随机梯度下降,每次迭代时随机使用一个样本的梯度值

mini-batch:小批量梯度下降法:每次使用样本的一部分的梯度值

SAG:随机平均梯度下降:每次迭代时,随机选择一个样本的梯度和以往样本梯度值的均值

梯度下降和正规方法的对比:

梯度下降:需要学习率,需要迭代求解,适用于大数据集

正规方程:一次运算就可得出,不需要学习率,适用于小数据集,如果数据量多,计算量会大

线性回归模型的评估:

MAE:平均绝对误差 真实值-预测值的绝对值之和求平均值

MSE:均方误差 真实值-预测值的平方之和求平均值

RMSE:均方根误差 真实值-预测值的平方之和求平均值开根号

均为越小越准确

特点:都能反映出预测值和真实值的误差

MAE对误差大小不敏感

RMSE:会放大预测误差较大样本的影响,对异常数据敏感

API:

复制代码
from sklearn.preprocessing import StandardScaler  # 标准化
from sklearn.model_selection import train_test_split  # 数据集的划分
from sklearn.metrics import mean_squared_error,mean_absolute_error,root_mean_squared_error # 模型的评估
from sklearn.linear_model import LinearRegression #正规方程的回归模型
from sklearn.linear_model import SGDRegressor # 梯度下降的回归模型
import pandas as pd
import numpy as np
data_url = "http://lib.stat.cmu.edu/datasets/boston"
raw_df = pd.read_csv(data_url, sep="\\s+", skiprows=22, header=None)
data = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]])
target = raw_df.values[1::2, 2]
# print(data)
# print(target)

# 数据集的划分
x_train,x_test,y_train,y_test=train_test_split(data, target,test_size=0.2, random_state=22)
# 特征的预处理,标准化
transfer=StandardScaler()
x_train=transfer.fit_transform(x_train)
x_test=transfer.transform(x_test)

# 模型的创建,正规方程
model=LinearRegression(fit_intercept=True)
# 模型的创建,梯度下降
# model=SGDRegressor(fit_intercept=True,learning_rate='constant',eta0=0.005)
# 模型的训练
model.fit(x_train,y_train)
# 模型的测试
y_pred=model.predict(x_test)
print(f'模型的预测数据为{y_pred}')
# 模型的评估
print(f'MAE,平均绝对误差: {mean_absolute_error(y_test,y_pred)}')
print(f'MSE,均方误差: {mean_squared_error(y_test,y_pred)}')
print(f'RMSE,均方根误差: {root_mean_squared_error(y_test,y_pred)}')

欠拟合和过拟合:

欠拟合:模型在训练集和测试集表现都不好

原因:模型太简单了

解决办法:添加特征

过拟合:模型在训练集表现好,在测试集表现不好

原因:模型太复杂了

解决办法:增加数据量,减少特征,减少模型对噪声的影响

演示:

复制代码
import numpy as np  # 主要是做数学相关运算操作等.
import matplotlib.pyplot as plt  # Matplotlib绘图的
from sklearn.linear_model import LinearRegression, Lasso, Ridge  # 线性回归的 正规方程解法, L1正则化, L2正则化.
from sklearn.metrics import mean_squared_error, root_mean_squared_error, mean_absolute_error  # 计算均方误差, 均方根误差, 平均绝对误差
from sklearn.model_selection import train_test_split  # 切割测试集和训练集.


def 过拟合():
    # 随机种子,固定生成的数据
    np.random.seed(1)
    # 生成x轴数据
    x=np.random.uniform(-3,3,size=100)
    # 生成y轴的值
    # 即:y=0.5x²+x+2+噪声(正态分布的生成随机数)
    # 0,1,size=100    生成正态分布随机数,均值是0,标准差1 ,随机个数100
    y = 0.5 * x ** 2 + x + 2 + np.random.normal(0, 1, size=100)
    # 对x轴的数据进行形状的转化
    x_train=x.reshape(-1,1)
    #模型的训练
    model=LinearRegression()
    model.fit(x_train,y)
    # 模型的预测
    y_predict=model.predict(x_train)
    print(f"预测值:{y_predict}")
    # 模型评估
    print(f"均方误差:{mean_squared_error(y, y_predict)}")
    print(f"均方根误差:{root_mean_squared_error(y, y_predict)}")
    print(f"平均绝对误差:{mean_absolute_error(y, y_predict)}")
    # 画图
    # 散点图,真实值
    plt.scatter(x,y)
    # 折线,预测值
    plt.plot(x,y_predict)
    # 展示
    plt.show()

def 正好拟合():
    # 随机种子,固定生成的数据
    np.random.seed(1)
    # 生成x轴数据
    x = np.random.uniform(-3, 3, size=100)
    # 生成y轴的值
    # 即:y=0.5x²+x+2+噪声(正态分布的生成随机数)
    # 0,1,size=100    生成正态分布随机数,均值是0,标准差1 ,随机个数100
    y = 0.5 * x ** 2 + x + 2 + np.random.normal(0, 1, size=100)
    # 对x轴的数据进行形状的转化
    x_train = x.reshape(-1, 1)
    # 对数据增加特征
    x2_train=np.hstack((x_train,x_train**2))

    # 模型的训练
    model = LinearRegression()
    model.fit(x2_train, y)
    # 模型的预测
    y_predict = model.predict(x2_train)
    print(f"预测值:{y_predict}")
    # 模型评估
    print(f"均方误差:{mean_squared_error(y, y_predict)}")
    print(f"均方根误差:{root_mean_squared_error(y, y_predict)}")
    print(f"平均绝对误差:{mean_absolute_error(y, y_predict)}")
    # 画图
    # 散点图,真实值
    plt.scatter(x, y)
    # 折线,预测值
    plt.plot(np.sort(x), y_predict[np.argsort(x)], color='r')
    # 展示
    plt.show()
def 过拟合():
    # 随机种子,固定生成的数据
    np.random.seed(1)
    # 生成x轴数据
    x = np.random.uniform(-3, 3, size=100)
    # 生成y轴的值
    # 即:y=0.5x²+x+2+噪声(正态分布的生成随机数)
    # 0,1,size=100    生成正态分布随机数,均值是0,标准差1 ,随机个数100
    y = 0.5 * x ** 2 + x + 2 + np.random.normal(0, 1, size=100)
    # 对x轴的数据进行形状的转化
    x_train = x.reshape(-1, 1)
    # 对数据增加特征
    x2_train = np.hstack((x_train, x_train ** 2, x_train**3, x_train**4, x_train**5, x_train**6))

    # 模型的训练
    model = LinearRegression()
    model.fit(x2_train, y)
    # 模型的预测
    y_predict = model.predict(x2_train)
    print(f"预测值:{y_predict}")
    # 模型评估
    print(f"均方误差:{mean_squared_error(y, y_predict)}")
    print(f"均方根误差:{root_mean_squared_error(y, y_predict)}")
    print(f"平均绝对误差:{mean_absolute_error(y, y_predict)}")
    # 画图
    # 散点图,真实值
    plt.scatter(x, y)
    # 折线,预测值
    plt.plot(np.sort(x), y_predict[np.argsort(x)], color='r')
    # 展示
    plt.show()




if __name__=="__main__":
    # 过拟合()
    #  正好拟合()
    过拟合()

reshape(-1,1):将原本一维数据转化为二维数据 -1:会自动读取有多少行

np.hstack:是按照列(columns) 对数据进行拼接的,也就是将原始特征和其高次项特征横向拼接,形成更宽的特征矩阵。

正则化:

出现的原因:在模型训练的时候有些特征会影响模型复杂度,或者某个特征的异常值过多,所有要尽量减少这些特征的影响(甚至删掉某个特征)这就是正则化

L1正则化:损失函数+阿尔法*(所有特征的权重绝对值之和)

L2正则化:损失函数+阿尔法*(所有特征的权重平方之和)

阿尔法:惩罚系数,这个值越大,则权重的调整幅度越大,权重就越小

API:

复制代码
from sklearn.linear_model import LinearRegression, Lasso, Ridge
# 创建不同的回归模型
# 普通线性回归(无正则化)
lr = LinearRegression()

# L1正则化(Lasso回归)
lasso = Lasso(alpha=10.0, random_state=42)  # alpha是正则化强度

# L2正则化(Ridge回归)
ridge = Ridge(alpha=10.0, random_state=42)  # alpha是正则化强度

# 训练模型
lr.fit(X_train, y_train)
lasso.fit(X_train, y_train)
ridge.fit(X_train, y_train)

# 预测
y_pred_lr = lr.predict(X_test)
y_pred_lasso = lasso.predict(X_test)
y_pred_ridge = ridge.predict(X_test)
相关推荐
时序大模型8 小时前
KDD2025 |DUET:时间 - 通道双聚类框架,多变量时序预测的 “全能选手”出现!
人工智能·机器学习·时间序列预测·时间序列·kdd2025
深入理解GEE云计算9 小时前
遥感生态指数(RSEI):理论发展、方法论争与实践进展
javascript·人工智能·算法·机器学习
深度学习lover9 小时前
<项目代码>yolo织物缺陷识别<目标检测>
人工智能·python·yolo·目标检测·计算机视觉·织物缺陷识别·项目代码
渡我白衣9 小时前
C++:链接的两难 —— ODR中的强与弱符号机制
开发语言·c++·人工智能·深度学习·网络协议·算法·机器学习
程序员大雄学编程10 小时前
用Python来学微积分23-微分中值定理
人工智能·python·数学·微积分
SunnyDays101110 小时前
如何使用Python编辑PDF文档:修改文本、添加图片、更新元数据等
python·编辑pdf·修改pdf文字
、、、、南山小雨、、、、10 小时前
加载YOLO模型,处理mp4视频
python·yolo·音视频
wshlp12345611 小时前
deepseek api 灵活使用
python
husterlichf11 小时前
机器学习核心概念详解(回归、分类和聚类)
机器学习·分类·回归·聚类