web-dev-qa-db-ja.com

PySpark:MultilayerPerceptronClassifierから分類確率を取得する方法は?

私はPythonでSpark 2.0.1を使用しています。データセットはDataFrameにあるので、機械学習にML(MLLibではなく)ライブラリを使用しています。多層パーセプトロン分類子があり、ラベルは2つだけです。

私の質問は、ラベルだけでなく、そのラベルの確率も(またはのみ)取得することは可能ですか?すべての入力に対して0または1だけでなく、0に対して0.95、1に対して0.05のようなものです。これがMLPでは不可能であるが、他の分類子では可能である場合は、分類子を変更できます。 MLPを使用したのは、確率を返すことができるはずだとわかっているからですが、PySparkで見つけることができません。

私はこれについて同様のトピックを見つけました MultilayerPerceptronClassifierから分類確率を取得する方法は? しかし彼らはJavaを使用し、彼らが提案した解決策はPythonでは機能しません。

どうも

9
Ondrej

実際、バージョン2.0の時点で、Spark MLのMLPは分類確率を提供していないようです。それにもかかわらず、そうしている他の分類器がいくつかあります。つまり、 ロジスティック回帰Naive BayesDecision Tree 、および Random Forest 。最初と最後の短い例を次に示します。

from pyspark.ml.classification import LogisticRegression, RandomForestClassifier
from pyspark.ml.linalg import Vectors
from pyspark.sql import Row
df = sqlContext.createDataFrame([
     (0.0, Vectors.dense(0.0, 1.0)),
     (1.0, Vectors.dense(1.0, 0.0))], 
     ["label", "features"])
df.show()
# +-----+---------+ 
# |label| features| 
# +-----+---------+ 
# | 0.0 |[0.0,1.0]| 
# | 1.0 |[1.0,0.0]| 
# +-----+---------+

lr = LogisticRegression(maxIter=5, regParam=0.01, labelCol="label")
lr_model = lr.fit(df)

rf = RandomForestClassifier(numTrees=3, maxDepth=2, labelCol="label", seed=42)
rf_model = rf.fit(df)

# test data:
test = sc.parallelize([Row(features=Vectors.dense(0.2, 0.5)),
                       Row(features=Vectors.dense(0.5, 0.2))]).toDF()

lr_result = lr_model.transform(test)
lr_result.show()
# +---------+--------------------+--------------------+----------+
# | features|       rawPrediction|         probability|prediction|
# +---------+--------------------+--------------------+----------+
# |[0.2,0.5]|[0.98941878916476...|[0.72897310704261...|       0.0|
# |[0.5,0.2]|[-0.9894187891647...|[0.27102689295738...|       1.0|  
# +---------+--------------------+--------------------+----------+

rf_result = rf_model.transform(test)
rf_result.show()
# +---------+-------------+--------------------+----------+ 
# | features|rawPrediction|         probability|prediction| 
# +---------+-------------+--------------------+----------+ 
# |[0.2,0.5]|    [1.0,2.0]|[0.33333333333333...|       1.0| 
# |[0.5,0.2]|    [1.0,2.0]|[0.33333333333333...|       1.0| 
# +---------+-------------+--------------------+----------+

MLlibについては、私の答えを参照してください ここ ; PySpark分類のいくつかの文書化されていない直感に反する機能については、関連する ブログ投稿 を参照してください。

6
desertnaut