天池学习赛——二手车交易价格预测

目录

一、赛题背景:

二、赛题内容:

三、赛题数据

​编辑

四、评测标准

五、关键代码示例

1.导包(基础工具)

2、读取数据

3、查看指定特征数据

4、训练模型

5、定义标签,绘制图表

6、训练集和验证集的mae和返回模型对象

7、加权融合预测

8.导出结果的csv文件


一、赛题背景:

随着社会经济的发展,人们对于汽车的需求逐渐增加,二手车交易市场也日益活跃。然而,对于二手车的定价往往受到多种因素的影响,包括车辆的品牌、车龄、行驶里程、车况等诸多因素。因此,准确预测二手车的交易价格对于买卖双方都具有重要意义。

二、赛题内容:

天池学习赛“二手车交易价格预测”旨在通过机器学习方法,基于给定的二手车数据集,建立模型来预测二手车的交易价格。参赛者需要针对所提供的二手车信息,构建合适的特征工程和模型,以实现准确的价格预测。

具体来说,参赛者需要从数据中提取有关二手车品牌、车龄、行驶里程、车况等各种特征,并利用这些特征训练模型。最终目标是建立一个能够准确预测二手车交易价格的模型,并通过评估指标(如均方根误差)来衡量模型的性能。

三、赛题数据

数据链接:

零基础入门数据挖掘 - 二手车交易价格预测_学习赛_天池大赛-阿里云天池的赛制 (aliyun.com)icon-default.png?t=N7T8https://tianchi.aliyun.com/competition/entrance/231784/information

赛题以预测二手车的交易价格为任务,数据集报名后可见并可下载,该数据来自某交易平台的二手车交易记录,总数据量超过40w,包含31列变量信息,其中15列为匿名变量。为了保证比赛的公平性,将会从中抽取15万条作为训练集,5万条作为测试集A,5万条作为测试集B,同时会对name、model、brand和regionCode等信息进行脱敏。

四、评测标准

五、关键代码示例

1.导包(基础工具)

#作者:tao0410
## 基础工具
import numpy as np
import pandas as pd
import warnings
import matplotlib
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.special import jn
from IPython.display import display, clear_output
import time
#设置Python警告处理规则。
warnings.filterwarnings('ignore')
%matplotlib inline

## 模型预测的
from sklearn import linear_model
from sklearn import preprocessing
from sklearn.svm import SVR
from sklearn.ensemble import RandomForestRegressor,GradientBoostingRegressor

## 数据降维处理的
from sklearn.decomposition import PCA,FastICA,FactorAnalysis,SparsePCA

import lightgbm as lgb
import xgboost as xgb

## 参数搜索和评价的
from sklearn.model_selection import GridSearchCV,cross_val_score,StratifiedKFold,train_test_split
from sklearn.metrics import mean_squared_error, mean_absolute_error

2、读取数据

## 通过Pandas对于数据进行读取 (pandas是一个很友好的数据读取函数库)
Train_data = pd.read_csv('./data/used_car_train_20200313.csv', sep=' ')
TestA_data = pd.read_csv('./data/used_car_testb_20200421.csv', sep=' ')

## 输出数据的大小信息
print('Train data shape:',Train_data.shape)
print('TestA data shape:',TestA_data.shape)

3、查看指定特征数据

这些数据要一条条单独运行

# 查看前五行数据
Train_data.head()


# 获取数值型列的描述性统计信息
TestA_data.describe()


# 查看数据结构信息
Train_data.info()

#查看列名
numerical_cols = Train_data.select_dtypes(exclude = 'object').columns
print(numerical_cols)


#查看指定特征的列名
categorical_cols = Train_data.select_dtypes(include = 'object').columns
print(categorical_cols)

4、训练模型

## 选择特征列
feature_cols = [col for col in numerical_cols if col not in ['SaleID','name','regDate','creatDate','price','model','brand','regionCode','seller']]
feature_cols = [col for col in feature_cols if 'Type' not in col]

## 提前特征列,标签列构造训练样本和测试样本
X_data = Train_data[feature_cols]
Y_data = Train_data['price']

X_test  = TestA_data[feature_cols]

print('X train shape:',X_data.shape)
print('X test shape:',X_test.shape)
## 选择特征列
feature_cols = [col for col in numerical_cols if col not in ['SaleID','name','regDate','creatDate','price','model','brand','regionCode','seller']]
feature_cols = [col for col in feature_cols if 'Type' not in col]

## 提前特征列,标签列构造训练样本和测试样本
X_data = Train_data[feature_cols]
Y_data = Train_data['price']

X_test  = TestA_data[feature_cols]

print('X train shape:',X_data.shape)
print('X test shape:',X_test.shape)

