在Ignite中使用k-最近邻(k-NN)分类算法

2024-04-30 12:58

本文主要是介绍在Ignite中使用k-最近邻(k-NN)分类算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在本系列前面的文章中,简单介绍了一下Ignite的线性回归算法,下面会尝试另一个机器学习算法,即k-最近邻(k-NN)分类。该算法基于对象k个最近邻中最常见的类来对对象进行分类,可用于确定类成员的关系。

一个适合k-NN分类的数据集是鸢尾花数据集,它可以很容易地通过UCI网站获得。

鸢尾花数据集由150个样本组成,来自3种不同种类的鸢尾花各有50朵(Iris Setosa, Iris Versicolour和Iris Virginica)。以下四个特征可供每个样本使用:

  • 萼片长度(cm)
  • 萼片宽度(cm)
  • 花瓣长度(cm)
  • 花瓣宽度(cm)

下面会创建一个模型,利用这四个特征区分不同的物种。

首先,要获取原始数据并将其拆分成训练数据(60%)和测试数据(40%)。然后再次使用Scikit-learn来执行这个任务,下面修改一下前一篇文章中使用的代码,如下:

from sklearn import datasets
import pandas as pd# Load Iris dataset.
iris_dataset = datasets.load_iris()
x = iris_dataset.data
y = iris_dataset.target# Split it into train and test subsets.
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.4, random_state=23)# Save train set.
train_ds = pd.DataFrame(x_train, columns=iris_dataset.feature_names)
train_ds["TARGET"] = y_train
train_ds.to_csv("iris-train.csv", index=False, header=None)# Save test set.
test_ds = pd.DataFrame(x_test, columns=iris_dataset.feature_names)
test_ds["TARGET"] = y_test
test_ds.to_csv("iris-test.csv", index=False, header=None)

当训练和测试数据准备好之后,就可以写应用了,本文的算法是:

  1. 读取训练数据和测试数据;
  2. 在Ignite中保存训练数据和测试数据;
  3. 使用训练数据拟合k-NN模型;
  4. 将模型应用于测试数据;
  5. 确定模型的准确性。

读取训练数据和测试数据

需要读取两个有5列的CSV文件,一个是训练数据,一个是测试数据,5列分别为:

  1. 萼片长度(cm)
  2. 萼片宽度(cm)
  3. 花瓣长度(cm)
  4. 花瓣宽度(cm)
  5. 花的种类(0:Iris Setosa,1:Iris Versicolour,2:Iris Virginica)

通过下面的代码,可以从CSV文件中读取数据:

private static void loadData(String fileName, IgniteCache<Integer, IrisObservation> cache)throws FileNotFoundException {Scanner scanner = new Scanner(new File(fileName));int cnt = 0;while (scanner.hasNextLine()) {String row = scanner.nextLine();String[] cells = row.split(",");double[] features = new double[cells.length - 1];for (int i = 0; i < cells.length - 1; i++)features[i] = Double.valueOf(cells[i]);double flowerClass = Double.valueOf(cells[cells.length - 1]);cache.put(cnt++, new IrisObservation(features, flowerClass));}
}

该代码简单地一行行的读取数据,然后对于每一行,使用CSV的分隔符拆分出字段,每个字段之后将转换成double类型并且存入Ignite。

将训练数据和测试数据存入Ignite

前面的代码将数据存入Ignite,要使用这个代码,首先要创建Ignite存储,如下:

IgniteCache<Integer, IrisObservation> trainData = getCache(ignite, "IRIS_TRAIN");
IgniteCache<Integer, IrisObservation> testData = getCache(ignite, "IRIS_TEST");
loadData("src/main/resources/iris-train.csv", trainData);
loadData("src/main/resources/iris-test.csv", testData);

getCache()的实现如下:

private static IgniteCache<Integer, IrisObservation> getCache(Ignite ignite, String cacheName) {CacheConfiguration<Integer, IrisObservation> cacheConfiguration = new CacheConfiguration<>();cacheConfiguration.setName(cacheName);cacheConfiguration.setAffinity(new RendezvousAffinityFunction(false, 10));IgniteCache<Integer, IrisObservation> cache = ignite.createCache(cacheConfiguration);return cache;
}

使用训练数据拟合k-NN分类模型

数据存储之后,可以像下面这样创建训练器:

KNNClassificationTrainer trainer = new KNNClassificationTrainer();

然后拟合训练数据,如下:

