基于Python数据挖掘的二手车价格预测系统

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

基于Python数据挖掘的二手车价格预测

目录

摘要

第一部分:使用说明和功能说明

1.系统概述
2.功能说明
3.使用说明

第二部分:核心代码及实现

1.系统架构

2. 探索性数据分析
2.1数据读取
2.2数值属性分析
2.3类别属性分析
2.4数据缺失值
2.5相关性分析

3.数据预处理
3.1处理目标值长尾分布
3.3处理特征严重倾斜数据
3.4处理异常值
3.5处理缺失值
3.6处理时间属性信息

4.模型训练与可视化
4.1特征选择
4.2构建模型

5.模型预测与评估
5.1结果分析
5.2结果对比

第三部分:系统设计与开发过程中的心得体会

参考文献

摘要

本程序基于某二手车交易平台的交易数据,旨在构建一个预测二手车价格的模型,帮助消费者和平台更准确地评估车辆价值。数据集包含超过40万条记录,涉及31个特征(包括15个匿名特征),从中抽取40万条作为训练集,5万条作为测试集。数据探索与预处理对数值型和类别型特征进行统计分析,发现部分特征(如power)存在异常值,并通过截断处理(如限制发动机功率≤600)。处理缺失值,例如将notRepairedDamage中的’-'替换为NaN,并用众数填充其他缺失特征。对目标变量price进行对数变换,缓解长尾分布的影响。从注册日期(regDate)和上线日期(creatDate)中提取时间差(used_time)作为新特征,推测其与价格呈负相关。删除无关特征(如SaleID),并基于name生成统计特征(name_count)。筛选高相关性特征(如匿名特征v_0、v_3、v_8、v_12)用于模型训练。模型构建与评估采用三种回归模型:决策树、随机森林和XGBoost,通过80%训练集和20%验证集进行训练与评估。使用平均绝对误差(MAE)和决定系数(R²)评估性能,其中XGBoost表现最佳,MAE最低。可视化关键特征(如v_12)与价格的关系,验证模型预测趋势与实际数据的吻合程度。通过数据清洗、特征工程和集成学习模型的应用,本程序实现了对二手车价格的合理预测。XGBoost因能有效捕捉非线性关系,在测试集上表现最优。未来可进一步优化特征组合或引入深度学习模型以提升精度。

关键词:二手车价格预测、数据挖掘、特征工程、XGBoost、随机森林

第一部分:使用说明和功能说明

1.系统概述

近年来,随着汽车行业的持续发展和突破,二手车市场的地位日益突出。随着人们生活水平的提高和消费观念的转变,越来越多的人开始选择购买二手车,这既满足了出行需求,又降低了经济压力。二手车市场的快速发展为数据挖掘在二手车价格预测中的应用提供了广阔的空间。

二手车价格的评估涉及多个因素,包括车辆的年份、品牌、型号、里程数、保养状况、有无事故记录等。这些因素之间相互关联,共同影响着二手车的价值。[1]传统的价格评估方法往往依赖于人工经验和市场比较,难以准确反映车辆的真实价值。因此,需要借助数据挖掘技术,对大量历史交易数据进行深入分析,挖掘出影响二手车价格的关键因素,从而建立更为准确的价格预测模型。[2]

本程序是基于机器学习的二手车价格预测系统,通过对40万条二手车交易记录进行分析,构建预测模型帮助用户评估二手车合理价格范围。系统包含完整的数据预处理、数据分析、特征工程、模型训练和预测流程。

数据挖掘技术是一种从大量数据中提取有用信息和模式的技术。在二手车价格预测中,数据挖掘技术可以应用于以下几个方面:

①数据预处理:对收集到的二手车数据进行清洗、整合和格式化,以确保数据的准确性和一致性。

②特征选择:从原始数据中选择与二手车价格相关的特征,如车辆年份、品牌、型号、里程数等,以构建预测模型。

