当前位置: 首页 > 面试题库 >

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

印季
2023-03-14
问题内容

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

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

一旦模型适合并用于预测类别,我想找出每个功能对特定类别预测的贡献。如何在scikit中学习?是否可以使用额外的树分类器,还是需要使用其他模型?


问题答案:

更新资料

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

示例:
想象一个特征,无论是太大还是很小的值都无法预测类,但是某个中间间隔的值却可以预测类。那可能是摄入水来预测脱水。但是水的摄入可能与盐的摄入相互影响,因为多吃盐可以增加水的摄入。现在,您可以在两个非线性特征之间进行交互。决策边界在您的特征空间周围蜿蜒而行,以对这种非线性进行建模并仅询问其中有多少特征会影响脱水风险是完全不知道的。这不是正确的问题。

备选方案:
您可能要问的另一个更有意义的问题是:如果我没有此信息(如果我没有使用此功能),则对给定标签的预测会遭受多少损失?为此,您只需忽略一个功能,训练一个模型并查看每个类的精度和召回率。它仍可告知特征重要性,但不对线性进行任何假设。

以下是旧答案

我前一段时间解决了类似的问题,并在Cross
Validated上
发布了相同的问题。 简短的答案是 ,没有实现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

例:

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是类标签,而第二级键是列索引,即要素索引。回想一下,绝对值越大,重要性就越大,符号告诉您它是小(可能为负)还是重要的大值。



 类似资料:
  • 在我们的组织中,我们有一些微服务和许多库。 有些库定义的“public”类不用于公共用途-仅在多个包中的库内部(因此不能是包私有的) 我想添加一些类似于Kotlin的“内部”修饰符的内容—一个checkstyle规则/注释处理器/测试组件,用于验证使用者应用程序是否不导入这些类。 例如,我将它们标记为@ForInternalUsageOnly或放入包com.ourorg.mylib.interna

  • 在Junit4(Eclipse)中,是否可以从测试用例中只运行一些方法(而不是全部)?我有两个测试用例,我想实现一个测试套件,其中包含一个测试用例中的所有方法(我通过向第一个测试用例中的所有测试添加@Category注释,然后在套件中使用@IncludeCategory)以及第二个测试用例中的一些方法。 非常感谢。

  • 我更倾向于第一种方法,但想确认其他人对这种情况的看法。

  • 脚本说明:其实密钥是可以在脚本中生成的。我这里直接生成,在脚本里写死了,有些地方不严谨,不成熟,凑合能用,欢迎指正,谢谢。 一、单实例测试 1、前置条件 1.1 配置文件 config.ini genesis-json = genesis.json block-log-dir = blocks enable-stale-production = true shared-file-dir = blo

  • 问题内容: 在python中,我尝试执行以下操作以定义函数: 但是由于某种原因,这是错误的。我收到此错误: 我该如何解决? 谢谢 问题答案: 这不是在python中声明函数的方式。您要写的是: 也就是说,如果您已经具有和函数。

  • 在Firebase实时数据库中使用云函数时,您可以使用云函数将特定字段作为目标。例如,给定这个JSON结构,我可以在user1的email字段更改为云计算功能。 现在有了Fi还原,我似乎不能针对特定的字段,只能针对文档。如果是这种情况,则针对电子邮件字段的Fi还原云函数必须看起来像这样,,并在每次更改集合中的任何文档时触发。这将导致大量浪费的云函数被触发。这就是火还原器的工作原理吗?它周围有优雅的