如何使用 PySpark 的 ChiSqSelector 检查选定的功能?
How to check selected features with PySpark's ChiSqSelector?
我正在使用 PySpark 的 ChiSqSelector select 最重要的功能。代码是 运行 好吧,但是我无法根据索引或名称验证我的功能。
所以我的问题是:如何识别selectedFeatures中的值指的是什么?
我有下面的示例代码,为了便于可视化,我只使用了四列,但是,我必须为将近 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())
然而,在尝试应用我在 中找到的解决方案时。我仍然无法理解哪些列是 selected 的名称或索引。也就是说,select编辑了哪些功能。
model = selector.fit(vec_df)
model.selectedFeatures
首先:请不要使用一个热编码特征,ChiSqSelector 应该直接用于分类(非编码)列,如您所见here。
如果没有 one-hot 编码的东西,selector 用法很简单:
现在让我们看看如何使用ChiSqSelector以及如何通过名称查找相关特征。
例如,我将创建一个只有 2 个相关列(AVProductStatesIdentifier 和 Firewall)的 df,其他 2 个(IsBeta 和 IsProtected)将保持不变:
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")))
现在,让我们 assemble 和 select 最重要的 2 列
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')
两个非常量列。
我正在使用 PySpark 的 ChiSqSelector select 最重要的功能。代码是 运行 好吧,但是我无法根据索引或名称验证我的功能。
所以我的问题是:如何识别selectedFeatures中的值指的是什么?
我有下面的示例代码,为了便于可视化,我只使用了四列,但是,我必须为将近 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())
然而,在尝试应用我在
model = selector.fit(vec_df)
model.selectedFeatures
首先:请不要使用一个热编码特征,ChiSqSelector 应该直接用于分类(非编码)列,如您所见here。 如果没有 one-hot 编码的东西,selector 用法很简单:
现在让我们看看如何使用ChiSqSelector以及如何通过名称查找相关特征。 例如,我将创建一个只有 2 个相关列(AVProductStatesIdentifier 和 Firewall)的 df,其他 2 个(IsBeta 和 IsProtected)将保持不变:
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")))
现在,让我们 assemble 和 select 最重要的 2 列
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')
两个非常量列。