按要求完成下面的内容
1请用python完成从0实现线性回归,尝试使用不同的训练参数(学习率,迭代次数), 以及不同的评价方法(MSE,MAE,RMSE,R2)等。
2比较说明sklearn的线性模型和自己实现的线性模型(通过上述代码实现以及训练过程, 比较不同超参数以及评价方法的影响)
第一问:
首先从0开始实现线性回归
1)创建数据:
直接调用load_boston 加载波士顿房价数据集:
2)5种评价指标:
3)自定义模型:
4)定义损失函数:
5)修改参数进行比较结果如下:
6)损失函图:
第二问:在第一问的基础上直接调用sklearn 里面的 LinearRegression()模型即可, 然后在进行比较,改变参数进行比较
结果如下:
根据结果比较得到结论:
代码部分:
from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression
import numpy as np
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore") # 忽略警告运行
# 数据的加载
def feature_scalling(X):
mean = X.mean(axis=0)
std = X.std(axis=0)
return (X - mean) / std
def load_data():
data = load_boston() # 注意波士顿房价这个数据将会在skleran 1.2这个版本移除
X = data.data
y = 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.shape
y_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,13
W = 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,13
W = 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()