这个比赛是天池的一个数据挖掘入门赛,要求根据提供的数据预测二手车的交易价格,属于回归问题,此篇主要分享一下特征工程和基础模型方面的思路。

1. 特征基本统计

date_cols = ['regDate', 'creatDate']
cate_cols = ['name', 'model', 'brand', 'bodyType', 'fuelType', 'gearbox', 'notRepairedDamage', 'regionCode', 'seller', 'offerType']
num_cols = ['power', 'kilometer'] + ['v_{}'.format(i) for i in range(15)]
cols = date_cols + cate_cols + num_colsdf = pd.DataFrame()
df['count'] = data[cols].count().values
df['missing_rate'] = (data.shape[0] - df['count']) / data.shape[0]
df['nunique'] = data[cols].nunique().values
df['max_value_counts'] = [data[f].value_counts().values[0] for f in cols]
df['max_value_counts_prop'] = df['max_value_counts'] / data.shape[0]
df['max_value_counts_value'] = [data[f].value_counts().index[0] for f in cols]
df.index = cols
df

2. 处理power

#处理异常值
def smooth_cols(group,cols = ['power'],out_value = 600):for col in cols:yes_no = (group[col]<out_value).astype('int')new = yes_no * group[col]group[col] = new.replace(0,group[col].median())return groupdata = data.groupby('brand').apply(smooth_cols,cols = ['power'],out_value = 600)
data.index = range(len(data))

3. 处理时间相关特征

from tqdm import tqdm#提取日期信息
date_cols = ['regDate', 'creatDate']# data.loc[data['regDate'] == 20070009]
# 使用时间:data['creatDate'] - data['regDate'],反应汽车使用时间,一般来说价格与使用时间成反比
# 数据里有时间出错的格式,需要加errors='coerce'
data['used_time_days'] = (pd.to_datetime(data['creatDate'], format='%Y%m%d', errors='coerce') - pd.to_datetime(data['regDate'], format='%Y%m%d', errors='coerce')).dt.days
data['used_time_month'] = round(data['used_time_days'] / 30, 3)
data['used_time_year'] = round(data['used_time_days'] / 365, 3)def date_proc(x):m = int(x[4:6])if m == 0:m = 1return x[:4] + '-' + str(m) + '-' + x[6:]for col in tqdm(date_cols):data[col] = pd.to_datetime(data[col].astype('str').apply(date_proc))data[col + '_year'] = data[col].dt.yeardata[col + '_month'] = data[col].dt.monthdata[col + '_day'] = data[col].dt.daydata[col + '_dayofweek'] = data[col].dt.dayofweek# 增加新特征,成交日期是否是周末
data['is_weekend'] = data['creatDate_dayofweek'].apply(lambda x: 1 if x in(5,6) else 0)# 使用年限折旧
def depreciation_year(year):if year <= 3:return 1 - year * 0.15elif year > 3 and  year <= 7:return 0.55 - (year-3) * 0.1elif year > 7 and  year <= 10:return 0.25 - (year-7) * 0.05else:return 0data['depreciation_year'] = data['used_time_year'].apply(lambda x: depreciation_year(x))

4.处理类别型特征

# 将fuelType2之后的值都设置成2
data.loc[data['fuelType'] == 3,'fuelType'] = 2
data.loc[data['fuelType'] == 4,'fuelType'] = 2
data.loc[data['fuelType'] == 5,'fuelType'] = 2
data.loc[data['fuelType'] == 6,'fuelType'] = 2
data['fuelType'].value_counts()data['notRepairedDamage'].replace('-', '2.0', inplace=True)
print('concat data shape:',data.shape)features = ['model','bodyType','fuelType','gearbox']
for fe in features:data[fe].fillna(data[fe].mode()[0], inplace=True)train[fe].fillna(data[fe].mode()[0], inplace=True)test[fe].fillna(data[fe].mode()[0], inplace=True)

5. 提取城市,年平均里程

# 从邮编中提取城市信息,这个特征后续通过lightGBM的特征重要性来看不高
data['city'] = data['regionCode'].apply(lambda x : str(x)[:-3])
data['city'].replace('', 0, inplace=True)# 计算年平均里程, 即kilometer/汽车使用年限
features = ['used_time_days','used_time_month','used_time_year']
for fe in features:data[fe].fillna(data[fe].median(), inplace=True)data['kilometer_everyear'] = round(1000 * data['kilometer'] / data['used_time_year'],3)

6.统计特征在数据集里出现次数,代表热门程度

from tqdm import tqdm# count编码
def count_features(df, feat_cols):for feat in tqdm(feat_cols):df[feat + '_count'] = df[feat].map(df[feat].value_counts())return(df)feature_list = ['regDate','creatDate','regDate_year','model','brand','regionCode','bodyType','fuelType','gearbox','notRepairedDamage']
data = count_features(data, feature_list)# 计算brand/model的销售统计量
Train_gb = train.groupby("brand")
all_info = {}
for kind, kind_data in Train_gb:info = {}kind_data = kind_data[kind_data['price'] > 0]info['brand_amount'] = len(kind_data)info['brand_price_max'] = kind_data.price.max()info['brand_price_median'] = kind_data.price.median()info['brand_price_min'] = kind_data.price.min()info['brand_price_sum'] = kind_data.price.sum()info['brand_price_ptp'] = kind_data.price.ptp()info['brand_price_std'] = kind_data.price.std()info['brand_price_average'] = round(kind_data.price.sum() / (len(kind_data) + 1), 2)all_info[kind] = info
brand_fe = pd.DataFrame(all_info).T.reset_index().rename(columns={"index": "brand"})
data = data.merge(brand_fe, how='left', on='brand')

