Spark 多项式逻辑回归__二分类

package Spark_MLlib

import org.apache.spark.ml.Pipeline
import org.apache.spark.ml.classification.{LogisticRegression, LogisticRegressionModel}
import org.apache.spark.ml.evaluation.MulticlassClassificationEvaluator
import org.apache.spark.ml.feature.{IndexToString, StringIndexer, VectorIndexer}
import org.apache.spark.ml.linalg.Vectors
import org.apache.spark.sql.SparkSession

object 多项式逻辑回归__二分类 {
  val spark=SparkSession.builder().master("local").getOrCreate()
  import spark.implicits._  //支持把一个RDD隐式转换为一个DataFrame
  def main(args: Array[String]): Unit = {
    val df =spark.sparkContext.textFile("file:///home/soyo/桌面/spark编程测试数据/soyo.txt")
      .map(_.split(",")).map(x=>data_schema(Vectors.dense(x(0).toDouble,x(1).toDouble,x(2).toDouble,x(3).toDouble),x(4))).toDF()
    df.show(130)
    df.createOrReplaceTempView("data_schema")
    val df_data=spark.sql("select * from data_schema where label !=‘soyo2‘") //这里soyo2需要加单引号,不然报错
    // df_data.map(x=>x(1)+":"+x(0)).collect().foreach(println)
    df_data.show()
    val labelIndexer=new StringIndexer().setInputCol("label").setOutputCol("indexedLabel").fit(df_data)
    val featureIndexer=new VectorIndexer().setInputCol("features").setOutputCol("indexedFeatures").fit(df_data)  //目的在特征向量中建类别索引
    val Array(trainData,testData)=df_data.randomSplit(Array(0.7,0.3))
    val lr=new LogisticRegression().setLabelCol("indexedLabel").setFeaturesCol("indexedFeatures").setMaxIter(10).setRegParam(0.3).setElasticNetParam(0.8).setFamily("multinomial")//设置elasticnet混合参数为0.8,setFamily("multinomial"):设置为多项逻辑回归,不设置setFamily为二项逻辑回归
    val labelConverter=new IndexToString().setInputCol("prediction").setOutputCol("predictionLabel").setLabels(labelIndexer.labels)

    val lrPipeline=new Pipeline().setStages(Array(labelIndexer,featureIndexer,lr,labelConverter))
    val lrPipeline_Model=lrPipeline.fit(trainData)
    val lrPrediction=lrPipeline_Model.transform(testData)
    lrPrediction.show(false)
    // lrPrediction.take(100).foreach(println)
    //模型评估
    val evaluator=new MulticlassClassificationEvaluator().setLabelCol("indexedLabel").setPredictionCol("prediction")
    val lrAccuracy=evaluator.evaluate(lrPrediction)
    println("准确率为: "+lrAccuracy)
    val lrError=1-lrAccuracy
    println("错误率为: "+lrError)
    val LRmodel=lrPipeline_Model.stages(2).asInstanceOf[LogisticRegressionModel]
    println("二项逻辑回归模型系数矩阵: "+LRmodel.coefficientMatrix)
    println("二项逻辑回归模型的截距向量: "+LRmodel.interceptVector)
    println("类的数量(标签可以使用的值): "+LRmodel.numClasses)
    println("模型所接受的特征的数量: "+LRmodel.numFeatures)

  }

}

结果:

