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,数据预处理及获取训练集和测试集

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

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

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

5,模型优化

  特征标准化处理

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

6,总结

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

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

SparkMLlib分类算法之逻辑回归算法的更多相关文章

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

    SparkMLlib学习分类算法之逻辑回归算法 (一),逻辑回归算法的概念(参考网址:http://blog.csdn.net/sinat_33761963/article/details/51693 ...

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

    分类算法之逻辑回归(Logistic Regression) 1.二分类问题 现在有一家医院,想要对病人的病情进行分析,其中有一项就是关于良性\恶性肿瘤的判断,现在有一批数据集是关于肿瘤大小的,任务就 ...

  3. sklearn调用逻辑回归算法

    1.逻辑回归算法即可以看做是回归算法,也可以看作是分类算法,通常用来解决分类问题,主要是二分类问题,对于多分类问题并不适合,也可以通过一定的技巧变形来间接解决. 2.决策边界是指不同分类结果之间的边界 ...

  4. 逻辑回归算法的原理及实现(LR)

    Logistic回归虽然名字叫"回归" ,但却是一种分类学习方法.使用场景大概有两个:第一用来预测,第二寻找因变量的影响因素.逻辑回归(Logistic Regression, L ...

  5. 一小部分机器学习算法小结: 优化算法、逻辑回归、支持向量机、决策树、集成算法、Word2Vec等

    优化算法 先导知识:泰勒公式 \[ f(x)=\sum_{n=0}^{\infty}\frac{f^{(n)}(x_0)}{n!}(x-x_0)^n \] 一阶泰勒展开: \[ f(x)\approx ...

  6. Spark机器学习(2):逻辑回归算法

    逻辑回归本质上也是一种线性回归,和普通线性回归不同的是,普通线性回归特征到结果输出的是连续值,而逻辑回归增加了一个函数g(z),能够把连续值映射到0或者1. MLLib的逻辑回归类有两个:Logist ...

  7. 《BI那点儿事》Microsoft 逻辑回归算法——预测股票的涨跌

    数据准备:一组股票历史成交数据(股票代码:601106 中国一重),起止日期:2011-01-04至今,其中变量有“开盘”.“最高”.“最低”.“收盘”.“总手”.“金额”.“涨跌”等 UPDATE ...

  8. Python实现机器学习算法:逻辑回归

    import numpy as np import matplotlib.pyplot as plt from sklearn.datasets.samples_generator import ma ...

  9. 每日一个机器学习算法——LR(逻辑回归)

    本系列文章用于汇集知识点,查漏补缺,面试找工作之用.数学公式较多,解释较少. 1.假设 2.sigmoid函数: 3.假设的含义: 4.性质: 5.找一个凸损失函数 6.可由最大似然估计推导出 单个样 ...

随机推荐

  1. [poj] 3690 Constellations || 矩阵hash

    原题 在大矩阵里找有几个小矩阵出现过,多组数据 将t个矩阵hash值放入multiset,再把大矩阵中每个hash值从multiset里扔出去,这样最后剩在multiset里的值就是没有找到的小矩阵, ...

  2. 2-sat 学习笔记

    一.问题描述 以你咕的模板题为例 题目描述 有\(n\)个布尔变量\(x_1\)~\(x_n\),另有\(m\)个需要满足的条件,每个条件的形式都是"\(x_i\)为true/false或\ ...

  3. GDB调试——经验总结

    GDB调试的一些很有用经验: 1. gdb调试,如果有参数,可以在run命令后加,也可以使用set args :如果是使用gdbserver+gdb的远程调试方式,参数可以在gdbserver后面加. ...

  4. 禅与园林艺术(garden)

    禅与园林艺术(garden) 上了大学之后,小W和小Z一起报了一门水课,在做作业时遇到了问题. 有一个长度为nn的数列{ai},为一列树木的美观值. 现在有mm次询问,每次给出三个数l,r,p 询问对 ...

  5. 如何用js让表格的行也能拖动

    行拖动的实现思路非常简单,选中一行,往上拖就与上面的行交换位置,往下拖就与下面的行交换位置.问题是如何得到交换行.我见过一个非常详细的教程,它会把表格里的每一行的高度与Y坐标计算出来,换言之,都时是比 ...

  6. linux 大中括号变量解读

    Linux中的小括号和大括号,${}/$()/()/{}/${var:-string}/${var:=string}/${var:+string}/${var:?string}/${var%patte ...

  7. 关于"implicit declaration of function 'gettimeofday' is invalid in c99"的解决

    http://blog.csdn.net/macmini/article/details/10503799 当我们使用 gettimeofday(&time, NULL);时,会出现这样一个W ...

  8. UVA 763 Fibinary Numbers

    题意讲某个二进制按照规则每一位对应斐波那契数生成新的数字,然后2个数字求和.再求由该规则生成的二进制串.并且要求尽量用更大项的fib数(题目提示不能由连续的1就是2个连续的1(11)不如100更优) ...

  9. input框监控输入内容

    $(".input").bind("input porpertychange",function(){ console.log($(".input&q ...

  10. Python的网络编程[1] -> FTP 协议[0] -> FTP 的基本理论

    FTP协议 / FTP Protocol FTP全称为File Transfer Protocol(文件传输协议),常用于Internet上控制文件的双向传输,常用的操作有上传和下载.基于TCP/IP ...