Spark Mllib之线性SVM和逻辑回归

2024-09-01 08:32

本文主要是介绍Spark Mllib之线性SVM和逻辑回归,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

微信公众号:数据挖掘与分析学习

1.Mathematical formulation

许多标准机器学习方法可以被公式化为凸优化问题,即找到取决于具有d个条目的变量向量w(在代码中称为权重)的凸函数f的最小化的任务。形式上,我们可以将其写为优化问题,其中目标函数形式如下:

这里向量xi∈Rd是训练数据的样本,对于1≤i≤n,yi∈R是它们对应的我们想要预测的标签。如果L(w; x,y)可以表示为wTx和y的函数,则称该方法是线性的。spark.mllib的几个分类和回归算法属于这一类,并在此处讨论。目标函数f有两部分:控制模型复杂性的正则化部分,以及测量模型对训练数据的误差的损失部分。损失函数L(w;.)通常是权重w的凸函数。固定正则化参数λ≥0(代码中的regParam)定义了最小化损失(即,训练误差)和最小化模型复杂度(即,避免过度拟合)这两个目标之间的权衡。

1.1损失函数

下表总结了spark.mllib支持的方法的损失函数及其渐变或子梯度:

注意,在上面的数学公式中,二元标签y表示为+ 1(正)或-1(负),这便于计算。但是,负标签在spark.mllib中由0表示,而不是-1,以与多分类标签一致。

 

1.2正则化

正则化器的目的是鼓励简单模型并避免过度拟合。 spark.mllib中我们支持以下正规化器:

这里sign(w)是由w的所有条目的sign(±1)组成的向量。由于平滑性,L2正则化问题通常比L1正则化更容易解决。然而,L1正则化可以帮助促进权重的稀疏性,从而导致更小和更可解释的模型,后者可以用于特征选择。 Elastic net是L1和L2正则化的组合。不建议在没有任何正则化的情况下训练模型,特别是当训练样本的数量很少时。

 

1.3 优化

线性模型使用凸优化方法来优化目标函数。spark.mllib使用两种方法,SGD和L-BFGS。目前,大多数算法API支持随机梯度下降(SGD),少数支持L-BFGS。

 

2.分类

分类旨在将输入项目分为不同类别。最常见的分类类型是二分类,其中有两类,通常称为正类和负类。如果有两个以上的类别,则称为多类分类。spark.mllib支持两种线性分类方法:线性支持向量机(SVM)和逻辑回归。线性SVM仅支持二分类,而逻辑回归支持二分类和多类分类问题。对于这两种方法,spark.mllib支持L1和L2正则化。训练数据集由MLlib中LabeledPoint的RDD表示,其中标签是从零开始的类索引:0,1,2,...

 

2.1线性SVM(Linear Support Vector Machines)

线性SVM是大规模分类任务的标准方法。它是如上面等式(1)中所述的线性方法,其中由hinge损失给出的公式中的损失函数:

默认情况下,线性SVM使用L2正则化进行训练。我们还支持使用L1正则化。在这种情况下,问题变成线性。线性SVM算法输出SVM模型。给定一个新的数据点,用x表示,该模型根据wTx的值进行预测。默认情况下,如果wTx≥0则结果为正,否则为负。

 

MLlib的所有方法都使用Java友好类型,因此您可以像在Scala中一样导入和调用它们。唯一需要注意的是,这些方法使用Scala RDD对象,而Spark Java API使用单独的JavaRDD类。您可以通过在JavaRDD对象上调用.rdd()将Java RDD转换为Scala。下面给出了一个与Scala中提供的示例等效的应用程序示例:

 

       SparkConf conf = new SparkConf().setAppName("JavaSVMWithSGDExample").setMaster("local");

       SparkContext sc = new SparkContext(conf);

       String path = "F:\\Learning\\java\\project\\LearningSpark\\src\\main\\resources\\sample_libsvm_data.txt";

       JavaRDD<LabeledPoint> data = MLUtils.loadLibSVMFile(sc, path).toJavaRDD();

       data.take(2);

       System.out.println(data.take(2).get(0).features().size()); // 692个特征

       System.out.println(data.take(2).get(1).features().size());

       // RDD划分为两部分,60%作为训练数据,40%为测试数据

       JavaRDD<LabeledPoint> training = data.sample(false, 0.6, 11L); // 训练数据

       training.cache();

 

       JavaRDD<LabeledPoint> test = data.subtract(training);// 测试数据

 

       // 模型训练

       int numIterations = 100;

       SVMModel model = SVMWithSGD.train(training.rdd(), numIterations);

 

       model.clearThreshold();

      

      

//     //在测试数据集上计算得分