+-----------------+-----+
|         features|label|
+-----------------+-----+
|[5.1,3.5,1.4,0.2]|soyo1|
|[4.9,3.0,1.4,0.2]|soyo1|
|[4.7,3.2,1.3,0.2]|soyo1|
|[4.6,3.1,1.5,0.2]|soyo1|
|[5.0,3.6,1.4,0.2]|soyo1|
|[5.4,3.9,1.7,0.4]|soyo1|
|[4.6,3.4,1.4,0.3]|soyo1|
|[5.0,3.4,1.5,0.2]|soyo1|
|[4.4,2.9,1.4,0.2]|soyo1|
|[4.9,3.1,1.5,0.1]|soyo1|
|[5.4,3.7,1.5,0.2]|soyo1|
|[4.8,3.4,1.6,0.2]|soyo1|
|[4.8,3.0,1.4,0.1]|soyo1|
|[4.3,3.0,1.1,0.1]|soyo1|
|[5.8,4.0,1.2,0.2]|soyo1|
|[5.7,4.4,1.5,0.4]|soyo1|
|[5.4,3.9,1.3,0.4]|soyo1|
|[5.1,3.5,1.4,0.3]|soyo1|
|[5.7,3.8,1.7,0.3]|soyo1|
|[5.1,3.8,1.5,0.3]|soyo1|
+-----------------+-----+
only showing top 20 rows

+-----------------+-----+------------+------------------+------------------------------------------+----------------------------------------+----------+---------------+
|features         |label|indexedLabel|indexedFeatures   |rawPrediction                             |probability                             |prediction|predictionLabel|
+-----------------+-----+------------+------------------+------------------------------------------+----------------------------------------+----------+---------------+
|[4.6,3.1,1.5,0.2]|soyo1|0.0         |[4.6,3.1,1.5,1.0] |[0.3841092104753886,-0.384109210475388]   |[0.6831353764654857,0.3168646235345142] |0.0       |soyo1          |
|[4.6,3.2,1.4,0.2]|soyo1|0.0         |[4.6,3.2,1.4,1.0] |[0.4118074545189242,-0.41180745451892353] |[0.6950031457169539,0.3049968542830461] |0.0       |soyo1          |
|[4.6,3.4,1.4,0.3]|soyo1|0.0         |[4.6,3.4,1.4,2.0] |[0.41345332780578103,-0.41345332780578037]|[0.6957004614212158,0.30429953857878417]|0.0       |soyo1          |
|[4.7,3.2,1.6,0.2]|soyo1|0.0         |[4.7,3.2,1.6,1.0] |[0.39085103161962165,-0.390851031619621]  |[0.6860468315498303,0.31395316845016974]|0.0       |soyo1          |
|[4.9,3.0,1.4,0.2]|soyo1|0.0         |[4.9,3.0,1.4,1.0] |[0.37736738933115554,-0.377367389331155]  |[0.6802095073085258,0.3197904926914742] |0.0       |soyo1          |
|[4.9,3.1,1.5,0.1]|soyo1|0.0         |[4.9,3.1,1.5,0.0] |[0.4169034023763003,-0.4169034023762997]  |[0.697159256477463,0.302840743522537]   |0.0       |soyo1          |
|[5.0,3.0,1.6,0.2]|soyo1|0.0         |[5.0,3.0,1.6,1.0] |[0.356410966431853,-0.35641096643185244]  |[0.6710244037082002,0.32897559629179984]|0.0       |soyo1          |
|[5.0,3.4,1.5,0.2]|soyo1|0.0         |[5.0,3.4,1.5,1.0] |[0.4357693082570414,-0.4357693082570408]  |[0.705065751202206,0.2949342487977939]  |0.0       |soyo1          |
|[5.0,3.4,1.6,0.4]|soyo1|0.0         |[5.0,3.4,1.6,3.0] |[0.35970271300556683,-0.35970271300556617]|[0.6724760743873281,0.3275239256126718] |0.0       |soyo1          |
|[5.1,3.4,1.5,0.2]|soyo1|0.0         |[5.1,3.4,1.5,1.0] |[0.4357693082570414,-0.4357693082570408]  |[0.705065751202206,0.2949342487977939]  |0.0       |soyo1          |
|[5.4,3.4,1.7,0.2]|soyo1|0.0         |[5.4,3.4,1.7,1.0] |[0.4148128853577389,-0.41481288535773825] |[0.6962757951954652,0.3037242048045349] |0.0       |soyo1          |
|[5.6,2.8,4.9,2.0]|soyo3|1.0         |[5.6,2.8,4.9,12.0]|[-0.3845461875044362,0.38454618750443703] |[0.3166754764713344,0.6833245235286656] |1.0       |soyo3          |
|[5.7,3.8,1.7,0.3]|soyo1|0.0         |[5.7,3.8,1.7,2.0] |[0.45089882383236457,-0.4508988238323638] |[0.7113187796385543,0.2886812203614457] |0.0       |soyo1          |
|[5.7,4.4,1.5,0.4]|soyo1|0.0         |[5.7,4.4,1.5,3.0] |[0.5423812503940613,-0.5423812503940606]  |[0.7473941839256351,0.25260581607436505]|0.0       |soyo1          |
|[5.8,2.8,5.1,2.4]|soyo3|1.0         |[5.8,2.8,5.1,16.0]|[-0.5366793780073855,0.5366793780073863]  |[0.2547648665744027,0.7452351334255972] |1.0       |soyo3          |
|[6.0,2.2,5.0,1.5]|soyo3|1.0         |[6.0,2.2,5.0,7.0] |[-0.3343736350128348,0.33437363501283546] |[0.3387774047228901,0.6612225952771099] |1.0       |soyo3          |
|[6.2,2.8,4.8,1.8]|soyo3|1.0         |[6.2,2.8,4.8,10.0]|[-0.3084795922529615,0.30847959225296234] |[0.3504733529544735,0.6495266470455265] |1.0       |soyo3          |
|[6.3,2.9,5.6,1.8]|soyo3|1.0         |[6.3,2.9,5.6,10.0]|[-0.3750852512562874,0.3750852512562882]  |[0.3207841503157466,0.6792158496842534] |1.0       |soyo3          |
|[6.3,3.3,6.0,2.5]|soyo3|1.0         |[6.3,3.3,6.0,17.0]|[-0.5776773099857371,0.577677309985738]   |[0.23951239936093965,0.7604876006390604]|1.0       |soyo3          |
|[6.3,3.4,5.6,2.4]|soyo3|1.0         |[6.3,3.4,5.6,16.0]|[-0.485750239692336,0.4857502396923369]   |[0.2745815258875292,0.7254184741124707] |1.0       |soyo3          |
+-----------------+-----+------------+------------------+------------------------------------------+----------------------------------------+----------+---------------+
only showing top 20 rows

