从0实现线性回归
创始人
2024-04-07 19:44:36
0

编码题:

按要求完成下面的内容

1请用python完成从0实现线性回归,尝试使用不同的训练参数(学习率,迭代次数), 以及不同的评价方法(MSE,MAE,RMSE,R2)等。

2比较说明sklearn的线性模型和自己实现的线性模型(通过上述代码实现以及训练过程, 比较不同超参数以及评价方法的影响)

第一问:

首先从0开始实现线性回归

1)创建数据

        直接调用load_boston 加载波士顿房价数据集:

2)5种评价指标:

3)自定义模型:

 4)定义损失函数:

5)修改参数进行比较结果如下:

 

6)损失函图:

第二问:在第一问的基础上直接调用sklearn 里面的 LinearRegression()模型即可, 然后在进行比较,改变参数进行比较

结果如下:

根据结果比较得到结论:

  1. b(前进的距离)小一点的话,每次改变的变化就小一点,精准度会比较高一点,适合训练次数比较多的模型,反之则反之
  2. Alpha (学习率)这个值笼统来讲及时比较大的时候学习效果就比较明显,对于b的调整也会比较明显从这里很容易看出:

代码部分:from sklearn.datasets import load_bostonfrom sklearn.linear_model import LinearRegressionimport numpy as npimport matplotlib.pyplot as pltimport warningswarnings.filterwarnings("ignore")  # 忽略警告运行# 数据的加载def feature_scalling(X):mean = X.mean(axis=0)std = X.std(axis=0)return (X - mean) / stddef load_data():data = load_boston()  # 注意波士顿房价这个数据将会在skleran 1.2这个版本移除X = data.datay = data.target.reshape(-1, 1)X = feature_scalling(X)return X, y# 评价指标1 ——  均方误差(MSE)def MSE(y, y_pre):return np.mean((y - y_pre) ** 2)# 评价指标2 ——  均方根误差(RMSE)def RMSE(y, y_pre):return np.sqrt(MSE(y, y_pre))# 评价指标3 —— 平均绝对误差(MAE)def MAE(y, y_pre):return np.mean(np.abs(y-y_pre))# 评价指标4 —— 平均绝对百分比误差(MAPE)def MAPE(y, y_pre):return np.mean(np.abs(y-y_pre)/y)# 评价指标4 —— R^2 评价指标def R2(y, y_pre):u = np.sum((y-y_pre)**2)v = np.sum((y-np.mean(y_pre))**2)return 1-(u/v)# 预测函数def prediction(X, W, bias):return np.matmul(X, W) + bias# 损失值函数def cost_function(X, y, W, bias):m, n = X.shapey_hat = prediction(X, W, bias)return 0.5 * (1 / m) * np.sum((y - y_hat) ** 2)# 自定义模型调整值def gradient_descent(X, y, W, bias, alpha):m, n = X.shape  # m个数据y_hat = prediction(X, W, bias)grad_w = -(1 / m) * np.matmul(X.T, (y - y_hat))grad_b = -(1 / m) * np.sum(y - y_hat)  # 求解梯度W = W - alpha * grad_w  # 梯度下降bias = bias - alpha * grad_b  # 调整前进的距离return W, bias# 自定义模型 1'''b = 0.1 #前进的距离alpha = 0.2 #学习率'''def train_by_my1(X, y, ite=200):m, n = X.shape  # 506,13W = np.random.randn(n, 1)b = 0.1  # 前进的距离alpha = 0.2  # 学习率costs = []  # 每一次的损失函数for i in range(ite):  # 训练 ite = 200 轮J = cost_function(X, y, W, b)  # 计算损失值costs.append(J)W, b = gradient_descent(X, y, W, b, alpha)y_pre = prediction(X, W, b)print("----------my_train1 训练模型--------------")print("my_train1 MSE评价指标: ", MSE(y, y_pre))print("my_train1 R^2评价指标: ", R2(y, y_pre))print("my_train1 MAPE评价指标: ", MAPE(y, y_pre))print("my_trian1 RMSE评价指标: ", RMSE(y, y_pre))print("my_train1 MAE评价指标; ", MAE(y, y_pre))return costs# 自定义模型超参数修改2'''b = 0.2 #前进的距离alpha = 0.5 #学习率'''def train_by_my2(X, y, ite=200):m, n = X.shape  # 506,13W = np.random.randn(n, 1)b = 0.05  # 前进的距离alpha = 0.1  # 学习率costs = []  # 每一次的损失函数for i in range(ite):  # 训练 ite = 200 轮J = cost_function(X, y, W, b)  # 计算损失值costs.append(J)W, b = gradient_descent(X, y, W, b, alpha)y_pre = prediction(X, W, b)print("----------my_train2 训练模型--------------")print("my_train2 MSE评价指标: ", MSE(y, y_pre))print("my_train2 R^2评价指标: ", R2(y, y_pre))print("my_train2 MAPE评价指标: ", MAPE(y, y_pre))print("my_trian2 RMSE评价指标: ", RMSE(y, y_pre))print("my_train2 MAE评价指标; ", MAE(y, y_pre))return costs# skleran 训练模型def train_by_sklearn(x, y):model = LinearRegression()  # 创建模型model.fit(x, y)  # fit训练模型y_pre = model.predict(x)  # 根据模型预测print("----------skleran 训练模型--------------")print("sklearn_train MSE评价指标: ", MSE(y, y_pre))print("sklearn_train R^2评价指标: ", R2(y, y_pre))print("sklearn_train MAPE评价指标: ", MAPE(y, y_pre))print("sklearn_train RMSE评价指标: ", RMSE(y, y_pre))print("sklearn_train MAE评价指标; ", MAE(y, y_pre))if __name__ == '__main__':x, y = load_data()#     train_by_sklearn(x, y)costs = train_by_my1(x, y)train_by_my2(x, y)plt.plot(range(len(costs)), costs, label='损失值', c='black')plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体plt.legend(fontsize=15)plt.xlabel('迭代次数', fontsize=15)plt.tight_layout()  # 调整子图间距plt.show()

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...