③模型训练:利用机器学习算法,如回归模型、决策树、随机森林等,对处理后的数据进行训练,建立二手车价格预测模型。

④模型验证与优化:通过交叉验证、网格搜索等方法对模型进行验证和优化,以提高预测的准确性。

本程序是基于机器学习的二手车价格预测系统,通过对40万条二手车交易记录进行分析,构建预测模型帮助用户评估二手车合理价格范围。系统包含完整的数据预处理、数据分析、特征工程、模型训练和预测流程。

所采用数据集总数据量超过40万,包含31列变量信息,其中15列为匿名变量。从中抽取出15万条作为训练集,5万条作为测试集,同时已对name、model、brand和regionCode等敏感信息进行脱敏。具体数据集的展示内容如下:

FieldDescription
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个匿名特征

2.功能说明

2.1数据探索性分析:

  1. 数据特征分布可视化(功率、里程等)
  2. 类型特征频次统计
  3. 缺失值分析和可视化
  4. 特征相关热力图

2.2数据预处理

  1. 缺失值处理(自动识别并填充)
  2. 异常值修正(如功率>600的截断)
  3. 长尾分布转换(价格对数变换)
  4. 日期特征提取(注册年份、使用天数等)

2.3模型训练与预测

  1. 支持三种回归模型(决策树、随机森林、XGBoost)
  2. 模型性能评估(MAE指标)
  3. 模型融合预测(加权平均)
  4. 结果导出(CSV格式)

3.使用说明

3.1环境配置

\# 创建Python环境

conda create -n car_price python=3.8

conda activate car_price

\# 安装依赖库

pip install pandas numpy matplotlib seaborn scikit-learn xgboost joblib

3.2操作流程

  1. 准备数据:将原始数据文件放入项目目录中
  2. 运行主程序:main.py
  3. 查看结果:
  1. 预处理数据:process_data/
  1. 目录可视化图表:output/
  1. 目录预测结果:output/submmit_stack.csv

关键目录结构:

project/

├── data/ # 原始数据

├── process_data/ # 预处理数据

├── models/ # 训练模型

├── output/ # 结果输出

│ ├── picture1.png # 特征分布图

│ ├── submmit_stack.csv # 预测结果

└── main.py # 主程序

第二部分:核心代码及实现

1.系统架构

系统架构设计图系统

探索性数据分析

2.1数据读取

train = pd.read_csv('./data/used_car_train_20200313.csv', sep=' ')

test = pd.read_csv('./data/used_car_testB_20200421.csv', sep=' ')

\# 简略查看训练数据

print(train.head())

在这里插入图片描述

print(train.shape)

在这里插入图片描述

\# 简略查看测试数据

print(test.head())

在这里插入图片描述

print(test.shape)

在这里插入图片描述

2.2数值属性分析

\# 通过describe()来熟悉训练数据数值属性的相关统计量

train_numeric_features = \[

'power', 'kilometer', 'price', 'v_0', 'v_1', 'v_2', 'v_3', 'v_4', 'v_5', 'v_6',

'v_7', 'v_8', 'v_9', 'v_10', 'v_11', 'v_12', 'v_13', 'v_14'\]

train\[train_numeric_features\].describe()

在这里插入图片描述

\# 通过describe()来熟悉测试数据数值属性的相关统计量

test_numeric_features = \[

'power', 'kilometer', 'v_0', 'v_1', 'v_2', 'v_3', 'v_4', 'v_5', 'v_6',

'v_7', 'v_8', 'v_9', 'v_10', 'v_11', 'v_12', 'v_13', 'v_14'

\]

print(train\[train_numeric_features\].describe())

在这里插入图片描述

通过info()来熟悉训练数据类型

print(train.info()) 

在这里插入图片描述
在这里插入图片描述

 #可视化训练数据中的数值属性
f_train = pd.melt(train, value_vars=train_numeric_features)
g_train = sns.FacetGrid(f_train, col="variable", col_wrap=3, sharex=False, sharey=False)
g_train = g_train.map(sns.distplot, "value")
plt.show() 

