AI实践营 Part 03:阿里云天池-二手车交易价格预测

目录

引言

一、项目背景

二、数据读取与预处理

三、特征工程

 1. One-Hot编码

2. 归一化处理

四、模型构建与训练

1. 定义网络结构

2. 实例化模型与定义损失函数

3. 数据准备

4. 训练模型

5. 模型评估与预测


引言

在当今数字化时代,数据挖掘已成为从海量数据中提取有价值信息和知识的关键技术。通过综合运用统计学、机器学习和数据库技术,数据挖掘技术帮助我们揭示数据中的隐藏模式、关系和趋势,为决策提供有力支持。本文将详细介绍阿里云天池平台上的二手车交易价格预测项目,探讨数据挖掘在实际应用中的具体过程和关键技术。

一、项目背景

二手车交易价格预测是数据挖掘在实际应用中的一个典型场景。通过对二手车数据的深入分析,我们可以建立预测模型,对二手车价格进行合理估计,帮助买家和卖家更好地了解市场行情,提高交易效率。阿里云天池平台上的二手车交易价格预测项目,正是基于这样的需求而设计的。

二、数据读取与预处理

1. 数据读取

首先,我们需要从指定路径读取训练集和测试集数据。这里使用Python的pandas库来实现:
 

import pandas as pd

train_data = pd.read_csv('/gemini/data-1/used_car_train_20200313.csv', sep=' ')
test_data = pd.read_csv('/gemini/data-1/used_car_testB_20200421.csv', sep=' ')

2. 数据合并与清洗

为了方便统一处理,我们将训练集和测试集合并:
 

data = pd.concat([train_data, test_data])

接下来,进行数据清洗工作。对于数据中的特殊符号(如'-'),我们将其替换为明确的数值(如'-1'),以便进行后续处理:
 

data = data.replace('-', '-1')

对于power值大于600的,我们进行限制处理:
 

data.loc[data['power'] > 600, 'power'] = 600

对于离散特征中存在的缺失值,我们也使用'-1'进行填充:
 

for col in config['cate_cols']:
    data[col] = data[col].fillna('-1')

此外,我们还需要去除可能无关的列,如'name'和'regionCode':
 

data.drop(['name', 'regionCode'], axis=1, inplace=True)

三、特征工程

 1. One-Hot编码

对于离散特征,我们使用One-Hot编码进行转换。One-Hot编码是一种将分类变量转换为数字向量的编码方式,可以处理非数值型的分类数据,将其转化为模型可以处理的数值形式。

def oneHotEncode(df, colNames):
    for col in colNames:
        dummies = pd.get_dummies(df[col], prefix=col)
        df = pd.concat([df, dummies], axis=1)
        df.drop([col], axis=1, inplace=True)
    return df

data = oneHotEncode(data, config['cate_cols'])

2. 归一化处理

对于连续特征,我们进行归一化处理,将数据映射到[0, 1]区间内,以提高模型的性能和稳定性。

for col in config['num_cols']:
    data[col] = data[col].fillna(0)
    data[col] = (data[col] - data[col].min()) / (data[col].max() - data[col].min())

四、模型构建与训练

1. 定义网络结构

我们使用PyTorch框架定义深度神经网络模型。这里以一个简单的多层感知机为例:

import torch
import torch.nn as nn

class Network(nn.Module):
    def __init__(self, in_dim, hidden_1, hidden_2, hidden_3, hidden_4):
        super().__init__()
        self.layers = nn.Sequential(
            nn.Linear(in_dim, hidden_1), nn.BatchNorm1d(hidden_1), nn.ReLU(),
            nn.Linear(hidden_1, hidden_2), nn.BatchNorm1d(hidden_2), nn.ReLU(),
            nn.Linear(hidden_2, hidden_3), nn.BatchNorm1d(hidden_3), nn.ReLU(),
            nn.Linear(hidden_3, hidden_4), nn.BatchNorm1d(hidden_4), nn.ReLU(),
            nn.Linear(hidden_4, 1)
        )

    def forward(self, x): y

2. 实例化模型与定义损失函数

在定义了网络结构之后,我们需要实例化这个模型,并定义适合回归任务的损失函数,比如均方误差(MSE)损失函数。

# 假设我们已经通过某种方式确定了输入维度和隐藏层维度
in_dim = data.drop(['SaleID', 'price'], axis=1).shape[1] # 假设除了SaleID和price外,其他都是特征
hidden_1, hidden_2, hidden_3, hidden_4 = 100, 50, 20, 10 # 示例隐藏层维度
model = Network(in_dim, hidden_1, hidden_2, hidden_3, hidden_4)
# 定义损失函数和优化器
criterion = nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
# 如果在GPU上运行,则转换为CUDA张量
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = model.to(device)

3. 数据准备

将pandas DataFrame转换为适合神经网络训练的Tensor数据,并划分训练集和验证集(如果有的话,这里只展示了转换部分)。

# 假设已经通过某种方式划分了训练集和测试集索引
train_index, test_index = train_test_split(range(len(data)), test_size=0.2, random_state=42)
# 转换为tensor
train_tensor = torch.tensor(data.iloc[train_index].drop(['SaleID', 'price'], axis=1).values, dtype=torch.float32).to(device)
train_labels = torch.tensor(data.iloc[train_index]['price'].values, dtype=torch.float32).to(device)
# 注意:测试集在这里通常用于模型评估,不参与训练过程,但为了完整性,我们也转换它
test_tensor = torch.tensor(data.iloc[test_index].drop(['SaleID', 'price'], axis=1).values, dtype=torch.float32).to(device)
test_labels = torch.tensor(data.iloc[test_index]['price'].values, dtype=torch.float32).to(device)
# 划分训练集和验证集(这里简单示例,实际中可能需要更复杂的划分)
# train_tensor, val_tensor, train_labels, val_labels = train_test_split(train_tensor, train_labels, test_size=0.2, random_state=42)

4. 训练模型

使用训练集数据训练模型,并在每个epoch后评估其在验证集上的性能(如果划分了验证集)。

epochs = 100 # 训练轮次
for epoch in range(epochs):
# 前向传播
outputs = model(train_tensor)
loss = criterion(outputs.squeeze(), train_labels)
# 反向传播和优化
optimizer.zero_grad()
loss.backward()
optimizer.step()
# 打印每个epoch的损失(可选)
if (epoch+1) % 10 == 0:
print(f'Epoch [{epoch+1}/{epochs}], Loss: {loss.item():.4f}')
# 注意:这里没有包含验证集的评估过程,实际项目中应该包括

5. 模型评估与预测

使用测试集数据评估模型性能,并进行预测。

# 模型评估(这里使用测试集作为示例)
with torch.no_grad():
predicted = model(test_tensor).squeeze()
test_loss = criterion(predicted, test_labels)
print(f'Test Loss: {test_loss.item():.4f}')
# 预测并保存结果(如果是竞赛或实际应用场景)
# 注意:这里假设我们是在处理竞赛数据,需要提交预测结果
predictions = predicted.cpu().numpy()
submission = pd.DataFrame({'SaleID': data.iloc[test_index]['SaleID'], 'price': predictions})
submission.to_csv('submission.csv', index=False)

以上就是使用PyTorch框架在二手车交易价格预测项目中,从数据读取、预处理、特征工程、模型构建与训练到模型评估与预测的完整流程。通过这个过程,我们可以利用数据挖掘技术从二手车数据中发现有价值的信息,从而使之更符合要求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值