Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark spark中Logistic回归的空系数_Apache Spark - Fatal编程技术网

Apache spark spark中Logistic回归的空系数

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)

我正在尝试将一些机器学习算法应用到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) 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