Ignite中如何使用k-最近邻分类算法
Ignite中如何使用k-最近邻分类算法,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
首先,要获取原始数据并将其拆分成训练数据(60%)和测试数据(40%)。然后再次使用Scikit-learn来执行这个任务,下面修改一下前一篇文章中使用的代码,如下:
from sklearn import datasetsimport pandas as pd# Load Iris dataset.iris_dataset = datasets.load_iris()x = iris_dataset.datay = iris_dataset.target# Split it into train and test subsets.from sklearn.model_selection import train_test_splitx_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_traintrain_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_testtest_ds.to_csv("iris-test.csv", index=False, header=None)
当训练和测试数据准备好之后,就可以写应用了,本文的算法是:
读取训练数据和测试数据;
在Ignite中保存训练数据和测试数据;
使用训练数据拟合k-NN模型;
将模型应用于测试数据;
确定模型的准确性。
读取训练数据和测试数据
需要读取两个有5列的CSV文件,一个是训练数据,一个是测试数据,5列分别为:
萼片长度(cm)
萼片宽度(cm)
花瓣长度(cm)
花瓣宽度(cm)
花的种类(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("class="lazy" data-src/main/resources/iris-train.csv", trainData);loadData("class="lazy" data-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个不同的种类。
关于Ignite中如何使用k-最近邻分类算法问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网行业资讯频道了解更多相关知识。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341