赞
踩
在之前的文章中,我们学习了分类学习之朴素贝叶斯算法,并带来简单案例,学习用法。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢。
Spark-机器学习(5)分类学习之朴素贝叶斯算法-CSDN博客文章浏览阅读1.6k次,点赞96次,收藏57次。今天的文章,我们来学习分类学习之朴素贝叶斯算法,并带来简单案例,学习用法。希望大家能有所收获。同时,希望我的文章能帮助到每一个正在学习的你们。也欢迎大家来我的文章下交流讨论,共同进步。https://blog.csdn.net/qq_49513817/article/details/138233224今天的文章,我们来学习分类学习之支持向量机,并带来简单案例,学习用法。希望大家能有所收获。
目录
支持向量机
支持向量(Support Vectors):在SVM中,支持向量是那些位于决策边界两侧的最靠近边界的训练样本点。这些点对于确定决策边界的位置至关重要,因为SVM试图找到一个超平面,使得支持向量到该超平面的距离最大化。这些支持向量通常只占训练数据的一小部分,因此SVM是一种稀疏模型,它只依赖于少数关键样本进行决策。
SV1、SV2、SV3等:这些通常是对支持向量的标记或引用。在实际应用中,可能会有多个支持向量,它们分布在决策边界的两侧。每个支持向量都对确定决策边界的位置有所贡献。标记为SV1、SV2、SV3等的支持向量只是为了区分不同的支持向量,没有特别的数学或逻辑含义。
超平面与间隔:在SVM中,决策边界是一个超平面,它将数据空间划分为两个区域,每个区域对应一个类别。间隔是指支持向量到决策边界的距离,SVM的目标是最大化这个间隔,以提高分类的鲁棒性和泛化能力。
支持向量机(Support Vector Machine,简称SVM)是一类按监督学习(supervised learning)方式对数据进行二元分类的广义线性分类器(generalized linear classifier)。它的决策边界是对学习样本求解的最大边距超平面(maximum-margin hyperplane)。SVM使用铰链损失函数(hinge loss)计算经验风险(empirical risk)并在求解系统中加入了正则化项以优化结构风险(structural risk),是一个具有稀疏性和稳健性的分类器。
SVM的工作原理可以概括为以下几个步骤:首先,对数据进行预处理,也叫做特征提取,将原始数据转换为可供算法处理的特征向量;然后,建立一个目标函数,该函数能够将数据划分成正类和负类;接着,选择最佳超参数,如kernel函数和正则化参数C,其中kernel函数用于将特征空间映射到高维空间,而正则化参数C是用来控制模型的复杂度的;最后,使用训练数据集训练出最佳SVM模型,再用测试数据集对模型进行测试和评价。
SVM较好地解决了传统学习方法难以处理的小样本、高维、非线性等问题,且具有较好的泛化能力。因此,它已成功应用到人脸识别、遥感图像分析、文本分类等众多模式识别领域。然而
Spark支持向量机(SVM)算法,是Spark机器学习库(MLlib)中的一个重要组成部分。Spark MLlib提供了SVM的实现,允许用户在大规模数据集上应用SVM算法进行分类任务。
SVM是一种监督学习算法,特别适用于高维空间,并且在数据维度大于样本点数时依然有效。它使用训练数据的一个子集(称为支持向量)来做出决策,因此具有内存效率高的特点。
在Spark中使用SVM时,首先需要创建一个Spark会话(SparkSession),然后可以从各种数据源(如文件、数据库、HDFS等)加载数据。数据加载后,可以将其转换为DataFrame格式,以便在MLlib中使用。然后,可以利用MLlib中的SVM算法对数据进行训练,得到一个SVM模型。这个模型可以用于对新数据进行分类预测。
此外,Spark还支持对向量和矩阵进行各种统计计算,这对于机器学习任务中的特征处理和模型评估非常有用。这些统计计算主要通过MLlib中的Statistics类库来实现。
下面的示例代码的主要作用是展示如何使用Spark MLlib的SVM分类器对多分类问题进行建模和评估。通过读取CSV文件中的数据,转换数据类型,训练模型,并评估模型的性能,这对于我们来学习机器学习来说是一个很好的例子。
- import org.apache.spark.ml.classification.SVM
- import org.apache.spark.ml.evaluation.MulticlassClassificationEvaluator
- import org.apache.spark.ml.feature.{StringIndexer, VectorIndexer}
- import org.apache.spark.sql.SparkSession
-
- object SimpleSVMExample {
- def main(args: Array[String]): Unit = {
- // 创建Spark会话
- val spark = SparkSession.builder()
- .appName("Peng0426.")
- .master("local[*]") // 使用本地模式,并尽可能使用所有可用的CPU核心
- .getOrCreate()
- import spark.implicits._
- // 加载数据,这里假设你有一个CSV文件,其中包含标签和特征
- val data = spark.read.option("header", "true").csv("path_to_your_data.csv")
- // 将标签列从字符串转换为数值型
- val labelIndexer = new StringIndexer()
- .setInputCol("label")
- .setOutputCol("indexedLabel")
- .fit(data)
- // 自动识别分类特征,并对它们进行索引
- val featureIndexer = new VectorIndexer()
- .setInputCol("features")
- .setOutputCol("indexedFeatures")
- .setMaxCategories(4) // 假设我们的特征是分类的,并且最多有4个不同的值
- .fit(data)
- // 分割数据集为训练集和测试集
- val Array(trainingData, testData) = data.randomSplit(Array(0.7, 0.3))
- // 训练SVM模型
- val svm = new SVM()
- .setLabelCol("indexedLabel")
- .setFeaturesCol("indexedFeatures")
- // 使用训练数据拟合模型
- val svmModel = svm.fit(trainingData)
- // 对测试数据进行预测
- val predictions = svmModel.transform(testData)
- // 选择 (prediction, true label) 和计算测试误差
- val evaluator = new MulticlassClassificationEvaluator()
- .setLabelCol("indexedLabel")
- .setPredictionCol("prediction")
- .setMetricName("accuracy")
- val accuracy = evaluator.evaluate(predictions)
- println(s"Test Error = ${(1.0 - accuracy)}")
- }
- }
data03数据格式
代码会输出测试集上的分类错误率(1减去准确率)。错误率越低,模型的性能越好。
关键字 | 描述 | 例子 |
---|---|---|
SVM | 支持向量机,一种有监督学习模型,用于分类和回归分析 | 使用Spark MLlib的SVM算法对鸢尾花数据集进行分类 |
分隔超平面 | SVM算法的核心,用于将数据划分为不同类别 | 在二维平面上,分隔超平面可能是一条直线 |
支持向量 | 距离分隔超平面最近的点,对分类决策有决定性影响 | 在训练过程中,支持向量用于确定分隔超平面的位置 |
间隔(Margin) | 分隔超平面到最近的支持向量的距离,SVM的目标是最大化间隔 | 通过最大化间隔,SVM算法提高泛化能力,降低对噪声的敏感性 |
线性可分与非线性可分 | SVM可处理线性可分和非线性可分的数据 | 对于线性可分数据,SVM可以直接找到分隔超平面;对于非线性可分数据,SVM可以通过核函数将数据映射到高维空间进行线性分割 |
核函数 | 用于将数据从原始空间映射到高维空间的函数,使非线性可分数据变得线性可分 | 常见的核函数包括线性核、多项式核、径向基函数(RBF)核等 |
硬间隔与软间隔 | 硬间隔要求所有样本点都被正确分类,软间隔允许部分样本点被错误分类 | 在实际应用中,软间隔SVM更为常见,因为它具有更强的泛化能力 |
多类分类 | SVM原本用于二分类问题,但可以通过“一对一”或“一对多”策略扩展到多类分类问题 | 对于一个具有多个类别的数据集,可以使用SVM的多类分类策略进行分类 |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。