//     JavaRDD<Tuple2<Object, Object>>scoreAndLabels=test.map(p->new Tuple2(model.predict(p.features()), p.label()));

//     System.out.println(scoreAndLabels.take(1).get(0));

//     //获取评估指标

//     BinaryClassificationMetrics metrics=new BinaryClassificationMetrics(JavaRDD.toRDD(scoreAndLabels));

//     double auRoc=metrics.areaUnderROC();

//     System.out.println("area under Roc="+auRoc);

//    

       String model_path="F:\\Learning\\java\\project\\LearningSpark\\src\\main\\resources\\model\\javaSVMWithSGDModel";

//     model.save(sc, model_path);

      

       SVMModel model2=SVMModel.load(sc, model_path);

       JavaRDD<Tuple2<Object, Object>>testScoreAndLabels=test.map(p->new Tuple2(model2.predict(p.features()), p.label()));

       System.out.println(testScoreAndLabels.take(1).get(0));

       sc.stop();

   

默认情况下,SVMWithSGD.train()方法执行L2正则化,并将正则化参数设置为1.0。如果我们想要配置这个算法,我们可以通过直接创建一个新对象并调用setter方法来进一步自定义SVMWithSGD。所有其他spark.mllib算法也以这种方式支持自定义。例如,以下代码生成SVM的L1正则化,其正则化参数设置为0.1,并运行200次迭代的训练算法。

 

       SVMWithSGD svmAlg = new SVMWithSGD();

        svmAlg.optimizer().setNumIterations(200).setRegParam(0.1).setUpdater(new L1Updater());

       SVMModel modelL1 = svmAlg.run(training.rdd());

 

2.2 逻辑回归(Logistic Regression)

Logistic回归广泛用于预测二元分类。如上面等式(1)中所述的线性方法,其中由逻辑损失给出的公式中的损失函数:

对于二分类问题,算法输出二元逻辑回归模型。给定一个新的数据点,用x表示,该模型通过应用逻辑函数进行预测

其中z = wTx。 默认情况下,如果f(wTx)> 0.5,则结果为正,否则为负,尽管与线性SVM不同,逻辑回归模型的原始输出f(z)具有 概率解释(即x为正的概率)。二元逻辑回归可以推广到多项Logistic回归中,以训练和预测多类分类问题。例如,对于K个可能的结果,可以选择其中一个结果作为“支点”,并且可以针对支点结果单独回归其他K-1个结果。在spark.mllib中,第一个类0被选为“pivot”类。

对于多类分类问题,该算法将输出多项Logistic回归模型,该模型包含针对第一类回归的K-1个二元逻辑回归模型。给定新的数据点,将运行K-1个模型,并且将选择具有最大概率的类作为预测类。我们实现了两种算法来解决逻辑回归:小批量梯度下降和L-BFGS。 我们建议使用L-BFGS,以实现更快的收敛。

以下代码说明了如何加载样本多类数据集,将其拆分为训练和测试,以及如何使用LogisticRegressionWithLBFGS来拟合逻辑回归模型。然后根据测试数据集评估模型并将其保存到磁盘。

 

       SparkConf conf = new SparkConf().setAppName("JavaLogisticRegressionWithLBFGSExample").setMaster("local");

       SparkContext sc = new SparkContext(conf);

 

       String path = "F:\\Learning\\java\\project\\LearningSpark\\src\\main\\resources\\sample_libsvm_data.txt";

       JavaRDD<LabeledPoint> data = MLUtils.loadLibSVMFile(sc, path).toJavaRDD();

       // 划分训练机和测试集

       JavaRDD<LabeledPoint>[] splits = data.randomSplit(new double[] { 0.6, 0.4 }, 11L);

       JavaRDD<LabeledPoint> tringing = splits[0].cache();

       JavaRDD<LabeledPoint> test = splits[1];

 

       // 模型构建和训练

       LogisticRegressionModel model = new LogisticRegressionWithLBFGS().setNumClasses(10).run(tringing.rdd());

 

       // 在测试集上计算得分

       JavaPairRDD<Object, Object> predictionAndLabels = test

              .mapToPair(p -> new Tuple2(model.predict(p.features()), p.label()));

 

       // 获取评价指标

       MulticlassMetrics metrics = new MulticlassMetrics(predictionAndLabels.rdd());

       double accuracy = metrics.accuracy();

       System.out.println("Accuracy:" + accuracy);

       model.save(sc, "F:\\Learning\\java\\project\\LearningSpark\\src\\main\\resources\\model\\logistic");

       sc.stop();

   

 

这篇关于Spark Mllib之线性SVM和逻辑回归的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1126441

相关文章

线性因子模型 - 独立分量分析(ICA)篇

