汽车价格多元线性回归
汽车价格预测多元线性回归
关于数据集
问题陈述
一家中国汽车公司吉利汽车渴望进入美国市场,在美利建立制造工厂并在当地生产汽车,以与美国和欧洲同行竞争。
他们与一家汽车咨询公司签订了合同,以了解汽车定价所依赖的因素。具体来说,他们希望了解影响美国市场汽车定价的因素,因为这些因素可能与中国市场有很大不同。公司想知道:
哪些变量在预测汽车
价格方面具有重要意义 这些变量对汽车
价格的描述程度 根据各种市场调查,该咨询公司收集了美国市场上不同类型汽车的大量数据集。
业务目标
我们需要使用可用的自变量对汽车价格进行建模。管理层将使用它来了解价格如何随自变量而变化。因此,他们可以操纵汽车的设计、商业战略等,以满足一定的价格水平。此外,该模型将是管理层了解新市场定价动态的好方法。
代码实现
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()