複数のカテゴリー列を持つデータフレームがあります。 2つの列の間の組み込み関数を使用して、二乗統計を見つけようとしています。
from pyspark.ml.stat import ChiSquareTest
r = ChiSquareTest.test(df, 'feature1', 'feature2')
しかし、それは私にエラーを与えます:
IllegalArgumentException: 'requirement failed: Column feature1 must be of type struct<type:tinyint,size:int,indices:array<int>,values:array<double>> but was actually double.'
feature1
のデータ型は次のとおりです。
feature1: double (nullable = true)
これに関して私を助けていただけませんか?
spark-ml
は一般的な統計ライブラリではありません。非常に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)
念のため、スカラのコード:
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("feature1, "feature2", "feature3")
val assembler = new VectorAssembler()
.setInputCols(Array("feature1"))
.setOutputCol("features")
ChiSquareTest.test(assembler.transform(df), "features", "feature2").show(false)
Oliの答えをさらに詳しく説明すると、Spark MLは機能が_pyspark.ml.linalg.Vector
_のインスタンスに格納されることを期待しています。2種類のベクトルがあります:
array<T>
_で表されますsize
indices
配列values
配列両方のベクトルタイプは、実際には疎ベクトルの構造を使用して表されますが、高密度ベクトルの場合、indices
配列は使用されず、values
はすべての値を格納します。最初の構造要素type
は、2つの種類を区別するために使用されます。
したがって、何かが_struct<type:tinyint,size:int,indices:array<int>,values:array<double>>
_を予期しているというエラーが表示された場合、それは単なる数値ではなく_pyspark.ml.linagl.Vector
_のインスタンスを渡すことを意味しています。
Vector
sを生成するには、_pyspark.ml.feature.VectorAssembler
_を使用して1つ以上の独立した特徴列を単一のベクトル列にアセンブルするか、ファクトリメソッドVectors.dense()
を使用して手動で構築します(密なベクトル)とVectors.sparse()
(スパースベクトルの場合)は、ファクトリオブジェクト_pyspark.ml.linalg.Vectors
_の。 VectorAssembler
はScalaに実装されているため、おそらくより簡単で高速です。明示的なベクトル作成の使用については、PySparkドキュメントの example for ChiSquareTest
を参照してください。