线性回归
1. 简介
- """
- 简介:
- 定义:
- 利用回归方程对一个或多个自变量(特征值)和因变量(目标值)之间关系 进行建模的一种分析方式
- 公式:
- 见下图
- 分类:
- 一元线性回归:
- 目标值与一个因变量有关系
- 多远线性回归:
- 目标值与多个因变量有关系
- """
复制代码 线性回归公式. 见下图
2. 线性回归问题求解
- """
- 线性回归API:
- from sklearn.linear_model import LinearRegression
- 损失函数:
- 误差概念:
- 用预测值y-真实值y = 误差
- 衡量每个样本预测值与真实值效果的函数
- 代价函数, 成本函数, 目标函数
- 种类:
- 均方误差 MSE
- 平均绝对误差 MAE
- 均方根误差 RMSE
- 正规方程法:
- 线性回归最小而成损失函数
- J(w)= ||Xw−y||₂² 取值最小
- """
- # 1.导入依赖包
- # from sklearn.datasets import load_boston # 数据集已废弃
- 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 # 均方误差评估
- from sklearn.linear_model import Ridge, RidgeCV
- import matplotlib.pyplot as plt
- import pandas as pd
- import numpy as np
- import warnings
- warnings.filterwarnings('ignore')
- # 正规方程法
- def linearRegr():
- """
- 正规方程法
- :return:
- """
- # 2.数据预处理
- # 2.1 获取数据
- 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]
- # 2.2 数据集划分
- x_train, x_test, y_train, y_test = train_test_split(data, target, random_state=22)
- # 2.3 特征工程-标准化
- transfer = StandardScaler()
- x_train = transfer.fit_transform(x_train)
- x_test = transfer.transform(x_test)
- # 3.模型训练,机器学习-线性回归
- # 3.1 实例化模型(正规方程)
- estimator = LinearRegression()
- # 3.2 模型训练
- estimator.fit(x_train, y_train)
- # 4.模型预测
- y_predict = estimator.predict(x_test)
- print("预测值为:", y_predict)
- print("模型的权重系数为:", estimator.coef_)
- # 5.模型评估,均方误差
- error = mean_squared_error(y_test, y_predict)
- print("误差为:", error)
复制代码- """
- 梯度下降法:
- 梯度:
- 单变量函数中:
- 梯度就是某一点的切线的斜率
- 梯度的方向为函数增长最快的方向
- 多变量函数中:
- 梯度就是某一个点的偏导数
- 有方向: 偏导数分量的向量方向
- 沿着梯度下降的方向求解极小值
- 公式:
- 见下图
- α: 学习率(步长)不能太大,也不能太小. 机器学习中:0.001~0.01
- 梯度是上升最快的方向, 我们需要是下降最快的方向, 所以需要加负号
-
- 梯度下降优化过程:
- 1. 给定初始位置 步长(学习率)
- 2. 计算该点当前的梯度的负方向
- 3. 向该负方向移动步长
- 步长决定了在梯度下降迭代过程中, 每一步沿梯度负方向前进的长度
- 学习率太小,下降的速度会慢
- 学习率太大, 容易造成错过最低点, 产生下降过程中的震荡,甚至梯度爆炸
- 4. 重复 2-3 步直至收敛
- 两次差距小于指定的阈值
- 达到指定的迭代次数
- 梯度下降法分类:
- 全体度下降算法 FGD
- 每次迭代时, 使用全部样本的梯度值
- 特点: 训练速度较慢
- 随机梯度下降算法 SGD
- 每次迭代时, 随机选择并使用一个样本梯度值
- 特点: 简单,高效,不稳定
- 小批量梯度下降算法 mini-batch
- 每次迭代时, 随机选择并使用小批量的样本梯度值
- 特点: 表现也正好居于SG 和FG 二者之间
- 随机平均梯度下降算法 SAG
- 每次迭代时, 随机选择一个样本的梯度值和以往样本的梯度值的均值
- 特点: 训练初期表现不佳,优化速度较慢
- """
- 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 # 均方误差评估
- from sklearn.linear_model import Ridge, RidgeCV
- import matplotlib.pyplot as plt
- import pandas as pd
- import numpy as np
- # 梯度下降法
- def SGDRegr():
- """
- 梯度下降法
- :return:
- """
- # 2.数据预处理
- # 2.1 获取数据
- 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]
- # 2.2 数据集划分
- x_train, x_test, y_train, y_test = train_test_split(data, target, random_state=22)
- # 2.3 特征工程-标准化
- transfer = StandardScaler()
- x_train = transfer.fit_transform(x_train)
- x_test = transfer.transform(x_test)
- # 3.模型训练,机器学习-线性回归
- # 3.1 实例化模型(梯度下降法)
- estimator = SGDRegressor()
- # estimator = SGDRegressor(max_iter=1000, learning_rate="constant", eta0=0.001)
- # 3.2 模型训练
- estimator.fit(x_train, y_train)
- # 4.模型预测
- y_predict = estimator.predict(x_test)
- print("预测值为:", y_predict)
- print("模型的权重系数为:", estimator.coef_)
- print("模型的偏置为:", estimator.intercept_)
- # 5.模型评估, 均方误差
- error = mean_squared_error(y_test, y_predict)
- print("误差为:", error)
复制代码 梯度下降法, 公式见下图

