项目背景
在我们的课程学习中,老师留给我们的作业就是阿里云天池的一个长期赛,用来给新手练手的,来练习基本的机器学习的框架建设和代码实现,下面我会从我的思路来展示我的解题过程。
二手车市场是一个充满机会和挑战的领域,预测二手车的交易价格不仅可以帮助买家和卖家做出更明智的决策,还能提升交易平台的竞争力。此次项目的目标是利用机器学习模型预测二手车的交易价格。我们将使用来自某交易平台的二手车交易记录数据,进行数据预处理、特征工程、模型训练和评估,最终生成一个预测结果提交文件。
数据集介绍
数据集包含超过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 dftrain_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")
结论
通过本项目,我们学习了如何进行数据预处理、特征工程和模型训练,并使用随机森林回归模型预测二手车的交易价格。我们在训练集和验证集上评估了模型的性能,并生成了符合提交格式的预测结果文件。
这个项目不仅帮助我们理解了数据科学和机器学习的基本流程,还增强了我们解决实际问题的能力。希望通过不断地练习和学习,我们能够在数据科学领域取得更大的进步。