对于呈现长尾型的数据需要进行特征的处理和转化,方便后续观察数据。
在这里插入图片描述
在这里插入图片描述
可视化测试数据中的数值属性

f_test = pd.melt(test, value_vars=test_numeric_features)g_test = sns.FacetGrid(f_test, col="variable", col_wrap=3, sharex=False, sharey=False)
g_test = g_test.map(sns.distplot, "value")
plt.show() 

在这里插入图片描述
在这里插入图片描述

2.3类别属性分析

# 分析训练数据类别特征nunique分布

category_features = [

'name', 'model', 'brand', 'bodyType', 'fuelType', 'gearbox',

'notRepairedDamage', 'regionCode', 'seller', 'offerType', 'regionCode'

]

for feature in category_features:

print(feature + "的特征分布如下:")

print("{}特征有个{}不同的值".format(feature, train[feature].nunique()))

print(train[feature].value_counts())

print(72 * '-')

# 对训练数据类别特征取值较少的,画出直方图

plt.figure(figsize=(15, 12))

i = 1

for feature in category_features:

if train[feature].nunique() < 50:

plt.subplot(4, 2, i)

i += 1

v = train[feature].value_counts()

fig = sns.barplot(x=v.index, y=v.values)

plt.title(feature)

plt.tight_layout()

plt.show()

从下图中可以看出bodyType特征有个8不同的值,fuelType特征有个7不同的值,gearbox特征有个2不同的值,notRepairedDamage特征有个3不同的值,regionCode特征有个7905不同的值。
在这里插入图片描述

2.4数据缺失值

# 'notRepairedDamage'属性中'-'应该也是空值,用nan替换

train['notRepairedDamage'].replace('-', np.nan, inplace=True)

test['notRepairedDamage'].replace('-', np.nan, inplace=True)

# 分析训练数据缺失值

train.isnull().sum()\[train.isnull().sum() > 0]

在这里插入图片描述

# 训练数据nan可视化

train_missing = train.isnull().sum()

train_missing = train_missing\[train_missing > 0\]

train_missing.sort_values(inplace=True)

train_missing.plot.bar()

plt.title("训练数据nan可视化")

plt.show()

在这里插入图片描述

# 分析测试数据缺失值

test.isnull().sum()[test.isnull().sum() > 0]

在这里插入图片描述

# 测试数据nan可视化

test_missing = test.isnull().sum()

test_missing = test_missing[test_missing > 0]

test_missing.sort_values(inplace=True)

test_missing.plot.bar()

plt.title("测试数据nan可视化")

plt.show()

在这里插入图片描述

2.5相关性分析

# 对'price'属性进行相关性分析

price_numeric = train[train_numeric_features]

correlation = price_numeric.corr()

print(correlation['price'].sort_values(ascending = False),'\n')

在这里插入图片描述

f, ax = plt.subplots(figsize=(8, 8))

plt.title('Correlation of Numeric Features with Price', y=1, size=16)

sns.heatmap(correlation, square=True, vmax=0.8, linewidths=0.1, cmap=sns.cm.rocket_r)

plt.show()

在这里插入图片描述
由热力相关图可以看出匿名特征v_0, v_3, v_8, v_12与’price’相关性很高。

3.数据预处理

3.1处理目标值长尾分布

# price 为长尾分布,对该特征进行处理

train['price'] = np.log1p(train['price'])

# 可视化处理后'price'分布

plt.figure(figsize=(10, 8))

sns.distplot(train\['price'\])

plt.show()

在这里插入图片描述

3.2处理无用值

# 合并训练数据和测试数据,方便后续数据预处理

df = pd.concat([train, test], axis=0, ignore_index=True)

print(df.head())

在这里插入图片描述

# SaleID为交易ID,肯定没用,但是我们可以用来统计别的特征的group数量

# name为汽车交易名称,已经脱敏一般没什么好挖掘的,不过同名的好像不少,可以挖掘一下

