我想将一些机器学习算法应用于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
顺便说一句,我申请的同一数据集与上述相同的步骤在火花另一台机器学习算法,它工作正常!
谢谢,你能解释一下这个参数是什么吗?当我们删除它发生了什么?再次感谢。 –
我的猜测是'setElasticNetParam(0.8)'将强制逻辑回归在L1和L2惩罚之间找到一个平衡点,并且在大多数情况下,L1惩罚会将回归系数推到0并打破分类器。 – Chang