值错误: 无法将字符串转换为浮点数: 。排列重要性是否仅适用于数值要素?



我有一个包含DTYPE的数据框x-包含所有三个给定dtypes的功能,y为int。
我创建了一个如下给出的管道。

get_imputer():
    imputing function
get_encoder():
    some encoder function
#model 
pipeline = Pipeline(steps=[
        ('imputer', get_imputer()),
        ('encoder', get_encoder()),
        ('regressor', RandomForestRegressor())
    ])

我需要找到模型的置换重要性。以下是代码。

import eli5
from eli5.sklearn import PermutationImportance
perm = PermutationImportance(pipeline.steps[2][1], random_state=1).fit(X, y)
eli5.show_weights(perm)

但是此代码在以下内容中丢弃错误:

ValueError: could not convert string to float: ''

让我们了解置换符号的工作。

您已经训练了所有功能的模型后,置换符号将列的值降低并检查对损失函数的影响。

例如

有5个功能(列(,有n行:

F1 F2 F3 F4 F5

V1 V2 V3 V4 V5V6 V7 V8 V9 V10。。。VT。。。。

现在要确定F3列是否重要,它会在f3列中调整值。例如。第X行中F3的值与第y中的F3值交换,然后检查对损耗函数的影响。因此,确定了模型中功能的重要性。

现在,要回答这个特定的问题,我要说的是,当所有功能都是数值时的任何模型(因为ML模型不直接理解文本(。因此,在您的通知率参数中,您需要提供数字的列。由于您在数字上转换分类/文本事物后已经训练了模型,因此您需要将相同的转换策略应用于新输入。

因此,仅在预处理数据并且数据框架具有数值时才应使用PermuationImportance。

对于下一个可怜的灵魂...

我遇到了同样的问题,遇到了这篇文章。虽然公认的答案是完全有意义的 - 事实是在OP的管道中,似乎他正在使用编码器来处理分类数据,这些数据将它们将其转换为数字。

因此,看来置换符号在过程中(完全完全是在管道之前(检查数字的数字方式。相反,它应在拟合模型之前检查预处理步骤和直接。这很令人沮丧,因为如果它与管道不起作用,则很难使用。

我开始使用 sklearn的置换_importance的实现,从而有些运气...但是我弄清楚了。

您需要再次将管道分开,您应该能够使其正常工作。这很烦人,但有效!

import eli5
from eli5.sklearn import PermutationImportance
estimator = pipeline.named_steps['regressor']
# I didnt have multiple steps when I did it, but maybe this is right?
preprocessor = pipeline.named_steps['imputer']['encoder']
X2 = preprocessor.transform(X)
perm = PermutationImportance(estimator, random_state=1).fit(X2.toarray(), y)
eli5.show_weights(perm)

相关内容

最新更新