如何基于随机森林特征重要性筛选TopN特征后进行t-SNE降维可视化
实现方案
步骤1:提取随机森林特征重要性前N的特征
训练完成的RandomForestClassifier实例自带feature_importances_属性,和输入特征的列顺序一一对应,我们可以基于该属性筛选前N个重要性最高的特征:
import pandas as pd # 定义需要提取的特征数量 n_top = 10 # 构造特征名与重要性的对应表 feature_imp = pd.DataFrame({ "col_name": X.columns, "imp_score": clf_rf.feature_importances_ }) # 按重要性降序排序,取前n_top个特征的列名 top_cols = feature_imp.sort_values("imp_score", ascending=False).head(n_top)["col_name"].tolist() # 从原特征集中筛选出目标特征子集 X_top_features = X[top_cols]
步骤2:用筛选后的特征子集执行t-SNE降维可视化
仅需要将原来t-SNE代码中的输入X替换为上一步得到的X_top_features即可:
from sklearn.manifold import TSNE import matplotlib.pyplot as plt import numpy as np tsne = TSNE(n_components=2, random_state=11) X_2d = tsne.fit_transform(X_top_features) target_ids = range(0,2) target_names = np.array(["label 1", "label 2"]) plt.figure(figsize=(6, 5)) colors = 'r', 'g' for i, c, label in zip(target_ids, colors, target_names): plt.scatter(X_2d[y == i, 0], X_2d[y == i, 1], c=c, label=label) plt.legend() plt.xlabel("Dimension 1") plt.ylabel("Dimension 2") plt.show()
注意事项:
- 如果需要拆分训练集、测试集单独做可视化,建议仅基于训练集的特征重要性筛选特征,再分别提取训练集、测试集的对应特征子集做降维,避免数据泄露
- 可以根据样本量调整t-SNE的
perplexity参数,一般建议取值在5~50之间,可视化效果会更合理
内容的提问来源于stack exchange,提问作者Adler Müller
相关产品推荐
相关产品推荐

