汽车价格多元线性回归

汽车价格预测多元线性回归

关于数据集

问题陈述

一家中国汽车公司吉利汽车渴望进入美国市场,在美利建立制造工厂并在当地生产汽车,以与美国和欧洲同行竞争。

他们与一家汽车咨询公司签订了合同,以了解汽车定价所依赖的因素。具体来说,他们希望了解影响美国市场汽车定价的因素,因为这些因素可能与中国市场有很大不同。公司想知道:

哪些变量在预测汽车
价格方面具有重要意义 这些变量对汽车
价格的描述程度 根据各种市场调查,该咨询公司收集了美国市场上不同类型汽车的大量数据集。

业务目标

我们需要使用可用的自变量对汽车价格进行建模。管理层将使用它来了解价格如何随自变量而变化。因此,他们可以操纵汽车的设计、商业战略等,以满足一定的价格水平。此外,该模型将是管理层了解新市场定价动态的好方法。


代码实现

import pandas as pd
import torch
from torch.utils.data import TensorDataset, DataLoader
from torch import nn
from torch.optim import SGD
import matplotlib.pyplot as plt

# 参数设置
file_path = r'D:\ALL_code\al_study_file\al_study\MachineLearning\线性回归\car-price-prediction\CarPrice_Assignment.csv'
batch_size = 2
num_epochs = 100
lr = 0.001


# 数据预处理
def preprocess_data(file_path):
    # 读取CSV文件
    data_arrays = pd.read_csv(file_path)
    # 找到非数值列
    non_numeric_columns = data_arrays.select_dtypes(include=["object", "category"]).columns.tolist()
    # 使用get_dummies进行独热编码
    data_encoded = pd.get_dummies(data_arrays, columns=non_numeric_columns)
    # 保存均值和标准差
    mean = data_encoded.mean()
    std = data_encoded.std()
    # 数据标准化
    data_encoded = (data_encoded - mean) / std
    # 分离特征和标签
    features = data_encoded.drop(['price', 'car_ID'], axis=1)
    labels = data_encoded['price']
    # 转换为PyTorch Tensor
    features = torch.tensor(features.values, dtype=torch.float32)
    labels = torch.tensor(labels.values, dtype=torch.float32).unsqueeze(1)
    return features, labels, mean, std


# 构造数据迭代器
def load_array(data_arrays, batch_size, is_train=True):
    dataset = TensorDataset(*data_arrays)
    return DataLoader(dataset, batch_size, shuffle=is_train)


# 模型定义
class LinearRegression(nn.Module):
    def __init__(self, input_dim):
        super(LinearRegression, self).__init__()
        self.layer = nn.Linear(input_dim, 1)

    def forward(self, x):
        return self.layer(x)


# 训练模型
def train_model(net, features, labels, batch_size, num_epochs, lr):
    # 创建训练数据迭代器
    data_iter = load_array((features, labels), batch_size)
    # 初始化模型参数
    net.layer.weight.data.normal_(0, 0.01)
    net.layer.bias.data.fill_(0)
    # 损失函数和优化器
    loss = nn.MSELoss()
    trainer = SGD(net.parameters(), lr=lr)
    # 存储每个epoch的损失值
    loss_history = []
    for epoch in range(num_epochs):
        for X, y in data_iter:
            l = loss(net(X), y)
            trainer.zero_grad()
            l.backward()
            trainer.step()
        # 计算并记录当前epoch的总损失
        l = loss(net(features), labels)
        loss_history.append(l.item())
        print(f'epoch {epoch + 1}, loss {l.item():f}')
    return loss_history


# 可视化损失
def visualize_loss(loss_history):
    plt.plot(range(1, num_epochs + 1), loss_history)
    plt.xlabel('Epoch')
    plt.ylabel('Loss')
    plt.title('Training Loss')
    plt.show()


# 主函数
def main():
    # 数据预处理
    features, labels, mean, std = preprocess_data(file_path)
    # 定义模型
    net = LinearRegression(features.shape[1])
    # 训练模型
    loss_history = train_model(net, features, labels, batch_size, num_epochs, lr)
    # 可视化损失
    visualize_loss(loss_history)


if __name__ == "__main__":
    main()

可视化结果

posted @ 2024-08-01 03:04  codersgl  阅读(6)  评论(0编辑  收藏  举报