天池长期赛:二手车价格预测(422方案分享)

这篇具有很好参考价值的文章主要介绍了天池长期赛:二手车价格预测(422方案分享)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

一、赛题介绍及评测标准

二、数据探索(EDA)

1.读取数据、缺失值可视化

2.特征描述性统计

3.测试集与验证集数据分布

4.特征相关性

三、数据清洗

四、特征工程

1.构建时间特征

2.匿名特征交叉

3.平均数编码

五、建模调参

六、模型融合

总结


前言

赛题属于回归类型,相比于前两次的保险反欺诈及贷款违约预测,本次比赛学到了很多特征工程、模型调参及模型融合的处理,收货颇丰。


一、赛题介绍及评测标准

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

长期赛的测试集是B,特征介绍如下:

天池大赛二手车交易价格预测,数据挖掘,Python,大数据,python,数据挖掘

天池大赛二手车交易价格预测,数据挖掘,Python,大数据,python,数据挖掘

二、数据探索(EDA)

1.读取数据、缺失值可视化

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
df = pd.read_csv('/train.csv', sep=' ')
# 缺失值可视化
missing = df.isnull().sum()/len(df)
missing = missing[missing > 0]
missing.sort_values(inplace=True) #排个序
missing.plot.bar()

天池大赛二手车交易价格预测,数据挖掘,Python,大数据,python,数据挖掘

2.特征描述性统计

df.describe().T

天池大赛二手车交易价格预测,数据挖掘,Python,大数据,python,数据挖掘

目标变量price, 75%以下的数据与最大值相差较大,数据呈现一个偏态分布(也可以可视化,会更加直观),这也是后续要进行对数转换的原因。

3.测试集与验证集数据分布

# 分离数值变量与分类变量
Nu_feature = list(df.select_dtypes(exclude=['object']).columns)  # 数值变量
Ca_feature = list(df.select_dtypes(include=['object']).columns)
plt.figure(figsize=(30,25))
i=1
for col in Nu_feature:
    ax=plt.subplot(6,5,i)
    ax=sns.kdeplot(df[col],color='red')
    ax=sns.kdeplot(test[col],color='cyan')
    ax.set_xlabel(col)
    ax.set_ylabel('Frequency')
    ax=ax.legend(['train','test'])
    i+=1
plt.show()

天池大赛二手车交易价格预测,数据挖掘,Python,大数据,python,数据挖掘

这几次比赛的数据集主办方都处理的很好,分布都是一致的 。

4.特征相关性

correlation_matrix=df.corr()
plt.figure(figsize=(12,10))
sns.heatmap(correlation_matrix,vmax=0.9,linewidths=0.05,cmap="RdGy")

天池大赛二手车交易价格预测,数据挖掘,Python,大数据,python,数据挖掘

与目标变量相关性比较高的特征有regDate、kilometer、v_0、v_3、v_8、v_12,这个不难理解,注册日期越早,行驶公里数越多,车价相对会越低。品牌和车型与目标变量的相关性较低这点比较意外。

三、数据清洗

# 众数填充缺失值
df['notRepairedDamage']=df['notRepairedDamage'].replace('-',0.0)
df['fuelType'] = df['fuelType'].fillna(0)
df['gearbox'] = df['gearbox'].fillna(0)
df['bodyType'] = df['bodyType'].fillna(0)
df['model'] = df['model'].fillna(0)
# 截断异常值
df['power'][df['power']>600] = 600
df['power'][df['power']<1] = 1
df['v_13'][df['v_13']>6] = 6
df['v_14'][df['v_14']>4] = 4
# 目标变量进行对数变换服从正态分布
df['price'] = np.log1p(df['price'])

大部分模型是以数据正态分布为前提,目标变量如果偏态严重,会影响模型预测效果,所以才会进行对数正态化。

众数填充是一种比较常见的缺失值填充方式,异常值截断是参考天池论坛的文章。

四、特征工程

