云天徽上 发表于 2024-12-25 17:14:38

【机器学习案列】基于随机森林和xgboost的二手车价格回归预测

本帖最后由 云天徽上 于 2024-12-26 13:17 编辑

🧑 博主简介:

曾任某智慧城市类企业算法总监,CSDN / 稀土掘金 等平台人工智能领域优质创作者。

目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。



### 一、项目分析
1.1 项目任务

kaggle二手车价格回归预测项目,目的**根据各种属性预测二手车的价格**。

1.2 评估准则
评估的标准是均方根误差:
!(data/attachment/forum/202412/25/171030pnozlxxnz282qnvn.png)

1.3 数据介绍
数据连接[https://www.kaggle.com/competitions/playground-series-s4e9/data?select=train.csv](https://www.kaggle.com/competitions/playground-series-s4e9/data?select=train.csv)

!(data/attachment/forum/202412/25/171050tyti66sstxcgt5zr.png)

其中:
- `id`:唯一标识符(或编号)
- `brand`:品牌
- `model`:型号
- `model_year`:车型年份
- `mileage`(注意这里可能是拼写错误,应该是mileage而不是milage):里程数
- `fuel_type`:燃油类型
- `engine`:发动机
- `transmission`:变速器
- `ext_col`:车身颜色(外部)
- `int_col`:内饰颜色(内部)
- `accident`:事故记录
- `clean_title`:清洁标题(通常指车辆是否有清晰的产权记录,无抵押、无重大事故等)
- `price`:价格


### 二、读取数据
2.1 导入相应的库

```python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import mean_squared_error
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split, GridSearchCV
import xgboost as xgb
```

2.2 读取数据

```python
file_path = '/kaggle/input/playground-series-s4e9/train.csv'
df = pd.read_csv(file_path)

df.head()
df.shape()
```

!(data/attachment/forum/202412/25/171112ev2hroa2zs2ca2u1.png)


!(data/attachment/forum/202412/25/171126qkm1faf91wax1f08.png)


### 三、Exploratory Data Analysis(EDA)
3.1   车型年份与价格的关系

```python
plt.figure(figsize=(10, 6))
sns.scatterplot(x='model_year', y='price', data=df)
plt.title('Model Year vs Price')
plt.xlabel('Model Year')
plt.ylabel('Price')
plt.show()
```

!(data/attachment/forum/202412/25/171140v9cg3g4a1gmmjls7.png)

3.2 滞留量与价格的关系

```python
plt.figure(figsize=(10, 6))
sns.scatterplot(x='milage', y='price', data=df)
plt.title('Milage vs Price')
plt.xlabel('Milage')
plt.ylabel('Price')
plt.show()
```

!(data/attachment/forum/202412/25/171204wgw0qp50wlqgq7qd.png)

3.3 热图检查数值特征之间的关系

```python
num_df = df.select_dtypes(include=['float64', 'int64'])
plt.figure(figsize=(12, 8))
corr_matrix = num_df.corr()
sns.heatmap(corr_matrix, annot=True, fmt=".2f", cmap="coolwarm", linewidths=0.5, annot_kws={"size": 10})
plt.title('Correlation Matrix', fontsize=16)
plt.xticks(rotation=45, ha='right')
plt.yticks(rotation=0)
plt.tight_layout()
plt.show()
```

!(data/attachment/forum/202412/25/171226avvo020zhh02ucf1.png)

3.4 按品牌统计图表
```python
plt.figure(figsize=(12, 6))
sns.countplot(data=df, x='brand', order=df['brand'].value_counts().index)
plt.title('Count of Cars by Brand', fontsize=16)
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
```

!(data/attachment/forum/202412/25/171247r3v996n99v88bm98.png)


3.5 箱线图

```python
plt.figure(figsize=(12, 6))
sns.boxplot(data=df, x='fuel_type', y='milage')
plt.title('Mileage by Fuel Type', fontsize=16)
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
```

!(data/attachment/forum/202412/25/171306bj1llham1m17a7am.png)


1.6 各品牌平均里程数
```python
plt.figure(figsize=(12, 6))
sns.barplot(data=df, x='brand', y='milage', estimator=np.mean, ci=None)
plt.title('Average Mileage by Brand', fontsize=16)
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
```


!(data/attachment/forum/202412/25/171327g66ijjj6yzhdh6h8.png)



### 四、 数据预测处理
4.1 检查每个特征是否具有不同的值

```python
for i in df.columns:
    if df.nunique()<2:
      print(f'{i} has only one unique value. ')
```
clean_title has only one unique value.

“Clean ”功能只有一个唯一值,所以我们可以将其删除。

```python
df.drop(['id','clean_title'],axis=1,inplace=True)
df.shape
```
(188533, 11)


4.2 缺失值处理

```python
df.isnull().sum().sum()
```

7535

```python
df.dropna(inplace=True)
df.isnull().sum().sum()
```
0

没有缺失的值,所以我们可以继续了。

4.3
使用一热编码将分类变量转换为数值格式
```python
df = pd.get_dummies(df, columns=['brand', 'model', 'fuel_type', 'transmission', 'ext_col', 'int_col', 'accident','engine' ], drop_first=True)
```

### 五、数据预测
5.1 数据样本和标签分离
```python
X = df.drop('price', axis=1)
y = df['price']
```

5.2 切分数据集

```python
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
```

5.3模型训练和评估
5.3.1Xgboost回归模型

```python
xgb_model = xgb.XGBRegressor(
    n_estimators=100,      
    max_depth=5,         
    learning_rate=0.1,   
    subsample=0.8,      
    random_state=42      
)

xgb_model.fit(X_train, y_train)

y_pred_xgb = xgb_model.predict(X_test)

rmse_xgb = np.sqrt(mean_squared_error(y_test, y_pred_xgb))
print(f'XGBoost Root Mean Squared Error: {rmse_xgb}')
```
XGBoost Root Mean Squared Error: 67003.09126576487

5.3.2 Random Forest回归模型

```python
rf_model = RandomForestRegressor(
    n_estimators=100,   
    max_depth=10,         
    min_samples_split=2,
    min_samples_leaf=1,   
    random_state=42      
)

rf_model.fit(X_train, y_train)

y_pred_rf = rf_model.predict(X_test)

rmse_rf = np.sqrt(mean_squared_error(y_test, y_pred_rf))
print(f'Random Forest Root Mean Squared Error: {rmse_rf}')
```

Random Forest Root Mean Squared Error: 68418.85393408517

**参考文献:**
1[https://www.kaggle.com/code/muhammaadmuzammil008/eda-random-forest-xgboost](https://www.kaggle.com/code/muhammaadmuzammil008/eda-random-forest-xgboost)

如果您在人工智能领域遇到技术难题,或是需要专业支持,无论是技术咨询、项目开发还是个性化解决方案,我都可以为您提供专业服务,如有需要可站内私信或添加下方VX名片(ID:xf982831907)

期待与您一起交流,共同探索AI的更多可能!
!(data/attachment/forum/202412/26/131731t00zi5tertrkr6oi.jpg)
页: [1]
查看完整版本: 【机器学习案列】基于随机森林和xgboost的二手车价格回归预测