SparkMLlib学习分类算法之逻辑回归算法

SparkMLlib学习分类算法之逻辑回归算法

(一),逻辑回归算法的概念参考网址:http://blog.csdn.net/sinat_33761963/article/details/51693836

    逻辑回归与线性回归类似,但它不属于回归分析家族(主要为二分类),而属于分类家族,差异主要在于变量不同,因此其解法与生成曲线也不尽相同。逻辑回归是无监督学习的一个重要算法,对某些数据与事物的归属(分到哪个类别)及可能性(分到某一类别的概率)进行评估。

    

(二),SparkMLlib逻辑回归应用

1,数据集的选择:http://www.kaggle.com/c/stumbleupon/data 中的(train.txt和test.txt)

2,数据集描述:关于涉及网页中推荐的页面是短暂(短暂存在,很快就不流行了)还是长久(长时间流行)的分类

3,数据预处理及获取训练集和测试集

val orig_file=sc.textFile("train_nohead.tsv")
    //println(orig_file.first())
    val data_file=orig_file.map(_.split("\t")).map{
      r =>
        val trimmed =r.map(_.replace("\"",""))
        val lable=trimmed(r.length-1).toDouble
        val feature=trimmed.slice(4,r.length-1).map(d => if(d=="?")0.0
        else d.toDouble)
        LabeledPoint(lable,Vectors.dense(feature))
    }.randomSplit(Array(0.7,0.3),11L)
    val data_train=data_file(0)//训练集
    val data_test=data_file(1)//测试集

4,逻辑回归模型训练及模型评价

val model_log=new LogisticRegressionWithLBFGS().setNumClasses(2).run(data_train)
/*
有两种最优化算法可以求解逻辑回归问题并求出最优参数:mini-batch gradient descent(梯度下降法),L-BFGS法。我们更推荐使用L-BFGS,因为它能更快聚合,而且现在spark2.1.0已经放弃LogisticRegressionWithLSGD()模式了*/
/*性能评估:使用精确度,PR曲线,AOC曲线*/
 val predictionAndLabels=data_test.map(point =>
      (model_log.predict(point.features),point.label)
    )
    val metricsLG=new MulticlassMetrics(predictionAndLabels)//0.6079335793357934
val metrics=Seq(model_log).map{
      model =>
        val socreAndLabels=data_test.map {
          point => (model.predict(point.features), point.label)
        }
        val metrics=new BinaryClassificationMetrics(socreAndLabels)
        (model.getClass.getSimpleName,metrics.areaUnderPR(),metrics.areaUnderROC())
    }
val allMetrics = metrics
    allMetrics.foreach{ case (m, pr, roc) =>
      println(f"$m, Area under PR: ${pr * 100.0}%2.4f%%, Area under ROC: ${roc * 100.0}%2.4f%%")
    }
/*LogisticRegressionModel, Area under PR: 73.1104%, Area under ROC: 60.4200%*/

5,模型优化

  特征标准化处理

val orig_file=sc.textFile("train_nohead.tsv")
    //println(orig_file.first())
    val data_file=orig_file.map(_.split("\t")).map{
      r =>
        val trimmed =r.map(_.replace("\"",""))
        val lable=trimmed(r.length-1).toDouble
        val feature=trimmed.slice(4,r.length-1).map(d => if(d=="?")0.0
        else d.toDouble)
        LabeledPoint(lable,Vectors.dense(feature))
    }
   /*特征标准化优化*/
    val vectors=data_file.map(x =>x.features)
    val rows=new RowMatrix(vectors)
    println(rows.computeColumnSummaryStatistics().variance)//每列的方差
    val scaler=new StandardScaler(withMean=true,withStd=true).fit(vectors)//标准化
    val scaled_data=data_file.map(point => LabeledPoint(point.label,scaler.transform(point.features)))
        .randomSplit(Array(0.7,0.3),11L)
    val data_train=scaled_data(0)
    val data_test=scaled_data(1)
/*训练逻辑回归模型*/
    val model_log=new LogisticRegressionWithLBFGS().setNumClasses(2).run(data_train)
/*在使用模型做预测时,如何知道预测到底好不好呢?换句话说,应该知道怎么评估模型性能。
    通常在二分类中使用的评估方法包括:预测正确率和错误率、准确率和召回率、准确率 ? 召回率
    曲线下方的面积、 ROC 曲线、 ROC 曲线下的面积和 F-Measure*/
    val predictionAndLabels=data_test.map(point =>
      (model_log.predict(point.features),point.label)
    )
    val metricsLG=new MulticlassMetrics(predictionAndLabels)//精确度:0.6236162361623616
val metrics=Seq(model_log).map{
      model =>
        val socreAndLabels=data_test.map {
          point => (model.predict(point.features), point.label)
        }
        val metrics=new BinaryClassificationMetrics(socreAndLabels)
        (model.getClass.getSimpleName,metrics.areaUnderPR(),metrics.areaUnderROC())
    }
val allMetrics = metrics
    allMetrics.foreach{ case (m, pr, roc) =>
      println(f"$m, Area under PR: ${pr * 100.0}%2.4f%%, Area under ROC: ${roc * 100.0}%2.4f%%")
    }
/*LogisticRegressionModel, Area under PR: 74.1103%, Area under ROC: 62.0064%*/

6,总结

  1,如何能提高更明显的精度。。。。。

  2,对逻辑回归的认识还不够。。。。

时间: 2024-10-03 14:05:10

SparkMLlib学习分类算法之逻辑回归算法的相关文章

