二手车交易价格预测--赛题分析
数据比赛步骤
1.赛题分析
2. 数据分析
3. 特征工程
4. 建模调参
5. 模型融合
一. 赛题分析
1.1 学习目标
- 理解赛题数据和目标,清楚评分体系。
- 完成相应报名,下载数据和结果提交打卡(可提交示例结果),熟悉比赛流程。
1.2 了解赛题
- 赛题概况
- 数据概况
- 预测指标
- 分析赛题
1.2.1 赛题概况
赛题以预测二手车的交易价格为任务,数据集报名后即可下载,该数据数据集报名后可见并可下载,该数据来自某交易平台的二手车交易记录,总数据量超过40w,包含31列变量信息,其中15列为匿名变量。为了保证比赛的公平性,将会从中抽取15万条作为训练集,5万条作为测试集A,5万条作为测试集B,同时会对name、model、brand和regionCode等信息进行脱敏。
数据脱敏链接: link.,具体指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护。这样可以使数据本身的安全等级降级,就可以在开发、测试和其它非生产环境以及外包或云计算环境中安全地使用脱敏后的真实数据集。借助数据脱敏技术,屏蔽敏感信息,并使屏蔽的信息保留其原始数据格式和属性,以确保应用程序可在使用脱敏数据的开发与测试过程中正常运行。
1.2.2 数据概况
一般而言,对于数据在比赛界面都有对应的数据概况介绍(匿名特征除外),说明列的性质特征。了解列的性质会有助于我们对于数据的理解和后续分析。 Tip:匿名特征,就是未告知数据列所属的性质的特征列。
train.csv
Data columns (total 31 columns):
SaleID 150000 non-null int64 - 销售样本ID
name 150000 non-null int64 - 汽车编码
regDate 150000 non-null int64 - 汽车注册时间
model 149999 non-null float64 - 车型编码
brand 150000 non-null int64 - 品牌
bodyType 145494 non-null float64 - 车身类型
fuelType 141320 non-null float64- 燃油类型
gearbox 144019 non-null float64- 变速箱
power 150000 non-null int64 - 汽车功率
kilometer 150000 non-null float64- 汽车行驶公里
notRepairedDamage 150000 non-null object - 汽车有尚未修复的损坏
regionCode 150000 non-null int64- 看车地区编码
seller 150000 non-null int64- 销售方
offerType 150000 non-null int64- 报价类型
creatDate 150000 non-null int64 - 广告发布时间
price 150000 non-null int64 - 汽车价格
v_0 150000 non-null float64-匿名特征,包含v0-14在内15个匿名特征
v_1 150000 non-null float64
v_2 150000 non-null float64
v_3 150000 non-null float64
v_4 150000 non-null float64
v_5 150000 non-null float64
v_6 150000 non-null float64
v_7 150000 non-null float64
v_8 150000 non-null float64
v_9 150000 non-null float64
v_10 150000 non-null float64
v_11 150000 non-null float64
v_12 150000 non-null float64
v_13 150000 non-null float64
v_14 150000 non-null float64
dtypes: float64(20), int64(10), object(1)
数字全都脱敏处理,都为label encoding形式,即数字形式
1.2.3 预测指标
本赛题的评价指标为MAE(Mean Absolute Error):
M
A
E
=
∑
i
=
1
n
∣
y
i
−
y
i
^
∣
b
,
.
MAE = \frac{\sum_{i=1}^{n}{|y_i - \hat{y_i}|}}{b},.
MAE=b∑i=1n∣yi−yi^∣,.
其中
y
i
^
\hat{y_i}
yi^表示预测值,y_i表示真实值。
一般问题评价指标说明:
什么是评估指标:
评估指标即是我们对于一个模型效果的数值型量化。(有点类似与对于一个商品评价打分,而这是针对于模型效果和理想效果之间的一个打分)、
一般来说分类和回归问题的评价指标有如下一些形式:
分类算法常见的评估指标如下:
- 对于二类分类器/分类算法,评价指标主要有accuracy, [Precision,Recall,F-score,Pr曲线],ROC-AUC曲线。
- 对于多类分类器/分类算法,评价指标主要有accuracy, [宏平均和微平均,F-score]。
对于回归预测类常见的评估指标如下:
- 平均绝对误差(Mean Absolute Error,MAE),均方误差(Mean Squared Error,MSE),平均绝对百分误差(Mean Absolute Percentage Error,MAPE),均方根误差(Root Mean Squared Error), R2(R-Square)
平均绝对误差 平均绝对误差(Mean Absolute Error,MAE):平均绝对误差,其能更好地反映预测值与真实值误差的实际情况,其计算公式如下:
M
A
E
=
∑
i
=
1
n
∣
y
i
−
y
i
^
∣
b
,
.
MAE = \frac{\sum_{i=1}^{n}{|y_i - \hat{y_i}|}}{b},.
MAE=b∑i=1n∣yi−yi^∣,.
其中
y
i
^
\hat{y_i}
yi^表示预测值,
y
i
y_i
yi表示真实值。
均方误差 均方误差(Mean Squared Error,MSE),均方误差,其计算公式为:
M A E = ∑ i = 1 n ( y i − y i ^ ) 2 n MAE = \frac{\sum_{i=1}^{n}{(y_i - \hat{y_i})^2}}{n} MAE=n∑i=1n(yi−yi^)2
残差平方和:
S
S
r
e
s
=
∑
i
=
1
n
(
y
i
−
y
i
^
)
2
SS_{res }= \sum_{i=1}^{n}{(y_i - \hat{y_i})^2}
SSres=i=1∑n(yi−yi^)2
其中
y
i
^
\hat{y_i}
yi^表示预测值,
y
i
y_i
yi表示每个样本的标签。
总平方和:
S
S
t
o
t
a
l
=
∑
i
=
1
n
(
y
i
−
y
ˉ
)
2
SS_{total} =\sum_{i=1}^{n} {(y_i - \bar{y})^2}
SStotal=i=1∑n(yi−yˉ)2
其中
y
ˉ
=
∑
i
=
1
n
x
i
n
\bar{y}=\frac{\sum_{i=1}^{n}{x_i}}{n}
yˉ=n∑i=1nxi表示样本的均值,
y
i
y_i
yi表示每个样本的标签。
回归平方和
S
S
R
=
∑
i
=
1
n
(
y
i
^
−
y
ˉ
)
2
SS_{R} =\sum_{i=1}^{n} {(\hat{y_i} - \bar{y})^2}
SSR=i=1∑n(yi^−yˉ)2
其中
y
i
^
\hat{y_i}
yi^表示预测值,其中
y
ˉ
=
∑
i
=
1
n
x
i
n
\bar{y}=\frac{\sum_{i=1}^{n}{x_i}}{n}
yˉ=n∑i=1nxi表示样本的均值
回归平方和、总平方和、残差平方和
链接: link.
链接: link
S S R + S S r e s = S S t o t a l SS_{R}+SS_{res} =SS_{total} SSR+SSres=SStotal
拟合优度
R
2
R^2
R2
S
S
R
S
S
t
o
t
a
l
=
R
2
\frac{SS_{R}}{SS_{total} }=R^2
SStotalSSR=R2
R
2
R^2
R2用于度量因变量的变异中可由自变量解释部分所占的比例,取值范围是 0~1,
R
2
R^2
R2越接近1,表明回归平方和占总平方和的比例越大,回归线与各观测点越接近,用x的变化来解释y值变化的部分就越多,回归的拟合程度就越好。所以
R
2
R^2
R2 也称为拟合优度(Goodness of Fit)的统计量。
1.2.4 分析赛题
1.此题为传统的数据挖掘问题,通过数据科学以及机器学习深度学习的办法来进行建模得到结果。
2.此题是一个典型的回归问题。
3.主要应用xgb、lgb、catboost,以及pandas、numpy、matplotlib、seabon、sklearn、keras等等数据挖掘常用库或者框架来进行数据挖掘任务。
4.通过EDA来挖掘数据的联系和自我熟悉数据。
1.3代码解读
1.3.1 导入函数工具箱
## 基础工具
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
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
1.3.2 数据读取
## 通过Pandas对于数据进行读取 (pandas是一个很友好的数据读取函数库)
##windos10
Train_data = pd.read_csv('F:\\datawhale-datamining\\team-learning-master\\aa\\data\\used_car_train_20200313.csv', sep=' ')
TestA_data = pd.read_csv('F:\\datawhale-datamining\\team-learning-master\\aa\\data\\used_car_testA_20200313.csv', sep=' ')
## 输出数据的大小信息
print('Train data shape:',Train_data.shape)
print('TestA data shape:',TestA_data.shape)
1.4经验借鉴
作为切入一道赛题的基础,赛题理解是极其重要的,对于赛题的理解甚至会影响后续的特征工程构建以及模型的选择,最主要是会影响后续发展工作的方向,比如挖掘特征的方向或者存在问题解决问题的方向,对了赛题背后的思想以及赛题业务逻辑的清晰,也很有利于花费更少时间构建更为有效的特征模型,赛题理解要达到的地步是什么呢,把一道赛题转化为一种宏观理解的解决思路。 以下将从多方面对于此进行说明:
- 1) 赛题理解究竟是理解什么: 理解赛题是不是把一道赛题的背景介绍读一遍就OK了呢?并不是的,理解赛题其实也是从直观上梳理问题,分析问题是否可行的方法,有多少可行度,赛题做的价值大不大,理清一道赛题要从背后的赛题背景引发的赛题任务理解其中的任务逻辑,可能对于赛题有意义的外在数据有哪些,并对于赛题数据有一个初步了解,知道现在和任务的相关数据有哪些,其中数据之间的关联逻辑是什么样的。 对于不同的问题,在处理方式上的差异是很大的。如果用简短的话来说,并且在比赛的角度或者做工程的角度,就是该赛题符合的问题是什么问题,大概要去用哪些指标,哪些指标是否会做到线上线下的一致性,是否有效的利于我们进一步的探索更高线上分数的线下验证方法,在业务上,你是否对很多原始特征有很深刻的了解,并且可以通过EDA来寻求他们直接的关系,最后构造出满意的特征。
- 2) 有了赛题理解后能做什么: 在对于赛题有了一定的了解后,分析清楚了问题的类型性质和对于数据理解的这一基础上,是不是赛题理解就做完了呢? 并不是的,就像摸清了敌情后,我们至少就要有一些相应的理解分析,比如这题的难点可能在哪里,关键点可能在哪里,哪些地方可以挖掘更好的特征,用什么样得线下验证方式更为稳定,出现了过拟合或者其他问题,估摸可以用什么方法去解决这些问题,哪些数据是可靠的,哪些数据是需要精密的处理的,哪部分数据应该是关键数据(背景的业务逻辑下,比如CTR的题,一个寻常顾客大体会有怎么样的购买行为逻辑规律,或者风电那种题,如果机组比较邻近,相关一些风速,转速特征是否会很近似)。这时是在一个宏观的大体下分析的,有助于摸清整个题的思路脉络,以及后续的分析方向。
- 3) 赛题理解的-评价指标: 为什么要把这部分单独拿出来呢,因为这部分会涉及后续模型预测中两个很重要的问题: 1. 本地模型的验证方式,很多情况下,线上验证是有一定的时间和次数限制的,所以在比赛中构建一个合理的本地的验证集和验证的评价指标是很关键的步骤,能有效的节省很多时间。 2. 不同的指标对于同样的预测结果是具有误差敏感的差异性的,比如AUC,logloss, MAE,RSME,或者一些特定的评价函数。是会有很大可能会影响后续一些预测的侧重点。
- 4) 赛题背景中可能潜在隐藏的条件: 其实赛题中有些说明是很有利益-都可以在后续答辩中以及问题思考中所体现出来的,比如高效性要求,比如对于数据异常的识别处理,比如工序流程的差异性,比如模型运行的时间,比模型的鲁棒性,有些的意识是可以贯穿问题思考,特征,模型以及后续处理的,也有些会对于特征构建或者选择模型上有很大益处,反过来如果在模型预测效果不好,其实有时也要反过来思考,是不是赛题背景有没有哪方面理解不清晰或者什么其中的问题没考虑到。