特征工程我参考了很多大神的方法,自己也尝试了很多组合在模型上运行,最终确定了这些特征,

毕竟模型都差不多,特征能够对提分有比较显著的效果,更多特征的构建可以参考:

零基础入门数据挖掘系列之「特征工程」-天池技术圈-天池技术讨论区

1.构建时间特征

from datetime import datetime
def date_process(x):
    year = int(str(x)[:4])
    month = int(str(x)[4:6])
    day = int(str(x)[6:8])
    if month < 1:
        month = 1
    date = datetime(year, month, day)
    return date
df['regDate'] = df['regDate'].apply(date_process)
df['creatDate'] = df['creatDate'].apply(date_process)
df['regDate_year'] = df['regDate'].dt.year
df['regDate_month'] = df['regDate'].dt.month
df['regDate_day'] = df['regDate'].dt.day
df['creatDate_year'] = df['creatDate'].dt.year
df['creatDate_month'] = df['creatDate'].dt.month
df['creatDate_day'] = df['creatDate'].dt.day
df['car_age_day'] = (df['creatDate'] - df['regDate']).dt.days#二手车使用天数
df['car_age_year'] = round(df['car_age_day'] / 365, 1)#二手车使用年数

2.匿名特征交叉

num_cols = [0,2,3,6,8,10,12,14]
for index, value in enumerate(num_cols):
    for j in num_cols[index+1:]:
        df['new'+str(value)+'*'+str(j)]=df['v_'+str(value)]*df['v_'+str(j)]
        df['new'+str(value)+'+'+str(j)]=df['v_'+str(value)]+df['v_'+str(j)]
        df['new'+str(value)+'-'+str(j)]=df['v_'+str(value)]-df['v_'+str(j)]

num_cols1 = [3,5,1,11]
for index, value in enumerate(num_cols1):
    for j in num_cols1[index+1:]:
        df['new'+str(value)+'-'+str(j)]=df['v_'+str(value)]-df['v_'+str(j)]

for i in range(15):
    df['new'+str(i)+'*year']=df['v_'+str(i)] * df['car_age_year']

3.平均数编码

X=df.drop(columns=['price','SaleID','seller','offerType', 'name','creatDate','regionCode'])
Y=df['price']

import Meancoder   # 平均数编码
class_list = ['model','brand','power','v_0','v_3','v_8','v_12']
MeanEnocodeFeature = class_list   # 声明需要平均数编码的特征
ME = Meancoder.MeanEncoder(MeanEnocodeFeature,target_type='regression') # 声明平均数编码的类
X = ME.fit_transform(X,Y)   # 对训练数据集的X和y进行拟合

五、建模调参

参数建议选择较低的学习率,用较高的迭代次数,可以提高模型精确度,可以参考

Datawhale 零基础入门数据挖掘-Task4 建模调参-天池实验室-实时在线的数据分析协作工具,享受免费计算资源

from catboost import CatBoostRegressor
from sklearn.model_selection import train_test_split
from sklearn.model_selection import KFold
from sklearn.metrics import  mean_squared_error
# 划分训练及测试集
x_train,x_test,y_train,y_test = train_test_split( X, Y,test_size=0.3,random_state=1)
# 模型训练
clf=CatBoostRegressor(
            loss_function="MAE",
            eval_metric= 'MAE',
            task_type="CPU",
            od_type="Iter",   #过拟合检查类型
            random_seed=2022)  # learning_rate、iterations、depth可以自己尝试
# 5折交叉  test是测试集B,已经经过清洗及特征工程,方法与训练集一致
result = []
mean_score = 0
n_folds=5
kf = KFold(n_splits=n_folds ,shuffle=True,random_state=2022)
for train_index, test_index in kf.split(X):
    x_train = X.iloc[train_index]
    y_train = Y.iloc[train_index]
    x_test = X.iloc[test_index]
    y_test = Y.iloc[test_index]
    clf.fit(x_train,y_train)
    y_pred=clf.predict(x_test)
    print('验证集MAE:{}'.format(mean_absolute_error(np.expm1(y_test),np.expm1(y_pred))))
    mean_score += mean_absolute_error(np.expm1(y_test),np.expm1(y_pred))/ n_folds
    y_pred_final = clf.predict(test)
    y_pred_test=np.expm1(y_pred_final)
    result.append(y_pred_test)
