机器学习篇-day03-线性回归-正规方程与梯度下降-模型评估-正则化解决模型拟合问题

一. 线性回归简介

定义

线性回归(Linear regression)是利用 回归方程(函数)一个或多个自变量(特征值)和因变量(目标值)之间 关系进行建模的一种分析方式。

回归方程(函数)

一元线性回归: y = kx + b => wx + b k: 斜率, 在机器学习中叫 权重(weight), 简称: w b: 截距, 在机器学习中叫 偏差/偏置(bios), 简称: b

多元线性回归: y = w1x1 + w2x2 + w3x3... + b => w转置 * x + b

★线性回归的分类

一元线性回归

目标值只与一个因变量有关系

1个特征, 1个标签

多元线性回归

目标值只与多个因变量有关系

多个特征, 1个标签

★应用场景

有特征, 有标签, 且标签是 连续的

二. 线性回归问题求解

线性回归API

线性回归API介绍

代码演示
# 导包
from sklearn.linear_model import LinearRegression
​
​
# 1. 准备数据
# 训练集数据
x_train = [[160], [166], [172], [174], [180]]
y_train = [56.3, 60.6, 65.1, 68.5, 75]
​
# 2. 创建 线性回归 模型对象
estimator = LinearRegression()
​
# 3. 模型训练
estimator.fit(x_train, y_train)
​
# 4. 模型评估(暂时略过)
​
# 5. 模型预测
# 查看模型参数, 即: 斜率(权重) 和 截距(偏置)
print(f'斜率k(w): {estimator.coef_}')         # [0.92942177]
print(f'截距b: {estimator.intercept_}')    # -93.27346938775514
​
# 模型预测
x_test = [[176]]
y_predict = estimator.predict(x_test)
print(f'预测结果:{y_predict}')          # [70.3047619]

★损失函数

求解最优 斜率 和 截距(拟合结果)

误差概念

用预测值y – 真实值y 就是 误差

损失函数

衡量每个样本预测值与真实值效果的函数

公式推导

损失函数分类

损失函数: 用来衡量 预测值 和 真实值关系的, 分类如下:

  1. 最小二乘法:

    每个样本的 预估值 - 真实值 的平方和

  2. 均方误差(Mean Square Error => MSE):

    每个样本的 预估值 - 真实值 的平方和 / 样本数

  3. 平均绝对误差(Mean Absolute Error => MAE)

    每个样本的 预估值 - 真实值 的绝对值的 和 / 样本数

线性回归求解步骤

损失函数优化方向, 即: 让损失函数值最小 方式1: 梯度下降法. 方式2: 正规方程(求导, 求偏导)

复习-导数和矩阵

数据表述

导数

函数上某一个点的切线就是导数, 瞬时速度变化率

基本公式
四则运算

复合函数求导:

g(h)是外函数h(x)是内函数。先对外函数求导,再对内函数求导

偏导

向量

向量范数

矩阵

正规方程法

只适用于线性回归

一元线性回归推导

多元线性回归推导

★梯度下降算法

思想原理

输入:初始化位置S;每步距离为a 。输出:从位置S到达山底

步骤1:令初始化位置为山的任意位置S

步骤2:在当前位置环顾四周,如果四周都比S高返回S;否则执行步骤3

步骤3: 在当前位置环顾四周,寻找坡度最陡的方向,令其为x方向

步骤4:沿着x方向往下走,长度为a,到达新的位置S'

步骤5:在S'位置环顾四周,如果四周都比S^‘高,则返回S^‘。否则转到步骤3

梯度下降过程就和下山场景类似, 可微分的损失函数,代表着一座山, 寻找的函数的最小值,也就是山底.

梯度 gradient grad

单变量函数中,梯度就是某一点切线斜率(某一点的导数);有方向为函数增长最快的方向

多变量函数中,梯度就是某一个点的偏导数;有方向:偏导数分量的向量方向

梯度下降公式

单变量

多变量

总结梯度下降

梯度下降案例-信贷

梯度下降算法分类

分类

优缺点

正规方程梯度下降对比

三. 回归模型的评估方法

★MAE-平均绝对误差

MSE-均方误差

★RMSE-均方根误差

MAE 和 RMSE 接近, 都表明模型的误差很低, MAE 或 RMSE 越小, 误差越小

