使用 scikit 确定每个特征对特定类别预测的贡献

2024-05-06

我正在使用 scikit 额外的树分类器:

model = ExtraTreesClassifier(n_estimators=10000, n_jobs=-1, random_state=0)

一旦模型拟合并用于预测类别,我想找出每个特征对特定类别预测的贡献。我如何在 scikit learn 中做到这一点?是否可以使用额外的树分类器,或者我是否需要使用其他模型?


Update

如今我对 ML 的了解比 2.5 年前更加丰富,我现在会说这种方法仅适用于高度线性的决策问题。如果你不小心将它应用于非线性问题,你就会遇到麻烦。

Example:想象一个特征,它既不能很大也不能很小的值可以预测类别,但某个中间区间的值可以预测类别。这可能是通过摄入水量来预测脱水。但水的摄入量可能与盐的摄入量相互作用,因为吃更多的盐可以摄入更多的水。现在两个非线性特征之间存在交互。决策边界围绕特征空间蜿蜒以对这种非线性进行建模,并且仅询问其中一个特征对脱水风险的影响程度是无知的。这不是正确的问题。

选择:您可以问的另一个更有意义的问题是:如果我没有此信息(如果我遗漏了此功能),我对给定标签的预测会受到多大影响?为此,您只需省略一个功能,训练一个模型,然后查看每个类别的精确度和召回率下降了多少。它仍然告知特征重要性,但它不对线性做出任何假设。

以下是旧答案.


我不久前解决了类似的问题并发布了交叉验证上有同样的问题 https://stats.stackexchange.com/questions/151762/class-specific-feature-importance. 简短的答案是没有实施sklearn这就是你想要的一切。

然而,您想要实现的目标实际上非常简单,可以通过将每个类上每个特征分割的平均标准化平均值乘以相应的model._feature_importances数组元素。您可以编写一个简单的函数来标准化数据集,计算跨类预测的每个特征的平均值,并与model._feature_importances大批。绝对结果值越大,这些特征对其预测类别就越重要,更好的是,符号会告诉您重要的值是小还是大。

这是一个超级简单的实现需要一个数据矩阵X,预测列表Y以及特征重要性数组,并输出描述每个特征对每个类的重要性的 JSON。

def class_feature_importance(X, Y, feature_importances):
    N, M = X.shape
    X = scale(X)

    out = {}
    for c in set(Y):
        out[c] = dict(
            zip(range(N), np.mean(X[Y==c, :], axis=0)*feature_importances)
        )

    return out

Example:

import numpy as np
import json
from sklearn.preprocessing import scale

X = np.array([[ 2,  2,  2,  0,  3, -1],
              [ 2,  1,  2, -1,  2,  1],
              [ 0, -3,  0,  1, -2,  0],
              [-1, -1,  1,  1, -1, -1],
              [-1,  0,  0,  2, -3,  1],
              [ 2,  2,  2,  0,  3,  0]], dtype=float)

Y = np.array([0, 0, 1, 1, 1, 0])
feature_importances = np.array([0.1, 0.2, 0.3, 0.2, 0.1, 0.1])
#feature_importances = model._feature_importances

result = class_feature_importance(X, Y, feature_importances)

print json.dumps(result,indent=4)

{
    "0": {
        "0": 0.097014250014533204, 
        "1": 0.16932975630904751, 
        "2": 0.27854300726557774, 
        "3": -0.17407765595569782, 
        "4": 0.0961523947640823, 
        "5": 0.0
    }, 
    "1": {
        "0": -0.097014250014533177, 
        "1": -0.16932975630904754, 
        "2": -0.27854300726557779, 
        "3": 0.17407765595569782, 
        "4": -0.0961523947640823, 
        "5": 0.0
    }
}

第一级按键result是类标签,第二级键是列索引,即特征索引。回想一下,大的绝对值对应于重要性,并且符号告诉您重要的是小值(可能是负值)还是大值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 scikit 确定每个特征对特定类别预测的贡献 的相关文章

