1

기능 선택을 수행하는 PySpark가 있지만 원래의 기능 색인/설명으로 다시 매핑을 유지하거나 얻는 방법이 있습니까? 예를 들어PySpark 기능 선택 및 해석 기능

:

  1. I 원시 피쳐 스트링 (COL = "rawFeatures")의 열은 StringArray있다.
  2. CountVectorizer (col = "features")을 사용하여 수치로 변환했습니다.
  3. 는 다음 나는이 ChiSqSelector 상단 1000 기능 (COL = "selectedFeatures)를 선택 실행했습니다.

을 내가 그 위에 1000 기능에 따라 (또는 단지 원시 기능 문자열을 얻는 방법 원래 이러한 선택 기능의 인덱스에 대응하는 단계 2)에서 대장균을 "기능"

답변

2

이 정보를 사용 fittedTransformers 거슬러 올라간다으로 Pipeline 하나 이런 :.

from pyspark.ml.feature import * 
from pyspark.ml import Pipeline 
import numpy as np 

data = spark.createDataFrame(
    [(1, ["spark", "foo", "bar"]), (0, ["kafka", "bar", "foo"])], 
    ("label", "rawFeatures")) 

model = Pipeline(stages = [ 
    CountVectorizer(inputCol="rawFeatures", outputCol="features"), 
    ChiSqSelector(outputCol="selectedFeatures", numTopFeatures=2) 
]).fit(data) 

당신은 Transformers 추출 할 수 있습니다 :

vectorizer, chisq = model.stages 

과 비교 selectedFeaturesvocabulary과 :

np.array(vectorizer.vocabulary)[chisq.selectedFeatures] 
array(['spark', 'kafka'], dtype='<U5') 

불행하게도 Transformers의 조합이 유지되지 않는 라벨 메타 데이터 :

features_meta, selected_features_meta = (f.metadata for f in model 
    .transform(data).select("features", "selectedFeatures") 
    .schema 
    .fields) 

features_meta 
{} 
selected_features_meta 
{'ml_attr': {'attrs': {'nominal': [{'idx': 0}, {'idx': 1}]}, 'num_attrs': 2}}