5、定义标签,绘制图表


6、训练集和验证集的mae和返回模型对象

## xgb-Model
xgr = xgb.XGBRegressor(n_estimators=120, learning_rate=0.1, gamma=0, subsample=0.8,\
        colsample_bytree=0.9, max_depth=7) #,objective ='reg:squarederror'

scores_train = []
scores = []

## 5折交叉验证方式
sk=StratifiedKFold(n_splits=5,shuffle=True,random_state=0)
for train_ind,val_ind in sk.split(X_data,Y_data):
    
    train_x=X_data.iloc[train_ind].values
    train_y=Y_data.iloc[train_ind]
    val_x=X_data.iloc[val_ind].values
    val_y=Y_data.iloc[val_ind]
    
    xgr.fit(train_x,train_y)
    pred_train_xgb=xgr.predict(train_x)
    pred_xgb=xgr.predict(val_x)
    
    score_train = mean_absolute_error(train_y,pred_train_xgb)
    scores_train.append(score_train)
    score = mean_absolute_error(val_y,pred_xgb)
    scores.append(score)
# 输出训练集和验证集的mae
print('Train mae:',np.mean(score_train))
print('Val mae:',np.mean(scores))

# 定义一个函数build_model_xgb,用于构建XGBoost模型,并返回模型对象。
def build_model_xgb(x_train,y_train):
    model = xgb.XGBRegressor(n_estimators=150, learning_rate=0.1, gamma=0, subsample=0.8,\
        colsample_bytree=0.9, max_depth=7) #, objective ='reg:squarederror'
    model.fit(x_train, y_train)
    return model
# 定义一个函数build_model_lgb,用于构建LightGBM模型,并返回模型对象。
def build_model_lgb(x_train,y_train):
    estimator = lgb.LGBMRegressor(num_leaves=127,n_estimators = 150)
    param_grid = {
        'learning_rate': [0.01, 0.05, 0.1, 0.2],
    }
    gbm = GridSearchCV(estimator, param_grid)
    gbm.fit(x_train, y_train)
    return gbm

## Split data with val
x_train,x_val,y_train,y_val = train_test_split(X_data,Y_data,test_size=0.3)

# 打印
print('Train lgb...')
model_lgb = build_model_lgb(x_train,y_train)
val_lgb = model_lgb.predict(x_val)
MAE_lgb = mean_absolute_error(y_val,val_lgb)
print('MAE of val with lgb:',MAE_lgb)

print('Predict lgb...')
model_lgb_pre = build_model_lgb(X_data,Y_data)
subA_lgb = model_lgb_pre.predict(X_test)
print('Sta of Predict lgb:')
Sta_inf(subA_lgb)

print('Train xgb...')
model_xgb = build_model_xgb(x_train,y_train)
val_xgb = model_xgb.predict(x_val)
MAE_xgb = mean_absolute_error(y_val,val_xgb)
print('MAE of val with xgb:',MAE_xgb)

print('Predict xgb...')
model_xgb_pre = build_model_xgb(X_data,Y_data)
subA_xgb = model_xgb_pre.predict(X_test)
print('Sta of Predict xgb:')
Sta_inf(subA_xgb)

7、加权融合预测

## 这里我们采取了简单的加权融合的方式
val_Weighted = (1-MAE_lgb/(MAE_xgb+MAE_lgb))*val_lgb+(1-MAE_xgb/(MAE_xgb+MAE_lgb))*val_xgb
val_Weighted[val_Weighted<0]=10 # 由于我们发现预测的最小值有负数,而真实情况下,price为负是不存在的,由此我们进行对应的后修正
print('MAE of val with Weighted ensemble:',mean_absolute_error(y_val,val_Weighted))

# 计算加权融合的预测结果
sub_Weighted = (1 - MAE_lgb / (MAE_xgb + MAE_lgb)) * subA_lgb + (1 - MAE_xgb / (MAE_xgb + MAE_lgb)) * subA_xgb

## 查看预测值的统计进行
plt.hist(Y_data)
plt.show()
plt.close()

8.导出结果的csv文件

# 读取提交文件
sub_df=pd.read_csv("./data/used_car_sample_submit.csv")

sub_df['price']=sub_Weighted
# 导出提交文件
sub_df.to_csv('./data/used_car_sample_submit.csv',index=False)