df['name_count'] = df.groupby(['name'])['SaleID'].transform('count')

df.drop(['name'], axis=1, inplace=True)

3.3处理特征严重倾斜数据

# 'seller'、'offerType'特征严重倾斜,训练数据中'seller'有一个特殊值,删除该样本

df.drop(df[df['seller'] == 1].index, inplace=True)

df.drop(['seller'], inplace=True, axis=1)

df.drop(['offerType'], inplace=True, axis=1)

3.4处理异常值

df['power'] = df['power'].map(lambda x: 600 if x > 600 else x)

# 可视化处理后'power'分布

plt.figure(figsize=(10, 8))

sns.distplot(df['power'])

plt.show()

在这里插入图片描述

3.5处理缺失值

\# 查看缺失值

df.isnull().sum()\[df.isnull().sum() > 0\]

在这里插入图片描述

# 用众数填充缺失值

df.fuelType.fillna(df.fuelType.mode()[0], inplace=True)

df.gearbox.fillna(df.gearbox.mode()[0], inplace=True)

df.bodyType.fillna(df.bodyType.mode()[0], inplace=True)

df.model.fillna(df.model.mode()[0], inplace=True)

df.notRepairedDamage.fillna(df.notRepairedDamage.mode()[0], inplace=True)

df.isnull().sum()[df.isnull().sum() > 0]

在这里插入图片描述

3.6处理时间属性信息

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['regDates'] = df['regDate'].apply(date_process)

df['creatDates'] = df['creatDate'].apply(date_process)

df['regDate_year'] = df['regDates'].dt.year

df['regDate_month'] = df['regDates'].dt.month

df['regDate_day'] = df['regDates'].dt.day

df['creatDate_year'] = df['creatDates'].dt.year

df['creatDate_month'] = df['creatDates'].dt.month

df['creatDate_day'] = df['creatDates'].dt.day

# 切割数据,导出数据

output_path = './process_data/'

print(df.shape)

train_num = df.shape[0] - 50000

df[:int(train_num)].to_csv(output_path + 'train_data_v1.csv', index=False, sep=' ')

df[train_num:train_num + 50000].to_csv(output_path + 'test_data_v1.csv', index=False, sep=' ')

4.模型训练与可视化

使用回归决策树模型

训练集中,根据creatDates和creatDates计算得到used_time。

作为特征的属性包括:

[“bodyType”,“brand”,“fuelType”,“gearbox”,“kilometer”,‘model’, ‘notRepairedDamage’, ‘power’, ‘regDate’,‘v_0’- ‘v_9’, ‘name_count’,‘used_time’]

训练集80%的数据用于训练,20%用于评价模型,使用MAE和决定系数R2评价模型

最后使用模型预测测试集,结果保存在output/submmit_stack.csv文件中。

import matplotlib

import numpy as np

import pandas as pd

from matplotlib import pyplot as plt

from sklearn import tree

from sklearn.model_selection import train_test_split

from sklearn.metrics import mean_absolute_error

from sklearn.preprocessing import StandardScaler

from xgboost.sklearn import XGBRegressor

from sklearn.ensemble import RandomForestRegressor

import joblib

train_path = "data/train_data_v1.csv"

train_data = pd.read_csv(train_path,sep=" ")

test_path = "data/test_data_v1.csv"

test_data = pd.read_csv(test_path,sep=" ")

data = train_data.copy(deep=True)

4.1特征选择

选择作为特征的属性如choosed_attris所列出,根据检验推测二手车的使用时间与其价格应该成反比,所以计算regdate和createdate的差得到车辆的使用时间,也作为其中一个特征。

data['used_time']=(pd.to_datetime(data['creatDates'],format='%Y-%m-%d',errors='coerce')-pd.to_datetime(data['regDates'],format='%Y-%m-%d',errors='coerce')).dt.days

choosed_attris = ["bodyType","brand","kilometer",

'model', 'notRepairedDamage', 'power',

'v_0', 'v_1', 'v_10', 'v_11', 'v_12', 'v_13', 'v_14',

'v_2', 'v_3', 'v_4', 'v_5', 'v_6', 'v_7', 'v_8', 'v_9',

'regDate_year',

'name_count','used_time']

train = data[choosed_attris]

label = data["price"]

print(train)

在这里插入图片描述

print(label)

在这里插入图片描述

将构建好的数据集划分为训练集<x_train, y_train>和验证集<x_train, y_train>两部分,并将划分前后的这些数据全部转储到文件中。

x_train, x_test, y_train, y_test = train_test_split(train, label, test_size=0.2)

joblib.dump(train, "dataset/train.csv")

joblib.dump(label, "dataset/label.csv")

joblib.dump(x_train, "dataset/x_train.csv")

joblib.dump(x_test, "dataset/x_test.csv")

joblib.dump(y_train, "dataset/y_train.csv")

joblib.dump(y_test, "dataset/y_test.csv")

4.2构建模型

使用决策树、随机森林、XGBoost进行模型预测。

随机森林属于Bagging类算法,在训练阶段,随机森林使用bootstrap采样从输入训练数据集中采集多个不同的子训练数据集来依次训练多个不同决策树;在预测阶段,随机森林将内部多个决策树的预测结果取平均得到最终的结果。[3]

XGBoost算法特征分裂来生长一棵树,每一轮学习一棵树,其实就是去拟合上一轮模型的预测值与实际值之间的残差。当我们训练完成得到k棵树时,我们要预测一个样本的分数,其实就是根据这个样本的特征,在每棵树中会落到对应的一个叶子节点,每个叶子节点就对应一个分数,最后只需将每棵树对应的分数加起来就是该样本的预测值。

#定义回归决策树

def train_decision_tree_regressor(x_train, y_train):

dr = tree.DecisionTreeRegressor()

dr.fit(x_train, y_train)

return dr

#定义随机森林回归器

def train_random_forest_regressor(x_train, y_train):

#rfr = RandomForestRegressor(n_estimators=80, max_depth=25 )

rfr = RandomForestRegressor(n_estimators=80,)

rfr.fit(x_train, y_train)

return rfr

#定义GBDT模型

def train_XGBRegressor(x_train, y_train):

gbm= XGBRegressor()

gbm.fit(x_train, y_train)

return gbm

加载保存的x_train, y_train,训练模型

def load_dataset():

paths = \["dataset/x_train.csv", "dataset/x_test.csv","dataset/y_train.csv", "dataset/y_test.csv"\]

x_train, x_test, y_train, y_test = \[joblib.load(x) for x in paths\]

return x_train, x_test, y_train, y_test

x_train, x_test, y_train, y_test = load_dataset()

执行本目录下的algo2.py文件,开始训练模型,并将模型保存在models目录下。

if sys.argv\[1\] == "xgbt":

drm = train_XGBRegressor(x_train, y_train)

pkl_name = "XGBRegressor"

if sys.argv\[1\] == "tree":

drm = train_decision_tree_regressor(x_train, y_train)

pkl_name = "train_decision_tree_regressor"

if sys.argv\[1\] == "forest":

drm = train_random_forest_regressor(x_train, y_train)

pkl_name = "train_forest_regressor"

else:

sys.exit(0)

t1 = time.time()

print("excute_time: %f"%round(t1 - t0, ndigits=4))

print("dumping model")

joblib.dump(drm, "models/"+pkl_name+".pkl")

5.模型预测与评估

5.1结果分析

载入训练后的模型,使用验证集<x_test,y_test>计算模型的MAE,MAE越小,说明模型预测得越准确。

import joblib

dtr = joblib.load("models/train_decision_tree_regressor.pkl")

rfr = joblib.load("models/train_forest_regressor.pkl")

xgbr = joblib.load("models/XGBRegressor.pkl")

回归决策树:

x_train, x_test, y_train, y_test = load_dataset()

predict_test = dtr.predict(x_test)

mae_result = \[\]

print(mean_absolute_error(predict_test, y_test))

print(mean_absolute_error(np.expm1(predict_test), np.expm1(y_test)))

mae_result.append(mean_absolute_error(np.expm1(predict_test), np.expm1(y_test)))

在这里插入图片描述

_\# 由于'v_12' ,'v_8', 'v_0'与price相关度较高所以进行可视化观察_

_for i in \['v_12' ,'v_8', 'v_0'\]:_

_plt.scatter(x_test\[i\], y_test, color='red')_

_plt.scatter(x_test\[i\], predict_test, color='blue')_

_plt.xlabel(i)_

_plt.ylabel('price')_

_plt.show()_

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
红点表示真实值,表示实际的二手车价格;蓝点表示预测值,表示模型预测的二手车价格。理想情况是红点和蓝点完全重合,实际情况是点越接近,预测越准确;点偏离越大,预测误差越大。

随机森林回归器:

predict_test = rfr.predict(x_test)

print(mean_absolute_error(predict_test, y_test))

print(mean_absolute_error(np.expm1(predict_test), np.expm1(y_test)))

mae_result.append(mean_absolute_error(np.expm1(predict_test), np.expm1(y_test)))

在这里插入图片描述

\# 由于'v_12' ,'v_8', 'v_0'与price相关度较高所以进行可视化观察

for i in \['v_12' ,'v_8', 'v_0'\]:

plt.scatter(x_test\[i\], y_test, color='red')

plt.scatter(x_test\[i\], predict_test, color='blue')

plt.xlabel(i)

plt.ylabel('price')

plt.show()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

xgboost模型:

predict_test = xgbr.predict(x_test)

print(mean_absolute_error(predict_test, y_test))

print(mean_absolute_error(np.expm1(predict_test), np.expm1(y_test)))

mae_result.append(mean_absolute_error(np.expm1(predict_test), np.expm1(y_test)))

在这里插入图片描述

\# 由于'v_12' ,'v_8', 'v_0'与price相关度较高所以进行可视化观察

for i in \['v_12' ,'v_8', 'v_0'\]:

plt.scatter(x_test\[i\], y_test, color='red')

plt.scatter(x_test\[i\], predict_test, color='blue')

plt.xlabel(i)

plt.ylabel('price')

plt.show()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.2结果对比

#plt.figure(figsize=(8,4),dpi=80)

fig, ax = plt.subplots(figsize=(8,4))

x = \["decision_tree_regressor","random_forest_regressor","XGBRegressor"\]

y = mae_result

for a, b in zip(x, y):

ax.text(a, b+1, b, ha='center', va='bottom')

plt.bar(x, mae_result,label="2")

在这里插入图片描述

可以看出,相比于决策树,随机森林回归器和xgboost模型的MAE都得到显示降低,模型的预测性能得到提高。最后,对随机森林回归树模型与xgbt回归模型进行简单的加权融合,计算MAE。

def Weighted_method(test_pre1,test_pre2,w=\[1/2,1/2\]):

Weighted_result = w\[0\]\*pd.Series(test_pre1)+w\[1\]\*pd.Series(test_pre2)

return Weighted_result

x_train, x_test, y_train, y_test = load_dataset()

m1 = rfr

m2 = xgbr

predict_1 = m1.predict(x_test)

predict_2 = m2.predict(x_test)

predict_test = Weighted_method(predict_1, predict_2)

print(mean_absolute_error(predict_test, y_test))

print(mean_absolute_error(np.expm1(predict_test), np.expm1(y_test)))

在这里插入图片描述

MAE有所减小。因此,最终的模型使用随机森林回归树模型与xgbt回归模型预测的均值作为二手车价格的预测值。

使用最终模型在测试集process_data/test_data_v1.csv进行预测。

test_path = "process_data/test_data_v1.csv"

test_data = pd.read_csv(test_path,sep=" ")