准确率为: 1.0
错误率为: 0.0
二项逻辑回归模型系数矩阵: 0.0  0.17220032593884316  -0.1047821144965127  -0.03279419190091169  
0.0  -0.172200325938843   0.10478211449651276  0.03279419190091169   
二项逻辑回归模型的截距向量: [0.04025556371065551,-0.04025556371065551]
类的数量(标签可以使用的值): 2
模型所接受的特征的数量: 4

时间: 2024-10-08 08:24:24

Spark 多项式逻辑回归__二分类的相关文章

Spark 多项式逻辑回归__多分类

package Spark_MLlib import org.apache.spark.ml.Pipeline import org.apache.spark.ml.classification.{BinaryLogisticRegressionSummary, LogisticRegression, LogisticRegressionModel} import org.apache.spark.ml.evaluation.MulticlassClassificationEvaluator i

Spark 二项逻辑回归__二分类

package Spark_MLlib import org.apache.spark.ml.Pipeline import org.apache.spark.ml.classification.{BinaryLogisticRegressionSummary, LogisticRegression, LogisticRegressionModel} import org.apache.spark.ml.evaluation.MulticlassClassificationEvaluator i

scikit-learn机器学习(二)逻辑回归进行二分类(垃圾邮件分类),二分类性能指标,画ROC曲线,计算acc,recall,presicion,f1

数据来自UCI机器学习仓库中的垃圾信息数据集 数据可从http://archive.ics.uci.edu/ml/datasets/sms+spam+collection下载 转成csv载入数据 import matplotlib matplotlib.rcParams['font.sans-serif']=[u'simHei'] matplotlib.rcParams['axes.unicode_minus']=False import pandas as pd import numpy as