3. 欠拟合与过拟合
- """
- 欠拟合与过拟合
- 欠拟合:
- 模型在训练集上表现不好,在测试集上也表现不好。模型过于简单
- 出现原因
- 学习到数据的特征过少
- 解决方法
- 添加其他特征
- 添加多项式特征项
- 过拟合:
- 模型在训练集上表现好,在测试集上表现不好。模型过于复杂
- 出现原因
- 原始特征过多,存在一些嘈杂特征, 模型过于复杂是因为模型尝试去兼顾各个测试数据点
- 解决方法
- 重新清洗数据
- 增大数据的训练量
- 正则化
- 减少特征维度,防止维灾难
- """
- def underFitting():
- """
- 欠拟合
- :return:
- """
- # 2.准备数据x y(增加上噪声)
- np.random.seed(666)
- x = np.random.uniform(-3, 3, size=100)
- y = 0.5 * x ** 2 + x + 2 + np.random.normal(0, 1, size=100)
- # 3 训练模型
- # 3.1 实例化线性回归模型
- estimator = LinearRegression()
- # 3.2 模型训练
- X = x.reshape(-1, 1)
- estimator.fit(X, y)
- # 4 模型预测
- y_predict = estimator.predict(X)
- # 5 模型评估,计算均方误差
- # 5.1 模型评估MSE
- myret = mean_squared_error(y, y_predict)
- print('myret-->', myret)
- # 5.2 展示效果
- plt.scatter(x, y)
- plt.plot(x, y_predict, color='r')
- plt.show()
- def fitting():
- """
- 拟合
- :return:
- """
- # 2.准备数据x y(增加上噪声)
- np.random.seed(666)
- x = np.random.uniform(-3, 3, size=100)
- y = 0.5 * x ** 2 + x + 2 + np.random.normal(0, 1, size=100)
- # 3.模型训练
- # 3.1 实例化线性回归模型
- estimator = LinearRegression()
- # 3.2 模型训练
- X = x.reshape(-1, 1)
- # print(‘X.shape-->’, X.shape)
- X2 = np.hstack([X, X ** 2]) # 数据增加二次项
- estimator.fit(X2, y)
- # 4.模型预测
- y_predict = estimator.predict(X2)
- # 5.模型评估,计算均方误差
- myret = mean_squared_error(y, y_predict)
- print('myret-->', myret)
- # 6 展示效果
- plt.scatter(x, y)
- # 画图plot折线图时 需要对x进行排序, 取x排序后对应的y值
- plt.plot(np.sort(x), y_predict[np.argsort(x)], color='r')
- plt.show()
- def overFitting():
- """
- 过拟合
- :return:
- """
- # 2.准备数据x y(增加上噪声)
- np.random.seed(666)
- x = np.random.uniform(-3, 3, size=100)
- y = 0.5 * x ** 2 + x + 2 + np.random.normal(0, 1, size=100)
- # 3 训练模型
- # 3.1 实例化线性回归模型
- estimator = LinearRegression()
- # 3.2 模型训练
- X = x.reshape(-1, 1)
- # print(‘X.shape-->’, X.shape)
- X3 = np.hstack([X, X ** 2, X ** 3, X ** 4, X ** 5, X ** 6, X ** 7, X ** 8, X ** 9, X ** 10]) # 数据增加高次项
- estimator.fit(X3, y)
- # 4.模型预测
- y_predict = estimator.predict(X3)
- # 5.模型评估,计算均方误差
- # 5.1 模型评估MSE
- myret = mean_squared_error(y, y_predict)
- print('myret-->', myret)
- # 5.2 展示效果
- plt.scatter(x, y)
- # 画图时输入的x数据: 要求是从小到大
- plt.plot(np.sort(x), y_predict[np.argsort(x)], color='r')
- plt.show()
复制代码- """
- 正则化:
- 在模型训练时,数据中有些特征影响模型复杂度、或者某个特征的异常值较多,所以要尽量减少这个特征的影响(甚至删除某个特征的影响)
- L1正则化
- α 叫做惩罚系数,该值越大则权重调整的幅度就越大,即:表示对特征权重惩罚力度就越大
- L1 正则化会使得权重趋向于 0,甚至等于 0,使得某些特征失效,达到特征筛选的目的
- from sklearn.linear_model import Lasso
- L2正则化
- α 叫做惩罚系数,该值越大则权重调整的幅度就越大,即:表示对特征权重惩罚力度就越大
- L2 正则化会使得权重趋向于 0,一般不等于 0
- from sklearn.linear_model import Ridge
- """
- # 1.导入依赖包
- from sklearn.linear_model import Lasso
- 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 # 均方误差评估
- from sklearn.linear_model import Ridge, RidgeCV
- import matplotlib.pyplot as plt
- import pandas as pd
- import numpy as np
- def L1Regular():
- """
- L1 正则化
- :return:
- """
- # 2.准备数据x y(增加上噪声)
- np.random.seed(666)
- x = np.random.uniform(-3, 3, size=100)
- y = 0.5 * x ** 2 + x + 2 + np.random.normal(0, 1, size=100)
- # 3 训练模型
- # 3.1 实例化L1正则化模型 做实验:alpha惩罚力度越来越大,k值越来越小,返回会欠拟合
- estimator = Lasso(alpha=0.1)
- # 3.2 模型训练
- X = x.reshape(-1, 1)
- X3 = np.hstack([X, X ** 2, X ** 3, X ** 4, X ** 5, X ** 6, X ** 7, X ** 8, X ** 9, X ** 10]) # 数据增加二次项
- estimator.fit(X3, y)
- print('estimator.coef_', estimator.coef_)
- # 4.模型预测
- y_predict = estimator.predict(X3)
- # 5.模型评估,计算均方误差
- # 5.1 模型评估MSE
- myret = mean_squared_error(y, y_predict)
- print('myret-->', myret)
- # 5.2 展示效果
- plt.scatter(x, y)
- # 画图时输入的x数据: 要求是从小到大
- plt.plot(np.sort(x), y_predict[np.argsort(x)], color='r')
- plt.show()
- # 1.导入依赖包
- from sklearn.linear_model import Ridge
- def L2Regular():
- """
- L2 正则化
- :return:
- """
- # 2.准备数据x y(增加上噪声)
- np.random.seed(666)
- x = np.random.uniform(-3, 3, size=100)
- y = 0.5 * x ** 2 + x + 2 + np.random.normal(0, 1, size=100)
- # 3.训练模型
- # 3.1 实例化L2正则化模型
- estimator = Ridge(alpha=0.1)
- # 3.2 模型训练
- X = x.reshape(-1, 1)
- X3 = np.hstack([X, X ** 2, X ** 3, X ** 4, X ** 5, X ** 6, X ** 7, X ** 8, X ** 9, X ** 10]) # 数据增加二次项
- estimator.fit(X3, y)
- print('estimator.coef_', estimator.coef_)
- # 4.模型预测
- y_predict = estimator.predict(X3)
- # 5.模型评估,计算均方误差
- # 5.1 模型评估,MSE
- myret = mean_squared_error(y, y_predict)
- print('myret-->', myret)
- # 5.2 展示效果
- plt.scatter(x, y)
- # 画图时输入的x数据: 要求是从小到大
- plt.plot(np.sort(x), y_predict[np.argsort(x)], color='r')
- plt.show()
复制代码 L1正则化, 公式为

L2正则化, 公式为

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |