2017-09-09 45 views
0

我想将一些机器学习算法应用于Spark(Java)中的数据集。 当尝试的 Logistic regression in spark 的例子中CoefficientMatrixis是这样的: 3 x 4 CSCMatrix (1,2) -0.7889290490451877 (0,3) 0.2989598305580243 (1,3) -0.36583869680195286 Intercept: [0.07898530675801645,-0.14799468898820128,0.06900938223018485]火花逻辑回归中的空系数

如果我没有错,
(1,2) -0.7889290490451877 (0,3) 0.2989598305580243 (1,3) -0.36583869680195286表示“最适合”的模式,每类。

现在,当我想我的数据集,其中有4个不同的类别和8192的功能,该系数是 4 x 8192 CSCMatrix Intercept: [1.3629726436521425,0.7373644161565249,-1.0762606057817274,-1.0240764540269398]

我不熟悉的Logistic回归算法,所以我不明白为什么没有“最合适”?

我的代码

HashingTF hashingTF = new HashingTF() 
       .setInputCol("listT") 
       .setOutputCol("rawFeatures") 
       .setNumFeatures(8192) ; 
Dataset<Row> featurizedData = hashingTF.transform(ReviewRawData); 
     featurizedData.show(); 
     IDF idf = new IDF().setInputCol("rawFeatures").setOutputCol("features"); 
     IDFModel idfModel = idf.fit(featurizedData); 
     Dataset<Row> rescaledData = idfModel.transform(featurizedData); 
//add the label col based on some conditions 
     Dataset<Row> lebeldata = rescaledData.withColumn("label",newCol); 
     lebeldata.groupBy("label").count().show(); 
Dataset<Row>[] splits = lebeldata.select("label","features").randomSplit(new double[]{0.7, 0.3}); 
     Dataset<Row> train = splits[0]; 
     Dataset<Row> test = splits[1]; 

     LogisticRegression lr = new LogisticRegression() 
       .setMaxIter(10) 
       .setRegParam(0.3) 
       .setElasticNetParam(0.8) 
       .setLabelCol("label") 
       .setFeaturesCol("features") 
       .setFamily("multinomial"); 

     LogisticRegressionModel lrModel = lr.fit(train); 
     System.out.println("Coefficients: \n" 
       + lrModel.coefficientMatrix() + " \nIntercept: " + 
     lrModel.interceptVector()); 

我的数据集

+-----+-----+ 
|label|count| 
+-----+-----+ 
| 0.0| 6455| 
| 1.0| 3360| 
| 3.0| 599| 
| 2.0| 560| 
+-----+-----+ 

而当评价分类,仅仅是第一类的预测。

Class 0.000000 precision = 0.599511 
Class 0.000000 recall = 1.000000 
Class 0.000000 F1 score = 0.749618 
Class 1.000000 precision = 0.000000 
Class 1.000000 recall = 0.000000 
Class 1.000000 F1 score = 0.000000 
Class 2.000000 precision = 0.000000 
Class 2.000000 recall = 0.000000 
Class 2.000000 F1 score = 0.000000 
Class 3.000000 precision = 0.000000 
Class 3.000000 recall = 0.000000 
Class 3.000000 F1 score = 0.000000 

顺便说一句,我申请的同一数据集与上述相同的步骤在火花另一台机器学习算法,它工作正常!

回答

0

我在Spark 2.1.1中从spark.mlLogisticRegression类似的问题,并删除.setElasticNetParam(0.8)为我工作。

另一种可能性是,您的数据集中存在高杠杆点(特征范围内的异常值),这会使预测偏斜。

+0

谢谢,你能解释一下这个参数是什么吗?当我们删除它发生了什么?再次感谢。 –

+0

我的猜测是'setElasticNetParam(0.8)'将强制逻辑回归在L1和L2惩罚之间找到一个平衡点,并且在大多数情况下,L1惩罚会将回归系数推到0并打破分类器。 – Chang