如今,我比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 npimport jsonfrom sklearn.preprocessing import scaleX = 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_importancesresult = 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是类标签,而第二级键是列索引,即要素索引。回想一下,绝对值越大,重要性就越大,符号告诉您它是小(可能为负)还是重要的大值。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)