RMSE的计算公式中有一个平方项, 因此大的误差将被平方, 因此会增加RMSE的值, 大多数情况下RMSE>MAE

RMSE会放大预测误差较大的样本对结果的影响,而MAE 只是给出了平均误差

结论:RMSE > MAE都能反应真实误差,但是RMSE会对异常点更加敏感

四. 线性回归API和案例

线性回归API

正规方程

sklearn.linear_model.LinearRegression(fit_intercept=True)

通过正规方程优化

参数:fit_intercept,是否计算偏置

属性:

LinearRegression.coef_ (回归系数)

LinearRegression.intercept_(偏置)

梯度下降

sklearn.linear_model.SGDRegressor(loss="squared_loss", fit_intercept=True, learning_rate ='constant', eta0=0.01)

SGDRegressor类实现了随机梯度下降学习,它支持不同的损失函数和正则化惩罚项,来拟合线性回归模型。

参数

loss(损失函数类型)eg:loss=”squared_loss

fit_intercept(是否计算偏置)

learning_rate (学习率策略):string, optional ,可以配置学习率随着迭代次数不断减小, 比如:学习率不断变小策略: ‘invscaling’: eta = eta0 / pow(t, power_t=0.25)

eta0=0.01 (学习率的值)

属性

SGDRegressor.coef_ (回归系数)SGDRegressor.intercept_ (偏置)

★波士顿房价预测

正规方程

from sklearn.preprocessing import StandardScaler  # 特征处理
from sklearn.model_selection import train_test_split  # 数据集划分
from sklearn.linear_model import LinearRegression  # 正规方程的回归模型
from sklearn.linear_model import SGDRegressor  # 梯度下降的回归模型
from sklearn.metrics import mean_squared_error, mean_absolute_error, root_mean_squared_error  # 均方误差评估
from sklearn.linear_model import Ridge, RidgeCV
​
import pandas as pd
import numpy as np
​
# 1. 加载数据
# 数据地址
data_url = "http://lib.stat.cmu.edu/datasets/boston"
# pandas读取数据
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]
​
# 2. 数据预处理: 把总数据506条 按8:2划分
x_train, x_test, y_train, y_test = train_test_split(data, target,test_size=0.2,random_state=21
)
​
# 3. 特征工程: 特征预处理(标准化, 归一化)
# 创建标准化对象
transfer = StandardScaler()
# 标准化训练集
x_train = transfer.fit_transform(x_train)
# 标准化测试集
x_test = transfer.transform(x_test)
print(len(x_train), len(x_test))
​
# 4. 模型训练
# 创建线性回归模型对象 => 正规方程
estimator = LinearRegression(fit_intercept=True)
# 训练模型
estimator.fit(x_train, y_train)
# 打印模型的 权重和偏置
print('权重', estimator.coef_)
print('偏置', estimator.intercept_)
​
# 5. 模型预测
y_predict = estimator.predict(x_test)
print(y_predict)
​
# 6. 模型评估
# 基于 预测值 和 真实值 计算 模型的 均方误差
print(f'该模型的均方误差: {mean_squared_error(y_test, y_predict)}')
print(f'该模型的平均绝对误差: {mean_absolute_error(y_test, y_predict)}')
print(f'该模型的均方根误差: {root_mean_squared_error(y_test, y_predict)}')

梯度下降