机器学习---逻辑回归(二)(Machine Learning Logistic Regression II)

在<机器学习---逻辑回归(一)(Machine Learning Logistic Regression I)>一文中,我们讨论了如何用逻辑回归解决二分类问题以及逻辑回归算法的本质.现在来看一下多分类的情况. 现实中相对于二分类问题,我们更常遇到的是多分类问题.多分类问题如何求解呢?有两种方式.一种是方式是修改原有模型,另一种方式是将多分类问题拆分成一个个二分类问题解决. 先来看一下第一种方式:修改原有模型.即:把二分类逻辑回归模型变为多分类逻辑回归模型. (二分类逻辑回归称为binary

用二项逻辑斯蒂回归解决二分类问题

逻辑斯蒂回归: 逻辑斯蒂回归是统计学习中的经典分类方法,属于对数线性模型.logistic回归的因变量可以是二分类的, 也可以是多分类的 基本原理 logistic 分布 折X是连续的随机变量,X服从logistic分布是指X具有下列分布函数和密度函数: 其中为位置参数,为形状参数.与图像如下,其中分布函数是以为中心对阵,越小曲线变化越快 二项logistic回归模型: 二项logistic回归模型如下: 其中是输入,输出,W称为权值向量,b称为偏置, 是w和x的内积 参数估计 ? 假设: ?

机器学习之逻辑回归(二)

二项逻辑回归模型是如下的条件概率分布: 其中x∈是输入,y∈{0,1}是输出. 为了方便,将权值向量和输入向量进行扩充,此时w = ,x = ,回归模型表示如下: 参数w未知,采用统计学中的极大似然估计来由样本估计参数w.对于0-1分布x ~ B(1 , p),x的概率密度函数可以表示为: 其中k = 0或1. 构造极大似然函数: 取对数得: 同理对于二项逻辑回归,我们令: 则其似然函数为: 其中yi取值为0或1. 取对数得: 求上式的最大值等价于对上式取负号后的最小值问题,得: 问题就转换成了

逻辑回归-4.添加多项式特征

逻辑回归解决二分类问题,但是像下图所示的非线性数据集,是没办法用一条直线分割为两部分的. 对于此数据集,用一个圆形或者椭圆形分割是比较合理的,圆形的表达式:\(X_1^2 + X_2^2 - R^2 = 0\) 为了让逻辑回归学习到这样的决策边界,我们需要引入多项式项,\(X_1^2,X_2^2\)分别是\(X_1,X_2\)的二次多项式.使用多项式后,可以定义任意圆心位置的圆.椭圆或不规则形状的决策边界. 代码实现 构造数据集 import numpy import matplotlib.py

大白话5分钟带你走进人工智能-第二十节逻辑回归和Softmax多分类问题(5)

                                                    大白话5分钟带你走进人工智能-第二十节逻辑回归和Softmax多分类问题(5) 上一节中,我们讲解了逻辑回归的优化,本节的话我们讲解逻辑回归做多分类问题以及传统的多分类问题,我们用什么手段解决. 先看一个场景,假如我们现在的数据集有3个类别,我们想通过逻辑回归建模给它区分出来.但我们知道逻辑回归本质上是区分二分类的算法模型.难道没有解决办法了吗?办法还是有的,既然想分出3类,我们姑且称这3个类

机器学习笔记(六)逻辑回归

一.逻辑回归问题 二分类的问题为是否的问题,由算出的分数值,经过sign函数输出的是(+1,-1),想要输出的结果为一个几率值,则需要改变函数模型 ,其中,, 则逻辑回归的函数为 二.逻辑回归错误评价 线性分类和线性回归的模型为: 其中的线性分数函数均为,逻辑回归有同样的分数函数,模型为 逻辑回归的理想函数为 对于函数f(x),在数据情况下,D的所有数据在函数下的联合概率为 ,我们想要的模型h要使,则对于h来说,在数据D中也符合, 要使需要找到一个g使它发生的可能性最大,即 由 p(x1),p(