我有一个包含类别型、浮点型和整数型数据类型的DataFrame。
X – 包含所有三种给定数据类型的特征,而y是整数。
我创建了一个如下所示的管道。
get_imputer(): 填补函数get_encoder(): 某种编码函数#模型管道 = Pipeline(steps=[ ('imputer', get_imputer()), ('encoder', get_encoder()), ('regressor', RandomForestRegressor()) ])
我需要找出模型的排列重要性。以下是相应的代码。
import eli5from eli5.sklearn import PermutationImportanceperm = PermutationImportance(pipeline.steps[2][1], random_state=1).fit(X, y)eli5.show_weights(perm)
但这段代码抛出了如下错误:
ValueError: could not convert string to float: ''
回答:
让我们简要了解一下PermutationImportance的工作原理。
在您使用所有特征训练模型后,PermutationImportance会打乱列/列的值,并检查对损失函数的影响。
例如:
有5个特征(列)和n行:
f1 f2 f3 f4 f5
v1 v2 v3 v4 v5v6 v7 v8 v9 v10…vt . . . .
现在,要确定f3列是否重要,它会打乱f3列中的值。例如,将x行中的f3值与y行中的f3值交换,然后检查对损失函数的影响。因此,确定特征在模型中的重要性。
现在,为了回答这个问题,我会说任何模型在训练时,所有特征都应该是数值的(因为机器学习模型无法直接理解文本)。所以,在您的PermutationImportance参数中,您需要提供数值列。因为您在将类别/文本转换为数字后训练了一个模型,您需要对新的输入应用相同的转换策略。
因此,PermutationImportance应该仅在您的数据经过预处理且DataFrame中的所有数据都是数值时使用。