基于线性回归的二手车售价预测模型
1. 简介
1.1 项目目标
本项目的核心目标是基于提供的 CarResale.csv 数据集,构建一个线性回归(Linear Regression)模型,以预测二手车的销售价格。项目将严格遵循数据科学的工作流程,包括环境配置、数据探索、预处理、模型训练及性能评估。
1.2 技术栈
- 编程语言: Python 3.x
- 核心库:
Pandas: 用于数据处理和I/O操作(如读取CSV文件)。NumPy: 用于进行科学计算和数值操作。Matplotlib&Seaborn: 用于数据可视化。Scikit-learn: 用于实现机器学习算法,包括数据划分、特征工程、模型训练和评估。
- 开发环境: Jupyter Notebook 或 Visual Studio Code (内置Jupyter支持)。
1.3 数据源
- 文件:
CarResale.csv - 描述: 该文件包含了二手车的多种属性,如制造年份、行驶里程、燃料类型、车主类型以及最终的销售价格。
selling_price是我们的目标预测变量。
1.4 方法论
本项目将遵循以下标准流程:
- 环境配置: 搭建支持项目运行的Python环境。
- 数据加载与探索性分析 (EDA): 导入数据集,审查其结构、统计摘要和数据类型。
- 数据清洗与预处理: 处理缺失值(如有)、重复数据及不一致性。
- 数据可视化: 通过图表深入理解数据特征及其与目标变量的关系。
- 特征工程与数据准备: 对数据进行转换,使其适用于机器学习模型。包括独热编码、训练集/测试集划分和特征缩放。
- 模型构建与评估: 训练线性回归模型,进行预测,并使用标准回归指标评估其性能。
2. 环境配置
为确保代码的可复现性,请严格遵循以下步骤配置开发环境。
2.1 Python 安装
Windows:
- 访问 Python官网 下载最新稳定版本。
- 启动安装程序,在初始界面必须勾选
Add Python to PATH选项。 - 选择
Install Now进行默认安装。
macOS:
推荐使用 Homebrew 包管理器进行安装。打开终端(Terminal)。
安装Homebrew (如果尚未安装):
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"使用Homebrew安装Python:
brew install python3
2.2 IDE 配置 (Visual Studio Code)
- 从 VS Code官网 下载并安装。
- 在VS Code中,打开**扩展(Extensions)**面板,搜索并安装以下插件:
Python(Publisher: Microsoft)Jupyter(Publisher: Microsoft)
2.3 依赖库安装
Windows: 打开命令提示符(CMD)或PowerShell,执行以下命令:
pip install pandas matplotlib seaborn scikit-learn jupytermacOS: 打开终端(Terminal),执行以下命令:
pip3 install pandas matplotlib seaborn scikit-learn jupyter
3. 项目文件结构
请在本地计算机上创建如下目录结构,并将相应文件置于其中。
/YourProjectFolder/
|-- CarResale.csv
|-- Car_Price_Prediction.ipynb
4. 项目实施流程
请在VS Code中打开 Car_Price_Prediction.ipynb 文件,并按顺序执行以下代码单元格。
4.1 数据加载与初始化
单元格 1: 导入库
- 目的: 加载本项目所需的所有Python库。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.feature_selection import RFE
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score
# 设置图表样式
sns.set(style="whitegrid")
plt.style.use('seaborn-v0_8-whitegrid')
单元格 2: 加载数据集
- 目的: 使用Pandas库将
CarResale.csv文件读入一个DataFrame对象中,为后续分析做准备。
# 读取CSV文件
df = pd.read_csv('CarResale.csv')
4.2 探索性数据分析 (EDA)
单元格 3: 预览数据
- 目的: 显示数据集的前5行,以快速了解数据结构、列名和数据样本。
df.head()
单元格 4: 描述性统计
- 目的: 生成数值型列的描述性统计数据,包括计数、均值、标准差、最小值、四分位数和最大值,以评估数据分布和量纲。
df.describe()
单元格 5: 数据集信息
- 目的: 输出DataFrame的摘要信息,包括列的数据类型、非空值的数量和内存使用情况。这是检查数据完整性和数据类型正确性的关键步骤。
df.info()
4.3 数据清洗
单元格 6: 检查并处理重复值
- 目的: 识别并移除数据集中的完全重复行,以避免模型训练偏差。
print(f"重复行数量: {df.duplicated().sum()}")
df = df.drop_duplicates()
print(f"删除重复行后,数据集大小: {df.shape}")
4.4 数据可视化
单元格 7: 目标变量分布
- 目的: 绘制目标变量
selling_price的直方图,以评估其分布形态(如正态性、偏度)。
plt.figure(figsize=(10, 6))
sns.histplot(df['selling_price'], bins=50, kde=True)
plt.title('二手车售价分布')
plt.xlabel('售价 (Selling Price)')
plt.ylabel('频数 (Frequency)')
plt.show()
单元格 8: 分类特征分布
- 目的: 使用计数图展示
fuel列中各类别的频数,以了解不同燃料类型汽车的构成比例。
plt.figure(figsize=(8, 5))
sns.countplot(x='fuel', data=df)
plt.title('不同燃料类型的汽车数量')
plt.xlabel('燃料类型 (Fuel Type)')
plt.ylabel('数量 (Count)')
plt.show()
单元格 9: 双变量关系散点图
- 目的: 通过散点图可视化关键数值特征 (
km_driven,brake_horsepower) 与目标变量selling_price之间的关系,以初步判断其线性相关性。
plt.figure(figsize=(14, 6))
plt.subplot(1, 2, 1)
sns.scatterplot(x='km_driven', y='selling_price', data=df, alpha=0.5)
plt.title('售价 vs. 行驶里程')
plt.xlabel('行驶里程 (km)')
plt.ylabel('售价')
plt.subplot(1, 2, 2)
sns.scatterplot(x='brake_horsepower', y='selling_price', data=df, alpha=0.5)
plt.title('售价 vs. 马力')
plt.xlabel('马力 (BHP)')
plt.ylabel('售价')
plt.tight_layout()
plt.show()
单元格 10: 相关性热力图
- 目的: 计算并可视化数值特征之间的皮尔逊相关系数矩阵。这有助于识别多重共线性以及与目标变量最相关的特征。
plt.figure(figsize=(12, 10))
correlation_matrix = df.corr(numeric_only=True)
sns.heatmap(correlation_matrix, annot=True, fmt=".2f", cmap='coolwarm')
plt.title('特征相关性热力图')
plt.show()
4.5 特征工程与数据准备
单元格 11: 特征与目标分离及独热编码
- 目的: 将数据集划分为特征矩阵
X和目标向量y。同时,将X中的分类文本数据通过独热编码转换为模型可处理的数值格式。
# 分离特征 (X) 和目标变量 (y)
X = df.drop('selling_price', axis=1)
y = df['selling_price']
# 识别分类变量
categorical_cols = X.select_dtypes(include=['object']).columns
# 对分类特征进行独热编码
X_encoded = pd.get_dummies(X, columns=categorical_cols, drop_first=True)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_encoded, y, test_size=0.2, random_state=42)
X_train.head()
单元格 12: 特征缩放
- 目的: 对特征数据进行标准化处理,使其均值为0,方差为1。此步骤对于线性回归等基于距离或梯度的算法至关重要。
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
单元格 13: 特征选择
- 目的: 使用递归特征消除(RFE)方法,从所有特征中筛选出对预测目标变量最重要的10个特征,以降低模型复杂度和潜在的过拟合风险。
model_for_rfe = LinearRegression()
selector = RFE(model_for_rfe, n_features_to_select=10)
selector = selector.fit(X_train_scaled, y_train)
selected_features_mask = selector.support_
selected_features = X_encoded.columns[selected_features_mask]
print(f"RFE选择出的10个最重要的特征是:\n{list(selected_features)}")
X_train_selected = selector.transform(X_train_scaled)
X_test_selected = selector.transform(X_test_scaled)
4.6 模型训练与评估
单元格 14: 模型训练与性能评估
- 目的: 初始化线性回归模型,使用处理后的训练数据对其进行训练,然后在测试集上进行预测,并计算评估指标(MAE, MSE, RMSE, R²)来量化模型性能。
lr_model = LinearRegression()
lr_model.fit(X_train_selected, y_train)
y_pred = lr_model.predict(X_test_selected)
mae = mean_absolute_error(y_test, y_pred)
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
r2 = r2_score(y_test, y_pred)
print(f"平均绝对误差 (MAE): {mae:.2f}")
print(f"均方误差 (MSE): {mse:.2f}")
print(f"R-squared (R²): {r2:.4f}")
print(f"均方根误差 (RMSE): {rmse:.2f}")
单元格 15: 结果可视化
- 目的: 绘制散点图对比模型的预测值与真实值。理想情况下,数据点应紧密围绕对角线分布,表明预测值与真实值高度一致。
plt.figure(figsize=(10, 6))
plt.scatter(y_test, y_pred, alpha=0.5)
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], '--r', linewidth=2)
plt.title('真实值 vs. 预测值')
plt.xlabel('真实售价')
plt.ylabel('预测售价')
plt.show()
5. 总结
至此,您已成功构建、训练并评估了一个用于预测二手车价格的线性回归模型。本文档涵盖了从环境设置到模型评估的完整流程,为进一步的模型优化(如尝试不同算法、调整超参数)奠定了坚实的基础。