Apache spark spark中Logistic回归的空系数
我正在尝试将一些机器学习算法应用到Spark(Java)中的数据集。 在尝试以下示例时: 系数矩阵是这样的:Apache spark spark中Logistic回归的空系数,apache-spark,Apache Spark,我正在尝试将一些机器学习算法应用到Spark(Java)中的数据集。 在尝试以下示例时: 系数矩阵是这样的: 3 x 4矩阵 (1,2) -0.7889290490451877 (0,3) 0.2989598305580243 (1,3) -0.36583869680195286 截距:[0.07898530675801645,-0.14799468898820128,0.06900938223018485] 如果我没有错的话, (1,2)-0.7889290490451877 (0,3)
3 x 4矩阵
(1,2) -0.7889290490451877
(0,3) 0.2989598305580243
(1,3) -0.36583869680195286
截距:[0.07898530675801645,-0.14799468898820128,0.06900938223018485]
如果我没有错的话,(1,2)-0.7889290490451877
(0,3) 0.2989598305580243
(1,3)-0.36583869680195286
代表每一类的“最佳拟合”模型
现在,当我尝试我的数据集时,它有4个不同的类和8192特性,系数是
4 x 8192矩阵
截距:[1.3629726436521425,0.7373644161565249,-1.0762606057817274,-1.0240764540269398]
我不熟悉逻辑回归算法,因此我无法理解为什么没有“最佳拟合”
我的代码
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());
在对分类器进行评估时,只对第一类进行了预测
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
顺便说一句,我将同样的数据集和上面相同的步骤应用到spark上的另一个机器学习算法中,效果很好 我在spark 2.1.1中的
spark.ml
和删除中的logisticsregression
时遇到了类似的问题。setElasticNetParam(0.8)
对我有效
另一种可能性是,您的数据集中存在高杠杆点(特征范围内的异常值),这会扭曲预测。谢谢,您能解释一下该参数的用途吗?当我们删除它时发生了什么?再次感谢。我的猜测是,
setElasticNetParam(0.8)
将迫使逻辑回归在L1和L2惩罚之间找到平衡,并且在大多数情况下,L1惩罚将把回归系数推到0并破坏分类器。这对我也有帮助。没想到文档中给出的默认参数值会引起问题。嘿,马哈茂德,你知道系数矩阵是什么吗?这是一个逻辑回归,因此我认为对于n个特征,权重应该简单地以1xn的形式表示。为什么每个类别都有多个权重,因为一组权重给出了每个类别的概率。对于每个类别,最适合的含义是什么?
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