pyspark unindex单热编码和组装列

时间:2017-05-23 15:37:42

标签: pyspark pipeline random-forest one-hot-encoding

我有以下代码,它将分类,数字特征,字符串索引混合为分类特征,然后对分类特征进行热编码,然后组合一个热编码分类特征和数字特征,通过随机运行它们森林和打印结果树。我希望树节点具有原始功能名称(即Frame_Size等)。我怎样才能做到这一点?一般来说,如何解码一个热编码和汇编的功能?

    # 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)

在我运行spark机器学习管道之后,我想将随机森林打印成树。目前它看起来像下面。enter image description here

我真正想要看到的是原始的分类特征名称,而不是特征1,特征2等。分类特征是一个热编码和矢量组合的事实使我很难取消索引/解码特征名称。如何在pyspark中unidex / decode onehot编码和汇编的特征向量?我有一个模糊的想法,我必须使用“IndexToString()”,但我不完全确定,因为有混合的数字,分类功能,他们是一个热编码和组装。

1 个答案:

答案 0 :(得分:0)

使用JPMML-SparkML库将Apache Spark ML管道导出到PMML文档。 PMML文档可由人类检查和解释(例如,使用记事本),或以编程方式处理(例如,使用其他Java PMML API库)。

“模型架构”由/PMML/MiningModel/MiningSchema元素表示。每个“活动特征”由MiningField元素表示;您可以通过查找相应的/PMML/DataDictionary/DataField元素来检索其“类型定义”。

编辑 :由于您询问的是PySpark,您可以考虑使用JPMML-SparkML-Package包进行导出。