3 回答
TA贡献1802条经验 获得超10个赞
我将从另一个角度提供答案,因为我还想知道Spark ML(不是MLlib)中基于树的模型的分类功能,并且文档尚不清楚一切如何工作。
当您使用pyspark.ml.feature.StringIndexer
额外的元数据转换数据框中的列时,该数据框中会存储额外的元数据,这些元数据专门将转换后的功能标记为分类功能。
当您打印数据框时,您将看到一个数字值(这是一个与类别值之一相对应的索引),如果您查看模式,您将看到新的转换列是type double
。但是,您pyspark.ml.feature.StringIndexer.transform
用来创建的新列不仅是普通的双列,而且还具有与之相关的额外元数据,这非常重要。您可以通过查看metadata
数据框的架构中适当字段的属性来检查此元数据(可以通过查看yourdataframe.schema来访问数据框的架构对象)
这些额外的元数据有两个重要含义:
当您
.fit()
使用基于树的模型进行调用时,它将扫描数据帧的元数据,并识别您使用诸如转换器(例如,pyspark.ml.feature.StringIndexer
如上所述)分类编码的字段(如上所述,还有其他转换器也将具有此效果,例如pyspark.ml.feature.VectorIndexer
)。因此,在Spark ML中使用基于树的模型时,在用StringIndxer转换特征后,不必对特征进行一键热编码(但是,在使用其他不使用特征的模型时,仍必须进行一键热编码)自然地处理线性回归等类别。)因为此元数据存储在数据帧中,所以您可以随时使用
pyspark.ml.feature.IndexToString
将数字索引恢复为原始分类值(通常是字符串)的方法。
添加回答
举报