Pra*_*nki 6 apache-spark pyspark apache-spark-ml
我有一个包含多个分类列的数据框。我正在尝试使用两列之间的内置函数查找卡方统计信息:
from pyspark.ml.stat import ChiSquareTest
r = ChiSquareTest.test(df, 'feature1', 'feature2')
Run Code Online (Sandbox Code Playgroud)
但是,它给了我错误:
IllegalArgumentException: 'requirement failed: Column feature1 must be of type struct<type:tinyint,size:int,indices:array<int>,values:array<double>> but was actually double.'
Run Code Online (Sandbox Code Playgroud)
的数据类型feature1
是:
feature1: double (nullable = true)
Run Code Online (Sandbox Code Playgroud)
你能帮我解决这个问题吗?
spark-ml
不是典型的统计库。它非常面向机器学习。因此,它假设您要在标签和特征或一组特征之间运行测试。
因此,与训练模型时类似,您需要针对标签组装要测试的特征。
在您的情况下,您可以feature1
按如下方式组装:
from pyspark.ml.stat import ChiSquareTest
from pyspark.ml.feature import VectorAssembler
data = [(1, 2), (3, 4), (2, 1), (4, 3)]
df = spark.createDataFrame(data, ['feature1', 'feature2'])
assembler = VectorAssembler().setInputCols(['feature1']).setOutputCol('features')
ChiSquareTest.test(assembler.transform(df), 'features', 'feature2').show(false)
Run Code Online (Sandbox Code Playgroud)
以防万一,Scala 中的代码:
import org.apache.spark.ml.stat.ChiSquareTest
import org.apache.spark.ml.feature.VectorAssembler
val df = Seq((1, 2, 3), (1, 2, 3), (4, 5, 6), (6, 5, 4))
.toDF("features", "feature2", "feature3")
val assembler = new VectorAssembler()
.setInputCols(Array("feature1"))
.setOutputCol("features")
ChiSquareTest.test(assembler.transform(df), "features", "feature2").show(false)
Run Code Online (Sandbox Code Playgroud)
为了扩展 Oli 的答案,Spark ML 希望将特征存储在pyspark.ml.linalg.Vector
. 有两种向量:
array<T>
size
,表示向量的完整维度indices
保存非零元素位置的数组values
保持所述非零元素的值阵列两种向量类型实际上都使用稀疏向量的结构来表示,而对于密集向量,indices
数组不再使用并values
存储所有值。第一个结构元素 ,type
用于区分这两种类型。
所以,如果你看到一个错误的东西期望struct<type:tinyint,size:int,indices:array<int>,values:array<double>>
,那意味着你应该传递一个实例pyspark.ml.linagl.Vector
而不仅仅是数字。
为了生成Vector
s,您可以使用pyspark.ml.feature.VectorAssembler
将一个或多个独立的特征列组装成单个向量列,或者使用工厂对象的工厂方法Vectors.dense()
(对于密集向量)和Vectors.sparse()
(对于稀疏向量)手动构建它们pyspark.ml.linalg.Vectors
。使用VectorAssembler
可能更容易也更快,因为它是在 Scala 中实现的。对于使用显式向量创建的,请咨询例如,对于ChiSquareTest
在PySpark文档。
归档时间: |
|
查看次数: |
8264 次 |
最近记录: |