2017-07-31 6 views
2

私は星を持つデータセットに予測を行うスパークミリリットルで線形回帰を使用して1-5の範囲:Sparkの予測範囲を制限する方法は?

val lr = new LinearRegression() 
    .setMaxIter(10) 
    .setRegParam(0.3) 
    .setElasticNetParam(0.8) 
    .setFeaturesCol(featureCol).setLabelCol(labelCol) 

// Fit the model 
val lrModel = lr.fit(dataFrame) 
val result = lrModel.transform(data) 
result.show() 

しかし、> 5、いくつかの予測:

私は範囲で予測を制限するにはどうすればよい
+--------------------+-------+-----------+---+------------------+ 
| topicDistribution|user_id|business_id| s|  prediction| 
+--------------------+-------+-----------+---+------------------+ 
|[1.0,2.0,3.0,4.0,...| user|  item| 0|    0.0| 
|[0.01514119038647...|  2|   1| 4|4.3475413742362665| 
|[0.03940825720524...|  2|   4| 3| 6.916754074011433| 
|[0.01514116632977...|  2|   1| 4| 4.245671097612515| 
|[0.01786143737009...|  2|   5| 5| 4.753807934900515| 
|[0.03943774853904...|  2|   4| 3| 6.973022108753978| 
|[0.04868600587994...|  3|   2| 4| 3.648043391726578| 
|[0.01515983372328...|  2|   2| 4| 4.246801262511743| 
|[0.01786135762750...|  2|   1| 5| 4.753905610858851| 
|[0.03940799263407...|  2|   4| 3| 6.970579591530296| 
|[0.04868653016151...|  3|   2| 4|3.6480609281936154| 
+--------------------+-------+-----------+---+------------------+ 

[1,5]? または予測を[1,5]に変換する方法。

+0

は、自然、線形回帰常に無限の予測を提供しています。基本的に、2つの選択肢が残っています。 2番目の方法は、回帰の代わりに分類を使用し、結果を目的の範囲に再スケーリングすることです。しかし、第3の選択肢として、意思決定ツリーの回帰フォレストを使用しようとすることもできます。それらはトレーニング中に見られなかった範囲を超える値を予測できません。しかし、この解決法はこの共通の問題に取り組む一般的な方法ではありません。 – Quickbeam2k1

+0

希望する範囲に値を切り捨てる良い方法はありますか? –

+0

しかし、私はSparkでいくつかの解決策を探しています。 –

答えて

0

私は値をフィルタし、変更するにはスパークSQLを使用します。

def rangeColume(input:DataFrame, col:String):DataFrame={ 
input.createOrReplaceTempView("table") 
val filter1 = ss.sql("select * from table where prediction >=1 and prediction <=5") 
    .toDF("topicDistribution","user_id","business_id","s",col) 
val filter2 = ss.sql("select * from table where prediction <1 ") 
    .toDF("topicDistribution","user_id","business_id","s","prediction<1") 
val filter3 = ss.sql("select * from table where prediction >5 ") 
    .toDF("topicDistribution","user_id","business_id","s","prediction>5") 
val filter4 = filter2.withColumn(col, lit(1)) 
    .select("topicDistribution","user_id","business_id","s",col) 
val filter5 = filter3.withColumn(col, lit(5)) 
    .select("topicDistribution","user_id","business_id","s",col) 
return filter1.union(filter4).union(filter5) 
} 

誰かは多分よりよい解決策を持っています。

+0

機能は、単に値を返す他の値を1に設定します。たぶん-1から7程度の整数を含む単純なデータフレームでこれを試してみてください。 – Quickbeam2k1

0
val filter1 = ss.filter(" prediction") 
       .toDF("topicDistribution","user_id","business_id","s",col) 

これはあなたが試みる方法です。原因それに

関連する問題