2017-05-23 1 views
0

다음과 같은 코드를 사용하여 범주 형, 숫자 형, 문자열 형의 범주 형 기능을 혼합 한 다음 단호한 형식으로 코드화 한 다음 핫 코드 형 범주 형 기능을 모두 어셈블합니다 숫자 기능을 사용하여 무작위로 숲을 굴려 결과 트리를 인쇄합니다. 트리 노드가 원래 기능 이름 (예 : Frame_Size 등)을 갖기를 원합니다. 어떻게해야합니까? 일반적으로 어떻게 하나의 핫 인코딩 및 어셈블 된 기능을 디코딩 할 수 있습니까?pyspark unindex one-hot으로 인코딩 및 어셈블 된 열

# categorical features : start singindexing and one hot encoding 
    column_vec_in = ['Commodity','Frame_Size' , 'Frame_Shape', 'Frame_Color','Frame_Color_Family','Lens_Color','Frame_Material','Frame_Material_Summary','Build', 'Gender_Global', 'Gender_LC'] # frame Article_Desc not slected because the cardinality is too high 
    column_vec_out = ['Commodity_catVec', 'Frame_Size_catVec', 'Frame_Shape_catVec', 'Frame_Color_catVec','Frame_Color_Family_catVec','Lens_Color_catVec','Frame_Material_catVec','Frame_Material_Summary_catVec','Build_catVec', 'Gender_Global_catVec', 'Gender_LC_catVec'] 

    indexers = [StringIndexer(inputCol=x, outputCol=x+'_tmp') for x in column_vec_in ] 

    encoders = [OneHotEncoder(dropLast=False, inputCol=x+"_tmp", outputCol=y) for x,y in zip(column_vec_in, column_vec_out)] 
    tmp = [[i,j] for i,j in zip(indexers, encoders)] 
    tmp = [i for sublist in tmp for i in sublist] 



    #categorical and numeric features 
    cols_now = ['SODC_Regular_Rate','Commodity_catVec', 'Frame_Size_catVec', 'Frame_Shape_catVec', 'Frame_Color_catVec','Frame_Color_Family_catVec','Lens_Color_catVec','Frame_Material_catVec','Frame_Material_Summary_catVec','Build_catVec', 'Gender_Global_catVec', 'Gender_LC_catVec'] 
    assembler_features = VectorAssembler(inputCols=cols_now, outputCol='features') 
    labelIndexer = StringIndexer(inputCol='Lens_Article_Description_reduced', outputCol="label") 
    tmp += [assembler_features, labelIndexer] 



    # converter = IndexToString(inputCol="featur", outputCol="originalCategory") 
    # converted = converter.transform(indexed) 


    pipeline = Pipeline(stages=tmp) 

    all_data = pipeline.fit(df_random_forest_P_limited).transform(df_random_forest_P_limited) 


    all_data.cache() 
    trainingData, testData = all_data.randomSplit([0.8,0.2], seed=0) 


    rf = RF(labelCol='label', featuresCol='features',numTrees=10,maxBins=800) 
    model = rf.fit(trainingData) 

    print(model.toDebugString) 

스파크 기계 학습 파이프 라인을 실행 한 후 임의의 포리스트를 트리로 인쇄하려고합니다. 현재 아래처럼 보입니다. enter image description here

실제로보고 싶은 것은 기능 1, 기능 2 등이 아니라 원래의 범주 형 기능 이름입니다. 범주 형 기능이 핫 인코딩 및 벡터 어셈블 된 사실로 인해 기능을 색인 해제/디코딩하기가 어렵습니다. 이름. 어떻게 인코딩 된 onehot을 인코딩/디코딩 할 수 있습니까? "IndexToString()"을 사용해야한다는 막연한 생각이 있지만 숫자, 범주 형 기능이 혼합되어있어 하나의 핫 인코딩 및 어셈블 링이 이루어지기 때문에 확실하지 않습니다.

답변

0

JPMML-SparkML 라이브러리를 사용하여 Apache Spark ML 파이프 라인을 PMML 문서로 내 보냅니다. PMML 문서는 인간이 검사하고 해석 할 수 있으며 (예 : 메모장 사용) 프로그래밍 방식으로 처리 할 수 ​​있습니다 (예 : 다른 Java PMML API 라이브러리 사용).

"모델 스키마"는 /PMML/MiningModel/MiningSchema 요소로 표시됩니다. 각 "활성 지형지 물"은 MiningField 요소로 표시됩니다. 해당 /PMML/DataDictionary/DataField 요소를 찾아 "유형 정의"를 검색 할 수 있습니다.

편집 : 당신이 PySpark에 대해 물어 되었기 때문에, 당신은 수출을위한 JPMML-SparkML-Package 패키지를 사용하는 것이 좋습니다.

+0

데이터를 내 보내야합니까, 아니면 일부 속성이나 기능을 사용하여 스키마 및 데이터 필드를 볼 수 있습니까? – pratiklodha