分类算法之逻辑回归(Logistic Regression

分类算法之逻辑回归(Logistic Regression) 1.二分类问题 现在有一家医院,想要对病人的病情进行分析,其中有一项就是关于良性\恶性肿瘤的判断,现在有一批数据集是关于肿瘤大小的,任务就是根据肿瘤的大小来判定是良性还是恶性.这就是一个很典型的二分类问题,即输出的结果只有两个值----良性和恶性(通常用数字0和1表示).如图1所示,我们可以做一个直观的判定肿瘤大小大于5,即为恶心肿瘤(输出为1):小于等于5,即为良性肿瘤(输出为0). 2.分类问题的本质 分类问题本质上属于有监督学习

21-城里人套路深之用python实现逻辑回归算法

如果和一个人交流时,他的思想像弹幕一样飘散在空中,将是怎样的一种景象?我想大概会毫不犹豫的点关闭的.生活为啥不能简单明了?因为太直白了令人乏味.保留一些不确定性反而扑朔迷离,引人入胜.我们学习了线性回归,对于损失函数及权重更新公式理解起来毫无压力,这是具体直白的好处.然而遇到抽象晦涩的逻辑回归,它的损失函数及权重更新公式就经历了从p(取值范围0~1)->p/(1-p)(取值范围0~+oo)->z=log(p/(1-p))(取值范围-oo~+oo)->p=1/1+e^(-z)->极大

逻辑回归算法-通俗易懂易实现

转自https://www.cnblogs.com/hum0ro/p/9652674.html,看到介绍的逻辑回归很容易理解算法原理及实现,拿来存档做记录 一直做图像处理算法和视频方面的嵌入式应用软件,早起研究和应用过神经网络算法,一直没有了解其他分类的机器学习算法,这段时间用空学习研究这些算法,如k-means,em聚类算法,查阅了许多资料,算法推倒的,结合举例说明有个直观印象,这样可以更好地理解算法,方便实现 1.什么是逻辑回归 在前面讲述的回归模型中,处理的因变量都是数值型区间变量,建立的

4.机器学习之逻辑回归算法

理论上讲线性回归模型既可以用于回归,也可以用于分类.解决回归问题,可以用于连续目标值的预测.但是针对分类问题,该方法则有点不适应,因为线性回归的输出值是不确定范围的,无法很好的一一对应到我们的若干分类中.即便是一个二分类,线性回归+阈值的方式,已经很难完成一个鲁棒性很好的分类器了.为了更好的实现分类,逻辑回归诞生了.逻辑回归(Logistic Regression)主要解决二分类问题,用来表示某件事情发生的可能性.逻辑回归是假设数据服从Bernoulli分布的,因此LR也属于参数模型,他的目的也

Spark MLlib Logistic Regression逻辑回归算法

1.1 逻辑回归算法 1.1.1 基础理论 logistic回归本质上是线性回归,只是在特征到结果的映射中加入了一层函数映射,即先把特征线性求和,然后使用函数g(z)将最为假设函数来预测.g(z)可以将连续值映射到0和1上. 它与线性回归的不同点在于:为了将线性回归输出的很大范围的数,例如从负无穷到正无穷,压缩到0和1之间,这样的输出值表达为"可能性"才能说服广大民众.当然了,把大值压缩到这个范围还有个很好的好处,就是可以消除特别冒尖的变量的影响. Logistic函数(或称为Sigm

(7) 逻辑回归算法

逻辑回归算法原理推导 逻辑回归,虽然叫回归,但还是一个分类算法  逻辑回归求解 原文地址:https://www.cnblogs.com/traditional/p/9385259.html

逻辑回归算法实现_基于R语言

逻辑回归(Logistic Regression)模型和线性回归非常相似,可以说就是在逻辑回归的基础上加上了一步逻辑转换,也就是因为这个转换,使逻辑回归模型非常适用于二分类问题的概率预测.本文主要详述逻辑回归模型的基础以及逻辑回归模型的R语言实现. 一.逻辑回归模型原理 首先要讲一下线性回归在预测分类事件中的缺点:线性回归模型的泛化能力很差,如果训练集存在噪点,会导致模型的结果特别差,不同样本建立起来的模型分割点不同:下图中根据年龄预测是否成年的分类问题,斜线就是根据训练集拟合出来的线性回归模型

用Python实现岭回归算法与Lasso回归算法并处理Iris数据集

在介绍岭回归算法与Lasso回归算法之前,先要回顾一下线性回归算法.根据线性回归模型的参数估计公式可知可知,得到的前提是矩阵可逆.换句话说就是样本各个特征(自变量)之间线性无关.然而在实际问题中,常常会出现特征之间出现多重共线性的情况,使得行列式的值接近于0,最终造成回归系数无解或者无意义. 为了解决这个问题,岭回归算法的方法是在线性回归模型的目标函数之上添加一个l2的正则项,进而使得模型的回归系数有解.具体的岭回归目标函数可表示为如下: 在Python中,岭回归算法的实现方法如下. 在Pyth

机器学习分类算法之逻辑回归

一.概念 逻辑回归(Logistic Regression,LR)是一种广义的线性回归分析模型,属于监督学习算法,需要打标数据,可以用在回归.二分类和多分类等问题上,最常用的是二分类. 线性回归就是通过一条曲线区分不同的数据集,在二分类问题上会有一条直线对其进行区分,如下: 逻辑回归需要每组数据都是都是数值型的,因为需要对其进行运算,得到直线系数,打标数据一般是0和1. 二.计算 逻辑回归的输出是一组特征系数,使用了 y=wx+b这种函数来进行线性拟合,这个问题的y值不是0,就是1.使用上述函数