【python】随机森林预测汽车销售

目录

引言

1. 数据收集与预处理

2. 划分数据集

3. 构建随机森林模型

4. 模型训练

5. 模型评估

6. 模型调优

数据集

代码及结果

独热编码

随机森林模型训练

特征重要性图

混淆矩阵

ROC曲线


引言

随机森林(Random Forest)是一种集成学习方法,它通过构建多个决策树并将它们的预测结果进行综合来改进模型的预测准确性和鲁棒性。在预测汽车销售方面,随机森林可以有效地处理包含多种特征(如车辆品牌、型号、年份、里程数、配置、价格等)的数据集,并预测销售数量、价格或顾客购买意向等。

以下是使用随机森林模型预测汽车销售的基本步骤:

1. 数据收集与预处理

  • 收集数据:首先,需要收集汽车销售的相关数据。这些数据可能包括车辆的技术规格、历史销售价格、市场需求数据、客户反馈等。
  • 数据清洗:去除重复项、缺失值处理(可以通过插值、删除或使用预测模型填补缺失值)、异常值处理等。
  • 特征选择:选择对汽车销售有显著影响的特征,比如车型、品牌、年份、配置、价格等。
  • 特征工程:对特征进行编码(如将分类变量转换为数值型),可能还需要进行特征缩放(如归一化或标准化)。

2. 划分数据集

  • 将数据集划分为训练集和测试集(通常按70%-30%或80%-20%的比例划分)。训练集用于训练模型,测试集用于评估模型的性能。

3. 构建随机森林模型

  • 使用训练集构建随机森林模型。随机森林模型的关键参数包括决策树的数量(n_estimators)、每个决策树分裂时考虑的特征数(max_features)、树的深度(如果设置了)等。
  • 通过交叉验证(如网格搜索)来优化这些参数,以找到最佳的模型配置。

4. 模型训练

  • 使用训练集数据训练随机森林模型。

5. 模型评估

  • 使用测试集评估模型的性能。评估指标可能包括准确率、召回率、F1分数、均方误差(MSE)等,具体取决于预测目标(如销售数量、价格或购买意向)。

6. 模型调优

  • 根据评估结果调整模型参数或进行特征工程,以进一步提高模型性能。

数据集

数据集如下图所示:

代码及结果

import pandas as pd  
from sklearn.model_selection import train_test_split  
from sklearn.linear_model import LinearRegression  
from sklearn.metrics import mean_squared_error  
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score 
 
# 加载数据集  
data = pd.read_csv('D:/项目/汽车销售/汽车销售财务业绩.csv',encoding='GBK') 
# 查看数据集的维度
print(data.shape)
# 查看数据集的前几行
print(data.head())

独热编码

独热编码(One-Hot Encoding)是一种常用的将类别型数据(Categorical Data)转换为数值型数据(Numerical Data)的方法,特别适用于机器学习算法中。在独热编码中,每个类别值都会被转换成一个新的二进制列(也称为哑变量),这些列中只有一个为1(表示该样本属于该类别),其余为0。这种方法能够确保模型能够正确处理类别型数据,并且每个类别都被视为完全独立的特征。

#文本分析,使用独热编码将文本型数据转换为数值型数据
  
# 对'销售类型'进行独热编码  
sales_type_onehot = pd.get_dummies(data['销售类型'], prefix='销售类型')  
  
# 对'销售模式'进行独热编码  
sales_mode_onehot = pd.get_dummies(data['销售模式'], prefix='销售模式')  
  
# 将独热编码的DataFrame与原始DataFrame(除去'销售类型'、'销售模式'和'输出'列)合并   
data_without_categorical = data.drop(['销售类型', '销售模式', '输出'], axis=1)  
data_encoded = pd.concat([data_without_categorical, sales_type_onehot, sales_mode_onehot], axis=1)  
  
# 将最后一列作为目标变量(y)  
y = data['输出'].map({'正常': 0, '异常': 1})  
  
# 其余作为特征(X)  
X = data_encoded  

随机森林模型训练

 # 机器学习选择随机森林算法
# 划分训练集和测试集  
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)    
  
# 创建随机森林分类器  
from sklearn.ensemble import RandomForestClassifier  
clf = RandomForestClassifier(n_estimators=100, random_state=42)    
  
# 训练模型  
clf.fit(X_train, y_train)    
  
# 预测测试集  
y_pred = clf.predict(X_test)    
  
# 评估模型  
from sklearn.metrics import accuracy_score  
accuracy = accuracy_score(y_test, y_pred)    
print(f'Model accuracy: {accuracy}')

特征重要性图

import matplotlib.pyplot as plt  
import numpy as np
  
# 获取特征重要性  
importances = clf.feature_importances_  
std = np.std([tree.feature_importances_ for tree in clf.estimators_], axis=0)  
indices = np.argsort(importances)[::-1]  
  
# 绘制特征重要性  
plt.figure()  
plt.title("Feature importances")  
plt.bar(range(X_train.shape[1]), importances[indices],  
       color="r", yerr=std[indices], align="center")  
plt.xticks(range(X_train.shape[1]), indices)  
plt.xlim([-1, X_train.shape[1]])  
plt.show()

混淆矩阵

from sklearn.metrics import confusion_matrix  
from sklearn.metrics import plot_confusion_matrix  
  
# 绘制混淆矩阵  
cm = confusion_matrix(y_test, y_pred)  
disp = plot_confusion_matrix(clf, X_test, y_test,  
                             display_labels=['正常', '异常'],  
                             cmap=plt.cm.Blues,  
                             normalize=None)  
disp.ax_.set_title('Confusion Matrix')  
plt.show()

ROC曲线

from sklearn.metrics import roc_curve, auc  
from sklearn.metrics import plot_roc_curve  
  
# 计算ROC曲线和AUC  
fpr, tpr, thresholds = roc_curve(y_test, clf.predict_proba(X_test)[:, 1])  
roc_auc = auc(fpr, tpr)  
  
# 绘制ROC曲线  
plt.figure()  
lw = 2  
plt.plot(fpr, tpr, color='darkorange', lw=lw, label='ROC curve (area = %0.2f)' % roc_auc)  
plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')  
plt.xlim([0.0, 1.0])  
plt.ylim([0.0, 1.05])  
plt.xlabel('False Positive Rate')  
plt.ylabel('True Positive Rate')  
plt.title('Receiver Operating Characteristic Example')  
plt.legend(loc="lower right")  
plt.show()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值