test_data\['used_time'\] = (pd.to_datetime(test_data\['creatDates'\], format='%Y-%m-%d', errors='coerce') -

pd.to_datetime(test_data\['regDates'\], format='%Y-%m-%d', errors='coerce')).dt.days

test_data_features = test_data\[\["bodyType","brand","kilometer",

'model', 'notRepairedDamage', 'power',

'v_0', 'v_1', 'v_10', 'v_11', 'v_12', 'v_13', 'v_14',

'v_2', 'v_3', 'v_4', 'v_5', 'v_6', 'v_7', 'v_8', 'v_9',

'regDate_year',

'name_count','used_time'\]\]

model = joblib.load("models/train_forest_regressor.pkl")

model2 = joblib.load("models/XGBRegressor.pkl")

#预测

p1 = model.predict(test_data_features)

p2 = model2.predict(test_data_features)

price = Weighted_method(p1, p2)

#生成用于提交的csv文件

output = pd.DataFrame()

output\['SaleID'\] = test_data.SaleID

output\['price'\] = np.expm1(price)

output.to_csv('output/submmit_stack.csv',index=False)

测试集预测结果的MAE为578.4769。

第三部分:系统设计与开发过程中的心得体会

本文探讨了基于Python数据挖掘的二手车价格预测方法,通过一系列系统性的实验和分析,得出了一系列有意义的结论。

在项目总体流程的指导下,我们首先对数据进行探索性分析,随后进行数据预处理,以确保数据的质量和一致性。针对回归决策树模型、随机森林回归器和XGBoost模型进行了实验和可视化对比。实验结果显示,相比于决策树模型,随机森林回归器和XGBoost模型的MAE(平均绝对误差)得到明显降低,表明这两种模型的预测性能显著提高。

为了进一步提升预测性能,我们尝试了随机森林回归器与XGBoost模型的加权融合。通过计算MAE,我们发现使用这两种模型预测的均值作为二手车价格的预测值时,MAE值达到最小,为0.12778741339762678。这一结果验证了模型融合在提升预测准确性方面的有效性。

随着大数据技术的不断发展和应用,数据挖掘在二手车价格预测中的作用日益凸显。通过挖掘和分析多维度数据,我们能够更准确地预测二手车价格,为消费者和商家提供更加精准的定价参考。[4]

因此,以下是对未来的展望。数据源的不断丰富:随着物联网、智能设备等技术的普及,二手车市场将拥有更多维度的数据,为数据挖掘提供更丰富的素材,进一步提升预测的准确性。算法的不断进步:机器学习、深度学习等算法的不断发展,将推动二手车价格预测技术的持续创新,提高预测的准确性和效率。智能化服务的提升:结合人工智能和大数据技术,我们可以开发出更加智能化的二手车交易平台和服务,为消费者提供更加便捷、高效的购车体验。

通过这次项目,我学会运用Python进行数据清洗、数据集成、数据归约和数据特征的分析。学会了对数据进行重复值、缺失值、异常值的处理。在课设的过程中,我尽量把有关数据挖掘模型都用到,使得我对于数据分析和数据挖掘的概念和应用有了更加深刻的理解。当然,我在这次项目中也感受到了Python学习的乐趣和探索的趣味,每当一个数据处理步骤完成后,我都会有一种成就感,让我越发想要深入学习。我知道我现在做的只是冰山一角,希望之后能有机会把基于数据挖掘的二手车价格预测做得更加深入。

参考文献

[1]江乐.二手车价格影响因素研究与预测[D].湖北大学,2024.

[2]廖亚茹.基于特征加权Stacking集成模型的二手车交易价格预测研究[D].华中师范大学,2024.

[3]郑爱萍,李彬彬,郭传好.基于线性回归和神经网络模型的二手车交易价格预测分析[J].智能计算机与应用,2023,13(09):103-110.

[4]杨致远.基于PCA-DNN和LightGBM的二手车价格预测[J].信息与电脑(理论版),2022,34(21):73-75.

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值