六、文章总结

  1. 比赛背景与重要性: 二手车交易价格预测在现代社会中具有重要意义,它帮助买卖双方确定公平合理的交易价格,促进市场的健康发展。通过机器学习模型,能够基于车辆的属性数据来预测价格,这对消费者和经销商都有实际的价值。

  2. 数据和特征工程: 在比赛中,参赛者首先需要对提供的二手车数据进行探索性分析(EDA),理解数据的分布、缺失值等情况。接着,通过特征工程,从原始数据中提取与价格相关的有效特征,如品牌、车龄、里程数、车型等。特征工程的质量直接影响最终模型的性能。

  3. 模型选择与优化: 参赛者通常会尝试多种机器学习模型,如线性回归、决策树、随机森林、梯度提升树(GBDT)、神经网络等,以及它们的集成方法(如XGBoost、LightGBM、CatBoost)。每种模型都有其优势和适用场景,需要根据实际情况进行选择和优化,以提升预测精度。

  4. 评估指标与结果分析: 在比赛中常用的评估指标包括均方根误差(RMSE),该指标衡量了预测值与实际值之间的差异。参赛者需根据评估指标来调整模型,优化预测结果。在总结中,可以分析最终模型在不同阶段的表现,并探讨可能的改进方向。

  5. 经验和教训: 参赛过程中,可能会遇到数据预处理不完善、模型过拟合或欠拟合、特征选择困难等问题。通过总结这些挑战及其解决方案,能够提供宝贵的经验教训,帮助其他人在类似问题上更好地应对。

七、可能遇到的问题

  1. 数据质量问题: 数据集可能存在缺失值、异常值或错误标记,这需要通过数据清洗和预处理来解决,以保证模型训练的准确性和稳定性。

  2. 特征选择与工程: 如何从大量的特征中选择最相关的特征,以及如何构建新的特征以提升模型效果,是一个关键的问题。在这个过程中需要不断尝试和优化。

  3. 模型调优与性能提升: 选择合适的模型和算法、调整超参数、处理模型的过拟合或欠拟合问题,是提升预测精度的关键步骤。

  4. 解释模型结果: 在竞赛结束后,如何解释模型预测的结果对于真实世界的价值,也是一个有挑战的问题。这需要将机器学习模型的预测结果转化为实际业务决策的有用信息。

通过深入总结比赛中遇到的问题及其解决方法,您的读者可以从中学习到在实际项目中应对类似挑战的策略和技巧。这些内容将使您的博客更加丰富和有价值。

本文的文章链接:写文章-CSDN创作中心icon-default.png?t=N7T8https://mp.csdn.net/mp_blog/creation/editor/139764086?spm=1001.2014.3001.9457


### 二手车价格预测比赛入门指南 #### 数据集概述 天池学习赛中的“二手车交易价格预测”提供了丰富的数据资源用于建模。此竞赛的数据来源于某交易平台的真实二手车辆销售记录,总共包含了超过40万个样本,每个样本有31个属性字段,其中包括一些未公开的具体含义的匿名化变量[^2]。 #### 数据预处理 对于此类问题,在开始任何算法之前都需要先做适当的数据清洗工作。这通常涉及缺失值填补、异常检测以及类别型特征编码等操作。特别是像`name`, `model`, `brand` 和 `regionCode`这样的敏感信息已经被脱敏处理过,因此可能需要采用特定的方法来进行有效利用。 #### 特征工程的重要性 成功的模型很大程度上依赖于良好的特征设计。在这个案例里,可以考虑创建新的衍生特性来捕捉潜在模式;比如计算车龄(当前年份减去制造日期)、里程数转换成公里每升油耗效率等等。这些新产生的特征可能会极大地提升最终模型的表现力[^1]。 #### 建立初步模型 当准备好干净且经过优化后的输入之后就可以尝试不同的回归技术了。线性回归可能是最简单的一个起点,但是考虑到实际场景下的复杂关系,更高级别的方法如随机森林、梯度提升树甚至是神经网络也值得探索。Python库Scikit-Learn提供了一个易于使用的API接口来进行上述所有类型的分析。 ```python from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestRegressor import pandas as pd # 加载数据 data = pd.read_csv('path_to_data.csv') # 划分训练集和验证集 X_train, X_val, y_train, y_val = train_test_split(data.drop(columns=['price']), data['price'], test_size=0.2) # 初始化并拟合模型 rf_model = RandomForestRegressor() rf_model.fit(X_train, y_train) # 预测与评估性能 predictions = rf_model.predict(X_val) print(f'Mean Absolute Error: {abs(predictions - y_val).mean()}') ``` #### 性能衡量标准 虽然精度(Precision),召回率(Recall)及F1得分(F1-score)广泛应用于分类任务中,但对于连续数值输出的任务来说并不适用。相反地,均方误差(MSE), 平均绝对误差(MAE) 或者R²分数将是更适合的选择。此外,如果想要比较不同模型之间的相对表现,则可以通过交叉验证获得更加稳健的结果估计[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值