当前位置:   article > 正文

python绘制随机森林重要度排序条形图,以及把重要度之和前0.9显示出来,用于观察_随机森林特征重要性排序图

随机森林特征重要性排序图

python绘制随机森林重要度排序条形图,以及把重要度之和前0.9显示出来,用于观察

前面的话:因为项目原因,需要特征选择,随机森林有自带的重要度属性,但是我需要观察前0.9(此处理解为能包含重要度之和为0.9的前几项特征为比较重要的,例如:20个特征可以包含重要度之和0.9,八个特征包含重要度0.1,那么可以把这8个进行筛选)

先附上绘制后的条新图(因为项目保密性,具体特征只截取部分名称,横坐标是重要度,纵坐标是特征名称):

 对这个图简单说明一下:

1.横坐标是重要度,纵坐标是特征名称

2.按照重要度排序,蓝色为末尾重要度之和为0.1的特征,红色为余下0.9的特征,在此也就可以理解为最重要部分

3.每一条重要度后都加了标签用于显示具体数值

 

下面附上代码:(一个函数)

def plot_feature_importances(feature_importances,title,feature_names,change):
    print('feature_importances',feature_importances)
    print('names',feature_names)
#     feature_importances = 100.0*(feature_importances/max(feature_importances))

#     print('feature_importances',feature_importances)
#     将得分从小到大排序
    index_sorted = np.argsort(feature_importances)
    print('index_sorted',index_sorted)
   #特征名称排序
    chara= change
    for col in range(0,i):
        chara[col] = feature_names[index_sorted[col]]
    print(chara)
    
    
#     让y坐标轴上的标签居中显示
    pos = np.arange(index_sorted.shape[0])+0.5
    print(pos)
    plt.figure(figsize=(16,16))
    #0.9的分割数据
    index1 = [i] * i
    index2 = [i] * i
    feature_importances = np.append(feature_importances,0)
   
    print('feature_importances',feature_importances)
    sum = 0
    
    for col in range(0,i):
        k = feature_importances[index_sorted[i-col-1]]
        sum =sum+ k
        index1[col] = index_sorted[i-col-1]
        if (sum >= 0.9):
            break
        
    s =0       
    for col in range(0,i):
        k = feature_importances[index_sorted[col]]
        print(k)
        s =s+ k
        index2[col] = index_sorted[col]
        if (s >= 0.1):
            break
            
    print('小于0.1',index2)
    index1 = np.flipud(index1)
    print('大于0.9',index1)
    
   
    plt.barh(pos,feature_importances[index2],align='center')
    plt.barh(pos,feature_importances[index1],align='center',color="red")   
    plt.yticks(pos,chara)
    plt.xlabel('Relative Importance')
    plt.title(title)
    
    xlabel = feature_importances[index_sorted]
    ylabel = pos
    for x1, y1 in zip(xlabel,ylabel):
        # 添加文本时添加偏移量使其显示更加美观
        x1 = np.around(x1, decimals=3)
#         print("坐标",y1,x1)
        plt.text(x1+0.00005, y1, '%.3f' % x1)
        
    plt.show() 

使用方法 plot_feature_importances(imports,'随机森林特征重要度排序',al,ad),四个参数,分别为:

1.imports:一个list,每个特征的重要度,不需要提前排序,plot_feature_importances函数中有排序算法

2.绘制图片的title,这里叫作 '随机森林特征重要度排序'

3.al,ad:一个list,都是每个特征的名字,这里需要和imports一一对应,比如: 第一个特征为A,重要度为0.1,第二个特征为B,重要度为0.9,则imports为[0.1,0.9],al = ad 为[A,B],即可使用绘图代码

最后,具体用到的包没有标注,需要手动加入包

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/97641
推荐阅读
相关标签
  

闽ICP备14008679号