KNNClassificationModel mdl = trainer.fit(ignite,trainData,(k, v) -> v.getFeatures(),     
// Feature extractor.(k, v) -> v.getFlowerClass())  
// Label extractor..withK(3).withDistanceMeasure(new EuclideanDistance()).withStrategy(KNNStrategy.WEIGHTED);

Ignite将数据保存为键-值(K-V)格式,因此上面的代码使用了值部分,目标值是Flower类,特征在其它列中。将k的值设为3,代表3种。对于距离测量,可以有几个选择,如欧几里德、汉明或曼哈顿,在本例中使用欧几里德。最后要指定是使用SIMPLE算法还是使用WEIGHTED k-NN算法,在本例中使用WEIGHTED。

将模型应用于测试数据

下一步,就可以用训练好的分类模型测试测试数据了,可以这样做:

int amountOfErrors = 0;
int totalAmount = 0;try (QueryCursor<Cache.Entry<Integer, IrisObservation>> cursor = testData.query(new ScanQuery<>())) {for (Cache.Entry<Integer, IrisObservation> testEntry : cursor) {IrisObservation observation = testEntry.getValue();double groundTruth = observation.getFlowerClass();double prediction = mdl.apply(new DenseLocalOnHeapVector(observation.getFeatures()));totalAmount++;if (groundTruth != prediction)amountOfErrors++;System.out.printf(">>> | %.0f\t\t\t | %.0f\t\t\t|\n", prediction, groundTruth);}System.out.println(">>> -----------------------------");System.out.println("\n>>> Absolute amount of errors " + amountOfErrors);System.out.printf("\n>>> Accuracy %.2f\n", (1 - amountOfErrors / (double) totalAmount));
}

确定模型的准确性

下面,就可以通过对测试数据中的真实分类和模型进行的分类进行对比,来确认模型的真确性。

代码运行之后,总结如下:

>>> Absolute amount of errors 2
>>> Accuracy 0.97

因此,Ignite能够将97%的测试数据正确地分类为3个不同的种类。

总结

Apache Ignite提供了一个机器学习算法库。通过k-NN分类示例,可以看到创建模型、测试模型和确定准确性的简单性。

在机器学习系列的下一篇中,将研究另一种机器学习算法

这篇关于在Ignite中使用k-最近邻(k-NN)分类算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

java使用protobuf-maven-plugin的插件编译proto文件详解

《java使用protobuf-maven-plugin的插件编译proto文件详解》:本文主要介绍java使用protobuf-maven-plugin的插件编译proto文件,具有很好的参考价... 目录protobuf文件作为数据传输和存储的协议主要介绍在Java使用maven编译proto文件的插件

SpringBoot线程池配置使用示例详解

《SpringBoot线程池配置使用示例详解》SpringBoot集成@Async注解,支持线程池参数配置(核心数、队列容量、拒绝策略等)及生命周期管理,结合监控与任务装饰器,提升异步处理效率与系统... 目录一、核心特性二、添加依赖三、参数详解四、配置线程池五、应用实践代码说明拒绝策略(Rejected

C++ Log4cpp跨平台日志库的使用小结

《C++Log4cpp跨平台日志库的使用小结》Log4cpp是c++类库,本文详细介绍了C++日志库log4cpp的使用方法,及设置日志输出格式和优先级,具有一定的参考价值,感兴趣的可以了解一下... 目录一、介绍1. log4cpp的日志方式2.设置日志输出的格式3. 设置日志的输出优先级二、Window

Ubuntu如何分配​​未使用的空间

《Ubuntu如何分配​​未使用的空间》Ubuntu磁盘空间不足,实际未分配空间8.2G因LVM卷组名称格式差异(双破折号误写)导致无法扩展,确认正确卷组名后,使用lvextend和resize2fs... 目录1:原因2:操作3:报错5:解决问题:确认卷组名称​6:再次操作7:验证扩展是否成功8:问题已解

Qt使用QSqlDatabase连接MySQL实现增删改查功能

《Qt使用QSqlDatabase连接MySQL实现增删改查功能》这篇文章主要为大家详细介绍了Qt如何使用QSqlDatabase连接MySQL实现增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴... 目录一、创建数据表二、连接mysql数据库三、封装成一个完整的轻量级 ORM 风格类3.1 表结构

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

Python使用pip工具实现包自动更新的多种方法

《Python使用pip工具实现包自动更新的多种方法》本文深入探讨了使用Python的pip工具实现包自动更新的各种方法和技术,我们将从基础概念开始,逐步介绍手动更新方法、自动化脚本编写、结合CI/C... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

Conda与Python venv虚拟环境的区别与使用方法详解

《Conda与Pythonvenv虚拟环境的区别与使用方法详解》随着Python社区的成长,虚拟环境的概念和技术也在不断发展,:本文主要介绍Conda与Pythonvenv虚拟环境的区别与使用... 目录前言一、Conda 与 python venv 的核心区别1. Conda 的特点2. Python v