from sklearn.preprocessing import StandardScaler  # 特征处理
from sklearn.model_selection import train_test_split  # 数据集划分
from sklearn.linear_model import LinearRegression  # 正规方程的回归模型
from sklearn.linear_model import SGDRegressor  # 梯度下降的回归模型
from sklearn.metrics import mean_squared_error, mean_absolute_error, root_mean_squared_error  # 均方误差, 平均绝对误差, 均方根误差评估
from sklearn.linear_model import Ridge, RidgeCV
​
import pandas as pd
import numpy as np
​
# 1. 加载数据
# 数据地址
data_url = "http://lib.stat.cmu.edu/datasets/boston"
# pandas读取数据
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]
​
# 2. 数据预处理: 把总数据506条 按8:2划分
x_train, x_test, y_train, y_test = train_test_split(data, target,test_size=0.2,random_state=21
)
​
# 3. 特征工程: 特征预处理(标准化, 归一化)
# 创建标准化对象
transfer = StandardScaler()
# 标准化训练集
x_train = transfer.fit_transform(x_train)
# 标准化测试集
x_test = transfer.transform(x_test)
print(len(x_train), len(x_test))
​
# 4. 模型训练
# 创建线性回归模型对象 => 梯度下降.
# 理解: 新的点 = 当前点 - 学习率 * 梯度(偏导)
# estimator = LinearRegression(fit_intercept=True)  # 正规方程
# constant: 常量, 即: 学习率的值
# eta0: 学习率(梯度下降公式中的α)
# max_iter: 最大迭代次数
estimator = SGDRegressor(fit_intercept=True,learning_rate='constant',eta0=0.001,max_iter=1000000
)
# 训练模型
estimator.fit(x_train, y_train)
# 打印模型的 权重和偏置
print('权重', estimator.coef_)
print('偏置', estimator.intercept_)
​
# 5. 模型预测
y_predict = estimator.predict(x_test)
print(y_predict)
​
# 6. 模型评估
# 基于 预测值 和 真实值 计算 模型的 均方误差
print(f'该模型的均方误差: {mean_squared_error(y_test, y_predict)}')
print(f'该模型的平均绝对误差: {mean_absolute_error(y_test, y_predict)}')
print(f'该模型的均方根误差: {root_mean_squared_error(y_test, y_predict)}')

五. 模型拟合问题

复习欠拟合与过拟合

欠拟合:模型在训练集和测试集上表现都不好。模型过于简单

正好拟合(泛化程度较高): 模型在训练集, 测试集上表现效果都比较好.

过拟合:模型在训练集上表现好,在测试集上表现不好。模型过于复杂

欠拟合在训练集和测试集上的误差都较大

过拟合在训练集上误差较小,而测试集上误差较大

欠拟合

代码

# 导包
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error  # 计算均方误差
from sklearn.linear_model import Ridge, Lasso
​
​
# 1. 定义函数, 表示: 欠拟合.
def dm01_欠拟合():# 1. 准备数据.# 准备噪声(可以简单理解为就是: 随机种子), 噪声相同, 每次生成的随机数(点)相同.np.random.seed(21)# x: 表示特征, -3 ~ 3之间 随机的小数, 生成: 100个.x = np.random.uniform(-3, 3, size=100)# y: 表示标签(目标值), 线性关系: y = 0.5x² + x + 2 + 正态分布 +  噪声.#  np.random.normal(0, 1, size=100) 意思是: 均值为0, 标准差为1, 生成100个.y = 0.5 * x ** 2 + x + 2 + np.random.normal(0, 1, size=100)
​# 模型训练.# 2. 创建 线性回归-正规方程 模型对象.estimator = LinearRegression(fit_intercept=True)  # 计算: 偏置.# 3. 对数据集做处理.X = x.reshape(-1, 1)# print(f'处理前 x => {x}')      # 假设: x = [1, 2, 3]# print(f'处理后 X => {X}')      # 处理后: X = [[1], [2], [3]]# 4. 模型训练.estimator.fit(X, y)  # 这里传的是, 处理后的x的值, 即: 二维数组.# 5. 模型预测.y_predict = estimator.predict(X)print(f'预测值为: {y_predict}')# 6. 模型评估.print(f'均方误差: {mean_squared_error(y, y_predict)}')  # 2.0683653437315512# 7. 数据可视化, 绘制图像.plt.scatter(x, y)  # 基于: 原始的x(特征), y值(真实值)绘制 散点图.plt.plot(x, y_predict, c='r')  # 基于: 原值的x(特征), y值(预测值)绘制 折线图(就是我们的 拟合回归线)plt.show()

结果

数据是抛物线=> 非线性, 用线性模型拟合, 模型过于简单, 欠拟合

产生原因

学习到数据的特征过少

解决办法

1)添加其他特征项,有时出现欠拟合是因为特征项不够导致的,可以添加其他特征项来解决, 例如: “组合”、“泛化”、“相关性”三类特征是特征添加的重要手段

2)添加多项式特征,模型过于简单时的常用套路,例如将线性模型通过添加二次项或三次项使模型泛化能力更强

正拟合

代码

