按以下方法编写梯度下降法预测波士顿房价1、获取数据并划分数据集 2、数据标准化/归一化处理 3、LinearRegression_numpy类实例化 #训练模型,调用类中的train_BGD方法 # 4、使用测试集进行测试,模型评价 # 将模型训练得到的系数w与测试数据test_data计算得到预测值。 # 计算测试集的MSE 5、画出损失函数的变化趋势,画出预测值与真实值曲线
时间: 2023-06-20 16:08:20 浏览: 101
以下是Python代码实现:
```
# 导入需要的库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 1、获取数据并划分数据集
data = pd.read_csv('boston_housing.csv')
train_data = data.sample(frac=0.8, random_state=0)
test_data = data.drop(train_data.index)
train_X = train_data.iloc[:, :-1]
train_y = train_data.iloc[:, -1]
test_X = test_data.iloc[:, :-1]
test_y = test_data.iloc[:, -1]
# 2、数据标准化/归一化处理
mean = train_X.mean()
std = train_X.std()
train_X = (train_X - mean) / std
test_X = (test_X - mean) / std
# 3、LinearRegression_numpy类实例化
class LinearRegression_numpy:
def __init__(self, lr=0.01, epochs=1000):
self.lr = lr
self.epochs = epochs
def train_BGD(self, X, y):
m, n = X.shape
self.w = np.zeros(n)
self.b = 0
self.losses = []
for epoch in range(self.epochs):
y_pred = np.dot(X, self.w) + self.b
loss = np.sum((y_pred - y) ** 2) / (2 * m)
self.losses.append(loss)
dw = np.dot(X.T, (y_pred - y)) / m
db = np.sum(y_pred - y) / m
self.w -= self.lr * dw
self.b -= self.lr * db
def predict(self, X):
return np.dot(X, self.w) + self.b
# 训练模型
model = LinearRegression_numpy(lr=0.1, epochs=1000)
model.train_BGD(train_X.values, train_y.values)
# 4、使用测试集进行测试,模型评价
pred_y = model.predict(test_X.values)
mse = np.mean((pred_y - test_y.values) ** 2)
print('MSE: ', mse)
# 5、画出损失函数的变化趋势,画出预测值与真实值曲线
plt.plot(model.losses)
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.show()
plt.scatter(test_y.values, pred_y)
plt.xlabel('True Values')
plt.ylabel('Predictions')
plt.axis('equal')
plt.axis('square')
plt.xlim([0,plt.xlim()[1]])
plt.ylim([0,plt.ylim()[1]])
_ = plt.plot([0, 50], [0, 50])
plt.show()
```
这段代码将会将数据读入,划分为训练集和测试集,并进行标准化处理。
接着使用 LinearRegression_numpy 类实例化并使用批量梯度下降法训练模型,并计算测试集的均方误差。
最后,画出损失函数的变化趋势和预测值与真实值的曲线。
阅读全文