基于随机森林的特征向量分析(Python实现)

一、随机森林特征分析的核心原理

随机森林通过集成多棵决策树的预测结果,其特征重要性评估基于以下两种机制:

  1. 基于不纯度(Mean Decrease Impurity)

    • 原理:统计每个特征在树节点分裂时对不纯度(基尼指数或信息熵)的降低贡献,贡献越大则特征越重要。

    • 公式

      其中\(ΔI\)为特征\(f_i\)在节点分裂时减少的不纯度。

  2. 置换重要性(Permutation Importance)

    • 原理:随机打乱某个特征的值后观察模型性能下降程度,下降越多说明特征越重要。

    • 优点:避免相关特征间的干扰,更准确反映真实贡献。


二、Python实现步骤(以分类任务为例)

1. 数据准备与特征编码
import pandas as pd
from sklearn.preprocessing import LabelEncoder, OneHotEncoder

# 加载数据(示例:汽车安全性数据集)
data = pd.read_csv('car-evaluation.csv', header=None)
df = pd.DataFrame(data, columns=['buying', 'maint', 'doors', 'persons', 'lug_boot', 'safety', 'class'])

# 分类特征编码
label_enc = LabelEncoder()
df['class'] = label_enc.fit_transform(df['class'])

# 独热编码(处理类别型特征)
df_encoded = pd.get_dummies(df, columns=['buying', 'maint', 'doors', 'lug_boot'])
2. 训练随机森林模型
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split

# 划分特征与目标变量
X = df_encoded.drop('class', axis=1)
y = df_encoded['class']

# 划分训练集与测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 训练模型
rf = RandomForestClassifier(n_estimators=200, random_state=42)
rf.fit(X_train, y_train)
3. 特征重要性提取与排序
# 获取特征重要性(基于不纯度)
importances = rf.feature_importances_
feature_names = X.columns
feature_importance_df = pd.DataFrame({'Feature': feature_names, 'Importance': importances})
feature_importance_df = feature_importance_df.sort_values(by='Importance', ascending=False)

print("Top 5 Important Features:")
print(feature_importance_df.head(5))
4. 可视化特征重要性
import matplotlib.pyplot as plt
import seaborn as sns

plt.figure(figsize=(10, 6))
sns.barplot(x='Importance', y='Feature', data=feature_importance_df.head(10))
plt.title('Random Forest Feature Importance')
plt.xlabel('Importance Score')
plt.ylabel('Feature')
plt.grid(axis='x', linestyle='--')
plt.show()

三、特征选择与模型优化

1. 递归特征消除(RFE)
from sklearn.feature_selection import RFE

# 选择前5个重要特征
selector = RFE(estimator=rf, n_features_to_select=5)
selector = selector.fit(X_train, y_train)

# 获取特征排名
ranking = selector.ranking_
print("Feature Ranking (1=most important):")
print(pd.Series(ranking, index=X.columns).sort_values())
2. 基于重要性的特征筛选
# 选择重要性>0.05的特征
selected_features = feature_importance_df[feature_importance_df['Importance'] > 0.05]['Feature']
X_train_selected = X_train[selected_features]
X_test_selected = X_test[selected_features]

# 重新训练模型
rf_selected = RandomForestClassifier(n_estimators=200, random_state=42)
rf_selected.fit(X_train_selected, y_train)

四、置换重要性分析(高级应用)

from sklearn.inspection import permutation_importance

# 计算置换重要性
result = permutation_importance(rf, X_test, y_test, n_repeats=10, random_state=42)

# 可视化
plt.figure(figsize=(10, 6))
plt.barh(feature_importance_df['Feature'][:10], result.importances_mean[0:10])
plt.xlabel('Permutation Importance')
plt.title('Feature Importance via Permutation')
plt.grid(axis='x', linestyle='--')
plt.show()

五、参数

参数 作用 推荐范围 注意事项
n_estimators 决策树数量 100-500 过大增加计算成本
max_depth 树的最大深度 3-10 防止过拟合
class_weight 类别权重(处理不平衡数据) 'balanced' 提升少数类识别率
bootstrap 是否使用自助采样法 True/False 影响特征重要性计算的稳定性

参考代码 随机森林特征向量分析 www.youwenfan.com/contentcnn/84649.html

六、完整代码示例

# 完整代码整合(特征分析+模型优化)
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.inspection import permutation_importance
import matplotlib.pyplot as plt

# 1. 数据加载与预处理
data = pd.read_csv('car-evaluation.csv', header=None)
df = pd.DataFrame(data, columns=['buying', 'maint', 'doors', 'persons', 'lug_boot', 'safety', 'class'])
df['class'] = df['class'].astype('category').cat.codes

# 2. 特征编码
df_encoded = pd.get_dummies(df, columns=['buying', 'maint', 'doors', 'lug_boot'])

# 3. 划分数据集
X = df_encoded.drop('class', axis=1)
y = df_encoded['class']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 4. 训练模型
rf = RandomForestClassifier(n_estimators=200, max_depth=5, random_state=42)
rf.fit(X_train, y_train)

# 5. 特征重要性分析
importances = rf.feature_importances_
feature_importance_df = pd.DataFrame({'Feature': X.columns, 'Importance': importances})
feature_importance_df = feature_importance_df.sort_values(by='Importance', ascending=False)

# 6. 可视化
plt.figure(figsize=(12, 8))
sns.barplot(x='Importance', y='Feature', data=feature_importance_df.head(10))
plt.title('Top 10 Important Features')
plt.grid(axis='x', linestyle='--')
plt.show()

# 7. 置换重要性验证
result = permutation_importance(rf, X_test, y_test, n_repeats=10, random_state=42)
plt.figure(figsize=(12, 8))
plt.barh(feature_importance_df['Feature'][:10], result.importances_mean[0:10])
plt.title('Permutation Importance Ranking')
plt.grid(axis='x', linestyle='--')
plt.show()
posted @ 2025-12-10 10:41  csoe9999  阅读(18)  评论(0)    收藏  举报