2016-06-25 13 views
1

をモデリングするとき、私はちょうどCentOSの上sparkR 1.6.1をインストールしているとのHadoopを使用していない確率を予測する方法。次のように個別の「ターゲット」の値を使用してデータをモデル化するための私のコードは次のとおりです。sparkR 1.6:GLM(二項ファミリ)

# 'tr' is a R data frame with 104 numeric columns and one TARGET column 
# TARGET column is either 0 or 1 
# Convert 'tr' to spark data frame 

train <- createDataFrame(sqlContext, tr) 

# test is an R dataframe without TARGET column 
# Convert 'test' to spark Data frame 
te<-createDataFrame(sqlContext,test) 
# Using sparkR's glm model to model data 
model <- glm(TARGET ~ . , data = train, family = "binomial") 
# Make predictions 
predictions <- predict(model, newData = te) 

私は次のように成功したか失敗したかを評価することができる午前(私は正しい午前願っています):

modelPrediction <- select(predictions, "prediction") 
head(modelPrediction) 

    prediction 
1   0 
2   0 
3   0 
4   0 
5   0 
6   0 

しかし、ときに私確率を評価したい場合は、次のような結果が得られます。

modelPrediction <- select(predictions, "probability") 
head(modelPrediction) 

       probability 
1 <environment: 0x6188e1c0> 
2 <environment: 0x61894b88> 
3 <environment: 0x6189a620> 
4 <environment: 0x618a00b8> 
5 <environment: 0x618a5b50> 
6 <environment: 0x618ac550> 

テストイベントの確率値を得るために助けてください。ありがとう。

+0

頭の結果を含めることができますか? – SpiritusPrana

答えて

1

背景:あなたのRコードは、スパークバックエンドからいくつかの計算の結果を要求し、スパークは、計算を行い、その結果をシリアライズします。この結果はR側で逆シリアル化され、Rオブジェクトが取得されます。

さて、それはスパークバックエンドで動作する方法がある - それは返されるオブジェクトの型がCharacterの1、StringLongFloatDoubleIntegerBooleanDateTimeStampまたはそのあることを数字場合などの場合、オブジェクトを直列化します。しかし、型がこれらのいずれとも一致しないと判明した場合、オブジェクトにIDを割り当て、そのIDに対してメモリに格納し、このIDをRクライアントに送信します。 (RBackendHandlerJVMObjectTrackerは、スパークバックエンドでのJVMオブジェクトを追跡する責任がある。)これは、次いでR側jobjクラスにデシリアライズされます。 (あなたは、先行連載されているものの全体像を得るためにSerDe.scalawriteObject方法を見てものではありませんすることができます。)

さて、R側で、あなたのpredictionsデータフレームのprobability列にオブジェクトを見れば、彼らのクラスはjobjであることがわかります。前述のように、このクラスのオブジェクトは、Sparkクラスタに保持されている実際のJavaオブジェクトの代理として機能します。この特定の場合、バッキングJavaクラスはorg.apache.spark.mllib.linalg.DenseVectorです。これは、各クラスの確率を含むベクトルです。このベクトルはSerDeクラスでサポートされているシリアライズされたタイプの1つではないため、スパークバックエンドはjobjプロキシを返し、これらのオブジェクトを将来の操作を可能にするためメモリに格納します。

この背景では、これらのDenseVectorオブジェクトでメソッドを呼び出すことによって、Rフロントエンドの確率値を取得できるはずです。今のところ、これが唯一の方法だと私は思う。 SparkR:::接頭辞の機能がSparkRでエクスポートされていません。セットアイリスデータのために動作するコードを以下に示し -

 [,1]   [,2] 
1 3.036612e-15 1.000000e+00 
2 5.919287e-12 1.000000e+00 
3 7.831827e-14 1.000000e+00 
4 7.712003e-13 1.000000e+00 
5 4.427117e-16 1.000000e+00 
6 3.816329e-16 1.000000e+00 
[...] 

注 -

irisDf <- createDataFrame(sqlContext, iris) 
irisDf$target <- irisDf$Species == 'setosa' 
model <- glm(target ~ . , data = irisDf, family = "binomial") 
summary(model) 
predictions <- predict(model, newData = irisDf) 
modelPrediction <- select(predictions, "probability") 
localPredictions <- SparkR:::as.data.frame(predictions) 

getValFrmDenseVector <- function(x) { 
    #Given it's binary classification there are just two elems in vector 
    a <- SparkR:::callJMethod(x$probability, "apply", as.integer(0)) 
    b <- SparkR:::callJMethod(x$probability, "apply", as.integer(1)) 
    c(a, b) 
} 

t(apply(localPredictions, 1, FUN=getValFrmDenseVector)) 

はこれで私は2つのクラスのために、次のprobabilty出力を得ますパッケージ名前空間。だから、あなたはパッケージプライベートな実装に対してコーディングしていることに留意してください。 (ただし、Sparkが公開APIを提供していない限り、これが他の方法で実現できるかどうかは実際には分かりません)

+0

お寄せいただきありがとうございます。提案されたソリューションが機能します。そしてあなたが正しく言及したように、callJMethod()はsparkRシェルの助けを借りません。これはsparkRBackend.Rの一部です。一方、私はこのコードを使って結果を得ることもできました: modelPrediction < - select(predictions、 "確率"); シンク( "abc.txt"); modelPrediction%>%showDF(numRows = 78000、truncate = FALSE); sink() – user3282777

+0

クール、ありがとう。私はshowDF関数も見ていきます。 (でも、それでは、コードの中から確率値を参照することはできません。 –

+0

あなたは100%正しいです。 – user3282777