使用线性回归、LGBM对二手车价格进行预测

article/2025/9/24 10:18:58

使用线性回归、LGBM对二手车价格进行预测

目录

  • 使用线性回归、LGBM对二手车价格进行预测
    • 说明
  • 数据导入、查看和清洗
    • 数据说明
    • 导入训练集
    • 导入测试集
    • 合并数据
    • 查看数据整体情况
    • 处理数据
      • 检查并处理缺失变量
  • EDA
    • 年份和价格
    • 地区和价格
    • 前任里程和价格
    • 燃料类型和价格
    • 传动装置类型
    • Mileage与价格
    • 发动机排量与价格
  • 特征编码
  • 数据切分
  • 模型建立
    • 线性回归
    • LGBM
  • 数据和代码
  • 专栏和往期项目

说明

本项目包含
1.数据处理
2.数据可视化
3.构建模型预测二手车价格

完整代码及数据见文末,可在线运行,也可下载

数据导入、查看和清洗

数据说明

column 列名
index 序号
Name 汽车的品牌和型号。
Location 该车正在销售或可购买的地点。
Year 车型的年份或版本。
Kilometers_Driven 前任车主驾驶该车的总公里数,单位为KM。
Fuel_Type 汽车使用的燃料类型(汽油/柴油/电动/CNG/LPG)。
Transmission 汽车使用的传动装置的类型。
Owner_Type 车主是否为第一手、第二手或其他。
Mileage 汽车公司提供的标准里程,单位是kmpl或km/kg。
Engine 发动机的排量,单位是cc。
Power 发动机的最大功率,单位是bhp。
Seats 汽车中的座位数。
New_Price 同一型号的新车的价格。
Price 二手车的价格,单位是印度卢比。( train.csv)

导入训练集

import pandas as pd
df_train = pd.read_csv('/home/mw/input/data6802/train-data.csv') 
df_train.drop('Unnamed: 0',axis=1,inplace=True)
df_train.head()

在这里插入图片描述

导入测试集

df_test = pd.read_csv('/home/mw/input/data6802/test-data.csv') 
df_test.drop('Unnamed: 0',axis=1,inplace=True)
df_test.head()

在这里插入图片描述

合并数据

先合并数据,方便清洗

df = df_train.append(df_test)
df.head()

查看数据整体情况

查看数据缺失请况,可以看出,新车价格大面积缺失,缺失了86%,其余特征缺失率都较低

df.info()

<class ‘pandas.core.frame.DataFrame’>
Int64Index: 7253 entries, 0 to 1233
Data columns (total 13 columns):
Engine 7207 non-null object
Fuel_Type 7253 non-null object
Kilometers_Driven 7253 non-null int64
Location 7253 non-null object
Mileage 7251 non-null object
Name 7253 non-null object
New_Price 1006 non-null object
Owner_Type 7253 non-null object
Power 7207 non-null object
Price 6019 non-null float64
Seats 7200 non-null float64
Transmission 7253 non-null object
Year 7253 non-null int64
dtypes: float64(2), int64(2), object(9)
memory usage: 793.3+ KB

all_data_na = (df.isnull().sum()/len(df))*100
all_data_na = all_data_na.drop(all_data_na[all_data_na == 0].index).sort_values(ascending=False)
missing_data = pd.DataFrame({'缺失率' : all_data_na})
missing_data
缺失率

New_Price 86.129877
Price 17.013650
Seats 0.730732
Power 0.634220
Engine 0.634220
Mileage 0.027575

发现有一个重复数据,我们后面需要剔除掉

df.duplicated().sum()

处理数据

#去除重复值
df.drop_duplicates(inplace=True)
#删去缺失价格列和Name列
df.drop("New_Price", axis=1, inplace=True)
df.drop("Name", axis=1, inplace=True)
df.head()

检查并处理缺失变量

Seats、Power、Engine、Mileage
含义为:
Mileage 汽车公司提供的标准里程,单位是kmpl或km/kg。
Engine 发动机的排量,单位是cc。
Power 发动机的最大功率,单位是bhp。
Seats 汽车中的座位数。
不着急做填充,先挨个检查变量,然后进行处理
首先是车座

