解释RandomForestClassifier中的特征重要性值



我是机器学习的初学者,在解释我从第一个程序中得到的一些结果时遇到了困难。设置如下:

我有一个书评数据集。这些书可以用大约1600本书中的任意数量的限定符进行标记。阅读这些书的人也可以用这些限定词来标记自己,以表明他们喜欢用这个标记阅读东西。

数据集为每个限定符都有一列。对于每一篇评论,如果使用给定的限定符来标记书籍和评论人,则记录值1。如果在给定评审中给定限定符没有"匹配",则记录值0。

还有一个"分数"列,每个评论都有一个整数1-5(该评论的"星级")。我的目标是确定哪些功能对获得高分最重要。

这是我现在的代码(https://gist.github.com/souldeux/99f71087c712c48e50b7):

def determine_feature_importance(df):
    #Determines the importance of individual features within a dataframe
    #Grab header for all feature values excluding score & ids
    features_list = df.columns.values[4::]
    print "Features List: n", features_list
    #set X equal to all feature values, excluding Score & ID fields
    X = df.values[:,4::]
    #set y equal to all Score values
    y = df.values[:,0]
    #fit a random forest with near-default paramaters to determine feature importance
    print 'nCreating Random Forest Classifier...n'
    forest = RandomForestClassifier(oob_score=True, n_estimators=10000)
    print 'nFitting Random Forest Classifier...n'
    forest.fit(X,y)
    feature_importance = forest.feature_importances_
    print feature_importance
    #Make importances relative to maximum importance
    print "nMaximum feature importance is currently: ", feature_importance.max()
    feature_importance = 100.0 * (feature_importance / feature_importance.max())
    print "nNormalized feature importance: n", feature_importance
    print "nNormalized maximum feature importance: n", feature_importance.max()
    print "nTo do: set fi_threshold == max?"
    print "nTesting: setting fi_threshhold == 1"
    fi_threshold=1
    #get indicies of all features over fi_threshold
    important_idx = np.where(feature_importance > fi_threshold)[0]
    print "nRetrieved important_idx: ", important_idx
    #create a list of all feature names above fi_threshold
    important_features = features_list[important_idx]
    print "n", important_features.shape[0], "Important features(>", fi_threshold, "% of max importance:n", important_features
    #get sorted indices of important features
    sorted_idx = np.argsort(feature_importance[important_idx])[::-1]
    print "nFeatures sorted by importance (DESC):n", important_features[sorted_idx]
    #generate plot
    pos = np.arange(sorted_idx.shape[0]) + .5
    plt.subplot(1,2,2)
    plt.barh(pos,feature_importance[important_idx][sorted_idx[::-1]],align='center')
    plt.yticks(pos, important_features[sorted_idx[::-1]])
    plt.xlabel('Relative importance')
    plt.ylabel('Variable importance')
    plt.draw()
    plt.show()
    X = X[:, important_idx][:, sorted_idx]

    return "Feature importance determined"

我正在成功地生成一个情节,但老实说,我不确定这个情节意味着什么。据我所知,这向我展示了任何给定的功能对分数变量的影响有多大。但是,我意识到这一定是一个愚蠢的问题,我怎么知道影响是积极的还是消极的?

简而言之,您不需要。决策树(随机林的构建块)不能以这种方式工作。如果您使用线性模型,那么对于特征是"正"还是"负",有一个非常简单的区别,因为它对最终结果的唯一影响是添加(带权重)。没什么了。然而,决策树的集合可能对每个特征都有任意复杂的规则,例如"如果书的封面是红色的,并且有100多页,那么如果它包含龙,那么它会得到高分",但"如果书有蓝色的封面,并且有超过100页,那么它包含龙就会得到低分"等等

功能重要性只会让您了解哪些功能有助于决策,而不是"以何种方式",因为有时它会起作用,有时会起作用。

你能做什么?你可以添加一些极端的简化——假设你只在完全没有其他人的情况下对功能感兴趣,现在——一旦你知道了哪些是重要的,你就可以计算这个功能在每个类别中的次数(在你的情况下是分数)。通过这种方式,您将获得分发

P(gets score X|has feature Y)

这将或多或少地向你展示它(在边缘化之后)是有积极影响还是消极影响。

随机森林可以测量分类任务中任何特征的相对重要性。

通常,我们会衡量如果我们失去该特征的真实值会造成的损失。一次一个特征对值进行加扰,并测量预测精度的损失。

因为每次我们构建一个新的决策树时都会这样做,并且随机森林由几棵树组成,所以值是可靠的。

看看这一页。

从林返回的数字越高。feature_importments_意味着它们在此分类任务中越重要。

然而,在您的情况下,这是不合适的。我建议尝试多项式Naive Bayes分类器,并在训练后检查feature_log_prob_。这样你就可以看到给定一个类的特征的概率,P(x_i|y)。

相关内容

  • 没有找到相关文章

最新更新