基于随机森林的特征向量分析(Python实现)
一、随机森林特征分析的核心原理
随机森林通过集成多棵决策树的预测结果,其特征重要性评估基于以下两种机制:
-
基于不纯度(Mean Decrease Impurity)
-
原理:统计每个特征在树节点分裂时对不纯度(基尼指数或信息熵)的降低贡献,贡献越大则特征越重要。
-
公式:
![]()
其中\(ΔI\)为特征\(f_i\)在节点分裂时减少的不纯度。
-
-
置换重要性(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()

浙公网安备 33010602011771号