随机推荐

  • 翻转旋转和图像

    我正在用 Java 编写一个平台游戏 并且正在手动编码玩家动画 我分别为每个肢体设置动画 改变位置和旋转 当玩家面向右时 这工作得很好 但是当玩家面向左时 我不知道如何处理旋转 以使它们在玩家向左转时看起来相同 每个身体部位的位置都是相对于
  • 有没有办法使用 Mayavi 填充陀螺仪表面的一侧?

    我正在使用 Mayavi 绘制陀螺仪的等值面 我的问题是我需要通过填充两个生成区域的一侧来获得更坚固的结构 在下面的图片中 您可以看到我生成的等值面的外观以及填充一侧后的外观 我生成的等值面 它应该是什么样子 等值面可以通过以下方程生成 U
  • Swift 中的 NSCollectionView 选择处理

    使用 Swift 学习 我一整天都在做这件事 但进展甚微 需要知道何时选择 NSCollectionView 中的项目 最终目标是让项目突出显示 并能够使用删除键将其从集合中删除 我的 NSCollectionView 绑定到 ArrayC
  • 在 eclipse indigo 中找不到 Window builder pro

    我读到 Eclipse Indigo 安装了 Window Builder Pro 插件 但我不知道它在哪里 文件 新建 项目没有给我选择 Window Builder Pro 的选项 如何找到它 您需要将此更新站点添加到 Eclipse
  • Font Awesome 4.0.0 缺少图标

    是我一个人的问题 还是 FontAwesome 3 x x 中实际上有 FontAwesome 4 0 0 中缺少的图标 如果是这样 这肯定会让 FontAwesome 对我来说不再那么棒 例如 我似乎找不到相当于icon remove 没
  • java格式化表格输出

    所以我正在尝试格式化我的输出 System out println Menu nItem tItem t tPrice tQuantity for int i 0 i
  • jQuery 单击事件更改 php 会话变量

    对此最好的方法是什么 因为 正如我发现的 只有在尝试过之后才完全有意义 p 你不能在 javascript 条件下设置 PHP 变量 杜尔赫 我能想到的唯一解决方案是对一个处理会话变量的小型 PHP 文件进行 AJAX 调用 elm cli
  • 给定字符串的所有可能排列?

    我该如何在 Ruby 中做到这一点 p abc all possible permutations 将返回 abc acb bca bac cba cab Edit 感谢雅库布 汉普尔 class String def all possib
  • 仅以 int 形式显示和保存小时数

    如何仅显示小时并使用 int 变量 我的意思是打印时间 例如 20 30 44 PM 我只想存储小时 即 int 变量中的 20 小时 怎么做 有谁知道的话可以告诉我密码吗 谢谢 尝试使用日历get http docs oracle com
  • 无法让 Rails Server 与 MySQL 一起使用

    我正在尝试让我的 Rails 应用程序与 MySQL 一起使用 而不是默认的 SQLite 我创建了一个新项目 强制使用 MySQL 它似乎工作正常 它在 Gem 文件中添加了 gem 条目 如下所示 source https rubyge
  • StateObject 作为 init() 中另一个对象的参数

    我试图将 StateObject 用户传递给authenticationHelper 但我不能 因为 IDE 说 在初始化所有存储的属性之前使用 self 即使它是在结构体的开头初始化的 我考虑过将 user 的初始化移至 init 但同样
  • Windows批处理编程中的用户输入操作

    我想以 ddmmyyyy 格式接受用户的输入 当用户以这种格式输入日期时 文件将移动到相应的文件夹 我尝试了以下代码但失败了 SET p str 输入文件夹的名称 例如30062011 移动 C Documents and Settings
  • 如何从图书馆创建承诺

    我对此感到困惑 因为到目前为止我发现的每个教程都假设我可以编辑库代码 或者库只有回调或回调作为最后一个参数 我正在使用的库的每个功能都设置为function successCallBack result FailCallBack error
  • java中使用awt.Toolkit和Clipboard是否可以知道剪贴板中复制的内容是否是mp3文件

    我正在尝试编写一个运行于背景 and monitors复制 a 的复制操作 mp3 file or a 文件夹包含 a mp3 file Clipboard cb Toolkit getDefaultToolkit getSystemCli
  • 返回值必须是 ?Illuminate\\Database\\Query\\Builder, App\\Models\\ModelName 返回的类型

    我试图得到以下回应 user id 1 first name john last name doe email email protected cdn cgi l email protection phone number 12345678
  • 随机梯度下降可以与 TensorFlow 一起使用吗?

    我设计了一个全连接 MLP 具有 2 个隐藏层和 1 个输出层 如果我使用批量或小批量梯度下降 我会得到一个很好的学习曲线 But a straight line while performing Stochastic Gradient D
  • asp.net core 3.0 web api request.body 和 [frombody] 冲突 [已关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我需要让身体通过request bodyfrombody后 但测试了2天还没有找到解决方案 我已经添加Request EnableBuffe
  • Yii2:ActiveController 中的 REST API 操作

    在文档指南中有示例 namespace app controllers use yii rest ActiveController class UserController extends ActiveController public m
  • 当输入为空时如何禁用按钮?

    我试图在输入字段为空时禁用按钮 React 中最好的方法是什么 我正在做类似以下的事情
  • 使用 scikit 确定每个特征对特定类别预测的贡献

    我正在使用 scikit 额外的树分类器 model ExtraTreesClassifier n estimators 10000 n jobs 1 random state 0 一旦模型拟合并用于预测类别 我想找出每个特征对特定类别预测