线性回归算法
总说过程参考黑马 用于自学https://www.bilibili.com/video/BV1Fzszz4Ek7?spm_id_from333.788.player.switchvd_source24c1e92bdfe1c6a0f1b228cda0583ac9p32线性回归算法属于有监督学习有特征有标签。属于回归问题标签连续一、线性回归介绍1.1 什么是线性回归线性回归Linear Regressor利用回归方程对1个或多个自变量特征值和因变量目标值之间的关系进行建模的一种方式。属于有监督学习有特征有标签且标签连续。数学公式如下其中T是线性代数中的转置主要分为一元线性 和 多元线性1.2 一元线性与多元线性1.2.1 一元线性回归一元线性回归 目标值只和一个因变量有关简单来说就是一次函数这里w叫权重b叫偏置1个特征列 1个标签列1.2.2 多元线性回归多元线性回归目标值与多个因变量有关多个特征列 1个标签列二、线性回归问题的求解2.1 线性回归API2.1.1 API调用过程2.1.2 入门代码数据集如下代码如下#导包 from sklearn.linear_model import LinearRegression #VS Code 终端默认编码不是 UTF-8 不是VS Code 可以不用写 import sys sys.stdout.reconfigure(encodingutf-8) # 强制让控制台使用 UTF-8 编码输出文字 #1. 准备数据 x_train [[160], [166], [172], [174], [180]] y_train [56.3, 60.6, 65.1, 68.5, 75] x_test [[176]] # 2. 数据的预处理 这里不需要 #3. 特征工程 包括特征提取、特征预处理 这里不需要 #4. 模型训练 model LinearRegression() # 创建模型对象 model.fit(x_train, y_train) # 模型训练 # 可以查看一下权重和偏置 print(f权重{model.coef_}) print(f偏置{model.intercept_}) #5. 模型预测 y_predict model.predict(x_test) print(y_predict) #6. 模型评估三、 损失函数损失函数(Loss Function也叫成本函数、代价函数、目标函数)是用于描述每个样本点 和 其预测值 之间的关系用于在训练时指导模型调整参数。数值上 是各个样本的误差和损失函数值越小模型越准。误差预测值y - 真实值y3.1 损失函数的种类损失函数有两类均方误差MSE(Mean-Square Error)、平均绝对误差MAE(Mean Absolute Error)均方误差MSE计算公式如下其中是预测值是样本值n为样本数量。平均绝对误差MAE计算公式如下其中是预测值是样本值n为样本数量。3.2 损失函数求解方法原理层面了解即可3.2.1正规方程法多元线性回归要求J(w)的最小值J(w)对w求导得到上图结果(1)最终推出结果(8)带入实例演示X就是特征列矩阵存在的问题1、如果运算量过大可能造成内存溢出。2、假设矩阵没有逆可能无解。3.2.2 梯度下降法主流梯度(grad)一元函数中就是某一点的导数有方向为函数值上升最快的方向多元函数中就是某一点的偏导数梯度是所有偏导数组成的向量梯度下降算法沿着梯度下降的方向求解极小值梯度下降公式循环迭代求当前点的梯度更新当前权重参数是下个点是上个点是损失函数对损失函数求偏导学习率(步长)大小适度在机器学习中常为0.001~0.01减法是因为梯度是上升最快的方向加上负号变成下降最快方向。重复直到收敛两次迭代的差小于阈值 或 达到迭代次数多变量实例3.2.2.1 梯度下降法案例设 姓名x1、每月工资x2、存款余额x3、房产面积x4授信额度 是 标签y这里的权重w换成了分母加2是方便计算简化编程。系数不影响极值点的位置最后要让导数0上面图中划掉应该是损失函数的偏导(梯度)下面进行带值假设每一列的权重相同一共8个人的数据每个数据有4个分量(分别计算4个梯度)。3.3 梯度下降法 分类分为4类1、全梯度下降算法FGDFull Gradient Descent每次迭代使用全部样本的梯度值缺点使用全部数据集训练速度较慢2、随机梯度下降算法SGD每次迭代随机使用一个样本的梯度值优点简单、高效缺点不稳定遇上噪声容易陷入局部最优解。3、小批量梯度下降算法mini-batch每次迭代随机选择小批量的样本梯度值。介于FGD和SGD之间目前使用最多。4、随机平均梯度下降算法SAG每次迭代随机选择一个样本的梯度值和以往样本的梯度值的均值。缺点训练初期表现不佳优化速度较慢因为常常将初始梯度设置为0梯度下降与正规方程的对比四、回归模型评估方法目的衡量 预测值 和 真实值 之间的差距4.1 均方误差MSE均方误差MSE计算公式如下其中是预测值是样本值n为样本数量。MSE越小模型预测越准确4.2 平均绝对误差MAE平均绝对误差MAE计算公式如下其中是预测值是样本值n为样本数量。MAE越小模型预测越准确4.3 均方根误差均方根误差RMSE计算公式如下其中是预测值是样本值n为样本数量。RMSE越小模型预测越准确。 RMSE会对异常点更加敏感一般使用MAE和RMSE两个指标一块使用并且评估五、线性回归API和案例5.1 正规方程API5.2 梯度下降API5.3 案例波士顿房价预测数据说明数据大小不一致可能会对结果影响较大需要标准化处理5.3.1 代码实现先使用正规方程法5.3.1.1 导入各种库代码如下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 # 均方误差评估 #VS Code 终端默认编码不是 UTF-8 不是VS Code 可以不用写 import sys sys.stdout.reconfigure(encodingutf-8) # 强制让控制台使用 UTF-8 编码输出文字5.3.1.2 加载数据集代码如下#1、导入 波士顿房价 数据集 import pandas as pd import numpy as np import ssl # 创建不验证证书的 SSL 上下文 ssl._create_default_https_context ssl._create_unverified_context data_url http://lib.stat.cmu.edu/datasets/boston raw_df pd.read_csv(data_url, sep\\s, skiprows22, headerNone) data np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]]) target raw_df.values[1::2, 2] # 打印部分数据 print(f特征:{data.shape}) # (506, 13)506行13列 print(f标签:{target.shape}) # (506,) 506行 print(f特征数据集:{data[:5]}) # 打印前5行特征数据 print(f标签数据集:{target[:5]}) # 打印前5行标签数据5.3.1.3 数据的预处理代码如下#2、数据预处理 --切分 训练集 和 测试集 # 参1特征数据 参2标签数据 参3测试集所占比例 参4随机种子 x_train, x_test, y_train, y_test train_test_split(data, target, test_size0.2, random_state23)5.3.1.4 特征工程代码如下#3、特征工程(特征提取、特征预处理...) #3.1 创建标准化对象 transfer StandardScaler() #3.2 训练集标准化 x_train transfer.fit_transform(x_train) #3.3 测试集标准化 x_test transfer.transform(x_test)5.3.1.5 模型训练代码如下#4、模型训练 #4.1 创建 线性回归 正规方程 的模型对象 estimator LinearRegression(fit_interceptTrue) #fit_intercept: 是否需要截距,默认为True #4.2 训练模型 estimator.fit(x_train, y_train) #4.3打印模型计算出的w(权重)和b(偏置) print(f正规方程法模型参数w:{estimator.coef_}) # 模型参数w print(f正规方程法模型参数b:{estimator.intercept_}) # 模型参数b5.3.1.6 模型预测代码如下#5、模型预测 y_pre estimator.predict(x_test) print(f正规方程法模型预测值:{y_pre}) # 模型预测值5.3.1.7 模型评估代码如下#6、模型评估 # 参1测试集标签 参2预测结果 print(f均方误差:{mean_squared_error(y_test, y_pre)}) # MSE:均方误差 print(f均方根误差:{root_mean_squared_error(y_test, y_pre)}) # RMSE:均方根误差 print(f平均绝对误差:{mean_absolute_error(y_test, y_pre)}) # MAE:平均绝对误差正规方程法完整代码如下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, root_mean_squared_error # 均方误差评估 from sklearn.metrics import mean_absolute_error # 平均绝对误差评估 #VS Code 终端默认编码不是 UTF-8 不是VS Code 可以不用写 import sys sys.stdout.reconfigure(encodingutf-8) # 强制让控制台使用 UTF-8 编码输出文字 #1、导入 波士顿房价 数据集 import pandas as pd import numpy as np import ssl # 创建不验证证书的 SSL 上下文 ssl._create_default_https_context ssl._create_unverified_context data_url http://lib.stat.cmu.edu/datasets/boston raw_df pd.read_csv(data_url, sep\\s, skiprows22, headerNone) data np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]]) target raw_df.values[1::2, 2] # 打印部分数据 print(f特征:{data.shape}) # (506, 13)506行13列 print(f标签:{target.shape}) # (506,) 506行 print(f特征数据集:{data[:5]}) # 打印前5行特征数据 print(f标签数据集:{target[:5]}) # 打印前5行标签数据 #2、数据预处理 --切分 训练集 和 测试集 # 参1特征数据 参2标签数据 参3测试集所占比例 参4随机种子 x_train, x_test, y_train, y_test train_test_split(data, target, test_size0.2, random_state23) #3、特征工程(特征提取、特征预处理...) #3.1 创建标准化对象 transfer StandardScaler() #3.2 训练集标准化 x_train transfer.fit_transform(x_train) #3.3 测试集标准化 x_test transfer.transform(x_test) #4、模型训练 #4.1 创建 线性回归 正规方程 的模型对象 estimator LinearRegression(fit_interceptTrue) #fit_intercept: 是否需要截距,默认为True #4.2 训练模型 estimator.fit(x_train, y_train) #4.3打印模型计算出的w(权重)和b(偏置) print(f正规方程法模型参数w:{estimator.coef_}) # 模型参数w print(f正规方程法模型参数b:{estimator.intercept_}) # 模型参数b #5、模型预测 y_pre estimator.predict(x_test) print(f正规方程法模型预测值:{y_pre}) # 模型预测值 #6、模型评估 # 参1测试集标签 参2预测结果 print(f均方误差:{mean_squared_error(y_test, y_pre)}) # MSE:均方误差 print(f均方根误差:{root_mean_squared_error(y_test, y_pre)}) # RMSE:均方根误差 print(f平均绝对误差:{mean_absolute_error(y_test, y_pre)}) # MAE:平均绝对误差对于梯度下降法只需要修改一下模型创建部分代码如下#4、模型训练 #4.1 创建 线性回归 梯度下降 的模型对象 # 参1是否计算偏置 参2学习率模式 constant常量(不会发生改变) 参3学习率 参4最大迭代次数 estimator SGDRegressor(fit_interceptTrue, learning_rateconstant, eta00.01, max_iter1000) #4.2 训练模型 estimator.fit(x_train, y_train) #4.3打印模型计算出的w(权重)和b(偏置) print(f模型参数w:{estimator.coef_}) # 模型参数w print(f模型参数b:{estimator.intercept_}) # 模型参数b完整代码如下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, root_mean_squared_error # 均方误差评估 from sklearn.metrics import mean_absolute_error # 平均绝对误差评估 #VS Code 终端默认编码不是 UTF-8 不是VS Code 可以不用写 import sys sys.stdout.reconfigure(encodingutf-8) # 强制让控制台使用 UTF-8 编码输出文字 #1、导入 波士顿房价 数据集 import pandas as pd import numpy as np import ssl # 创建不验证证书的 SSL 上下文 ssl._create_default_https_context ssl._create_unverified_context data_url http://lib.stat.cmu.edu/datasets/boston raw_df pd.read_csv(data_url, sep\\s, skiprows22, headerNone) data np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]]) target raw_df.values[1::2, 2] # 打印部分数据 print(f特征:{data.shape}) # (506, 13)506行13列 print(f标签:{target.shape}) # (506,) 506行 print(f特征数据集:{data[:5]}) # 打印前5行特征数据 print(f标签数据集:{target[:5]}) # 打印前5行标签数据 #2、数据预处理 --切分 训练集 和 测试集 # 参1特征数据 参2标签数据 参3测试集所占比例 参4随机种子 x_train, x_test, y_train, y_test train_test_split(data, target, test_size0.2, random_state23) #3、特征工程(特征提取、特征预处理...) #3.1 创建标准化对象 transfer StandardScaler() #3.2 训练集标准化 x_train transfer.fit_transform(x_train) #3.3 测试集标准化 x_test transfer.transform(x_test) #4、模型训练 #4.1 创建 线性回归 梯度下降 的模型对象 # 参1是否计算偏置 参2学习率模式 constant常量(不会发生改变) 参3学习率 参4最大迭代次数 estimator SGDRegressor(fit_interceptTrue, learning_rateconstant, eta00.01, max_iter1000) #4.2 训练模型 estimator.fit(x_train, y_train) #4.3打印模型计算出的w(权重)和b(偏置) print(f模型参数w:{estimator.coef_}) # 模型参数w print(f模型参数b:{estimator.intercept_}) # 模型参数b #5、模型预测 y_pre estimator.predict(x_test) print(f模型预测值:{y_pre}) # 模型预测值 #6、模型评估 # 参1测试集标签 参2预测结果 print(f均方误差:{mean_squared_error(y_test, y_pre)}) # MSE:均方误差 print(f均方根误差:{root_mean_squared_error(y_test, y_pre)}) # RMSE:均方根误差 print(f平均绝对误差:{mean_absolute_error(y_test, y_pre)}) # MAE:平均绝对误差六、过拟合和欠拟合过拟合模型在训练集表现好、测试集表现差过拟合原因模型过于复杂、数据少或训练过度。解决办法重新清洗数据、增大数据训练量、正则化、减少特征维度欠拟合模型在训练集表现差、测试集表现差欠拟合原因模型过于简单、特征不足。解决办法添加特征列、组合 泛化 相关性、添加多项式特征项6.1 绘图展示6.1.1 欠拟合代码如下def under_fitting(): # 1. 准备数据 # 1.1 指定随机种子保证每次生成结果一致 np.random.seed(23) # 1.2 随机生成x轴 100个数据模拟特征 x np.random.uniform(-3, 3, 100) # 从-3到3中随机生成100个数据 # 1.3 基于x轴的值随机生成y轴 100个数据模拟标签 # y kx b 0.5 * x ** 2 x 2 噪声 这里k和b的值是随便取的 y 0.5 * x ** 2 x 2 np.random.normal(0, 1, 100) # 噪声均值为0标准差为1 生成100个 # 1.4 查看生成的数据 print(f特征(x):{x}) print(f标签(y):{y}) #2. 数据预处理把x轴(特征)转化成多行1列的形式 X x.reshape(-1, 1) print(f特征(X):{X}) #3. 特征工程这里不做直接使用 #4. 模型训练 #4.1 使用正规方程训练模型 estimator LinearRegression() #4.2 模型训练 estimator.fit(X, y) #5. 模型预测 y_pre estimator.predict(X) #6. 模型评估 print(f均方误差:{mean_squared_error(y, y_pre)}) # MSE:均方误差 print(f均方根误差:{root_mean_squared_error(y, y_pre)}) # RMSE:均方根误差 print(f平均绝对误差:{mean_absolute_error(y, y_pre)}) # MAE:平均绝对误差 #7. 绘图 plt.scatter(x, y) # 散点图 绘制真实值 plt.plot(x, y_pre, colorr) # 折线图 绘制预测值 plt.show()绘制图片如下6.1.2 正好拟合代码如下#2. 定义函数模拟拟合 # 只需要改动数据预处理 def fitting(): # 1. 准备数据 # 1.1 指定随机种子保证每次生成结果一致 np.random.seed(23) # 1.2 随机生成x轴 100个数据模拟特征 x np.random.uniform(-3, 3, 100) # 从-3到3中随机生成100个数据 # 1.3 基于x轴的值随机生成y轴 100个数据模拟标签 # y kx b 0.5 * x ** 2 x 2 噪声 这里k和b的值是随便取的 y 0.5 * x ** 2 x 2 np.random.normal(0, 1, 100) # 噪声均值为0标准差为1 生成100个 # 1.4 查看生成的数据 print(f特征(x):{x}) print(f标签(y):{y}) #2. 数据预处理把x轴(特征)转化成多行1列的形式 X x.reshape(-1, 1) #2.1 由于模型只有一列过于简单会出现欠拟合现象。这里增加1个特征列 增加模型复杂度 X2 np.hstack([X, X ** 2]) # 函数作用:水平拼接行数不变列数增加 print(f特征(X):{X}) #3. 特征工程这里不做直接使用 #4. 模型训练 #4.1 使用正规方程训练模型 estimator LinearRegression() #4.2 模型训练 estimator.fit(X2, y) #5. 模型预测 y_pre estimator.predict(X2) #6. 模型评估 print(f均方误差:{mean_squared_error(y, y_pre)}) # MSE:均方误差 print(f均方根误差:{root_mean_squared_error(y, y_pre)}) # RMSE:均方根误差 print(f平均绝对误差:{mean_absolute_error(y, y_pre)}) # MAE:平均绝对误差 #7. 绘图 plt.scatter(x, y) # 散点图 绘制真实值 # np.sort(x) # 对x轴进行排序 np.argsort(x) 对x轴进行排序,返回排序后的索引 plt.plot(np.sort(x), y_pre[np.argsort(x)], colorr) # 折线图 绘制预测值 plt.show()绘制图片如下6.1.3 过拟合代码如下#3. 定义函数模拟过拟合 def over_fitting(): # 1. 准备数据 # 1.1 指定随机种子保证每次生成结果一致 np.random.seed(23) # 1.2 随机生成x轴 100个数据模拟特征 x np.random.uniform(-3, 3, 100) # 从-3到3中随机生成100个数据 # 1.3 基于x轴的值随机生成y轴 100个数据模拟标签 # y kx b 0.5 * x ** 2 x 2 噪声 这里k和b的值是随便取的 y 0.5 * x ** 2 x 2 np.random.normal(0, 1, 100) # 噪声均值为0标准差为1 生成100个 # 1.4 查看生成的数据 print(f特征(x):{x}) print(f标签(y):{y}) #2. 数据预处理把x轴(特征)转化成多行1列的形式 X x.reshape(-1, 1) #2.1 由于模型只有一列过于简单为了模拟过拟合现象新增9列增加模型复杂度 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}) #3. 特征工程这里不做直接使用 #4. 模型训练 #4.1 使用正规方程训练模型 estimator LinearRegression() #4.2 模型训练 estimator.fit(X3, y) #5. 模型预测 y_pre estimator.predict(X3) #6. 模型评估 print(f均方误差:{mean_squared_error(y, y_pre)}) # MSE:均方误差 print(f均方根误差:{root_mean_squared_error(y, y_pre)}) # RMSE:均方根误差 print(f平均绝对误差:{mean_absolute_error(y, y_pre)}) # MAE:平均绝对误差 #7. 绘图 plt.scatter(x, y) # 散点图 绘制真实值 # np.sort(x) # 对x轴进行排序 np.argsort(x) 对x轴进行排序,返回排序后的索引 plt.plot(np.sort(x), y_pre[np.argsort(x)], colorr) # 折线图 绘制预测值 plt.show()绘制图片如下6.2 正则化用于解决过拟合问题分为L1正则化、L2正则化。开发中一般使用L2正则6.2.1 L1正则化L1正则化在损失函数中添加L1正则化项公式如下补充一下 MSE均方误差 的公式叫做惩罚系数值越大权重调整幅度越大L1正则化会使权重趋向于0(可以0)使得某些特征失效达到特征筛选的目的6.2.1.1 代码实现代码如下def l1_regularization(): # 1. 准备数据 # 1.1 指定随机种子保证每次生成结果一致 np.random.seed(23) # 1.2 随机生成x轴 100个数据模拟特征 x np.random.uniform(-3, 3, 100) # 从-3到3中随机生成100个数据 # 1.3 基于x轴的值随机生成y轴 100个数据模拟标签 # y kx b 0.5 * x ** 2 x 2 噪声 这里k和b的值是随便取的 y 0.5 * x ** 2 x 2 np.random.normal(0, 1, 100) # 噪声均值为0标准差为1 生成100个 # 1.4 查看生成的数据 print(f特征(x):{x}) print(f标签(y):{y}) #2. 数据预处理把x轴(特征)转化成多行1列的形式 X x.reshape(-1, 1) #2.1 由于模型只有一列过于简单为了模拟过拟合现象新增9列增加 模型复杂度 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}) #3. 特征工程这里不做直接使用 #4. 模型训练 #4.1 创建L1正则化对象 estimator Lasso(alpha0.1) # alpha:正则化系数(惩罚系数) 默认1 #4.2 模型训练 estimator.fit(X3, y) #5. 模型预测 y_pre estimator.predict(X3) #6. 模型评估 print(f均方误差:{mean_squared_error(y, y_pre)}) # MSE:均方误差 print(f均方根误差:{root_mean_squared_error(y, y_pre)}) # RMSE:均方根误差 print(f平均绝对误差:{mean_absolute_error(y, y_pre)}) # MAE:平均绝对误差 #7. 绘图 plt.scatter(x, y) # 散点图 绘制真实值 # np.sort(x) # 对x轴进行排序 np.argsort(x) 对x轴进行排序,返回排序后的索引 plt.plot(np.sort(x), y_pre[np.argsort(x)], colorr) # 折线图 绘制预测值 plt.show()结果图如下6.2.2 L2正则化L2正则化在损失函数中添加L2正则化项公式如下叫做惩罚系数值越大权重调整幅度越大L2正则化会使权重趋向于0(一般≠0)使用L2正则化的线性回归模型是岭回归6.2.2.1 代码实现代码如下def l2_regularization(): # 1. 准备数据 # 1.1 指定随机种子保证每次生成结果一致 np.random.seed(23) # 1.2 随机生成x轴 100个数据模拟特征 x np.random.uniform(-3, 3, 100) # 从-3到3中随机生成100个数据 # 1.3 基于x轴的值随机生成y轴 100个数据模拟标签 # y kx b 0.5 * x ** 2 x 2 噪声 这里k和b的值是随便取的 y 0.5 * x ** 2 x 2 np.random.normal(0, 1, 100) # 噪声均值为0标准差为1 生成100个 # 1.4 查看生成的数据 print(f特征(x):{x}) print(f标签(y):{y}) #2. 数据预处理把x轴(特征)转化成多行1列的形式 X x.reshape(-1, 1) #2.1 由于模型只有一列过于简单为了模拟过拟合现象新增9列增加 模型复杂度 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}) #3. 特征工程这里不做直接使用 #4. 模型训练 #4.1 创建L2正则化对象 estimator Ridge(alpha10) # alpha:正则化系数(惩罚系数) 默认1 #4.2 模型训练 estimator.fit(X3, y) #5. 模型预测 y_pre estimator.predict(X3) #6. 模型评估 print(f均方误差:{mean_squared_error(y, y_pre)}) # MSE:均方误差 print(f均方根误差:{root_mean_squared_error(y, y_pre)}) # RMSE:均方根误差 print(f平均绝对误差:{mean_absolute_error(y, y_pre)}) # MAE:平均绝对误差 #7. 绘图 plt.scatter(x, y) # 散点图 绘制真实值 # np.sort(x) # 对x轴进行排序 np.argsort(x) 对x轴进行排序,返回排序后的索引 plt.plot(np.sort(x), y_pre[np.argsort(x)], colorr) # 折线图 绘制预测值 plt.show()结果如图过拟合和欠拟合的完整代码如下import numpy as np import matplotlib.pyplot as plt 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, root_mean_squared_error # 均方误差评估 from sklearn.metrics import mean_absolute_error # 平均绝对误差评估 from sklearn.linear_model import Lasso, Ridge # L1正则化回归模型 L2正则化回归模型 #VS Code 终端默认编码不是 UTF-8 不是VS Code 可以不用写 import sys sys.stdout.reconfigure(encodingutf-8) # 强制让控制台使用 UTF-8 编码输出文字 #1. 定义函数模拟欠拟合 def under_fitting(): # 1. 准备数据 # 1.1 指定随机种子保证每次生成结果一致 np.random.seed(23) # 1.2 随机生成x轴 100个数据模拟特征 x np.random.uniform(-3, 3, 100) # 从-3到3中随机生成100个数据 # 1.3 基于x轴的值随机生成y轴 100个数据模拟标签 # y kx b 0.5 * x ** 2 x 2 噪声 这里k和b的值是随便取的 y 0.5 * x ** 2 x 2 np.random.normal(0, 1, 100) # 噪声均值为0标准差为1 生成100个 # 1.4 查看生成的数据 print(f特征(x):{x}) print(f标签(y):{y}) #2. 数据预处理把x轴(特征)转化成多行1列的形式 X x.reshape(-1, 1) print(f特征(X):{X}) #3. 特征工程这里不做直接使用 #4. 模型训练 #4.1 使用正规方程训练模型 estimator LinearRegression() #4.2 模型训练 estimator.fit(X, y) #5. 模型预测 y_pre estimator.predict(X) #6. 模型评估 print(f均方误差:{mean_squared_error(y, y_pre)}) # MSE:均方误差 print(f均方根误差:{root_mean_squared_error(y, y_pre)}) # RMSE:均方根误差 print(f平均绝对误差:{mean_absolute_error(y, y_pre)}) # MAE:平均绝对误差 #7. 绘图 plt.scatter(x, y) # 散点图 绘制真实值 plt.plot(x, y_pre, colorr) # 折线图 绘制预测值 plt.show() #2. 定义函数模拟拟合 # 只需要改动数据预处理 def fitting(): # 1. 准备数据 # 1.1 指定随机种子保证每次生成结果一致 np.random.seed(23) # 1.2 随机生成x轴 100个数据模拟特征 x np.random.uniform(-3, 3, 100) # 从-3到3中随机生成100个数据 # 1.3 基于x轴的值随机生成y轴 100个数据模拟标签 # y kx b 0.5 * x ** 2 x 2 噪声 这里k和b的值是随便取的 y 0.5 * x ** 2 x 2 np.random.normal(0, 1, 100) # 噪声均值为0标准差为1 生成100个 # 1.4 查看生成的数据 print(f特征(x):{x}) print(f标签(y):{y}) #2. 数据预处理把x轴(特征)转化成多行1列的形式 X x.reshape(-1, 1) #2.1 由于模型只有一列过于简单会出现欠拟合现象。这里增加1个特征列 增加模型复杂度 X2 np.hstack([X, X ** 2]) # 函数作用:水平拼接行数不变列数增加 print(f特征(X):{X}) #3. 特征工程这里不做直接使用 #4. 模型训练 #4.1 使用正规方程训练模型 estimator LinearRegression() #4.2 模型训练 estimator.fit(X2, y) #5. 模型预测 y_pre estimator.predict(X2) #6. 模型评估 print(f均方误差:{mean_squared_error(y, y_pre)}) # MSE:均方误差 print(f均方根误差:{root_mean_squared_error(y, y_pre)}) # RMSE:均方根误差 print(f平均绝对误差:{mean_absolute_error(y, y_pre)}) # MAE:平均绝对误差 #7. 绘图 plt.scatter(x, y) # 散点图 绘制真实值 # np.sort(x) # 对x轴进行排序 np.argsort(x) 对x轴进行排序,返回排序后的索引 plt.plot(np.sort(x), y_pre[np.argsort(x)], colorr) # 折线图 绘制预测值 plt.show() #3. 定义函数模拟过拟合 def over_fitting(): # 1. 准备数据 # 1.1 指定随机种子保证每次生成结果一致 np.random.seed(23) # 1.2 随机生成x轴 100个数据模拟特征 x np.random.uniform(-3, 3, 100) # 从-3到3中随机生成100个数据 # 1.3 基于x轴的值随机生成y轴 100个数据模拟标签 # y kx b 0.5 * x ** 2 x 2 噪声 这里k和b的值是随便取的 y 0.5 * x ** 2 x 2 np.random.normal(0, 1, 100) # 噪声均值为0标准差为1 生成100个 # 1.4 查看生成的数据 print(f特征(x):{x}) print(f标签(y):{y}) #2. 数据预处理把x轴(特征)转化成多行1列的形式 X x.reshape(-1, 1) #2.1 由于模型只有一列过于简单为了模拟过拟合现象新增9列增加模型复杂度 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}) #3. 特征工程这里不做直接使用 #4. 模型训练 #4.1 使用正规方程训练模型 estimator LinearRegression() #4.2 模型训练 estimator.fit(X3, y) #5. 模型预测 y_pre estimator.predict(X3) #6. 模型评估 print(f均方误差:{mean_squared_error(y, y_pre)}) # MSE:均方误差 print(f均方根误差:{root_mean_squared_error(y, y_pre)}) # RMSE:均方根误差 print(f平均绝对误差:{mean_absolute_error(y, y_pre)}) # MAE:平均绝对误差 #7. 绘图 plt.scatter(x, y) # 散点图 绘制真实值 # np.sort(x) # 对x轴进行排序 np.argsort(x) 对x轴进行排序,返回排序后的索引 plt.plot(np.sort(x), y_pre[np.argsort(x)], colorr) # 折线图 绘制预测值 plt.show() #4. 定义函数模拟l1正则化 def l1_regularization(): # 1. 准备数据 # 1.1 指定随机种子保证每次生成结果一致 np.random.seed(23) # 1.2 随机生成x轴 100个数据模拟特征 x np.random.uniform(-3, 3, 100) # 从-3到3中随机生成100个数据 # 1.3 基于x轴的值随机生成y轴 100个数据模拟标签 # y kx b 0.5 * x ** 2 x 2 噪声 这里k和b的值是随便取的 y 0.5 * x ** 2 x 2 np.random.normal(0, 1, 100) # 噪声均值为0标准差为1 生成100个 # 1.4 查看生成的数据 print(f特征(x):{x}) print(f标签(y):{y}) #2. 数据预处理把x轴(特征)转化成多行1列的形式 X x.reshape(-1, 1) #2.1 由于模型只有一列过于简单为了模拟过拟合现象新增9列增加 模型复杂度 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}) #3. 特征工程这里不做直接使用 #4. 模型训练 #4.1 创建L1正则化对象 estimator Lasso(alpha0.1) # alpha:正则化系数(惩罚系数) 默认1 #4.2 模型训练 estimator.fit(X3, y) #5. 模型预测 y_pre estimator.predict(X3) #6. 模型评估 print(f均方误差:{mean_squared_error(y, y_pre)}) # MSE:均方误差 print(f均方根误差:{root_mean_squared_error(y, y_pre)}) # RMSE:均方根误差 print(f平均绝对误差:{mean_absolute_error(y, y_pre)}) # MAE:平均绝对误差 #7. 绘图 plt.scatter(x, y) # 散点图 绘制真实值 # np.sort(x) # 对x轴进行排序 np.argsort(x) 对x轴进行排序,返回排序后的索引 plt.plot(np.sort(x), y_pre[np.argsort(x)], colorr) # 折线图 绘制预测值 plt.show() # 5. 定义函数模拟l2正则化 def l2_regularization(): # 1. 准备数据 # 1.1 指定随机种子保证每次生成结果一致 np.random.seed(23) # 1.2 随机生成x轴 100个数据模拟特征 x np.random.uniform(-3, 3, 100) # 从-3到3中随机生成100个数据 # 1.3 基于x轴的值随机生成y轴 100个数据模拟标签 # y kx b 0.5 * x ** 2 x 2 噪声 这里k和b的值是随便取的 y 0.5 * x ** 2 x 2 np.random.normal(0, 1, 100) # 噪声均值为0标准差为1 生成100个 # 1.4 查看生成的数据 print(f特征(x):{x}) print(f标签(y):{y}) #2. 数据预处理把x轴(特征)转化成多行1列的形式 X x.reshape(-1, 1) #2.1 由于模型只有一列过于简单为了模拟过拟合现象新增9列增加 模型复杂度 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}) #3. 特征工程这里不做直接使用 #4. 模型训练 #4.1 创建L2正则化对象 estimator Ridge(alpha10) # alpha:正则化系数(惩罚系数) 默认1 #4.2 模型训练 estimator.fit(X3, y) #5. 模型预测 y_pre estimator.predict(X3) #6. 模型评估 print(f均方误差:{mean_squared_error(y, y_pre)}) # MSE:均方误差 print(f均方根误差:{root_mean_squared_error(y, y_pre)}) # RMSE:均方根误差 print(f平均绝对误差:{mean_absolute_error(y, y_pre)}) # MAE:平均绝对误差 #7. 绘图 plt.scatter(x, y) # 散点图 绘制真实值 # np.sort(x) # 对x轴进行排序 np.argsort(x) 对x轴进行排序,返回排序后的索引 plt.plot(np.sort(x), y_pre[np.argsort(x)], colorr) # 折线图 绘制预测值 plt.show() #6. 测试 if __name__ __main__: # under_fitting() # 欠拟合 # fitting() # 拟合 # over_fitting() # 过拟合 # l1_regularization() # l1正则化 l2_regularization() # l2正则化