阿里云天池:预测二手车交易价格的机器学习项目

项目背景

在我们的课程学习中,老师留给我们的作业就是阿里云天池的一个长期赛,用来给新手练手的,来练习基本的机器学习的框架建设和代码实现,下面我会从我的思路来展示我的解题过程。

二手车市场是一个充满机会和挑战的领域,预测二手车的交易价格不仅可以帮助买家和卖家做出更明智的决策,还能提升交易平台的竞争力。此次项目的目标是利用机器学习模型预测二手车的交易价格。我们将使用来自某交易平台的二手车交易记录数据,进行数据预处理、特征工程、模型训练和评估,最终生成一个预测结果提交文件。

数据集介绍

数据集包含超过40万条二手车交易记录,31个特征变量,包括15个匿名特征。为保证比赛的公平性,数据集被分为训练集、测试集A和测试集B。为了保护隐私,部分特征(如name、model、brand和regionCode)已被脱敏。

以下是数据集中的一些重要特征:

  • SaleID: 交易ID,唯一编码
  • regDate: 汽车注册日期
  • model: 车型编码
  • brand: 汽车品牌
  • bodyType: 车身类型
  • fuelType: 燃油类型
  • gearbox: 变速箱类型
  • power: 发动机功率
  • kilometer: 已行驶公里数
  • notRepairedDamage: 尚未修复的损坏
  • regionCode: 地区编码
  • seller: 销售方
  • offerType: 报价类型
  • creatDate: 汽车上线时间
  • price: 二手车交易价格(预测目标)

数据预处理

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_absolute_error

# 加载数据
train_data_path = '/mnt/data/used_car_train_20200313.csv'
test_data_path = '/mnt/data/used_car_testB_20200421.csv'
sample_submission_path = '/mnt/data/used_car_sample_submit.csv'

train_data = pd.read_csv(train_data_path)
test_data = pd.read_csv(test_data_path)
sample_submission = pd.read_csv(sample_submission_path)

# 数据预处理
def preprocess_data(df):
    if 'regDate' in df.columns:
        df['regDate'] = pd.to_datetime(df['regDate'], format='%Y%m%d', errors='coerce')
        df['regYear'] = df['regDate'].dt.year
        df['regMonth'] = df['regDate'].dt.month
        df['regDay'] = df['regDate'].dt.day
        df = df.drop(['regDate'], axis=1)
    if 'creatDate' in df.columns:
        df['creatDate'] = pd.to_datetime(df['creatDate'], format='%Y%m%d', errors='coerce')
        df['creatYear'] = df['creatDate'].dt.year
        df['creatMonth'] = df['creatDate'].dt.month
        df['creatDay'] = df['creatDate'].dt.day
        df = df.drop(['creatDate'], axis=1)
    
    if 'notRepairedDamage' in df.columns:
        df['notRepairedDamage'] = df['notRepairedDamage'].map({'0': 1, '1': 0}).fillna(-1)
    if 'bodyType' in df.columns:
        df['bodyType'] = df['bodyType'].fillna(-1)
    if 'fuelType' in df.columns:
        df['fuelType'] = df['fuelType'].fillna(-1)
    if 'gearbox' in df.columns:
        df['gearbox'] = df['gearbox'].fillna(-1)
    
    return df

train_data = preprocess_data(train_data)
test_data = preprocess_data(test_data)
 

特征工程

在完成数据预处理后,我们需要选择适当的特征来训练我们的模型。为了简单起见,我们将删除一些无关或已脱敏的特征,如SaleID和name。此外,我们将处理目标变量price。

# 删除不需要的列并准备训练和测试数据
drop_columns = ['SaleID', 'name']
if 'price' in train_data.columns:
    drop_columns.append('price')
    y = train_data['price']
else:
    y = None
    print("Error: 'price' column not found in train_data")

drop_columns_train = [col for col in drop_columns if col in train_data.columns]
X = train_data.drop(drop_columns_train, axis=1)

drop_columns_test = [col for col in drop_columns if col in test_data.columns]
X_test = test_data.drop(drop_columns_test, axis=1)
 

 

模型训练与评估

我们选择随机森林回归模型来训练我们的数据,因为它在处理非线性关系和高维数据时表现良好。我们将数据分割为训练集和验证集,以评估模型的性能。

# 检查y是否为None
if y is not None:
    # 分割训练集和验证集
    X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42)

    # 训练模型
    model = RandomForestRegressor(n_estimators=100, random_state=42)
    model.fit(X_train, y_train)

    # 验证模型
    y_pred = model.predict(X_val)
    mae = mean_absolute_error(y_val, y_pred)
    print(f'Validation MAE: {mae}')
 

生成提交文件

最后,我们使用训练好的模型对测试集进行预测,并生成提交文件。

    # 预测测试集
    test_preds = model.predict(X_test)

    # 生成提交文件
    submission = pd.DataFrame({'SaleID': test_data['SaleID'], 'price': test_preds})
    submission.to_csv('submission.csv', index=False)
else:
    print("Error: y is None, cannot proceed with training")
 

结论

通过本项目,我们学习了如何进行数据预处理、特征工程和模型训练,并使用随机森林回归模型预测二手车的交易价格。我们在训练集和验证集上评估了模型的性能,并生成了符合提交格式的预测结果文件。

这个项目不仅帮助我们理解了数据科学和机器学习的基本流程,还增强了我们解决实际问题的能力。希望通过不断地练习和学习,我们能够在数据科学领域取得更大的进步。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值