数据挖掘-二手车价格预测系列
1.赛题概况
赛题以预测二手车的交易价格为任务,数据集来自某交易平台的二手车交易记录,总数据量超过40w,包含31列变量信息,其中15列为匿名变量。为了保证比赛的公平性,将会从中抽取15万条作为训练集,5万条作为测试集A,5万条作为测试集B,同时会对name、model、brand和regionCode等信息进行脱敏。
赛题链接:零基础入门数据挖掘 - 二手车交易价格预测-天池大赛-阿里云天池
2.分析赛题
-
此题为传统的数据挖掘问题,通过数据科学以及机器学习深度学习的办法来进行建模得到结果。
-
此题是一个典型的回归问题。
-
主要应用xgb、lgb、catboost,以及pandas、numpy、matplotlib、seabon、sklearn、keras等等数据挖掘常用库或者框架来进行数据挖掘任务。
-
通过EDA来挖掘数据的联系和自我熟悉数据。
3.数据概况
train.csv
SaleID - 销售样本ID
name - 汽车编码
regDate - 汽车注册时间
model - 车型编码
brand - 品牌
bodyType - 车身类型
fuelType - 燃油类型
gearbox - 变速箱
power - 汽车功率
kilometer - 汽车行驶公里
notRepairedDamage - 汽车有尚未修复的损坏
regionCode - 看车地区编码
seller - 销售方
offerType - 报价类型
creatDate - 广告发布时间
price - 汽车价格
数字全都脱敏处理,都为label encoding形式,即数字形式
数据特征查看:
Train_data.head()
Train_data.info()
Train_data.desc()
import numpy as np
import pandas as pd
#载入数据集
Train_data=pd.read_csv('car_train_0110.csv',sep=' ')
Test_data=pd.read_csv('car_testA_0110.csv',sep=' ')
print('Train data shape:',Train_data.shape)
print('TestA data shape:',Test_data.shape)
Train data shape: (250000, 40)
TestA data shape: (50000, 39)
Train_data.head()
SaleID name regDate model brand bodyType fuelType gearbox power kilometer ... v_14 v_15 v_16 v_17 v_18 v_19 v_20 v_21 v_22 v_23
0 134890 734 20160002 13.0 9 NaN 0.0 1.0 0 15.0 ... 0.092139 0.000000 18.763832 -1.512063 -1.008718 -12.100623 -0.947052 9.077297 0.581214 3.945923
1 306648 196973 20080307 72.0 9 7.0 5.0 1.0 173 15.0 ... 0.001070 0.122335 -5.685612 -0.489963 -2.223693 -0.226865 -0.658246 -3.949621 4.593618 -1.145653
2 340675 25347 20020312 18.0 12 3.0 0.0 1.0 50 12.5 ... 0.064410 0.003345 -3.295700 1.816499 3.554439 -0.683675 0.971495 2.625318 -0.851922 -1.246135
3 57332 5382 20000611 38.0 8 7.0 0.0 1.0 54 15.0 ... 0.069231 0.000000 -3.405521 1.497826 4.782636 0.039101 1.227646 3.040629 -0.801854 -1.251894
4 265235 173174 20030109 87.0 0 5.0 5.0 1.0 131 3.0 ... 0.000099 0.001655 -4.475429 0.124138 1.364567 -0.319848 -1.131568 -3.303424 -1.998466 -1.279368
5 rows × 40 columns
4.评价指标
基于混淆矩阵的评价指标
如果某个二元分类问题,训练拟合得到了几个模型假设,那么通常我们选择在验证集上,F1 Score 数值最大的那个模型假设。
1)召回率(查全率):反映预测对的正例数占真正的正例数的比率
2)准确率:反映分类器对整个样本的判定能力,能将正的判定为正,负的判定为负
3)查准率:所得数值与真实值之间的精确程度;预测正确的正例数占预测为正例总量的比率
分类指标评价计算示例
import numpy as np
from sklearn.metrics import accuracy_score
y_pred = [0, 1, 0, 1]
y_true = [0, 1, 1, 1]
print('ACC:',accuracy_score(y_true, y_pred))
ACC: 0.75
accuracy_score 分类准确率分数是指所有分类正确的百分比。
## AUC
import numpy as np
from sklearn.metrics import roc_auc_score
y_true = np.array([0, 0, 1, 1])
y_scores = np.array([0.1, 0.4, 0.35, 0.8])
print('AUC socre:',roc_auc_score(y_true, y_scores))
AUC socre: 0.75
AUC是衡量二分类模型优劣的一种评价指标,其他评价指标有精确度、准确率、召回率,而AUC比这三者更为常用。因为一般在分类模型中,预测结果都是以概率的形式表现,如果要计算准确率,通常都会手动设置一个阈值来将对应的概率转化成类别,这个阈值也就很大程度上影响了模型准确率的计算。AUC能很好描述模型整体性能的高低。从一定程度上讲,它可以描述预测结果中正例排在负例前面的概率。
AUC(Area under the Curve of ROC)是ROC曲线下方的面积,是判断二分类预测模型优劣的标准。ROC(receiver operating characteristic curve)属于信号检测理论。通俗点的解释:从正样本中随机抽取一个样本,从负样本中随机抽取一个样本,通过二分类模型对其进行预测,得到正样本的预测概率为p1,负样本的为p2,p1>p2的可能性或概率就是AUC。
ROC曲线的横坐标是伪阳性率(也叫假正类率,False Positive Rate),纵坐标是真阳性率(真正类率,True Positive Rate),这的计算方法如下:
伪阳性率(FPR) 判定为正例却不是真正例的概率 真阳性率(TPR) 判定为正例也是真正例的概率 x轴与y轴的值域都是[0, 1],随着判定正例的阈值不断增加,我们可以得到一组(x, y)的点,相连便作出了ROC曲线,示例图如下:
ROC图从直观上看能得出两个结论:曲线点越接近右下角表示当前阈值预测正例出错的概率越高,准确性较低;曲线点越接近左上角。
回归指标评价计算
# 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))
print('RMSE:',np.sqrt(metrics.mean_squared_error(y_true,y_pred)))
print('MAE:',metrics.mean_absolute_error(y_true,y_pred))
print('MAPE:',mape(y_true,y_pred))