df['Seats'].value_counts()

5.0 6046
7.0 796
8.0 170
4.0 119
6.0 38
2.0 18
10.0 8
9.0 3
0.0 1
Name: Seats, dtype: int64

车座不可能为0,我们将其删除

df.drop(df[df['Seats']==0].index,axis=0,inplace=True)
df['Seats'].value_counts()

5.0 6046
7.0 796
8.0 170
4.0 119
6.0 38
2.0 18
10.0 8
9.0 3
Name: Seats, dtype: int64

剩余的缺失值我们用中位数填充

df['Seats'] = df['Seats'].fillna(df['Seats'].median())
df['Seats'].isnull().sum()

0

然后看看power,也就是发动机的最大功率
先把power的单位去除,再用中位数进行填补

df['Power'] = df['Power'].str.split(" ",expand=True)[0]
df['Power'] = pd.to_numeric(df['Power'],errors='coerce')
df['Power'].isnull().sum()

174

df['Power'] = df['Power'].fillna(df['Power'].median())
df['Power'].isnull().sum()

0
再来是Engine,发动机的排量,处理方式同上

df['Engine'] = df['Engine'].str.split(" ",expand=True)[0]
df['Engine'] = pd.to_numeric(df['Engine'],errors='coerce')
df['Engine'].isnull().sum()

46

df['Engine'] = df['Engine'].fillna(df['Engine'].median())
df['Engine'].isnull().sum()

0
Mileage 汽车公司提供的标准里程,单位是kmpl或km/kg。

df['Mileage'] = df['Mileage'].str.split(" ",expand=True)[0]
df['Mileage'] = pd.to_numeric(df['Mileage'],errors='coerce')
df['Mileage'].isnull().sum()

2

df['Mileage'] = df['Mileage'].fillna(df['Mileage'].median())
df['Mileage'].isnull().sum()

0

EDA

import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

年份和价格

sns.catplot('Year', 'Price',height=6, aspect=2, data=df)
plt.xticks(rotation=60)

地区和价格

sns.catplot('Location', 'Price', kind="boxen",height=6, aspect=2, data=df)
plt.xticks(rotation=60)

在这里插入图片描述

前任里程和价格

Kilometers_Driven 前任车主驾驶该车的总公里数
我们发现有个异常点,行驶超过了600万公里,我们以100W公里为分界线,将超出部分剔除再看看

df = df[df['Kilometers_Driven'] > 0]
df = df[df['Kilometers_Driven'] < 1000000]
plt.figure(figsize=(9,6))
sns.scatterplot('Kilometers_Driven', 'Price', data=df)

在这里插入图片描述

燃料类型和价格

Fuel_Type 汽车使用的燃料类型(汽油/柴油/电动/CNG/LPG)。

df['Fuel_Type'].value_counts()

Diesel 3851
Petrol 3323
CNG 62
LPG 12
Electric 2
Name: Fuel_Type, dtype: int64
在这里插入图片描述

传动装置类型

Transmission 汽车使用的传动装置的类型。

df['Transmission'].value_counts()

Manual 5203
Automatic 2047
Name: Transmission, dtype: int64

在这里插入图片描述
几手车主
Owner_Type 车主是否为第一手、第二手或其他。

df['Owner_Type'].value_counts()

First 5949
Second 1152
Third 137
Fourth & Above 12
Name: Owner_Type, dtype: int64

在这里插入图片描述

Mileage与价格

Mileage 汽车公司提供的标准里程,单位是kmpl或km/kg。
在这里插入图片描述

发动机排量与价格

Engine 发动机的排量,单位是cc。

特征编码

from sklearn.preprocessing import LabelEncoder,OneHotEncoder
for feat in ['Fuel_Type', 'Location','Owner_Type', 'Transmission', 'Year']:lbl = LabelEncoder()lbl.fit(df[feat])df[feat] = lbl.transform(df[feat])
df.head()