# 模型评估
print('mean 验证集MAE:{}'.format(mean_score))
cat_pre=sum(result)/n_folds
ret=pd.DataFrame(cat_pre,columns=['price'])
ret.to_csv('/预测.csv')

经过交叉验证取平均值可以将线上分数提高10到15,由于price前期做了对数变换,在预测时需要还原。

六、模型融合

模型融合是用catboost与lightgbm,catboost精确度比lightgbm高,但训练速度没有lightgbm快,采用简单的加权融合可以将线上分数提高5-7,我也试过用stack融合,但效果没有加权融合好,这个仁者见仁智者见智吧,模型融合可以参考:

Datawhale 零基础入门数据挖掘-Task5 模型融合-天池实验室-实时在线的数据分析协作工具,享受免费计算资源

catboost+特征交叉+调参+5折 线上447
catboost+特征交叉+平均数编码+调参+5折 线上437
catboost+lightgbm+特征交叉+平均数编码+调参+5折+模型加权融合 线上422
from lightgbm.sklearn import LGBMRegressor
gbm = LGBMRegressor() # 参数可以去论坛参考
# 由于模型不支持object类型的处理,所以需要转化
X['notRepairedDamage'] = X['notRepairedDamage'].astype('float64')
test['notRepairedDamage'] = test['notRepairedDamage'].astype('float64')
result1 = []
mean_score1 = 0
n_folds=5
kf = KFold(n_splits=n_folds ,shuffle=True,random_state=2022)
for train_index, test_index in kf.split(X):
    x_train = X.iloc[train_index]
    y_train = Y.iloc[train_index]
    x_test = X.iloc[test_index]
    y_test = Y.iloc[test_index]
    gbm.fit(x_train,y_train)
    y_pred1=gbm.predict(x_test)
    print('验证集MAE:{}'.format(mean_absolute_error(np.expm1(y_test),np.expm1(y_pred1))))
    mean_score1 += mean_absolute_error(np.expm1(y_test),np.expm1(y_pred1))/ n_folds
    y_pred_final1 = gbm.predict((test),num_iteration=gbm.best_iteration_)
    y_pred_test1=np.expm1(y_pred_final1)
    result1.append(y_pred_test1)
# 模型评估
print('mean 验证集MAE:{}'.format(mean_score1))
cat_pre1=sum(result1)/n_folds

#加权融合
sub_Weighted = (1-mean_score1/(mean_score1+mean_score))*cat_pre1+(1-mean_score/(mean_score1+mean_score))*cat_pre

天池大赛二手车交易价格预测,数据挖掘,Python,大数据,python,数据挖掘


总结

1.特征工程有太多组合可以尝试,有时间的朋友可以多多尝试。

2.论坛上有大神用深度学习模型,只构建的时间特征就能跑到420左右的分数,有兴趣的朋友可以尝试下。

3.对于目标变量还有无界约翰逊分布johnsonsu处理方式,效果比对数处理要好,但还原有点麻烦。

4. stack模型的融合应该是要优于加权融合的,可以尝试3个以上的不同类型的模型融合,或许效果会更好。文章来源地址https://www.toymoban.com/news/detail-791365.html