def dm02_正好拟合():# 1. 准备数据.# 准备噪声(可以简单理解为就是: 随机种子), 噪声相同, 每次生成的随机数(点)相同.np.random.seed(21)# x: 表示特征, -3 ~ 3之间 随机的小数, 生成: 100个.x = np.random.uniform(-3, 3, size=100)# y: 表示标签(目标值), 线性关系: y = 0.5x² + x + 2 + 正态分布 +  噪声.#  np.random.normal(0, 1, size=100) 意思是: 均值为0, 标准差为1, 生成100个.y = 0.5 * x ** 2 + x + 2 + np.random.normal(0, 1, size=100)
​# 模型训练.# 2. 创建 线性回归-正规方程 模型对象.estimator = LinearRegression(fit_intercept=True)  # 计算: 偏置.# 3. 对数据集做处理.# 3.1 把数据从 一维数组 => 二维数组, 即: 从 [1, 2, 3] => [[1], [2], [3]]X = x.reshape(-1, 1)# 3.2 拼接: x 和 x的平方, 把数据从 [[1], [2], [3]] => [[1, 1], [2, 4], [3, 9]]   一元线性回归 => 二元线性回归X2 = np.hstack([X, X ** 2])  #print(f'处理前 x => {x}')  # 假设: x = [1, 2, 3]print(f'处理后 X => {X}')  # 处理后: X = [[1], [2], [3]]print(f'处理后 X2 => {X2}')  # 处理后: X2 = [[1, 1], [2, 4], [3, 9]]
​# 4. 模型训练.estimator.fit(X2, y)  # 这里传的是, 处理后的x的值, 即: 二维数组 => 二元线性回归# 5. 模型预测.y_predict = estimator.predict(X2)print(f'预测值为: {y_predict}')# 6. 模型评估.print(f'均方误差: {mean_squared_error(y, y_predict)}')  # 均方误差: 1.0009503498374301# 7. 数据可视化, 绘制图像.plt.scatter(x, y)  # 基于: 原始的x(特征), y值(真实值)绘制 散点图.
​# 细节: 要对x的值进行升序排列, 然后再绘制, 否则会出现: 散点没有连贯性.# plt.plot(x, y_predict, c='r')  # 基于: 原值的x(特征), y值(预测值)绘制 折线图(就是我们的 拟合回归线)# np.sort(x): 按照x的值 升序排列.# np.argsort(x): 按照x的值 升序排列, 返回(x对应的)索引值.plt.plot(np.sort(x), y_predict[np.argsort(x)], c='r')  # 基于: 原值的x(特征), y值(预测值)绘制 折线图(就是我们的 拟合回归线)plt.show()

结果

数据是一元二次方程抛物线, 给模型的数据, 增加x²项特征, 再用线性模型拟合, 模型结果正拟合

过拟合

代码

def dm03_过拟合():# 1. 准备数据.# 准备噪声(可以简单理解为就是: 随机种子), 噪声相同, 每次生成的随机数(点)相同.np.random.seed(21)# x: 表示特征, -3 ~ 3之间 随机的小数, 生成: 100个.x = np.random.uniform(-3, 3, size=100)# y: 表示标签(目标值), 线性关系: y = 0.5x² + x + 2 + 正态分布 +  噪声.#  np.random.normal(0, 1, size=100) 意思是: 均值为0, 标准差为1, 生成100个.y = 0.5 * x ** 2 + x + 2 + np.random.normal(0, 1, size=100)
​# 模型训练.# 2. 创建 线性回归-正规方程 模型对象.estimator = LinearRegression(fit_intercept=True)  # 计算: 偏置.# 3. 对数据集做处理.# 3.1 把数据从 一维数组 => 二维数组, 即: 从 [1, 2, 3] => [[1], [2], [3]]X = x.reshape(-1, 1)# 3.2 拼接: x, x的平方, x的立方, x的四次方..., 把数据从 [[1], [2], [3]] => [[1, 1....], [2, 4, 8, 16, 32, 64...], [3, 9, 27...]]   一元线性回归 => 二元线性回归X3 = np.hstack([X, X ** 2, X ** 3, X ** 4, X ** 5, X ** 6, X ** 7, X ** 8, X ** 9, X ** 10])  # 继续增加 最高次项print(f'处理前 x => {x}')  # 假设: x = [1, 2, 3]print(f'处理后 X => {X}')  # 处理后: X = [[1], [2], [3]]print(f'处理后 X2 => {X3}')  # 处理后: X = [[1], [2], [3]]
​# 4. 模型训练.estimator.fit(X3, y)  # 这里传的是, 处理后的x的值, 即: 二维数组 => 多元线性回归# 5. 模型预测.y_predict = estimator.predict(X3)print(f'预测值为: {y_predict}')# 6. 模型评估.print(f'均方误差: {mean_squared_error(y, y_predict)}')  # 均方误差: 0.9646255969834893# 7. 数据可视化, 绘制图像.plt.scatter(x, y)  # 基于: 原始的x(特征), y值(真实值)绘制 散点图.
​# 细节: 要对x的值进行升序排列, 然后再绘制, 否则会出现: 散点没有连贯性.# plt.plot(x, y_predict, c='r')  # 基于: 原值的x(特征), y值(预测值)绘制 折线图(就是我们的 拟合回归线)# np.sort(x): 按照x的值 升序排列.# np.argsort(x): 按照x的值 升序排列, 返回(x对应的)索引值.plt.plot(np.sort(x), y_predict[np.argsort(x)], c='r')  # 基于: 原值的x(特征), y值(预测值)绘制 折线图(就是我们的 拟合回归线)plt.show()

