web-dev-qa-db-ja.com

IllegalArgumentException:列はstruct <type:tinyint、size:int、indices:array <int>、values:array <double >>型である必要がありますが、実際にはdoubleでした。

複数のカテゴリー列を持つデータフレームがあります。 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)

これに関して私を助けていただけませんか?

2
Pratham Solanki

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)
4
Oli

Oliの答えをさらに詳しく説明すると、Spark MLは機能が_pyspark.ml.linalg.Vector_のインスタンスに格納されることを期待しています。2種類のベクトルがあります:

  • 密なベクトル-これらは、すべてのゼロを含む、ベクトルのすべての要素を保持する単純な配列であり、Spark配列型_array<T>_で表されます
  • スパースベクトル-ベクトルの非ゼロ要素のみを格納するより複雑なデータ構造であり、非ゼロの数が少ない巨大なベクトルをコンパクトに格納できます。スパースベクトルには3つのコンポーネントがあります。
    • ベクトルの完全な次元を示す整数size
    • ゼロ以外の要素の位置を保持するindices配列
    • 非ゼロ要素の値を保持するvalues配列

両方のベクトルタイプは、実際には疎ベクトルの構造を使用して表されますが、高密度ベクトルの場合、indices配列は使用されず、valuesはすべての値を格納します。最初の構造要素typeは、2つの種類を区別するために使用されます。

したがって、何かが_struct<type:tinyint,size:int,indices:array<int>,values:array<double>>_を予期しているというエラーが表示された場合、それは単なる数値ではなく_pyspark.ml.linagl.Vector_のインスタンスを渡すことを意味しています。

Vectorsを生成するには、_pyspark.ml.feature.VectorAssembler_を使用して1つ以上の独立した特徴列を単一のベクトル列にアセンブルするか、ファクトリメソッドVectors.dense()を使用して手動で構築します(密なベクトル)とVectors.sparse()(スパースベクトルの場合)は、ファクトリオブジェクト_pyspark.ml.linalg.Vectors_の。 VectorAssemblerはScalaに実装されているため、おそらくより簡単で高速です。明示的なベクトル作成の使用については、PySparkドキュメントの example for ChiSquareTest を参照してください。

2
Hristo Iliev