在这里插入图片描述

数据切分

df_train = df[~df['Price'].isnull()]
df_train = df_train.reset_index(drop=True)
df_test = df[df['Price'].isnull()]
df_train.head()

在这里插入图片描述

no_features = ['Price']
# 输入特征列
features = [col for col in df_train.columns if col not in no_features]X = df_train[features] # 训练集输入
y = df_train['Price']# 训练集标签
X_test = df_test[features] # 测试集输入
from sklearn.model_selection import train_test_split
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.20, random_state=2022)

模型建立

线性回归

from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(X_train, y_train)
y_pred= lr.predict(X_val)
print("Score on Traing set: ",lr.score(X_train,y_train))
print("Score on valid set: ",lr.score(X_val,y_val))

Score on Traing set: 0.702077663498507
Score on valid set: 0.6982662108270392

from sklearn import metrics
from sklearn.metrics import mean_squared_error, mean_absolute_error
import numpy as np
print("\t\tError Table")
print('Mean Absolute Error      : ', metrics.mean_absolute_error(y_pred,y_val))
print('Mean Squared  Error      : ', metrics.mean_squared_error(y_pred,y_val))
print('Root Mean Squared  Error : ', np.sqrt(metrics.mean_squared_error(y_pred,y_val)))
print('R Squared Error          : ', metrics.r2_score(y_pred,y_val))
	Error Table

Mean Absolute Error : 3.8191025211006466
Mean Squared Error : 35.51327770962762
Root Mean Squared Error : 5.959301780378942
R Squared Error : 0.6092807923897521

LGBM

params = {'learning_rate':0.1,'n_estimators':1000,'max_depth': 15,'metric': 'mse','verbose': -1,'seed': 2022,'n_jobs': -1,
}
import lightgbm as lgb
model = lgb.LGBMRegressor(**params)
model.fit(X_train, y_train,eval_set=[(X_train, y_train), (X_val, y_val)],eval_metric='rmse',verbose=50, early_stopping_rounds=100)
y_pred = model.predict(X_val, num_iteration=model.best_iteration_)

Training until validation scores don’t improve for 100 rounds.
[50] training’s rmse: 2.74657 training’s l2: 7.54363 valid_1’s rmse:
3.51272 valid_1’s l2: 12.3392 [100] training’s rmse: 2.20497 training’s l2: 4.86191 valid_1’s rmse: 3.22494 valid_1’s l2: 10.4002 [150] training’s rmse: 1.91286 training’s l2: 3.65904 valid_1’s rmse: 3.14442 valid_1’s l2: 9.8874 [200] training’s rmse: 1.7006 training’s l2: 2.89204 valid_1’s rmse: 3.10488 valid_1’s
l2: 9.64028 [250] training’s rmse: 1.5359 training’s l2:
2.35898 valid_1’s rmse: 3.09994 valid_1’s l2: 9.6096 [300] training’s rmse: 1.40321 training’s l2: 1.969 valid_1’s rmse: 3.13444 valid_1’s
l2: 9.82473 [350] training’s rmse: 1.2895 training’s l2:
1.66282 valid_1’s rmse: 3.15344 valid_1’s l2: 9.9442 Early stopping, best iteration is: [253] training’s rmse: 1.52763 training’s l2:
2.33365 valid_1’s rmse: 3.09248 valid_1’s l2: 9.5634

print("Score on Traing set: ",model.score(X_train,y_train))
print("Score on valid set: ",model.score(X_val,y_val))

Score on Traing set: 0.9815388772454189
Score on valid set: 0.9187458418102552

print("\t\tError Table")
print('Mean Absolute Error      : ', metrics.mean_absolute_error(y_pred,y_val))
print('Mean Squared  Error      : ', metrics.mean_squared_error(y_pred,y_val))
print('Root Mean Squared  Error : ', np.sqrt(metrics.mean_squared_error(y_pred,y_val)))
print('R Squared Error          : ', metrics.r2_score(y_pred,y_val))