结果

数据是一元二次的, 特征值含有多个高次项, 模型过于复杂, 学习到脏数据, 过拟合

产生原因

原始特征过多,存在一些嘈杂特征, 模型过于复杂是因为模型尝试去兼顾所有测试样本

解决办法

1)重新清洗数据

导致过拟合的一个原因有可能是数据不纯,如果出现了过拟合就需要重新清洗数据。

2)增大数据的训练量

还有一个原因就是我们用于训练的数据量太小导致的,训练数据占总数据的比例过小。

3)正则化

4)减少特征维度

正则化

解释正则化

在解决回归过拟合中,我们选择正则化。但是对于其他机器学习算法如分类算法来说也会出现这样的问题,除了一些算法本身作用之外(决策树、神经网络),我们更多的也是去自己做特征选择,包括之前说的删除、合并一些特征

在学习的时候,数据提供的特征有些影响模型复杂度或者这个特征的数据点异常较多,所以算法在学习的时候尽量减少这个特征的影响(甚至删除某个特征的影响),这就是正则化

注:调整时候,算法并不知道某个特征影响,而是去调整参数得出优化的结

★L1正则化

概念原理

L1正则化,在损失函数中添加L1正则化项

α 叫做惩罚系数,该值越大则权重调整的幅度就越大,即:表示对特征权重惩罚力度就越大

L1 正则化会使得权重趋向于 0,甚至等于 0,使得某些特征失效,达到特征筛选的目的

