实战项目--随机森林模型评估特征的重要性

183 阅读6分钟

前言:

笔者最近参加了一个比赛,赛题是搭建一个多特征二分类模型,由于模型的性能在最优参数左右达到了瓶颈值,所以查阅了大量特征选择的文章,受到【机器学习】11 种特征选择策略总结! 这篇文章的启发,在实验室中搭建了一个随机森林模型用于评估模型的重要性,遂有了此文。

一、模型与项目简介

下面的这个项目将会展示我如何使用随机森林分类器(RandomForestClassifier)来评估特征的重要性。

随机森林是一种基于决策树的集成学习方法,它通过构建多个决策树并对它们的预测结果进行平均或多数投票来提高模型的准确性和稳定性。

二、项目代码详解

1. 数据准备

  • 读取数据:使用pandas库的read_csv函数从CSV文件中读取数据。

  • 数据清洗

    • 移除用户ID列:假设USER_ID_MD5列对于模型训练不重要,因此从数据集中移除。
    • 处理NaN值:删除包含NaN值的行,确保模型训练时数据的完整性。
    • 处理无穷大值:将无穷大值替换为NaN,并删除这些行,以防止模型受到异常值的影响。
import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
import matplotlib.pyplot as plt

# 数据集文件路径
file_path = '/home/workspace/output/Date/测试集A/train.csv'

# 读取CSV文件
df = pd.read_csv(file_path)

这里我首先导入了必要的库和依赖:

  • numpy用于数值计算,

  • pandas用于数据处理,

  • RandomForestClassifier用于构建随机森林模型,

  • matplotlib.pyplot用于数据可视化。

然后,定义了CSV文件的路径,并使用pandasread_csv函数读取数据。

# 移除用户ID列
df = df.drop(columns=['USER_ID_MD5'])  # 假设用户ID列名为 'USER_ID_MD5'

这里,我直接从数据集中移除了USER_ID_MD5列,因为假设这个用户ID对于模型训练不重要,数据集的第一列就是这个用户ID,而且该ID较长,且是字符串和数字的结合。

# 检查并处理NaN值
df = df.dropna()  # 删除包含NaN值的行

# 检查并处理无穷大值
df.replace([np.inf, -np.inf], np.nan, inplace=True)
df.dropna(inplace=True)  # 删除包含无穷大值的行

在这部分,我处理了缺失值和无穷大值。 首先,使用dropna删除了包含NaN值的行。 然后,将无穷大值替换为NaN,并再次使用dropna删除这些行,以确保数据的完整性和准确性。

2. 特征和目标变量

  • 特征(X) :选择数据集中除了最后一列之外的所有列作为特征。
  • 目标变量(y) :选择数据集中的最后一列作为目标变量。
# 假设最后一列是目标变量
X = df.iloc[:, :-1]  # 所有行,除了最后一列
y = df.iloc[:, -1]   # 所有行,只有最后一列

这里假设最后一列是我要预测的目标变量。

3. 模型训练

  • 初始化随机森林分类器:我初始化了一个随机森林分类器,设置了100棵树(n_estimators=100)和随机种子(random_state=42),以确保结果的可重复性。
  • 训练模型:使用fit方法训练模型,将特征集X和目标变量y作为输入。
# 初始化随机森林分类器
rf = RandomForestClassifier(n_estimators=100, random_state=42)

# 训练模型
rf.fit(X, y)

4. 特征重要性

  • 获取特征重要性:随机森林模型可以自动计算每个特征的重要性,这些值表示每个特征对于模型预测目标变量的贡献程度。
  • 创建特征重要性DataFrame:将特征名称和它们的重要性存储在一个新的DataFrame中。
  • 排序和打印:按照重要性对DataFrame进行降序排序,并打印出来。
# 获取特征重要性
feature_importances = rf.feature_importances_

# 将特征重要性添加到DataFrame中
feature_names = X.columns
df_features = pd.DataFrame({'Feature': feature_names, 'Importance': feature_importances})
print(df_features.sort_values(by='Importance', ascending=False))

5. 可视化特征重要性