Error Table
Mean Absolute Error : 1.4166114668742893
Mean Squared Error : 9.563401874094804
Root Mean Squared Error : 3.092475040173292
R Squared Error : 0.9122361874546977

数据和代码

点击跳转代码,可在线运行
右上角Fork后可以获取全部代码
如果觉得还不错,可以点赞fork~

专栏和往期项目

👉往期文章可以关注我的专栏
下巴同学的数据加油小站
会不定期分享数据挖掘、机器学习、风控模型、深度学习、NLP等方向的学习项目,关注不一定能学到你想学的东西,但是可以学到我想学和正在学的东西😀


http://chatgpt.dhexx.cn/article/r36KgRij.shtml

相关文章

MFC VS2010 Open CASCADE新建自己的工程

最近磕磕绊绊的去尝试用open cascade建立自己需要的工程文件&#xff0c;终于成功了&#xff0c;一直从网上获取方法&#xff0c;今天自己写一点心得&#xff0c;分享给大家。 一、准备&#xff1a; 1、安装 open cascade &#xff0c; 我安装后目录是&#xff1a; C:\OpenCAS…

[C++] OpenCasCade空间几何库的模型展现

OpenCasCade是什么 Open CASCADE&#xff08;简称OCC&#xff09;平台是由法国Matra Datavision公司开发的CAD/CAE/CAM软件平台&#xff0c;可以说是世界上最重要的几何造型基础软件平台之一。开源OCC对象库是一个面向对象C类库&#xff0c;用于快速开发设计领域的专业应用程序…

MFC中使用OpenCasCade示例

目录&#xff1a; 一、OpenCasCade开发环境搭建 二、创建一个MFC应用程序 三、在MFC工程中添加代码 四、画个瓶子 一、OpenCasCade开发环境搭建 参见《OpenCasCade开发环境搭建》&#xff0c;这篇文章最后运行示例前所做的工作为以后开发OpenCasCade工程铺平了路&#xff…

HTML<HBuilder X>

一&#xff1a;网页基本标签元素 HTML常用标签(HTML不是一种编程语言&#xff0c;而是一种标记语言&#xff09;&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>文档标题</title> </head><…

Opencascade 开发 1章

序 这一系列的文章旨在介绍一个方便大家开始开发自己CAD的方法。需要指出的是&#xff0c;本人主要希望通过分享一些相关技术&#xff0c;提升国人软件自主的意识和途径。通过本文构建自己的CAD只是软件自主化的非常非常小的一步&#xff0c;希望大家在不停尝试的过程中有所提…

【OCC学习5】记录最新版本emcc编译occ的bug:opencascade-7.6.0/src/Standard/Standard_Time.hxx:29:25: error: redefinit

1. 在研究OCC与Webassembly结合使用&#xff0c;编译的时候遇到以下问题&#xff1a; C:/workspace/occ_wasm/opencascade-7.6.0/src/Standard/Standard_Integer.hxx:126:25: note: previous definition is here inline Standard_Boolean IsEqual (const Standard_Integer the…

NX二次开发CreateDialog函数在UI.hxx文件和WinUser.h中的冲突

NX二次开发CreateDialog函数在UI.hxx文件和WinUser.h中的冲突 在UG二次开发中&#xff0c;若使用MFC库&#xff0c;一旦加上#include<Afx.h>头文件&#xff0c;或者使用<windows.h>头文件下面这句话就报错 theDialog GetPoints::theUI->CreateDialog(theDlxF…

HLO--XLA

HLO: high level optimizer 高级优化器 XLA&#xff1a; XLA(Accelerated Linear Algebra)-加速线性代数&#xff0c;Google推出的高性能机器学习领域编译器&#xff08;编译型推理引擎&#xff09;&#xff0c;它可以在不更改源代码的条件下加速Tensorflow模型 提高TensorFlo…

C++:C++编译过程:看完还不懂C++编译过程来捶我

