线性回归简介
一元线性回归:y=w*x+b
多元线性回归:y=w的转置*X+b
线性回归问题的求解
线性API回归、损失函数
''' 线性回归介绍(Linear Regressor) 概述/目的: 用线性公式来描述多个自变量(特征)和1个因变量(标签)之间的关系。,对其关系进行建模,基于特征预测标签 线性回归属于有监督学习:有特征,有标签,且标签是连续型的 分类: 一元线性回归:1个特征,1个标签 多元线性回归:多个特征,1个标签 公式: 一元线性回归: y=kx+b=>w*x+b k:数学中叫斜率,在机器学习中Weight(权重),简称w b:数学中叫截距,在机器学习中Bias(偏置),简称b 多元线性回归: y=w1*x1+w2*x2+...+wn*xwn+b=w的转置*X+b ''' #导包 from sklearn.linear_model import LinearRegression #案例 :演示线性回归API入门 #1.准备数据 x_train=[[160],[166],[172],[174],[180]]#训练集特征 y_train=[50.3,60.6,65.1,68.5,75]#训练集标签 x_test=[[176]]#测试集特征 #2.数据的预处理,这里不需要 #3.特征工程(特征提取,特征预处理)这里不需要 #4.模型训练 #4.1创建模型对象 extimator=LinearRegression() #4.2具体的训练动作 extimator.fit(x_train,y_train) #4.3因为是线性回归模型,我们可以查看一下:斜率(w权重),截距(b偏置) print(f'权重:{extimator.coef_}')#[1.19472789] print(f'截距:{extimator.intercept_}')#-139.68163265306126 #5.模型预测 y_pre=extimator.predict(x_test) print(f'预测值是: {y_pre}')#[70.59047619] #6.模型评估误差=预测值-真实值损失函数(Loss Function,也叫成本函数,代价函数、目标函数,Cost Function) 用于描述每个样本点和其预测值之间关系的,让损失函数最小,就是让误差和小,线性回归效率,评估就越高 问题:如何让损失函数最小? 答案: 1.梯度下降法 2.正规方程法损失函数分类:最小二乘法:每个样本点误差的平方和 MSE(Mean Squared Error)均方误差:每个样本点误差的平方和/样本点数量 MAE(Mean Absolute Error)平均绝对误差:每个样本点误差的绝对值和/样本点数量 RMSE(Root Mean Squared Error)均方根误差:每个样本点误差的平方和的开方/样本点数量的平方根;也就是均方误差的平方根
导数和矩阵
正规方程法
上上张图片,最终结论,L2范式的平方,其中,L2范式的XW是上面图片的形式,一般情况下,在矩阵乘法运算符
@运算时:一维数组会临时被当作列向量参与矩阵乘法运算,计算完结果依然输出一维数组;但原数组本身维度不发生改变。
梯度下降算法
损失函数:是衡量模型的好坏;损失函数越小,模型就越好
而其最小值计算方式有两种:
1.正规方程一步直接算,但是如果没有逆计算不出来
2.梯度下降
回归模型评估方法
MAE、MSE、RMSE
线性回归API和案例
线性回归API,案例波士顿房价预测
''' 线性回归介绍(Linear Regressor) 概述/目的: 用线性公式来描述多个自变量(特征)和1个因变量(标签)之间的关系。,对其关系进行建模,基于特征预测标签 线性回归属于有监督学习:有特征,有标签,且标签是连续型的 分类: 一元线性回归:1个特征,1个标签 多元线性回归:多个特征,1个标签 公式: 一元线性回归: y=kx+b=>w*x+b k:数学中叫斜率,在机器学习中Weight(权重),简称w b:数学中叫截距,在机器学习中Bias(偏置),简称b 多元线性回归: y=w1*x1+w2*x2+...+wn*xwn+b=w的转置*X+b 误差=预测值-真实值 损失函数(Loss Function,也叫成本函数,代价函数、目标函数,Cost Function) 用于描述每个样本点和其预测值之间关系的,让损失函数最小,就是让误差和小,线性回归效率,评估就越高 问题:如何让损失函数最小? 答案: 1.梯度下降法 2.正规方程法 损失函数分类: 1.最小二乘法:每个样本点误差的平方和 MSE(Mean Squared Error)均方误差:每个样本点误差的平方和/样本点数量 MAE(Mean Absolute Error)平均绝对误差:每个样本点误差的绝对值和/样本点数量 RMSE(Root Mean Squared Error)均方根误差:每个样本点误差的平方和的开方/样本点数量的平方根;也就是均方误差的平方根 ''' #导包 from sklearn.linear_model import LinearRegression #案例 :演示线性回归API入门 #1.准备数据 x_train=[[160],[166],[172],[174],[180]]#训练集特征 y_train=[50.3,60.6,65.1,68.5,75]#训练集标签 x_test=[[176]]#测试集特征 #2.数据的预处理,这里不需要 #3.特征工程(特征提取,特征预处理)这里不需要 #4.模型训练 #4.1创建模型对象 extimator=LinearRegression() #4.2具体的训练动作 extimator.fit(x_train,y_train) #4.3因为是线性回归模型,我们可以查看一下:斜率(w权重),截距(b偏置) print(f'权重:{extimator.coef_}')#[1.19472789] print(f'截距:{extimator.intercept_}')#-139.68163265306126 #5.模型预测 y_pre=extimator.predict(x_test) print(f'预测值是: {y_pre}')#[70.59047619] #6.模型评估''' 案例:正规方程法,线性回归对象 完成波士顿房价预测任务 回顾: 线性回归属于有监督学习,有特征有标签,且标签是连续的 线性回归的分类: 一元线性回归:y=w*x+b 多元线性回归:y=w1*x1+w2*x2+...+wn*xwn+b=w的转置*X+b 线性回归大白话解释: 他是用线性公式来描述特征和标签之间的关系,方便做预测 如何衡量线性回归模型的好? 思路:预测值和真实值之间的误差越小,模型越好,-》损失函数 具体的方案: 1.最小二乘法 每个样本误差平方和 2.均方误差(MSE) 每个样本误差平方和/样本点数量 3.均方根误差(RMSE) 每个样本误差平方和的开方/样本点数量的平方根 4.平均绝对误差(MAE) 每个样本误差绝对值和/样本点数量 如何让损失函数最小? 思路1:正规方程法 思路2:梯度下降法->全梯度下降(Full Gradient Descent, FGD),随机梯度下降(Stochastic Gradient Descent, SGD),小批量梯度下降(Batch Stochastic Gradient Descent, BSGD) 机器学习的开发流程: 1.加载数据 2.数据预处理 3.特征工程(特征提取,特征预处理,特征降维,特征选择,特征组合) 4.模型训练 5.模型预测 6.模型评估 ''' # 导包 # 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, root_mean_squared_error, mean_absolute_error # 均方误差评估, RMSE, MAE 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" 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]]) # hstack()函数作用: 水平拼接数组 target = raw_df.values[1::2, 2] # print(f'特征: {data.shape}') # (506, 13) # print(f'标签: {target.shape}') # (506,) # # print(f'特征数据: {data[:5]}') # print(f'标签数据: {target[:5]}') #2.数据预处理 #2.1将数据拆分成训练集和测试集 #参数1:特征数据 参数2:标签数据 参数3:测试集占比 参数4:随机种子 x_train, x_test, y_train, y_test = train_test_split(data, target, test_size=0.2, random_state=42) #3.特征工程(特征提取,特征预处理,特征降维,特征选择,特征组合) transformer = StandardScaler()#创建标准化对象 x_train = transformer.fit_transform(x_train)#对训练集进行标准化 x_test = transformer.transform(x_test)#对测试集进行标准化 #4.模型训练 estimator = LinearRegression() estimator.fit(x_train, y_train) # 打印模型计算出的 w(权重, weight) 和 b(偏置, bias). print(f'权重: {estimator.coef_}') print(f'偏置: {estimator.intercept_}') #5. 模型预测 y_pre = estimator.predict(x_test) print(f'预测值: {y_pre}') #6. 模型评估 # 参1: 测试集的标签数据. 参2: 预测结果. rmse = root_mean_squared_error(y_test, y_pre) mae = mean_absolute_error(y_test, y_pre) mse = mean_squared_error(y_test, y_pre) print(f'均方误差: {mse}') print(f'均方根误差: {rmse}') print(f'平均绝对误差: {mae}')''' 案例:随机梯度下降法,线性回归对象 完成波士顿房价预测任务 回顾: 线性回归属于有监督学习,有特征有标签,且标签是连续的 线性回归的分类: 一元线性回归:y=w*x+b 多元线性回归:y=w1*x1+w2*x2+...+wn*xwn+b=w的转置*X+b 线性回归大白话解释: 他是用线性公式来描述特征和标签之间的关系,方便做预测 如何衡量线性回归模型的好? 思路:预测值和真实值之间的误差越小,模型越好,-》损失函数 具体的方案: 1.最小二乘法 每个样本误差平方和 2.均方误差(MSE) 每个样本误差平方和/样本点数量 3.均方根误差(RMSE) 每个样本误差平方和的开方/样本点数量的平方根 4.平均绝对误差(MAE) 每个样本误差绝对值和/样本点数量 如何让损失函数最小? 思路1:正规方程法 思路2:梯度下降法->全梯度下降(Full Gradient Descent, FGD),随机梯度下降(Stochastic Gradient Descent, SGD),小批量梯度下降(Batch Stochastic Gradient Descent, BSGD) 机器学习的开发流程: 1.加载数据 2.数据预处理 3.特征工程(特征提取,特征预处理,特征降维,特征选择,特征组合) 4.模型训练 5.模型预测 6.模型评估 ''' # 导包 # 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, root_mean_squared_error, mean_absolute_error # 均方误差评估, RMSE, MAE 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" 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]]) # hstack()函数作用: 水平拼接数组 target = raw_df.values[1::2, 2] # print(f'特征: {data.shape}') # (506, 13) # print(f'标签: {target.shape}') # (506,) # # print(f'特征数据: {data[:5]}') # print(f'标签数据: {target[:5]}') #2.数据预处理 #2.1将数据拆分成训练集和测试集 #参数1:特征数据 参数2:标签数据 参数3:测试集占比 参数4:随机种子 x_train, x_test, y_train, y_test = train_test_split(data, target, test_size=0.2, random_state=42) #3.特征工程(特征提取,特征预处理,特征降维,特征选择,特征组合) transformer = StandardScaler()#创建标准化对象 x_train = transformer.fit_transform(x_train)#对训练集进行标准化 x_test = transformer.transform(x_test)#对测试集进行标准化 #4.模型训练 #参数1fit_intercept 是否计算偏置项,参数2: 学习率模式->常量,即不会发生变化 参数3: 学习率的初始值 estimator = SGDRegressor(fit_intercept=True, learning_rate='constant', eta0=0.01) estimator.fit(x_train, y_train) # 打印模型计算出的 w(权重, weight) 和 b(偏置, bias). print(f'权重: {estimator.coef_}') print(f'偏置: {estimator.intercept_}') #5. 模型预测 y_pre = estimator.predict(x_test) print(f'预测值: {y_pre}') #6. 模型评估 # 参1: 测试集的标签数据. 参2: 预测结果. rmse = root_mean_squared_error(y_test, y_pre) mae = mean_absolute_error(y_test, y_pre) mse = mean_squared_error(y_test, y_pre) print(f'均方误差: {mse}') print(f'均方根误差: {rmse}') print(f'平均绝对误差: {mae}')欠拟合与过拟合
出现原因、解决方法
''' 案例: 演示:欠拟合、过拟合、正好拟合,L1正则化。L2正则化的效果图 回顾: 欠拟合:模型在训练集和测试集表现效果都不好 正好拟合:模型在训练集和测试集表现效果都好 过拟合:模型在训练集表现的好,测试集表现的不好 过拟合,欠拟合解释: 产生原因: 欠拟合:模型简单 过拟合:模型复杂 解决方案: 欠拟合:增加特征,从而增加模型的复杂度 过拟合:减少模型复杂度,手动筛选(减少)特征,L1和L2正则化 ''' # 导包 import matplotlib.pyplot as plt # from sklearn.datasets import load_boston # 数据 import numpy as np 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, mean_absolute_error # 均方误差评估, RMSE, MAE from sklearn.linear_model import Ridge, RidgeCV def dm01_under_fitting(): #1.准备数据 #1.1指定随机种子,则每次生成(噪声)的数据都是固定的 np.random.seed(23) #1.2随机生成x轴100个数据,模拟:特征 x=np.random.uniform(low=-3, high=3, size=100)#参1:最小值,参2:最大值,参3:生成的个数 #1.3基于x轴值,通过线性公式,生成y轴100个数据,模拟标签 y=0.5*x**2+x+2+np.random.normal(0,1,100)#参1:均值,参2:标准差,参3:生成的个数 #1.4查看生成的x轴特征和y轴标签的数据 print(f'x轴特征:{x}') print(f'y轴标签:{y}') #2.数据预处理:把x轴(特征)转成多行1列的形式 X=x.reshape(-1,1) print(f'处理后的特征:{X[:5]}') #3特征工程 这里不做了,直接用100条数据,先训练,后预测 #4.模型训练 #4.1创建模型对象 estimator=LinearRegression()#正规方程 线性回归模型 #4.2模型训练 estimator.fit(X,y)#参1:处理后的特征数据 参2:标签数据 #5.模型预测 y_predict=estimator.predict(X)#处理后的特征数据 #6.模型评估 print(f'均方误差:{mean_squared_error(y,y_predict)}')#参1:真实标签,参2:预测标签 #7.绘图 plt.scatter(x,y)#真实数据 以散点图的形式绘制真实值 plt.plot(x,y_predict,color='red')#预测数据,以线图的形式绘制预测值 plt.show() if __name__=='__main__': dm01_under_fitting()def dm02_just_fitting(): #1.准备数据 #1.1指定随机种子,则每次生成(噪声)的数据都是固定的 np.random.seed(23) #1.2随机生成x轴100个数据,模拟:特征 x=np.random.uniform(low=-3, high=3, size=100)#参1:最小值,参2:最大值,参3:生成的个数 #1.3基于x轴值,通过线性公式,生成y轴100个数据,模拟标签 y=0.5*x**2+x+2+np.random.normal(0,1,100)#参1:均值,参2:标准差,参3:生成的个数 #1.4查看生成的x轴特征和y轴标签的数据 print(f'x轴特征:{x}')#[1,2,3,4,5] print(f'y轴标签:{y}') #2.数据预处理:把x轴(特征)转成多行1列的形式 X=x.reshape(-1,1) print(f'处理后的特征:{X[:5]}')#[[1],[2],[3],[4],[5]] #因为目前特征列只有1列,模型过于简单,会出现欠拟合问题,我们增加1列特征列,从而增加;模型的复杂度 X2=np.hstack([X,X**2])#水平拼接,增加1列特征列,即x的平方#该函数作用:横向拼接,即:拼接2个数组,拼接后数组行数不变,列数增加 print(f'处理后的特征:{X[:5]}')#[[1,1],[2,4],[3,9],[4,16],[5,25]] #3特征工程 这里不做了,直接用100条数据,先训练,后预测 #4.模型训练 #4.1创建模型对象 estimator=LinearRegression()#正规方程 线性回归模型 #4.2模型训练 estimator.fit(X2,y)#参1:处理后的特征数据 参2:标签数据 #5.模型预测 y_predict=estimator.predict(X2)#处理后的特征数据 #6.模型评估 print(f'均方误差:{mean_squared_error(y,y_predict)}')#参1:真实标签,参2:预测标签 #7.绘图 plt.scatter(x,y)#真实数据 以散点图的形式绘制真实值 #np.sort(x)对x轴特征进行排序,默认是升序 #np.argsort(x)对x轴特征进行排序,返回排序后的索引 #例如:排序前x轴是[11,33,22]->对应的索引:[0,1,2] #排序后的x轴是[11,22,33]->对应的索引:[0,1,2] plt.plot(np.sort(x),y_predict[np.argsort(x)],color='red')#预测数据,以线图的形式绘制预测值 plt.show() if __name__=='__main__': # dm01_under_fitting() dm02_just_fitting()L1正则化、L2正则化
''' 案例: 演示:欠拟合、过拟合、正好拟合,L1正则化。L2正则化的效果图 回顾: 欠拟合:模型在训练集和测试集表现效果都不好 正好拟合:模型在训练集和测试集表现效果都好 过拟合:模型在训练集表现的好,测试集表现的不好 过拟合,欠拟合解释: 产生原因: 欠拟合:模型简单 过拟合:模型复杂 解决方案: 欠拟合:增加特征,从而增加模型的复杂度 过拟合:减少模型复杂度,手动筛选(减少)特征,L1和L2正则化 过拟合, 欠拟合解释: 产生原因: 欠拟合: 模型简单. 过拟合: 模型复杂. 解决方案: 欠拟合: 增加特征, 从而增加 模型的复杂度. 过拟合: 减少模型复杂度, 手动筛选(减少)特征, L1和L2正则化. L1和L2正则化介绍: 目的/思路: 都是基于 惩罚系数 来修改(特征列的)权重的, 惩罚系数越大, 则修改力度就越大, 对应的权重就越小. 区别: L1正则化, 可以实现让权重变为0, 从而达到 特征选择的目的. L2正则化, 只能让权重无限趋近于0, 但是不能为0. 大白话: 我要去爬山, 带了个小包, 装了: 登山杖, 水, 面包, 衣服, 雨伞, 鞋子... 发现包装不下了. L1正则化: 可以实现去掉一些不是必选的, 例如: 当天去, 当前回, 且天气晴朗 -> 不带雨伞, 鞋子, 即: 权重为0 L2正则化: 换一个非常非常大的包, 还是那些物品, 但是空间占用(权重)就变小了... ''' # 导包 import matplotlib.pyplot as plt # from sklearn.datasets import load_boston # 数据 import numpy as np 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, mean_absolute_error # 均方误差评估, RMSE, MAE from sklearn.linear_model import Ridge, RidgeCV from sklearn.linear_model import Lasso, Ridge # L1正则化, L2正则化 def dm01_under_fitting(): #1.准备数据 #1.1指定随机种子,则每次生成(噪声)的数据都是固定的 np.random.seed(23) #1.2随机生成x轴100个数据,模拟:特征 x=np.random.uniform(low=-3, high=3, size=100)#参1:最小值,参2:最大值,参3:生成的个数 #1.3基于x轴值,通过线性公式,生成y轴100个数据,模拟标签 y=0.5*x**2+x+2+np.random.normal(0,1,100)#参1:均值,参2:标准差,参3:生成的个数 #1.4查看生成的x轴特征和y轴标签的数据 print(f'x轴特征:{x}') print(f'y轴标签:{y}') #2.数据预处理:把x轴(特征)转成多行1列的形式 X=x.reshape(-1,1) print(f'处理后的特征:{X[:5]}') #3特征工程 这里不做了,直接用100条数据,先训练,后预测 #4.模型训练 #4.1创建模型对象 estimator=LinearRegression()#正规方程 线性回归模型 #4.2模型训练 estimator.fit(X,y)#参1:处理后的特征数据 参2:标签数据 #5.模型预测 y_predict=estimator.predict(X)#处理后的特征数据 #6.模型评估 print(f'均方误差:{mean_squared_error(y,y_predict)}')#参1:真实标签,参2:预测标签 #7.绘图 plt.scatter(x,y)#真实数据 以散点图的形式绘制真实值 plt.plot(x,y_predict,color='red')#预测数据,以线图的形式绘制预测值 plt.show() def dm02_just_fitting(): #1.准备数据 #1.1指定随机种子,则每次生成(噪声)的数据都是固定的 np.random.seed(23) #1.2随机生成x轴100个数据,模拟:特征 x=np.random.uniform(low=-3, high=3, size=100)#参1:最小值,参2:最大值,参3:生成的个数 #1.3基于x轴值,通过线性公式,生成y轴100个数据,模拟标签 y=0.5*x**2+x+2+np.random.normal(0,1,100)#参1:均值,参2:标准差,参3:生成的个数 #1.4查看生成的x轴特征和y轴标签的数据 print(f'x轴特征:{x}')#[1,2,3,4,5] print(f'y轴标签:{y}') #2.数据预处理:把x轴(特征)转成多行1列的形式 X=x.reshape(-1,1) print(f'处理后的特征:{X[:5]}')#[[1],[2],[3],[4],[5]] #因为目前特征列只有1列,模型过于简单,会出现欠拟合问题,我们增加1列特征列,从而增加;模型的复杂度 X2=np.hstack([X,X**2])#水平拼接,增加1列特征列,即x的平方#该函数作用:横向拼接,即:拼接2个数组,拼接后数组行数不变,列数增加 print(f'处理后的特征:{X[:5]}')#[[1,1],[2,4],[3,9],[4,16],[5,25]] #3特征工程 这里不做了,直接用100条数据,先训练,后预测 #4.模型训练 #4.1创建模型对象 estimator=LinearRegression()#正规方程 线性回归模型 #4.2模型训练 estimator.fit(X2,y)#参1:处理后的特征数据 参2:标签数据 #5.模型预测 y_predict=estimator.predict(X2)#处理后的特征数据 #6.模型评估 print(f'均方误差:{mean_squared_error(y,y_predict)}')#参1:真实标签,参2:预测标签 #7.绘图 plt.scatter(x,y)#真实数据 以散点图的形式绘制真实值 #np.sort(x)对x轴特征进行排序,默认是升序 #np.argsort(x)对x轴特征进行排序,返回排序后的索引 #例如:排序前x轴是[11,33,22]->对应的索引:[0,1,2] #排序后的x轴是[11,22,33]->对应的索引:[0,1,2] plt.plot(np.sort(x),y_predict[np.argsort(x)],color='red')#预测数据,以线图的形式绘制预测值 plt.show() def dm03_over_fitting(): # 1.准备数据 # 1.1指定随机种子,则每次生成(噪声)的数据都是固定的 np.random.seed(23) # 1.2随机生成x轴100个数据,模拟:特征 x = np.random.uniform(low=-3, high=3, size=100) # 参1:最小值,参2:最大值,参3:生成的个数 # 1.3基于x轴值,通过线性公式,生成y轴100个数据,模拟标签 y = 0.5 * x ** 2 + x + 2 + np.random.normal(0, 1, 100) # 参1:均值,参2:标准差,参3:生成的个数 # 1.4查看生成的x轴特征和y轴标签的数据 print(f'x轴特征:{x}') # [1,2,3,4,5] print(f'y轴标签:{y}') # 2.数据预处理:把x轴(特征)转成多行1列的形式 X = x.reshape(-1, 1) print(f'处理后的特征:{X[:5]}') # [[1],[2],[3],[4],[5]] # 2.2 因为目前特征列只有1列, 模型过于简单, 为了模拟过拟合, 我们增加9列 特征列, 从而增加模型的复杂度. # 即: 把数据从 [[1], [2], [3], [4], [5]] => [[1, 1**2, 1**3, 1**4, 1**5...], [2, 2**2, 2**3, 2**4, 2**5], [3...]...] # 该函数作用: 横向拼接, 即: 拼接多个数组, 拼接后数组的行数不变, 拼接后数组的列数等于拼接前数组的列数之和. # 例如: [[1], [2], [3], [4], [5]] => [[1, 1**2, 1**3, 1**4, 1**5...], [2, 2**2, 2**3, 2**4, 2**5], [3...]...] # 2.3 水平拼接,增加9列特征列,即x的平方、立方、四次、五次、六次、七次、八次、九次 X3 = np.hstack([X, X ** 2, X ** 3, X ** 4, X ** 5, X ** 6, X ** 7, X ** 8, X ** 9, X ** 10]) # 水平拼接,增加9列特征列,即x的平方、立方、四次、五次、六次、七次、八次、九次 print(f'处理后的特征:{X3[:5]}') # [[1,1],[2,4],[3,9],[4,16],[5,25]] # 3特征工程 这里不做了,直接用100条数据,先训练,后预测 # 4.模型训练 # 4.1创建模型对象 estimator = LinearRegression() # 正规方程 线性回归模型 # 4.2模型训练 estimator.fit(X3, y) # 参1:处理后的特征数据 参2:标签数据 # 5.模型预测 y_predict = estimator.predict(X3) # 处理后的特征数据 # 6.模型评估 print(f'均方误差:{mean_squared_error(y, y_predict)}') # 参1:真实标签,参2:预测标签 # 7.绘图 plt.scatter(x, y) # 真实数据 以散点图的形式绘制真实值 # np.sort(x)对x轴特征进行排序,默认是升序 # np.argsort(x)对x轴特征进行排序,返回排序后的索引 # 例如:排序前x轴是[11,33,22]->对应的索引:[0,1,2] # 排序后的x轴是[11,22,33]->对应的索引:[0,1,2] plt.plot(np.sort(x), y_predict[np.argsort(x)], color='red') # 预测数据,以线图的形式绘制预测值 plt.show() #定义函数,模拟L1正则化 def dm04_l1_regularization(): # 1.准备数据 # 1.1指定随机种子,则每次生成(噪声)的数据都是固定的 np.random.seed(23) # 1.2随机生成x轴100个数据,模拟:特征 x = np.random.uniform(low=-3, high=3, size=100) # 参1:最小值,参2:最大值,参3:生成的个数 # 1.3基于x轴值,通过线性公式,生成y轴100个数据,模拟标签 y = 0.5 * x ** 2 + x + 2 + np.random.normal(0, 1, 100) # 参1:均值,参2:标准差,参3:生成的个数 # 1.4查看生成的x轴特征和y轴标签的数据 print(f'x轴特征:{x}') # [1,2,3,4,5] print(f'y轴标签:{y}') # 2.数据预处理:把x轴(特征)转成多行1列的形式 X = x.reshape(-1, 1) print(f'处理后的特征:{X[:5]}') # [[1],[2],[3],[4],[5]] # 2.2 因为目前特征列只有1列, 模型过于简单, 为了模拟过拟合, 我们增加9列 特征列, 从而增加模型的复杂度. # 即: 把数据从 [[1], [2], [3], [4], [5]] => [[1, 1**2, 1**3, 1**4, 1**5...], [2, 2**2, 2**3, 2**4, 2**5], [3...]...] # 该函数作用: 横向拼接, 即: 拼接多个数组, 拼接后数组的行数不变, 拼接后数组的列数等于拼接前数组的列数之和. # 例如: [[1], [2], [3], [4], [5]] => [[1, 1**2, 1**3, 1**4, 1**5...], [2, 2**2, 2**3, 2**4, 2**5], [3...]...] # 2.3 水平拼接,增加9列特征列,即x的平方、立方、四次、五次、六次、七次、八次、九次 X3 = np.hstack([X, X ** 2, X ** 3, X ** 4, X ** 5, X ** 6, X ** 7, X ** 8, X ** 9, X ** 10]) # 水平拼接,增加9列特征列,即x的平方、立方、四次、五次、六次、七次、八次、九次 print(f'处理后的特征:{X3[:5]}') # [[1,1],[2,4],[3,9],[4,16],[5,25]] # 3特征工程 这里不做了,直接用100条数据,先训练,后预测 # 4.模型训练 # 4.1创建模型对象 # estimator = LinearRegression() # 正规方程 线性回归模型 estimator = Lasso(alpha=0.1) # L1正则化 线性回归模型# alpha: 正则化系数(惩罚系数), 默认是: 1. # 4.2模型训练 estimator.fit(X3, y) # 参1:处理后的特征数据 参2:标签数据 # 5.模型预测 y_predict = estimator.predict(X3) # 处理后的特征数据 # 6.模型评估 print(f'均方误差:{mean_squared_error(y, y_predict)}') # 参1:真实标签,参2:预测标签 # 7.绘图 plt.scatter(x, y) # 真实数据 以散点图的形式绘制真实值 # np.sort(x)对x轴特征进行排序,默认是升序 # np.argsort(x)对x轴特征进行排序,返回排序后的索引 # 例如:排序前x轴是[11,33,22]->对应的索引:[0,1,2] # 排序后的x轴是[11,22,33]->对应的索引:[0,1,2] plt.plot(np.sort(x), y_predict[np.argsort(x)], color='red') # 预测数据,以线图的形式绘制预测值 plt.show() #定义函数,模拟L2正则化 def dm05_l2_regularization(): # 1.准备数据 # 1.1指定随机种子,则每次生成(噪声)的数据都是固定的 np.random.seed(23) # 1.2随机生成x轴100个数据,模拟:特征 x = np.random.uniform(low=-3, high=3, size=100) # 参1:最小值,参2:最大值,参3:生成的个数 # 1.3基于x轴值,通过线性公式,生成y轴100个数据,模拟标签 y = 0.5 * x ** 2 + x + 2 + np.random.normal(0, 1, 100) # 参1:均值,参2:标准差,参3:生成的个数 # 1.4查看生成的x轴特征和y轴标签的数据 print(f'x轴特征:{x}') # [1,2,3,4,5] print(f'y轴标签:{y}') # 2.数据预处理:把x轴(特征)转成多行1列的形式 X = x.reshape(-1, 1) print(f'处理后的特征:{X[:5]}') # [[1],[2],[3],[4],[5]] # 2.2 因为目前特征列只有1列, 模型过于简单, 为了模拟过拟合, 我们增加9列 特征列, 从而增加模型的复杂度. # 即: 把数据从 [[1], [2], [3], [4], [5]] => [[1, 1**2, 1**3, 1**4, 1**5...], [2, 2**2, 2**3, 2**4, 2**5], [3...]...] # 该函数作用: 横向拼接, 即: 拼接多个数组, 拼接后数组的行数不变, 拼接后数组的列数等于拼接前数组的列数之和. # 例如: [[1], [2], [3], [4], [5]] => [[1, 1**2, 1**3, 1**4, 1**5...], [2, 2**2, 2**3, 2**4, 2**5], [3...]...] # 2.3 水平拼接,增加9列特征列,即x的平方、立方、四次、五次、六次、七次、八次、九次 X3 = np.hstack([X, X ** 2, X ** 3, X ** 4, X ** 5, X ** 6, X ** 7, X ** 8, X ** 9, X ** 10]) # 水平拼接,增加9列特征列,即x的平方、立方、四次、五次、六次、七次、八次、九次 print(f'处理后的特征:{X3[:5]}') # [[1,1],[2,4],[3,9],[4,16],[5,25]] # 3特征工程 这里不做了,直接用100条数据,先训练,后预测 # 4.模型训练 # 4.1创建模型对象 # estimator = LinearRegression() # 正规方程 线性回归模型 # estimator = Lasso(alpha=0.1) # L1正则化 线性回归模型# alpha: 正则化系数(惩罚系数), 默认是: 1. estimator = Ridge(alpha=0.1) # L2正则化 线性回归模型# alpha: 正则化系数(惩罚系数), 默认是: 1. # 4.2模型训练 estimator.fit(X3, y) # 参1:处理后的特征数据 参2:标签数据 # 5.模型预测 y_predict = estimator.predict(X3) # 处理后的特征数据 # 6.模型评估 print(f'均方误差:{mean_squared_error(y, y_predict)}') # 参1:真实标签,参2:预测标签 # 7.绘图 plt.scatter(x, y) # 真实数据 以散点图的形式绘制真实值 # np.sort(x)对x轴特征进行排序,默认是升序 # np.argsort(x)对x轴特征进行排序,返回排序后的索引 # 例如:排序前x轴是[11,33,22]->对应的索引:[0,1,2] # 排序后的x轴是[11,22,33]->对应的索引:[0,1,2] plt.plot(np.sort(x), y_predict[np.argsort(x)], color='red') # 预测数据,以线图的形式绘制预测值 plt.show() if __name__=='__main__': # dm01_under_fitting() # dm02_just_fitting() # dm03_over_fitting() # dm04_l1_regularization() dm05_l2_regularization()