到了这里,关于天池长期赛:二手车价格预测(422方案分享)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 零基础入门数据挖掘——二手车交易价格预测:baseline

    比赛要求参赛选手根据给定的数据集,建立模型,二手汽车的交易价格。 赛题以预测二手车的交易价格为任务,数据集报名后可见并可下载,该数据来自某交易平台的二手车交易记录,总数据量超过40w,包含31列变量信息,其中15列为匿名变量。为了保证比赛的公平性,将会

    2024年02月03日
    浏览(35)
  • 【机器学习入门与实践】数据挖掘-二手车价格交易预测(含EDA探索、特征工程、特征优化、模型融合等)

    【机器学习入门与实践】数据挖掘-二手车价格交易预测(含EDA探索、特征工程、特征优化、模型融合等) note:项目链接以及码源见文末 了解赛题 赛题概况 数据概况 预测指标 分析赛题 数据读取pandas 分类指标评价计算示例 回归指标评价计算示例 EDA探索 载入各种数据科学以

    2023年04月13日
    浏览(32)
  • 大数据分析案例-基于XGBoost算法构建二手车价格评估模型

    🤵‍♂️ 个人主页:@艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏 📂加关注+ 喜欢大数据分析项目的小伙伴,希望可以多多支持该系列的其他文章 大数据分析案例合集

    2023年04月09日
    浏览(24)
  • 【Python实战】Python采集二手车数据——超详细讲解

    今天,我们将采集某二手车数据,通过这个案例,加深我们对xpath的理解。通过爬取数据后数据分析能够直观的看到二手车市场中某一品牌的相对数据,能够了解到现在的二手车市场情况,通过分析数据看到二手车的走势,车商就可以利用这些数据进行定价,让想买二手车却

    2024年02月01日
    浏览(23)
  • Spring Boot后端+Vue前端:打造高效二手车交易系统

    作者介绍: ✌️大厂全栈码农|毕设实战开发,专注于大学生项目实战开发、讲解和毕业答疑辅导。 🍅 获取源码联系方式请查看文末 🍅  推荐订阅精彩专栏 👇🏻 避免错过下次更新 Springboot项目精选实战案例 更多项目: CSDN主页YAML墨韵 学如逆水行舟,不进则退。学习如赶

    2024年04月28日
    浏览(52)
  • python笔记16_实例练习_二手车折旧分析p1

    python数据分析练习,具体数据不放出。 分析实践很简单。目的不是做完,而是讲清楚每一步的目的和连带的知识点(所以才叫学习笔记) 原始数据格式:csv文件 原始数据结构: 数据格式 字段名 int(无用信息) 无 String che300_brand_name float new_price String maker_type float lowest_pric

    2024年02月07日
    浏览(51)
  • python笔记17_实例演练_二手车折旧分析p2

    …… 书接上文 探查车龄为5年的车辆,折旧价值与车辆等级的关系。 这里用到了 DataFrame 的 groupby 函数 ,这个函数对于数据处理的重要程度无需赘言。 groupby 必须配合聚合函数 同时使用,否则只能得到一个 DataFrameGroupBy 类型的玩意儿。 这里是可以只传 groupby 参数,不写聚合

    2024年02月07日
    浏览(28)
  • 基于Python+Flask+Echart实现二手车数据分析展示

    作者主页:编程指南针 作者简介:Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容:Java项目、Python项目、前端项目、人工智能与大数据、简历模板、学习资料、面试题库

    2024年02月09日
    浏览(25)
  • Java实现二手车交易系统 JAVA+Vue+SpringBoot+MySQL

    基于JAVA+Vue+SpringBoot+MySQL的二手车交易系统,分为管理后台和用户网页,包含了二手车档案、预约订单模块、预订单模块、留言板模块和车辆资讯模块,还包含系统自带的用户管理、部门管理、角色管理、菜单管理、日志管理、数据字典管理、文件管理、图表展示等基础模块,

    2024年02月22日
    浏览(30)
  • 基于Java+SpringBoot+Vue前后端分离二手车交易系统设计和实现

    博主介绍 : ✌ 全网粉丝30W+,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精彩专栏 推荐订阅 👇🏻 不然下次找不到哟 2022-2024年

    2024年02月10日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包