序言 线性因子模型是数据分析与机器学习中的一类重要模型,它们通过引入潜变量( latent variables \text{latent variables} latent variables)来更好地表征数据。其中,独立分量分析( ICA \text{ICA} ICA)作为线性因子模型的一种,以其独特的视角和广泛的应用领域而备受关注。 ICA \text{ICA} ICA旨在将观察到的复杂信号

Spark MLlib模型训练—聚类算法 PIC(Power Iteration Clustering)

Spark MLlib模型训练—聚类算法 PIC(Power Iteration Clustering) Power Iteration Clustering (PIC) 是一种基于图的聚类算法,用于在大规模数据集上进行高效的社区检测。PIC 算法的核心思想是通过迭代图的幂运算来发现数据中的潜在簇。该算法适用于处理大规模图数据,特别是在社交网络分析、推荐系统和生物信息学等领域具有广泛应用。Spa

✨机器学习笔记(二)—— 线性回归、代价函数、梯度下降

1️⃣线性回归(linear regression) f w , b ( x ) = w x + b f_{w,b}(x) = wx + b fw,b​(x)=wx+b 🎈A linear regression model predicting house prices: 如图是机器学习通过监督学习运用线性回归模型来预测房价的例子,当房屋大小为1250 f e e t 2 feet^

【高等代数笔记】线性空间(一到四)

3. 线性空间 令 K n : = { ( a 1 , a 2 , . . . , a n ) ∣ a i ∈ K , i = 1 , 2 , . . . , n } \textbf{K}^{n}:=\{(a_{1},a_{2},...,a_{n})|a_{i}\in\textbf{K},i=1,2,...,n\} Kn:={(a1​,a2​,...,an​)∣ai​∈K,i=1,2,...,n

逻辑表达式,最小项

目录 得到此图的逻辑电路 1.画出它的真值表 2.根据真值表写出逻辑式 3.画逻辑图 逻辑函数的表示 逻辑表达式 最小项 定义 基本性质 最小项编号 最小项表达式   得到此图的逻辑电路 1.画出它的真值表 这是同或的逻辑式。 2.根据真值表写出逻辑式   3.画逻辑图   有两种画法,1是根据运算优先级非>与>或得到,第二种是采

UMI复现代码运行逻辑全流程(一)——eval_real.py(尚在更新)

一、文件夹功能解析 全文件夹如下 其中,核心文件作用为: diffusion_policy:扩散策略核心文件夹,包含了众多模型及基础库 example:标定及配置文件 scripts/scripts_real:测试脚本文件,区别在于前者倾向于单体运行,后者为整体运行 scripts_slam_pipeline:orb_slam3运行全部文件 umi:核心交互文件夹,作用在于构建真

用Python实现时间序列模型实战——Day 14: 向量自回归模型 (VAR) 与向量误差修正模型 (VECM)

一、学习内容 1. 向量自回归模型 (VAR) 的基本概念与应用 向量自回归模型 (VAR) 是多元时间序列分析中的一种模型,用于捕捉多个变量之间的相互依赖关系。与单变量自回归模型不同,VAR 模型将多个时间序列作为向量输入,同时对这些变量进行回归分析。 VAR 模型的一般形式为: 其中: ​ 是时间  的变量向量。 是常数向量。​ 是每个时间滞后的回归系数矩阵。​ 是误差项向量,假

带头结点的线性链表的基本操作

持续了好久,终于有了这篇博客,链表的操作需要借助图像模型进行反复学习,这里尽可能的整理并记录下自己的思考,以备后面复习,和大家分享。需要说明的是,我们从实际应用角度出发重新定义了线性表。 一. 定义 从上一篇文章可以看到,由于链表在空间的合理利用上和插入、删除时不需要移动等优点,因此在很多场合下,它是线性表的首选存储结构。然而,它也存在某些实现的缺点,如求线性表的长度时不如顺序存储结构的

SVM编程实现python

深入解析python版SVM源码系列--简化版SMO算法 SVM使用SMO算法来解决其中涉及到的二次规划问题。一个简单版本的SMO算法的实现如下: ''' 随机选择随机数,不等于J '''def selectJrand(i,m):j=i #we want to select any J not equal to iwhile (j==i):j = int(random

浙大数据结构:02-线性结构4 Pop Sequence

这道题我们采用数组来模拟堆栈和队列。 简单说一下大致思路,我们用栈来存1234.....,队列来存输入的一组数据,栈与队列进行匹配,相同就pop 机翻 1、条件准备 stk是栈,que是队列。 tt指向的是栈中下标,front指向队头,rear指向队尾。 初始化栈顶为0,队头为0,队尾为-1 #include<iostream>using namespace std;#defi