目录
一、算法思想
二、代码实现
一、算法思想
线性回归模型的训练和预测,并包含了数据预处理、损失函数计算、梯度下降优化等步骤。以下是算法的主要步骤:
1. 数据加载与预处理(`load_data`函数):
- 从sklearn.datasets中加载波士顿房价数据集。
- 将数据集的特征和目标变量分别保存为特征矩阵`X`和目标向量`y`。
2. 数据标准化 (`normalize`函数):
- 对特征矩阵`X`进行标准化处理,即减去每个特征的均值并除以标准差,以使数据适合梯度下降算法。
3. 添加偏置值 (`addBais`函数):
- 在特征矩阵`X`中添加一列偏置值(全为1的列),这是因为线性回归模型包含一个偏置项(截距项)。
4. 计算方差(损失函数)(`calculate_MES`函数):
- 定义均方误差(Mean Squared Error, MSE)作为损失函数,用于评估模型预测值与真实值之间的差异。
5. 训练过程(`train`函数):
- 使用梯度下降算法训练模型,通过多次迭代更新模型的权重和偏置,以最小化损失函数。
- 在每次迭代中,计算预测值`y_pred`,然后根据预测值和真实值`y`计算损失。
- 计算权重和偏置的梯度,并使用学习率`lr`来更新权重和偏置。
- 将每次迭代的损失保存到列表`losses`中,以便后续可视化。
6. 预测(`predict`函数):
- 使用训练得到的权重和偏置来计算给定特征矩阵`X`的预测值`y_pred`。
7. 可视化预测结果(`plot_predictions`函数):
- 将模型的预测结果与真实值进行比较,并通过散点图展示。
- 绘制最佳拟合线,展示模型的预测趋势。
8. 可视化训练过程(`plot_training_process`函数):
- 将训练过程中的损失函数值绘制成折线图,以观察模型在训练过程中的表现和收敛情况。
在代码的最后,通过调用这些函数来执行整个流程:加载数据、数据标准化、添加偏置值、训练模型、预测、以及可视化训练过程和预测结果。
二、代码实现
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns# 导入波士顿房价数据集
from sklearn.datasets import load_boston
import warningswarnings.filterwarnings('ignore', category=FutureWarning, module='sklearn')
warnings.filterwarnings('ignore', category=UserWarning)# 数据加载以及预处理
def load_data():""":return: X 为特征矩阵,y真实价格的向量"""boston = load_boston()# 加载房子的特征df feature_names为特征名字df = pd.DataFrame(data=boston.data, columns=boston.feature_names)# 添加价格数据df['price'] = boston.target# 构建特征矩阵XX = df.drop('price', axis=1).values# 真实价格y 向量y = df['price'].valuesreturn X, y# 数据标准化
def normalize(X):# 计算每个特征的平均值mean = np.mean(X, axis=0)# 计算标准差std = np.std(X, axis=0)normalize_X = (X - mean) / stdreturn normalize_X# 添加偏执值
def addBais(X):# 构建偏执值向量 X.shape[0]为样本数量b = np.ones((X.shape[0], 1))X_with_bais = np.concatenate((b, X), axis=1) # 将偏置项添加到第一列return X_with_bais# 计算方差(损失函数)
def calculate_MES(y_pred, y):MSE = np.mean(((y - y_pred) ** 2))return MSE# 训练过程
def train(X, y, lr=0.01, num_iterations=1000):# 样本数量 和 特征数量 + 1num_examples, num_features = X.shape# 权重向量,包括偏置项weights = np.zeros(num_features)bias = 0# 损失函数的列表losses = []for i in range(num_iterations):# 预测值y_pred = np.dot(X, weights) + bias# 计算权重梯度dw = 2 / num_examples * np.dot(X.T, y_pred - y)# 计算偏置梯度db = 2 / num_examples * np.sum(y_pred - y)# 梯度下降weights -= lr * dwbias -= lr * db# 计算损失loss = calculate_MES(y_pred, y)losses.append(loss)return weights, bias, lossesdef predict(X, weights, bias):y_pred = np.dot(X, weights) + biasreturn y_pred# 可视化预测结果
def plot_predictions(y_true, y_pred, weights, bias):df = pd.DataFrame({'True': y_true, 'Predicted': y_pred})sns.scatterplot(data=df, x='True', y='Predicted')# 绘制拟合直线x_line = np.linspace(min(y_true), max(y_true), num=100)y_line = weights[1] * x_line + biasplt.plot(x_line, y_line, color='r', label='Fitted Line')plt.xlabel('真实价格')plt.ylabel('预测价格')plt.title('True vs Predicted Prices with Fitted Line')plt.legend()plt.show()# 可视化训练过程
def plot_training_process(losses):plt.plot(losses)plt.xlabel('Iteration')plt.ylabel('Mean Squared Error')plt.title('Training Process')plt.show()if __name__ == '__main__':# 加载数据X, y = load_data()# 数据变准化normalize_X = normalize(X)# 添加偏执值X_with_bias = addBais(normalize_X)weights, bias, losses = train(X_with_bias, y)# 可视化训练过程plot_training_process(losses)# 预测y_pred = predict(X_with_bias, weights, bias)# 可视化结果plot_predictions(y, y_pred, weights[1:], bias)