1&#xff1a;先看图 2&#xff1a;一个C源文件从文本到可执行文件经历的过程&#xff1a; gcc Hello.cpp 预处理阶段&#xff1a;gcc -E hello.c -o hello.i 对源代码文件中包含关系&#xff08;头文件&#xff09;&#xff0c;预编译语句&#xff08;宏定义&#xff09…

h计算机软件指什么,HXX 文件扩展名: 它是什么以及如何打开它?

解决难以打开 HXX 文件的问题 打开 HXX 文件过程中所遇到的常见问题 MacroMates TextMate 消失 尝试打开 HXX 时&#xff0c;你会遇到一条错误消息&#xff0c;例如 “%%os%% 无法打开 HXX 文件”。 如果是这种情况&#xff0c;通常是因为 你的计算机上没有安装 MacroMates Tex…

神器octotree

在Github上查看源代码的体验十分糟糕&#xff0c;尤其是从一个目录跳转到另一个目录的时候&#xff0c;非常麻烦。 直到遇到这款神器&#xff0c;相见恨晚&#xff01;&#xff01; 具体安装及使用步骤参考&#xff1a; https://www.cnblogs.com/12yang-ting/p/7485264.html …

有用的Chrome扩展介绍 - Octotree - GitHub code tree

明细&#xff1a; 安装之后&#xff0c;Github网站左边会自动出现类似Visual Studio Code的代码显示方式&#xff0c;可以通过树形结构方便地浏览代码&#xff0c;无需重复点击文件夹进入。 树形结构里的图标可以使用各种不同的风格显示&#xff1a; 快捷键&#xff1a;上箭头…

Octotree在GitHub中出错(已解决)

谷歌插件真的是很方便&#xff0c;像Octotree让我们github中的项目浏览起来更加条理&#xff0c;如图 但是当我在github中频繁的切换文件夹的时候&#xff0c;Outotree开始报错&#xff0c;也不显示目录结构&#xff0c;将错误代码放到谷歌翻译如下。 我理解的意思是github需…

Octotree在GitHub中出错

使用octotree 出现Error: Connection error octotree解决办法 解决方法&#xff1a;需要在github设置访问token 登录github&#xff0c;打开https://github.com/settings/profile 依次点击 Settings -> Developer settings -> Personal access tokens -> Generate n…

google扩展工具Octotree使用(2020-09-01)

不知道近期是不是改版了&#xff0c;反正我的需要github Acess Token权限设置。&#xff08;最近csdn出问题了&#xff0c;图片不能居中&#xff0c;勉强看&#xff09; 1.从google商店添加软件 2.打开github刷新并配置 &#xff08;1&#xff09;点钥匙的地方 &#xff08;2…

Octotree访问私有仓库:Error: Private repository

问题 在GitHub私有仓库中使用Octotree时出现下面情况&#xff1a; 这个是因为我们需要在GitHub中给Octotree设置一个访问令牌 解决 在GitHub中&#xff1a;Settings -> Developer settings -> Personal access tokens -> Generate new token 创建令牌 设置名称Oc…

基于 Octotree 的[码云]文件树插件

之前一直在用github上面的Octotree&#xff0c;现在在用gitee&#xff08;主要是github的访问速度太慢了&#xff09;。   现在主要转到了gitee上面了&#xff0c;那么有没有基于 Octotree 的[码云]文件树插件呢&#xff0c;当然是有的&#xff0c;下面就进行安装。 1.基于 O…

Octotree 神器 tips

1. 注册一个Gitlab的帐号&#xff0c;并登录进去 2.打开页面会看到这样一个图片 3.安装完插件&#xff0c;点击上面红色方框的内容&#xff0c;即可&#xff0c;效果图如下

Octotree Chrome插件离线安装 树形展示插件

Octotree 是国外程序员Buu Nguyen 做的一个 Chrome 插件。安装之后&#xff0c;可以以左侧的树形结构浏览代码&#xff0c;非常nice 牛啤 1、GitHub 树形展示插件 下载地址附上&#xff1a;https://www.crx4chrome.com/crx/271883/ 2、Gitee 树形展示插件 https://gitee.co…