如何使用PySpark的ChiSqSelector检查所选功能?

2024-09-28 23:39:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用PySpark的ChiSqSelector来选择最重要的功能。代码运行良好,但是我无法验证我的索引或名称方面的功能

所以我的问题是:我如何识别这些值​​在所选功能中,功能是指?

我有下面的示例代码,为了便于可视化,我只使用了四列,但是,我必须对几乎有100列的DF执行此操作

df=df.select("IsBeta","AVProductStatesIdentifier","IsProtected","Firewall","HasDetections")


from pyspark.ml.feature import VectorAssembler
vec_assembler = VectorAssembler(inputCols = ["IsBeta","AVProductStatesIdentifier","IsProtected","Firewall"], outputCol="features")
vec_df = vec_assembler.transform(df)

selector = ChiSqSelector(featuresCol='features', fpr=0.05, outputCol="selectedFeatures",labelCol= "HasDetections")
result = selector.fit(vec_df).transform(vec_df)
print(result.show())

enter image description here

然而,当尝试应用我在this question中找到的解决方案时。我仍然无法理解根据名称或索引选择了哪些列。也就是说,哪些是要选择的特征

model = selector.fit(vec_df)
model.selectedFeatures

enter image description here


Tags: 功能名称dfselectorfeaturesassemblerfirewallvec
1条回答
网友
1楼 · 发布于 2024-09-28 23:39:20

第一:请不要使用一个热编码特性,ChiSqSelector应该直接用于分类(非编码)列,如您所见here。 如果没有一个热编码的东西,选择器的使用是直接的:

现在让我们看看ChiSqSelector是如何使用的,以及如何按名称查找相关功能。 例如用法我将创建一个只包含2个相关列(AVProductStatesIdentifier和Firewall)的df,其他2个(IsBeta和iProtected)将保持不变:

from pyspark.sql.types import StructType, StructField, IntegerType
from pyspark.sql.functions import col, create_map, lit
from itertools import chain
import numpy as np
import pandas as pd

#create df
df_p = pd.DataFrame([np.ones(1000, dtype=int),
             np.ones(1000, dtype=int),
             np.random.randint(0,500, 1000, dtype=int),
             np.random.randint(0,2, 1000, dtype=int)
             ], index=['IsBeta', 'IsProtected', 'Firewall', 'HasDetections']).T
df_p['AVProductStatesIdentifier'] = np.random.choice(['a', 'b', 'c'], 1000)

schema=StructType([StructField("IsBeta",IntegerType(),True),
                   StructField("AVProductStatesIdentifier",StringType(),True),
            StructField("IsProtected",IntegerType(),True),
            StructField("Firewall",IntegerType(),True),
            StructField("HasDetections",IntegerType(),True),
            ])

df = spark.createDataFrame(
    df_p[['IsBeta', 'AVProductStatesIdentifier', 'IsProtected', 'Firewall', 'HasDetections']],
    schema
)

首先,让我们将列AVProductStatesIdentifier分类

mapping = {l.AVProductStatesIdentifier:i for i,l in enumerate(df.select('AVProductStatesIdentifier').distinct().collect())}

mapping_expr = create_map([lit(x) for x in chain(*mapping.items())])

df = df.withColumn("AVProductStatesIdentifier", mapping_expr.getItem(col("AVProductStatesIdentifier")))

现在,让我们将其组合起来,并选择两个最重要的列

from pyspark.ml.feature import VectorAssembler
vec_assembler = VectorAssembler(inputCols = ["IsBeta","AVProductStatesIdentifier","IsProtected","Firewall"], outputCol="features")
vec_df = vec_assembler.transform(df)

selector = ChiSqSelector(numTopFeatures=2,featuresCol='features', fpr=0.05, outputCol="selectedFeatures",labelCol= "HasDetections")
model = selector.fit(vec_df)

现在执行:

np.array(df.columns)[model.selectedFeatures]

导致

array(['AVProductStatesIdentifier', 'Firewall'], dtype='<U25')

两个非常量列

相关问题 更多 >