如何将 sklean 管道应用于功能列表(具体取决于可用性)



我有一个具有 10 个特征(例如,所有浮点数(的熊猫数据帧。给定特征的不同特征(例如平均值(,数据帧可以分为 4 个子集:平均值 <0、范围内平均值 (0,1(、范围内平均值 (1,100(、平均值>=100

对于每个子集,将应用不同的管道,但是,它们可能并不总是可用,例如,数据集可能仅包含平均值 <0;或者可能仅包含平均值 <0 和平均值 (1,100(;或者可能包含所有 4 个子集

问题是如何根据子集的可用性应用管道。

问题是总共会有 7 种不同的组合: 所有子集都存在,只有 3 个存在,只有 2 个子集存在,只有 1 个子集存在。

如何根据子集的可用性分配不同的管道,而无需使用嵌套的 if else(10 if/else(

if subset1 exists:
make_column_transformer(pipeline1, subset1)
elif subset2 exists:
make_column_transformer(pipeline2, subset2)
elif subset3 exists:
make_column_transformer(pipeline3, subset3)
elif subset1 and subset 2 exists
make_column_transformer([(pipeline1, subset1), (pipeline2, subset2)]
elif subset3 and subset 2 exists
make_column_transformer([(pipeline3, subset3), (pipeline2, subset2)]
elif subset1 and subset 3 exists
make_column_transformer([(pipeline1, subset1), (pipeline3, subset3)]
elif subset1 and subset2 and subset3 exists:
make_column_transformer([(pipeline1, subset1), (pipeline2, subset2), (pipeline3, subset3)]

有没有更好的方法来避免这种嵌套(考虑到如果我们有 10 个不同的子集_(

将不同变换应用于不同特征集的方法是ColumnTransformer[1]。然后,您可以拥有一个包含列名称的列表,可以根据所需的条件填充该列表。然后,每个转换器将采用每个列表中列出的列,例如cols_mean_lt0 = [...]等。

话虽如此,你的方法对我来说并不好。您可能希望缩放要素,以便它们都具有相同的平均值和标准。根据您将使用的算法,这可能是强制性的,也可能不是强制性的。

[1] https://scikit-learn.org/stable/modules/generated/sklearn.compose.ColumnTransformer.html

编辑:

列转换器采用transformers,它是名称、元组和列的元组。你想要的是有多个转换器,每个转换器将处理不同的列。元组中的列可以用"字符串或 int、类似字符串或 int 的数组、切片、布尔掩码数组或可调用"来表示。在这里,我建议您传递列列表。

这样,您可以拥有三个变压器,每个案例一个。现在,若要指示希望每个转换器处理哪些列,只需创建三个列表,每个转换器一个列表。每列将对应于其中一个列表。这很容易做到。在循环中,您可以检查每列的含义,然后将列名附加到与相应转换器对应的列表中。

希望这有帮助!

最新更新