0

開発者APIの例(https://github.com/apache/spark/blob/master/examples/src/main/scala/org/apache/spark/examples/ml/DeveloperApiExample.scala)は、分類モデルの関数predictRaw()の簡単な実装例を示しています。これは抽象クラスClassificationModel内の関数であり、具体クラスで実装する必要があります。次のように開発者向けAPIの例によれば、あなたはそれを計算することができます。BLAS.dot(features, coefficients)Apache Sparkで分類モデルのpredictRaw()を実装しようとしています

override def predictRaw(features: Features.Type): Vector = { 
    val margin = BLAS.dot(features, coefficients) 
    Vectors.dense(-margin, margin) // Binary classification so we return a length-2 vector, where index i corresponds to class i (i = 0, 1). 
} 

私の理解では、これは単に長さの係数ベクトルによって(長さnumFeaturesの)機能ベクトルの行列内積(であるということですnumFeatures)ので、効果的にそれぞれの 'フィーチャー' colsは係数によって差し引かれ、合計されてval marginになります。しかし、SparkはMLlibでプライベートであるためBLASライブラリへのアクセスを提供しなくなり、Matrixの特性には行列乗法が提供されます。行列の乗法には、乗算のためのさまざまなファクトリメソッドがあります。

次のように行列のファクトリメソッドを使用してpredictRaw()を実装する方法の私の理解では、次のとおりです。

override def predictRaw(features: Vector): Vector = { 

//coefficients is a Vector of length numFeatures: val coefficients = Vectors.zeros(numFeatures) 
val coefficientsArray = coefficients.toArray 
val coefficientsMatrix: SparkDenseMatrix = new SparkDenseMatrix(numFeatures, 1, coefficientsArray) 
val margin: Array[Double] = coefficientsMatrix.multiply(features).toArray // contains a single element 
val rawPredictions: Array[Double] = Array(-margin(0),margin(0)) 
new SparkDenseVector(rawPredictions) 
} 

これは、配列にデータ構造を変換するオーバーヘッドが必要になります。より良い方法がありますか? BLASは現在非公開です。 NB。コードはテストされていません!現時点ではval coefficients: Vectorはちょうどゼロのベクトルですが、学習アルゴリズムを実装すると結果が含まれます。

答えて

0

私はこれを解決したと思います。 predictRaw()はロジスティック回帰型の例の信頼区間を計算するため、Spark DeveloperAPIの例は非常に混乱します。しかし、実際に予測されるpredictRaw()は、ClassificationModelを実装するとき、入力データセットのi番目のサンプルごとに出力ラベルのベクトルを予測します。技術的には、上記の行列乗算はBLASを使用しなければ正しいですが、実際にはpredictRaw()はこのように計算する必要はありません。

基盤となるソースコードから: https://github.com/apache/spark/blob/v2.2.0/mllib/src/main/scala/org/apache/spark/ml/classification/Classifier.scala

* @return vector where element i is the raw prediction for label i. * This raw prediction may be any real number, where a larger value indicates greater * confidence for that label.

機能raw2predictは、生の予測から、実際のラベルを計算しますが、これはAPIによって行われているように実装する必要はありません。

関連する問題