如何使用spark-ml处理分类功能?

如何使用 spark-ml 和不 处理分类数据spark-mllib?


如果文档不是很清楚,似乎分类器(例如RandomForestClassifier)LogisticRegression具有一个featuresCol参数,该参数指定中的要素列的名称DataFrame,一个labelCol参数,其指定中的标记类的列的名称DataFrame。


显然,我要在预测中使用多个特征,因此我尝试使用VectorAssembler将所有特征放在下的单个向量中featuresCol。


但是,VectorAssembler仅接受数字类型,布尔类型和向量类型(根据Spark网站),因此我无法将字符串放入特征向量中。


我应该如何进行?


弑天下
浏览 757回答 3
3回答

守候你守候我

我将从另一个角度提供答案,因为我还想知道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将数字索引恢复为原始分类值(通常是字符串)的方法。
打开App,查看更多内容
随时随地看视频慕课网APP