在之前的文章中,我们学习了分类学习之支持向量机,并带来简单案例,学习用法。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢。
spark-机器学习(6)分类学习之支持向量机-csdn博客文章浏览阅读1.5k次,点赞28次,收藏25次。今天的文章,我们来学习分类学习之支持向量机,并带来简单案例,学习用法。希望大家能有所收获。同时,希望我的文章能帮助到每一个正在学习的你们。也欢迎大家来我的文章下交流讨论,共同进步。https://blog.csdn.net/qq_49513817/article/details/138260328今天的文章,我们来学习分类学习之决策树,并带来简单案例,学习用法。希望大家能有所收获。
目录
一、决策树
什么是决策树
决策树模型
决策树是一种基本的分类与回归方法。它主要被用于分类问题,但也可以用于回归问题。决策树模型呈树形结构,其中每个内部节点表示一个属性上的判断条件,每个分支代表一个判断条件的输出,每个叶节点代表一个类别。
决策树学习的目的是根据给定的训练数据集构建一个决策树模型,以便能够对新样本进行正确的分类。决策树学习通常包括三个步骤:特征选择、决策树的生成和决策树的剪枝。
- 特征选择:选择对训练数据具有分类能力的特征。特征选择的目的是决定用哪个特征来划分空间。常用的选择准则有信息增益、增益率和基尼指数。
- 决策树的生成:基于特征选择的结果,递归地构建决策树。从根节点开始,对每个特征进行测试,根据测试结果将样本分配到子节点,直到满足停止条件(例如,所有样本属于同一类,或没有剩余特征可用)为止。
- 决策树的剪枝:为了避免过拟合,通常需要对决策树进行剪枝。剪枝的主要目的是简化模型,提高模型的泛化能力。剪枝可以通过预剪枝(在决策树生成过程中进行剪枝)或后剪枝(在决策树生成完成后进行剪枝)来实现。
决策树具有直观、易于理解和实现的优点。然而,它也可能导致过拟合,特别是在处理具有复杂关系的数据集时。此外,决策树对输入数据的预处理(如缺失值和异常值的处理)和参数设置(如停止条件和剪枝策略)也比较敏感。
spark决策树
spark决策树是apache spark mllib库中提供的一种机器学习算法,用于分类和回归问题。spark决策树基于传统的决策树算法,并结合了spark的分布式计算能力,以处理大规模数据集。
spark决策树在构建过程中,通过递归地将数据集分割成子集来创建树形结构。每个内部节点代表一个特征上的判断条件,根据该条件将数据集划分为不同的子集,并分配给子节点。这个过程一直进行到满足停止条件为止,例如所有样本属于同一类或者没有剩余特征可用。
spark决策树支持多种特征选择准则,如信息增益、增益率和基尼指数,以便根据数据的特性选择最合适的划分策略。同时,为了防止过拟合,spark决策树也提供了剪枝机制,可以在决策树生成过程中或生成完成后进行剪枝。
由于spark的分布式计算能力,spark决策树可以有效地处理大规模数据集,并且具有良好的扩展性。这使得它成为处理大规模机器学习问题的一种有效方法。
二、示例代码
下面的示例代码的主要作用是训练一个决策树分类模型 ,通过直接在程序中模拟数据来达到我们展示一个决策树的过程,仅作为学习阶段的示例。在工作中,数据往往庞大而复杂,需要我们花费更长的时间来处理数据和优化模型。
完整代码
import org.apache.spark.{sparkconf, sparkcontext}
import org.apache.spark.ml.pipeline
import org.apache.spark.ml.classification.decisiontreeclassifier
import org.apache.spark.ml.evaluation.multiclassclassificationevaluator
import org.apache.spark.ml.feature.{stringindexer, vectorassembler}
import org.apache.spark.sql.sparksession
object p7{
def main(args: array[string]): unit = {
// 初始化spark
val conf = new sparkconf().setappname("peng0426.").setmaster("local[*]")
val sc = new sparkcontext(conf)
val spark = sparksession.builder().appname("simpledecisiontreeexample").getorcreate()
import spark.implicits._
// 创建模拟数据
val data = seq(
(1.0, 0.0, "a"), (1.5, 1.0, "a"), (5.0, 5.0, "b"), (5.0, 8.0, "b"), (1.0, 4.0, "a"), (1.5, 1.0, "a"), (5.5, 5.0, "b"), (8.0, 7.0, "b"), (1.0, 0.0, "a"), (2.5, 1.0, "a"), (5.5, 5.0, "b"), (8.0, 6.0, "b"),
).todf("feature1", "feature2", "label")
// 将标签列从字符串类型转换为数值类型
val labelindexer = new stringindexer()
.setinputcol("label")
.setoutputcol("indexedlabel")
.fit(data)
// 将特征列组合成一个特征向量
val assembler = new vectorassembler()
.setinputcols(array("feature1", "feature2"))
.setoutputcol("features")
// 创建决策树分类器
val dt = new decisiontreeclassifier()
.setlabelcol("indexedlabel")
.setfeaturescol("features")
// 创建管道
val pipeline = new pipeline()
.setstages(array(labelindexer, assembler, dt))
// 将数据划分为训练集和测试集
val array(trainingdata, testdata) = data.randomsplit(array(0.7, 0.3))
// 训练模型
val model = pipeline.fit(trainingdata)
// 预测测试集
val predictions = model.transform(testdata)
//计算测试误差
val evaluator = new multiclassclassificationevaluator()
.setlabelcol("indexedlabel")
.setpredictioncol("prediction")
.setmetricname("accuracy")
val accuracy = evaluator.evaluate(predictions)
println(s"test accuracy = $accuracy")
}
}
方法解析
-
sparkconf 和 sparkcontext: 用于初始化spark应用程序的配置和上下文。
-
sparksession: 是spark 2.0及以上版本中引入的新概念,用于替代sparkcontext来创建dataframe、dataset和读取数据。
-
pipeline: 在spark ml中,pipeline是一个用于组合多个转换步骤(如特征转换、模型训练等)的框架。
-
stringindexer: 用于将字符串类型的标签列转换为数值类型,以便用于机器学习模型。
-
vectorassembler: 将多个特征列组合成一个特征向量,这通常是机器学习模型所需要的输入格式。
-
decisiontreeclassifier: 决策树分类器,用于训练决策树模型。
-
multiclassclassificationevaluator: 用于评估多分类模型性能的评估器。
-
dataframe api: spark的dataframe api用于处理结构化数据。
代码效果
-
初始化spark: 通过设置
sparkconf
和sparksession
来初始化spark应用程序。 -
创建模拟数据: 创建一个包含两个特征列和一个标签列的dataframe。
-
数据预处理: 使用
stringindexer
和vectorassembler
进行数据预处理,将标签转换为数值类型,并将特征组合成特征向量。 -
构建模型管道: 使用
pipeline
将预处理步骤和决策树分类器组合在一起。 -
划分数据集: 将数据随机划分为训练集和测试集。
-
训练模型: 使用训练数据拟合管道,从而训练决策树模型。
-
预测和评估: 对测试集进行预测,并使用
multiclassclassificationevaluator
计算准确率。
代码输出
这段代码最后会输出我们的测试集的准确率,这个值表示模型在测试集上的预测准确率。现在运行代码来看看输出的是多少。
可以看到运行代码后得到了1.0。accuracy的值只会在0到1之间,越接近1代表我们的模型分类的效果越强,但是我这里的1.0是基于数据集特小,数据不复杂的情况下,在真实的环境中往往很难达到。在实际应用中,我们只需要努力将模型的accuracy值接近1.0即可。
拓展-spark决策树
关键字 | 描述 | 例子 |
---|---|---|
特征列(featurescol) | 指定输入数据中的特征列名 | featurescol="features" |
标签列(labelcol) | 指定输入数据中的标签列名 | labelcol="label" |
不纯度度量(impurity) | 选择不纯度度量方式,如基尼不纯度或熵 | impurity="gini" |
最大深度(maxdepth) | 设置决策树的最大深度 | maxdepth=5 |
最小信息增益(mininfogain) | 设置分裂节点时所需的最小信息增益 | mininfogain=0.01 |
最小实例数(mininstancespernode) | 设置分裂后每个节点至少包含的实例数量 | mininstancespernode=2 |
预测列(predictioncol) | 指定输出数据中的预测结果列名 | predictioncol="prediction" |
概率列(probabilitycol) | 指定输出数据中的类别概率预测结果列名 | probabilitycol="probability" |
阈值(thresholds) | 用于多分类问题的阈值设置 | thresholds=[0.3, 0.7] |
示例数据集 | 使用iris数据集进行分类任务 | 加载iris数据集,设置上述参数进行训练 |
发表评论