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

2023-11-08 11:50

本文主要是介绍天池长期赛:二手车价格预测(422方案分享),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

一、赛题介绍及评测标准

二、数据探索(EDA)

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

2.特征描述性统计

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

4.特征相关性

三、数据清洗

四、特征工程

1.构建时间特征

2.匿名特征交叉

3.平均数编码

五、建模调参

六、模型融合

总结


前言

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


一、赛题介绍及评测标准

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

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

二、数据探索(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()

2.特征描述性统计

df.describe().T

目标变量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()

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

4.特征相关性

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

与目标变量相关性比较高的特征有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 = 1date = 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_foldsy_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_foldsy_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


总结

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

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

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

4. stack模型的融合应该是要优于加权融合的,可以尝试3个以上的不同类型的模型融合,或许效果会更好。

这篇关于天池长期赛:二手车价格预测(422方案分享)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/369668

相关文章

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

高效+灵活,万博智云全球发布AWS无代理跨云容灾方案!

摘要 近日,万博智云推出了基于AWS的无代理跨云容灾解决方案,并与拉丁美洲,中东,亚洲的合作伙伴面向全球开展了联合发布。这一方案以AWS应用环境为基础,将HyperBDR平台的高效、灵活和成本效益优势与无代理功能相结合,为全球企业带来实现了更便捷、经济的数据保护。 一、全球联合发布 9月2日,万博智云CEO Michael Wong在线上平台发布AWS无代理跨云容灾解决方案的阐述视频,介绍了

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端,一般来说需要版本检测和自动更新功能,这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤: 读取本地应用版本拉取远程版本并比较两个版本如果需要升级,那么拉取更新历史弹出升级控制窗口用户选择升级时,拉取升级包解压,重启应用用户选择忽略时,本地版本标志为忽略版本用户选择取消时,隐藏升级控制窗口 2.

如何选择SDR无线图传方案

在开源软件定义无线电(SDR)领域,有几个项目提供了无线图传的解决方案。以下是一些开源SDR无线图传方案: 1. **OpenHD**:这是一个远程高清数字图像传输的开源解决方案,它使用SDR技术来实现高清视频的无线传输。OpenHD项目提供了一个完整的工具链,包括发射器和接收器的硬件设计以及相应的软件。 2. **USRP(Universal Software Radio Periphera

java常用面试题-基础知识分享

什么是Java? Java是一种高级编程语言,旨在提供跨平台的解决方案。它是一种面向对象的语言,具有简单、结构化、可移植、可靠、安全等特点。 Java的主要特点是什么? Java的主要特点包括: 简单性:Java的语法相对简单,易于学习和使用。面向对象:Java是一种完全面向对象的语言,支持封装、继承和多态。跨平台性:Java的程序可以在不同的操作系统上运行,称为"Write once,

MyBatis 切换不同的类型数据库方案

下属案例例当前结合SpringBoot 配置进行讲解。 背景: 实现一个工程里面在部署阶段支持切换不同类型数据库支持。 方案一 数据源配置 关键代码(是什么数据库,该怎么配就怎么配) spring:datasource:name: test# 使用druid数据源type: com.alibaba.druid.pool.DruidDataSource# @需要修改 数据库连接及驱动u

一种改进的red5集群方案的应用、基于Red5服务器集群负载均衡调度算法研究

转自: 一种改进的red5集群方案的应用: http://wenku.baidu.com/link?url=jYQ1wNwHVBqJ-5XCYq0PRligp6Y5q6BYXyISUsF56My8DP8dc9CZ4pZvpPz1abxJn8fojMrL0IyfmMHStpvkotqC1RWlRMGnzVL1X4IPOa_  基于Red5服务器集群负载均衡调度算法研究 http://ww