代码演示
# 4. 定义函数, 表示: L1正则化 => 解决 过拟合问题的, 降低模型复杂度, 可能会使得权重变为0 => 特征选取.
def dm04_L1正则化():# 1. 准备数据.# 准备噪声(可以简单理解为就是: 随机种子), 噪声相同, 每次生成的随机数(点)相同.np.random.seed(21)# x: 表示特征, -3 ~ 3之间 随机的小数, 生成: 100个.x = np.random.uniform(-3, 3, size=100)# y: 表示标签(目标值), 线性关系: y = 0.5x² + x + 2 + 正态分布 +  噪声.#  np.random.normal(0, 1, size=100) 意思是: 均值为0, 标准差为1, 生成100个.y = 0.5 * x ** 2 + x + 2 + np.random.normal(0, 1, size=100)
​# 模型训练.# 2. 创建 线性回归-正规方程 模型对象.# estimator = LinearRegression(fit_intercept=True)    # 计算: 偏置.# 2. 创建 线性回归-L1正则化 模型对象.estimator = Lasso(alpha=0.1)  # alpha: 正则化参数, 其值越大, 则正则化程度越高, 即: 权重值越小, 则越容易被截断为0.
​# 3. 对数据集做处理.# 3.1 把数据从 一维数组 => 二维数组, 即: 从 [1, 2, 3] => [[1], [2], [3]]X = x.reshape(-1, 1)# 3.2 拼接: x, x的平方, x的立方, x的四次方..., 把数据从 [[1], [2], [3]] => [[1, 1....], [2, 4, 8, 16, 32, 64...], [3, 9, 27...]]   一元线性回归 => 二元线性回归X3 = np.hstack([X, X ** 2, X ** 3, X ** 4, X ** 5, X ** 6, X ** 7, X ** 8, X ** 9, X ** 10])  # 继续增加 最高次项print(f'处理前 x => {x}')  # 假设: x = [1, 2, 3]print(f'处理后 X => {X}')  # 处理后: X = [[1], [2], [3]]print(f'处理后 X2 => {X3}')  # 处理后: X = [[1], [2], [3]]
​# 4. 模型训练.estimator.fit(X3, y)  # 这里传的是, 处理后的x的值, 即: 二维数组 => 多元线性回归# 5. 模型预测.y_predict = estimator.predict(X3)print(f'预测值为: {y_predict}')# 6. 模型评估.print(f'均方误差: {mean_squared_error(y, y_predict)}')  # 均方误差: 1.026270345364126# 7. 数据可视化, 绘制图像.plt.scatter(x, y)  # 基于: 原始的x(特征), y值(真实值)绘制 散点图.
​# 细节: 要对x的值进行升序排列, 然后再绘制, 否则会出现: 散点没有连贯性.# plt.plot(x, y_predict, c='r')  # 基于: 原值的x(特征), y值(预测值)绘制 折线图(就是我们的 拟合回归线)# np.sort(x): 按照x的值 升序排列.# np.argsort(x): 按照x的值 升序排列, 返回(x对应的)索引值.plt.plot(np.sort(x), y_predict[np.argsort(x)], c='r')  # 基于: 原值的x(特征), y值(预测值)绘制 折线图(就是我们的 拟合回归线)plt.show()
结果图

Lasso回归L1正则 会将高次方项系数变为0

★L2正则化

概念原理

L2正则化,在损失函数中添加L2正则化项

α 叫做惩罚系数,该值越大则权重调整的幅度就越大,即:表示对特征权重惩罚力度就越大

L2 正则化会使得权重趋向于 0,一般不等于 0

代码演示
# 5. 定义函数, 表示: L2正则化 => 解决 过拟合问题的, 降低模型复杂度. 会使得权重趋向于0, 不会变为0.
def dm05_L2正则化():# 1. 准备数据.# 准备噪声(可以简单理解为就是: 随机种子), 噪声相同, 每次生成的随机数(点)相同.np.random.seed(21)# x: 表示特征, -3 ~ 3之间 随机的小数, 生成: 100个.x = np.random.uniform(-3, 3, size=100)# y: 表示标签(目标值), 线性关系: y = 0.5x² + x + 2 + 正态分布 +  噪声.#  np.random.normal(0, 1, size=100) 意思是: 均值为0, 标准差为1, 生成100个.y = 0.5 * x ** 2 + x + 2 + np.random.normal(0, 1, size=100)
​# 模型训练.# 2. 创建 线性回归-正规方程 模型对象.# estimator = LinearRegression(fit_intercept=True)    # 计算: 偏置.# 2. 创建 线性回归-L2正则化 模型对象.estimator = Ridge(alpha=0.1)  # alpha: 正则化参数, 其值越大, 则正则化程度越高, 即: 权重值越小, 则越容易被截断为0.
​# 3. 对数据集做处理.# 3.1 把数据从 一维数组 => 二维数组, 即: 从 [1, 2, 3] => [[1], [2], [3]]X = x.reshape(-1, 1)# 3.2 拼接: x, x的平方, x的立方, x的四次方..., 把数据从 [[1], [2], [3]] => [[1, 1....], [2, 4, 8, 16, 32, 64...], [3, 9, 27...]]   一元线性回归 => 二元线性回归X3 = np.hstack([X, X ** 2, X ** 3, X ** 4, X ** 5, X ** 6, X ** 7, X ** 8, X ** 9, X ** 10])  # 继续增加 最高次项print(f'处理前 x => {x}')  # 假设: x = [1, 2, 3]print(f'处理后 X => {X}')  # 处理后: X = [[1], [2], [3]]print(f'处理后 X2 => {X3}')  # 处理后: X = [[1], [2], [3]]
​# 4. 模型训练.estimator.fit(X3, y)  # 这里传的是, 处理后的x的值, 即: 二维数组 => 多元线性回归# 5. 模型预测.y_predict = estimator.predict(X3)print(f'预测值为: {y_predict}')# 6. 模型评估.print(f'均方误差: {mean_squared_error(y, y_predict)}')  # 均方误差: 0.964988964298911# 7. 数据可视化, 绘制图像.plt.scatter(x, y)  # 基于: 原始的x(特征), y值(真实值)绘制 散点图.
​# 细节: 要对x的值进行升序排列, 然后再绘制, 否则会出现: 散点没有连贯性.# plt.plot(x, y_predict, c='r')  # 基于: 原值的x(特征), y值(预测值)绘制 折线图(就是我们的 拟合回归线)# np.sort(x): 按照x的值 升序排列.# np.argsort(x): 按照x的值 升序排列, 返回(x对应的)索引值.plt.plot(np.sort(x), y_predict[np.argsort(x)], c='r')  # 基于: 原值的x(特征), y值(预测值)绘制 折线图(就是我们的 拟合回归线)plt.show()
结果图

