2017-06-14 4 views
0

私はSparkからMLlibを使い始めました。私は単純なモデル(例えばロジスティック回帰)を訓練したい。私の期待は、ターゲットとして使用する列と、機能として扱う列をモデルに「伝える」必要があるということでした。Sparkで複数の列を1つのベクトル値の列に結合する方法は?

ただし、フィーチャ(値としてベクトルを含む列)が1つだけあるように見えます。

私の質問は次のとおりです。このようなベクトル値の列を作成する方法は?私が試してみました(しかし、それは動作しません)以下:私は、次のエラーメッセージが表示されますその結果

from pyspark.ml.feature import VectorAssembler 
assembler = VectorAssembler(inputCols=['_c0', '_c1', '_c2', '_c3', '_c4'], outputCol='feat_vec') 
df = assembler.transform(df) 

df = df.withColumn('feat_vec', [df['_c0'], df['_c1'], df['_c1'], df['_c3'], df['_c4']]) 

は、私もこれを試してみました

を追加しました:

pyspark.sql.utils.IllegalArgumentException: u'Data type StringType is not supported.' 
+1

私はあなたが間違っていると思います。 [こちら](https://stackoverflow.com/questions/32982425/encode-and-assemble-multiple-features-in-pyspark)をご覧ください。 –

+0

私の答えをここで確認してください。VectorAssembler:https://stackoverflow.com/questions/43355341/spark-pipeline-error/43378263#43378263 – TDrabas

+0

ここで問題が起きるとは分かりません@TDrabas – eliasah

答えて

3

VectorAssemblerを使用する方法行く。 linalg.VectorにはDoubleの値しか設定できません。 PipelineStringIndexer + OneHotEncoderを追加する必要があります。次に、生成された新しい列に対してアセンブラを使用できます。

E.G. (リンクより)

from pyspark.ml.feature import OneHotEncoder, StringIndexer 

df = spark.createDataFrame([ 
    (0, "a"), 
    (1, "b"), 
    (2, "c"), 
    (3, "a"), 
    (4, "a"), 
    (5, "c") 
], ["id", "category"]) 

stringIndexer = StringIndexer(inputCol="category", outputCol="categoryIndex") 
model = stringIndexer.fit(df) 
indexed = model.transform(df) 

encoder = OneHotEncoder(inputCol="categoryIndex", outputCol="categoryVec") 
encoded = encoder.transform(indexed) 
encoded.show() 

P.S.どうぞご覧くださいPipelines

+0

あなたの答えから私は何か役に立つ(基本的にスパークで1つのホットエンコーディングを行う方法を)学んだが、それは私の質問への答えを提供していない。私はカテゴリー的な特徴を持っていません。私が持っている機能は数字です(文字列として表現されていますが)。 – Roman

+0

多分私はこの問題を誤解しています。しかし、あなたのフィーチャが数値型で、String型しかない場合、それらをVectorAssemblerに渡す前にDoubleにキャストできませんか?質問にサンプルデータを追加できますか? – Gevorg

+0

あなたは正しいです。これがVectorAssemblerが機能しなかった理由です。まず、値が文字列であることを知らなかった。第二に、私は彼らが二重でなければならないか、浮いているか分からなかった。 – Roman

関連する問題