目录
一、赛题数据
1.1 背景介绍
赛题以二手车市场为背景,要求选手以预测二手汽车的交易价格为任务,这是一个典型的回归问题。
该数据来自某交易平台的二手车交易记录,总数据量超过40w,包含31列变量信息,其中15列为匿名变量。为了保证比赛的公平性,将会从中抽取15万条作为训练集,5万条作为测试集A,5万条作为测试集B,同时会对name、model、brand和regionCode等信息进行脱敏。
1.2 字段表
Field | Description |
---|---|
SaleID | 交易ID,唯一编码 |
name | 汽车交易名称,已脱敏 |
regDate | 汽车注册日期,例如20160101,2016年01月01日 |
model | 车型编码,已脱敏 |
brand | 汽车品牌,已脱敏 |
bodyType | 车身类型:豪华轿车:0,微型车:1,厢型车:2,大巴车:3,敞篷车:4,双门汽车:5,商务车:6,搅拌车:7 |
fuelType | 燃油类型:汽油:0,柴油:1,液化石油气:2,天然气:3,混合动力:4,其他:5,电动:6 |
gearbox | 变速箱:手动:0,自动:1 |
power | 发动机功率:范围 [ 0, 600 ] |
kilometer | 汽车已行驶公里,单位万km |
notRepairedDamage | 汽车有尚未修复的损坏:是:0,否:1 |
regionCode | 地区编码,已脱敏 |
seller | 销售方:个体:0,非个体:1 |
offerType | 报价类型:提供:0,请求:1 |
creatDate | 汽车上线时间,即开始售卖时间 |
price | 二手车交易价格(预测目标) |
v系列特征 | 匿名特征,包含v0-14在内15个匿名特征 |
二、评判标准
评判标准为MAE(Mean Absolute Error)
MAE越小,说明模型模拟的越好。
三、赛题相关
3.1 明确目标
目标
:数据
:目标
:评分体系
3.2 了解赛题
- 赛题概况
- 数据概况
- 预测指标
- 分析赛题
3.2.1 赛题概况(见1.1背景)
3.2.2 数据概况(见1.2字段表)
3.2.3 预测指标MAE
3.2.4 分析赛题
- 此题为传统的数据挖掘问题,通过数据科学以及机器学习、深度学习的办法来进行建模得到结果。
- 此题是一个典型的回归问题。
- 主要应用xgb、lgb、catboost,以及pandas、numpy、matplotlib、seabon、sklearn、keras等等数据挖掘常用库或者框架来进行数据挖掘任务。
- 通过EDA来挖掘数据的联系和自我熟悉数据。
四、补充知识
4.1 一般问题评价指标说明
-
评估指标 即是对于一个模型效果的数值型量化。(模型效果vs理想效果)
-
常见的评价指标:
| 分类:二分类(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) -
相关计算公式
- 平均绝对误差(MAE):能够更好地反映预测值与真实值误差的实际情况。
M A E = 1 N ∑ i = 1 N ∣ y i − y ^ i ∣ MAE=\frac{1}{N}\sum_{i=1}^N{\left| y_i-\hat{y}_i \right|} MAE=N1i=1∑N∣yi−y^i∣ - 均方误差(MSE):
M S E = 1 N ∑ i = 1 N ( y i − y ^ i ) 2 MSE=\frac{1}{N}\sum_{i=1}^N{\left( y_i-\hat{y}_i \right)}^2 MSE=N1i=1∑N(yi−y^i)2 - 残差平方和(
R
2
R^2
R2):
S S r e s = ∑ ( y i − y ^ i ) 2 SSres=\sum{\left( y_i-\hat{y}_i \right)}^2 SSres=∑(yi−y^i)2
总平均值:
S S t o t = ∑ ( y i − y ˉ i ) 2 SStot=\sum{\left( y_i-\bar{y}_i \right)}^2 SStot=∑(yi−yˉi)2
R 2 = 1 − S S r e s S S t o t = 1 − ∑ ( y i − y ^ i ) 2 ∑ ( y i − y ˉ i ) 2 R^2=1-\frac{SSres}{SStot}=1-\frac{\sum{\left( y_i-\hat{y}_i \right)}^2}{\sum{\left( y_i-\bar{y}_i \right)}^2} R2=1−SStotSSres=1−∑(yi−yˉi)2∑(yi−y^i)2
R 2 R^2 R2用于度量因变量的变异中可由自变量解释部分所占的比例,取值范围0~1, R 2 R^2 R2越接近1,表明回归平方和占总平方和的比例越大,回归线与各观测点越接近,回归拟合程度越好。
4.2 回归问题
回归预测建模是将输入变量(X)的映射函数(f)近似为连续输出变量(y)的任务。
4.3 EDA(Exploratory Data Analysis)
与传统的统计分析方法的区别:
传统:先假定数据服从某种分布,然后运用这种模型进行预测,以概率论为基础,做各种的参数检验。
EDA:“抛开”概率理论,从数据出发,强调数据可视化
- 单变量分析:直方图;箱线图;正态性检验
- 两个变量分析:线性相关?
- 报表
4.4 他人经验
赛题理解究竟是理解什么?
“理解赛题≠读背景介绍”,应从背后的赛题背景引发的赛题任务理解其中的任务逻辑,可能对于赛题有意义的外在数据有哪些,并对于赛题数据有一个初步了解,知道现在和任务相关数据有哪些,其中数据之间的关联逻辑是什么样的。
该赛题符合的问题是什么问题,大概要去用哪些指标,哪些指标是否会做到线上线下的一致性,是否有效的利于我们进一步的探索更高线上分数的线下验证方法,在业务上,你是否对很多原始特征有很深刻的了解,并且可以通过EDA来寻求他们直接的关系,最后构造出满意的特征。
有了赛题理解后能做什么?
- 问题类型
- 数据理解
- 理解分析:题的难点可能在哪里;关键点可能在哪里;哪些地方可以挖掘更好的特征;用什么样得线下验证方式更为稳定,出现了过拟合或者其他问题,估摸可以用什么方法去解决这些问题,哪些数据是可靠的,哪些数据是需要精密的处理的,哪部分数据应该是关键数据(背景的业务逻辑下,比如CTR的题,一个寻常顾客大体会有怎么样的购买行为逻辑规律,或者风电那种题,如果机组比较邻近,相关一些风速,转速特征是否会很近似)。这时是在一个宏观的大体下分析的,有助于摸清整个题的思路脉络,以及后续的分析方向。
赛题理解的-评价指标
- 本地模型的验证方式,很多情况下,线上验证是有一定的时间和次数限制的,所以在比赛中构建一个合理的本地的验证集和验证的评价指标是很关键的步骤,能有效的节省很多时间。
- 不同的指标对于同样的预测结果是具有误差敏感的差异性的,比如AUC,logloss, MAE,RSME,或者一些特定的评价函数。是会有很大可能会影响后续一些预测的侧重点。
赛题背景中可能隐藏的条件
其实赛题中有些说明是很有利益-都可以在后续答辩中以及问题思考中所体现出来的,比如高效性要求,比如对于数据异常的识别处理,比如工序流程的差异性,比如模型运行的时间,比模型的鲁棒性,有些的意识是可以贯穿问题思考,特征,模型以及后续处理的,也有些会对于特征构建或者选择模型上有很大益处,反过来如果在模型预测效果不好,其实有时也要反过来思考,是不是赛题背景有没有哪方面理解不清晰或者什么其中的问题没考虑到。
PS:
—By: AI蜗牛车
东南大学研究生,研究方向主要是时空序列预测和时间序列数据挖掘
公众号: AI蜗牛车
知乎: https://www.zhihu.com/people/seu-aigua-niu-che
github: https://github.com/chehongshu
五、代码部分
# 1数据读取pandas
import pandas as pd
import numpy as np
##载入训练集和测试集
path = './datalab/'
Train_data = pd.read_csv(path+'used_car_train_20200313.csv', sep=' ')
Test_data = pd.read_csv(path+'used_car_testA_20200313.csv' , sep=' ')
print('Train data shape:', Train_data.shape)
print('TestA data shape:', Test_data.shape)
print(Train_data.head())
Train data shape: (150000, 31)
TestA data shape: (50000, 30)
SaleID name regDate model ... v_11 v_12 v_13 v_14
0 0 736 20040402 30.0 ... 2.804097 -2.420821 0.795292 0.914762
1 1 2262 20030301 40.0 ... 2.096338 -1.030483 -1.722674 0.245522
2 2 14874 20040403 115.0 ... 1.803559 1.565330 -0.832687 -0.229963
3 3 71865 19960908 109.0 ... 1.285940 -0.501868 -2.438353 -0.478699
4 4 111080 20120103 110.0 ... 0.910783 0.931110 2.834518 1.923482
[5 rows x 31 columns]
# 2分类指标评价计算示例
## accuracy, precision, recall, f1-score, AUC
import numpy as np
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score
y_pred = [0, 1, 0, 1]
y_true = [0, 1, 1, 1]
print('ACC:', accuracy_score(y_true, y_pred))
print('Precision:', precision_score(y_true, y_pred))
print('Recall:', recall_score(y_true, y_pred))
print('F1-score', f1_score(y_true, y_pred))
y_true1 = np.array([0, 0, 1, 1])
y_scores = np.array([0.1, 0.4, 0.35, 0.8])
print('AUC score:', roc_auc_score(y_true1, y_scores))
ACC: 0.75
Precision: 1.0
Recall: 0.6666666666666666
F1-score 0.8
AUC score: 0.75
# 2回归指标评价计算示例
#coding=utf-8
import numpy as np
from sklearn import metrics
def mape(y_true, y_pred):
return np.mean(np.abs((y_pred - y_true)/y_true))
y_true = np.array([1.0, 5.0, 4.0, 3.0, 2.0, 5.0, -3.0])
y_pred = np.array([1.0, 4.5, 3.8, 3.2, 3.0, 4.8, -2.2])
#MSE
print('MSE:', metrics.mean_squared_error(y_true,y_pred))
#RMSE
print('RMSE:', np.sqrt(metrics.mean_squared_error(y_true,y_pred)))
#MAE
print('MAE:', metrics.mean_absolute_error(y_true, y_pred))
#MAPE
print('MAPE:', mape(y_true, y_pred))
##R2-score
from sklearn.metrics import r2_score
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
print('R2-score:', r2_score(y_true,y_pred))
MSE: 0.2871428571428571
RMSE: 0.5358571238146014
MAE: 0.4142857142857143
MAPE: 0.1461904761904762
R2-score: 0.9486081370449679