# 可视化特征重要性
plt.figure(figsize=(10, 8))  # 设置图形的大小
plt.barh(df_features['Feature'], df_features['Importance'])
plt.xlabel('Feature Importance')
plt.ylabel('Feature')
plt.title('Feature Importance using Random Forest')
plt.gca().invert_yaxis()  # 反转y轴,使得重要性最高的特征在上方
plt.show()  # 显示图形

在该部分,我使用matplotlib库来可视化特征重要性。

  • 首先,设置图形的大小为10x8英寸。

  • 然后,使用barh函数绘制水平条形图,横轴显示特征重要性,纵轴显示特征名称。

  • 设置图形的标题和轴标签,并使用invert_yaxis方法将 y 轴反转,使得重要性最高的特征显示在图形的顶部。

  • 最后,使用plt.show()方法展示图形。

通过这个过程,我们可以直观地看到哪些特征对模型的预测能力贡献最大,这对于理解模型的决策过程和指导进一步的特征工程和模型优化非常有帮助。当然,如果你算力和时间充足的情况下,还是尽量不要砍掉特征吧。

三、模型整体代码展示:

import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
import matplotlib.pyplot as plt

# 数据集文件路径
file_path = '/home/workspace/output/Date/测试集A/train.csv'

# 读取CSV文件
df = pd.read_csv(file_path)

# 移除用户ID列
df = df.drop(columns=['USER_ID_MD5'])  # 假设用户ID列名为 'USER_ID_MD5'

# 检查并处理NaN值
df = df.dropna()  # 删除包含NaN值的行

# 检查并处理无穷大值
df.replace([np.inf, -np.inf], np.nan, inplace=True)
df.dropna(inplace=True)  # 删除包含无穷大值的行

# 假设最后一列是目标变量
X = df.iloc[:, :-1]  # 所有行,除了最后一列
y = df.iloc[:, -1]   # 所有行,只有最后一列

# 初始化随机森林分类器
rf = RandomForestClassifier(n_estimators=100, random_state=42)

# 训练模型
rf.fit(X, y)

# 获取特征重要性
feature_importances = rf.feature_importances_

# 将特征重要性添加到DataFrame中
feature_names = X.columns
df_features = pd.DataFrame({'Feature': feature_names, 'Importance': feature_importances})
print(df_features.sort_values(by='Importance', ascending=False))

# 可视化特征重要性
plt.figure(figsize=(10, 8))  # 设置图形的大小
plt.barh(df_features['Feature'], df_features['Importance'])
plt.xlabel('Feature Importance')
plt.ylabel('Feature')
plt.title('Feature Importance using Random Forest')
plt.gca().invert_yaxis()  # 反转y轴,使得重要性最高的特征在上方
plt.show()

四、实验结果展示:

1. 特征重要性结果输出:

               Feature  Importance
3                 ARPU    0.184040
5                  DOU    0.171869
4                  MOU    0.165255
6             FLOW_BHD    0.112627
21       TYPE2_3_MONTH    0.055892
17      PROD_BANDWIDTH    0.045605
23       TYPE3_3_MONTH    0.039666
16             FLAG_KD    0.038498
20       TYPE2_1_MONTH    0.027009
1             FLAG_AGE    0.025583
19       TYPE1_3_MONTH    0.020054
22       TYPE3_1_MONTH    0.018937
0            GOTONE_ID    0.017463
2             FLAG_YSF    0.012981
10          FLAG_CQ_CT    0.010474
9       FLAG_OVER_CALL    0.010099
11        FLAG_OF_GPRS    0.009882
12        FLAG_OF_CALL    0.009176
8       FLAG_OVER_GPRS    0.008297
18       TYPE1_1_MONTH    0.007535
25        ZWFW_3_ACCT1    0.003704
13       FLAG_PHONE_ZC    0.001958
15   FLAG_PHONE_NET_ZC    0.001924
24        ZWFW_1_ACCT1    0.001073
14  FLAG_PHONE_CALL_ZC    0.000372
7       FLAG_FLOW_OVER    0.000024

2. 特征重要性可视化输出

image.png

总的来说,这个模型还是一个比较强大的机器学习工具的,适用于分类问题,它通过特征重要性评估和可视化,为我理解和优化模型提供了有用的信息。

五、End

以上就是笔者最近的随机森林模型评估特征的重要性的实战项目讲解,欢迎大家点赞,收藏,交流和关注,谢谢!