Ridge线性回归l2正则不会将系数变为0 但是对高次方项系数影响较大

L1与L2的区别

工程开发中L1、L2使用建议:一般倾向使用L2正则。

相同点

都可以降低模型的复杂度, 都可以解决: 过拟合问题.

不同点

L1正则化会使得特征的权重变为0, 一般适用于: 特征选取.L2正则化会使得特征的权重趋向于0, 不会变为零. 可以解决 过拟合问题, 一般首选用 它.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1558187.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

react中css样式隔离

使用CSS Modules css模块化 1, 创建组件样式文件时以 xxx.module.css命名, 例如 Home.module.css 代替 Home.css 2, 在组件jsx导入样式文件时使用 import styles from ./xxx.module.css 导入 代替 import ./xxx.css 3, 在组件中需要设置样式的标签上添加class值, classNa…

如何扫描HTTP代理:步骤与注意事项

HTTP代理是一个复杂的过程,通常用于寻找可用的代理服务器,以便在网络中实现匿名或加速访问。虽然这个过程可以帮助用户找到适合的代理,但也需要注意合法性和道德问题。本文将介绍如何扫描HTTP代理,并提供一些建议和注意事项。 什…

python pyinstaller打包exe遇到报错:RuntimeError: input(): lost sys.stdin

在使用python中的pyinstaller命令打包exe遇到报错:RuntimeError: input(): lost sys.stdin 一、问题复现 import datetimedef record_log():project_name = input("请输入项目名称:")l

SpringBoot3响应式编程全套-Spring Webflux