7. 用数值特征对类别特征做统计刻画

8. 类别特征的二阶交叉

9. 后验概率——bodyType, fuelType, gearBox在品牌brand和regionCode中的概率

内容有点多,感兴趣的可以去我的github下载。但是后续实际跑模型来看,特征数量对模型的影响并不是成正比的(特征数目越多模型效果越好)。比如有些特征(regionCode的统计),加进去后反而会升高MAE,经过多次试验,最终确定下来180维左右的特征。

https://github.com/SunnyFei-78/Recommendation/tree/master/天池_二手车交易价格预测

天池大赛——二手车交易价格预测方案分享(一)相关推荐

  1. 阿里AI天池大赛-二手车交易价格预测-回归算法与模型融合

    1:报名地址 https://tianchi.aliyun.com/competition/entrance/231784/introduction?spm=5176.12281925.0.0.1a3 ...

  2. python二手车价格预测_天池_二手车交易价格预测数据分析

    字典 FieldDescription SaleID 交易ID,唯一编码 name 汽车交易名称,已脱敏 regDate 汽车注册日期,例如20160101,2016年01月01日 model 车型编 ...

  3. 二手车交易价格预测方案——数据分析EDA

    二手车交易价格预测 题目解析 赛题概况 数据概况 数据脱敏 评价指标 EDA目标 读取数据 head(),tail(),describe() 数据总览和异常值检查 describe(),info() ...

  4. 天池_二手车交易价格预测

    二手车交易价格预测 赛题链接天池: https://tianchi.aliyun.com/competition/entrance/231784/introduction 笔记记录:Github 主要 ...

  5. Task 1 天池赛 - 二手车交易价格预测

    文章目录 1 赛题概况 1.1 概况 1.2 数据概况 1.3 评估指标 2 赛题分析 2.1 分析 2.2 代码示例 数据读取 分类指标评价计算示例 回归指标评价计算示例 3 经验总结 4 问题记录 ...

  6. 天池比赛——二手车交易价格预测(主要步骤)

    Step 1:导入函数工具箱 Step 2:数据读取 1) 数据简要浏览 2) 数据信息查看 3) 数据统计信息浏览 Step 3:特征与标签构建 1) 提取数值类型特征列名 2) 构建训练和测试样本 ...

  7. 阿里天池二手车交易价格预测(一)——EDA

    阿里天池二手车交易价格预测(一)--EDA Exploratory Data Analysis是数据科学领取理解和分析数据的方法,通过不断的收集.分析和假设验证,以取得对数据的深入理解. EDA的价值 ...

  8. 【直播】王茂霖:二手车交易价格预测-千变万化特征工程(河北高校数据挖掘邀请赛)

    二手车交易价格预测-千变万化特征工程 目前 河北高校数据挖掘邀请赛 正在如火如荼的进行中.为了大家更好的参赛,王茂霖分享了 从0梳理1场数据挖掘赛事!,完整梳理了从环境准备.数据读取.数据分析.特征工 ...

  9. 【直播】王茂霖:二手车交易价格预测 Baseline 提高(河北高校数据挖掘邀请赛)

    二手车交易价格预测 Baseline 提高 目前 河北高校数据挖掘邀请赛 正在如火如荼的进行中.为了大家更好的参赛,王茂霖分享了 从0梳理1场数据挖掘赛事!,完整梳理了从环境准备.数据读取.数据分析. ...

最新文章

  1. 双十一,程序员前女友发来消息。。。
  2. altium pcb 信号高亮_Altium Designer PCB的时候 高亮显示引脚连线
  3. 【转】Linux入门命令篇(简训)
  4. bkwin设置文本控件为多行模式
  5. linux 修改当前系统时间
  6. 【C#桌面应用】第一节:使用C#开发桌面应用的准备
  7. 如和用Python获取今日头条上面三千美女图,且看教程
  8. mysql 51cto 数据类型_Mysql数据类型
  9. python tkinter画笑脸_tkinter绘制红绿灯图案
  10. 淘宝运营到底是做什么的?
  11. 怎样彻底删除微信聊天记录?学会这招,从此不用再砸手机也不用泡水里
  12. 四种平均数的数学公式
  13. HDU 4287 Intelligent IME 水题
  14. 爆炒猪肚的做法 爆炒猪肚怎样炒才脆
  15. R语言学习-问题解决-Error in output$nodeID : $ operator is invalid for atomic vectors
  16. MaixII-Dock(v831)学习笔记——PWM
  17. Hbuilder 历次版本更新记录
  18. 关于Chandrashekhar阿扎德概述
  19. Python 输入一个整数,将他转换为数字金字塔和 * 金字塔
  20. calc.relimp学习笔记(R语言)

热门文章

  1. django里面的css无法加载,django使用admin后台,一部分 css和js文件无法加载-无法打开文件...
  2. (实战)[re:Invent 2018]-002:通过分析奖励函数优化后- 8.4s / 圈
  3. 全面解读Logit模型
  4. 等级保护测评需要多长时间 ?
  5. Android 与Vue 页面交互
  6. magento2.3.2 用户支付成功后台没有生成订单 丢单问题处理
  7. centos7中安装mysql步骤及命令教程
  8. WGCNA | 值得你深入学习的生信分析方法!~(网状分析-第一步-数据整理)
  9. gradle一直提示更新:Gradle files have changed since last project sync. A project sync may be necessary fo
  10. 小米电视精简,去开机广告,系统更新,删除无用内置软件等