目录 传送门前言一、组件对比二、WebFlux1、引入2、Reactor Core3、DispatcherHandler3.1、请求处理流程 4、注解开发4.1、目标方法传参4.2、返回值写法 5、文件上传6、错误处理7、RequestContext8、自定义Flux配置9、Filter 传送门 SpringMVC的源码解析(精品&…

GNURadio 平台实现SSB信号调制解调

目录 一、SSB 信号调制解调原理 二、搭建的GRC流图 一、SSB 信号调制解调原理 1.SSB调制原理 DSB信号虽然相比AM信号节约了功率利用率,但是信号带宽与AM信号一样,是基带信号最大频率的2倍。DSB信号上下边带信号完全一样,传递信息一样&…

ML 系列:【13 】— Logistic 回归(第 2 部分)

文章目录 一、说明二、挤压方法三、Logistic 回归中的损失函数四、后记 一、说明 ​ 在这篇文章中,我们将深入研究 squashing 方法,这是有符号距离方法(第 12节)的一种很有前途的替代方案。squashing 方法通过提供增强的对异常值…

TCP_SOCKET编程实现

文章目录 与UDP_SOCKET的区别第一代Tcp_ServerTcp_Client第二代Tcp_Server第三代Tcp_server多线程版本Tcp_Server线程池版的Tcp_Server使用inet_ntop来解决线程安全问题 业务逻辑编写总结补充说明&&业务代码完成ping的真实作用Translate编写Transform业务代码 整体总结…

三星SCX-4321NS卡纸、复印打印浅淡、扫描仪锁定故障检修

故障描述: 复印及打印过程中会偶尔卡纸、纸张褶皱(每次纸都卡在进纸传感器摇臂附近,然后纸就顶不上去了),复印或打印出来的文件整体偏淡;扫描仪锁定是在维修过程中突发的。 检修流程描述: 拆机检测 卡纸的问题是进纸器塑料部件断裂需要更换整套进纸器组件;经过更换整套…

Ansible 工具从入门到使用

1. Ansible概述 Ansible是一个基于Python开发的配置管理和应用部署工具,现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点,Pubbet和Saltstack能实现的功能,Ansible基本上都可以实现。 Ansible能批量配置、部署、管理上千台主…

STM32F103C8T6 - 定时器

一、定时器简介 定时器总共分为4部分,8小结。 第一部分(定时中断、内外时钟源选择):定时器基本定时计数功能,定一个时间,让定时器每隔一段时间定时中断一次 。 第二部分(输出比较&#xff09…

使用正则表达式删除文本的奇数行或者偶数行

用智谱清言和kimi搜出来的结果都没法在notepad生效,后面在overflow上找到的答案比较靠谱。 查找:^[^\n]*\n([^\n]*) 替换:\1 删除偶数行 查找:^([^\n]*)\n[^\n]* 替换:\1 代码解释 ^:这个符号代表字符…

Java面试题——第九篇(JVM)

1. Java中的强引用、软引用、弱引用和虚引用分别是什么 强引用 最常见的引用类型,在Java中,默认情况下,任何普通的对象引用都是强引用只要一个对象有强引用指向他,垃圾回收器永远不会回收该对象,即使系统内存紧张。 …

Linux的图形系统概述 (TODO)

(TODO) Linux graphics stack 现代 Linux 图形栈由多个子系统和层次组成,从应用程序到硬件之间的各个层面协同工作来处理图形显示和硬件加速。随着时间的推移,Linux 从传统的 **X Window System** 逐步过渡到 **Wayland**&#x…

三 星 SCX-4521F 硒 鼓 清 零 及 一 般 故 障 维 修 浅 谈

基本参数 耗材容量:SCX-4521D3/XIL(3000页) 功 率:平均功率350W、休眠模式10W 一般故障讲解 一、三星SCX-4521F打印机更换硒鼓(或加粉)后仍显示墨粉用尽 (加粉清零、关闭碳粉通知) 按菜单------#1934(快速按完)------屏幕会有TECH字母显示------菜单------向…

LeetCode-2608. 图中的最短环【广度优先搜索 图,腾讯面试真题】

LeetCode-2608. 图中的最短环【广度优先搜索 图,腾讯面试真题】 题目描述:解题思路一:【一图秒懂】枚举起点跑 BFS解题思路二:背诵版解题思路三: 题目描述: 现有一个含 n 个顶点的 双向 图,每个…

二分图的判定-染色法

二分图 如果一张无向图的N个节点可以分成A.B两个不相交的非空集合,并且同一集合内的点之间没有边相连,那么称该无向图为二分图(BipartiteGraph)。 定理:二分图不存在奇环(长度为奇数的环)。 因为每一条边都是从一个集合走到另一个集合&#…

构建宠物咖啡馆:SpringBoot框架的实现策略

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理基于Spring Boot的宠物咖啡馆平台的设计与…

malloc(0)

malloc(0) 在操作系统底层的实现涉及内存分配管理的多个方面。下面是对 malloc(0) 的实现原理的详细解释: 1. 内存分配管理 操作系统通过内存管理子系统来处理内存分配请求,包括 malloc 函数。内存分配通常使用以下几种策略: 堆管理&#…

卫星测绘AI技术-立哥尖端科研

分布式微波干涉测绘卫星是以多颗满足一定编队构形的卫星为平台,以合成孔径雷达 和高精度星间相对状态测量设备等为有效载荷,具备全天时、全天候获取雷达干涉影像数 据,快速测制全球数字表面模型、数字雷达正射影像等测绘产品能力的卫星系统…

论文解析三: D2-Net 用于联合描述和检测局部特征的可训练CNN

目录 1.D2-Net摘要2.D2-Net关键点介绍3. Joint Detection and Description (联合检测和描述)3.1 Feature Extraction3.2 Feature Detection3.2.1 Hard feature detection (硬特征检测)3.2.1 Soft Feature Detection(软特征检测) 3…