昇思25天学习打卡营第23天|基于MindSpore的红酒分类实验案例:从数据准备到模型预测

目录

MindSpore 版本配置与红酒数据集下载

葡萄酒数据读取、处理与可视化分析

基于 KNN 算法的样本分类模型构建与预测函数定义

基于 KNN 模型的测试集预测与准确率计算


MindSpore 版本配置与红酒数据集下载


        首先使用 %%capture captured_output 捕获后续代码的输出。然后,通过 pip 命令卸载已安装的 mindspore 库,并从指定源安装特定版本 2.3.0rc1 的 mindspore 库,随后查看当前安装的 mindspore 版本。接着,从 download 模块导入 download 函数,用于下载指定的红酒数据集。指定了数据集的 url 地址,并指定将其下载到当前目录(./),采用 zip 格式,若已存在则进行替换。

        代码如下:

%%capture captured_output
# 实验环境已经预装了mindspore==2.3.0rc1,如需更换mindspore版本,可更改下面mindspore的版本号
!pip uninstall mindspore -y
!pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspore==2.3.0rc1
# 查看当前 mindspore 版本
!pip show mindspore
from download import download

# 下载红酒数据集
url = "https://ascend-professional-construction-dataset.obs.cn-north-4.myhuaweicloud.com:443/MachineLearning/wine.zip"  
path = download(url, "./", kind="zip", replace=True)

葡萄酒数据读取、处理与可视化分析


        首先进行了一些必要的库导入,并设置了绘图的环境。然后设置了 MindSpore 的运行上下文为 CPU 。接着读取了一个名为 wine.data 的文件,并将数据转换为相应的数组 X(特征数据)和 Y(标签数据)。定义了一些属性名称。之后通过绘制多个子图,以不同的特征组合为横纵坐标,对数据进行了可视化展示,分别用不同的标记区分了不同的类别。

        代码如下:

%matplotlib inline
import os
import csv
import numpy as np
import matplotlib.pyplot as plt

import mindspore as ms
from mindspore import nn, ops

ms.set_context(device_target="CPU")
with open('wine.data') as csv_file:
    data = list(csv.reader(csv_file, delimiter=','))
print(data[56:62]+data[130:133])
X = np.array([[float(x) for x in s[1:]] for s in data[:178]], np.float32)
Y = np.array([s[0] for s in data[:178]], np.int32)
attrs = ['Alcohol', 'Malic acid', 'Ash', 'Alcalinity of ash', 'Magnesium', 'Total phenols',
         'Flavanoids', 'Nonflavanoid phenols', 'Proanthocyanins', 'Color intensity', 'Hue',
         'OD280/OD315 of diluted wines', 'Proline']
plt.figure(figsize=(10, 8))
for i in range(0, 4):
    plt.subplot(2, 2, i+1)
    a1, a2 = 2 * i, 2 * i + 1
    plt.scatter(X[:59, a1], X[:59, a2], label='1')
    plt.scatter(X[59:130, a1], X[59:130, a2], label='2')
    plt.scatter(X[130:, a1], X[130:, a2], label='3')
    plt.xlabel(attrs[a1])
    plt.ylabel(attrs[a2])
    plt.legend()
plt.show()

        运行结果:

基于 KNN 算法的样本分类模型构建与预测函数定义

        首先通过随机选择生成训练集和测试集的索引。然后定义了一个名为 KnnNet 的类,用于计算输入样本与训练集样本的距离并获取最接近的 k 个样本的索引。接着定义了一个 knn 函数,将输入样本转换为张量后,通过 KnnNet 类获取最接近的样本索引,统计这些索引对应标签的数量,最终返回数量最多的标签类别。

        代码如下:

train_idx = np.random.choice(178, 128, replace=False)
test_idx = np.array(list(set(range(178)) - set(train_idx)))
X_train, Y_train = X[train_idx], Y[train_idx]
X_test, Y_test = X[test_idx], Y[test_idx]
class KnnNet(nn.Cell):
    def __init__(self, k):
        super(KnnNet, self).__init__()
        self.k = k

    def construct(self, x, X_train):
        #平铺输入x以匹配X_train中的样本数
        x_tile = ops.tile(x, (128, 1))
        square_diff = ops.square(x_tile - X_train)
        square_dist = ops.sum(square_diff, 1)
        dist = ops.sqrt(square_dist)
        #-dist表示值越大,样本就越接近
        values, indices = ops.topk(-dist, self.k)
        return indices

def knn(knn_net, x, X_train, Y_train):
    x, X_train = ms.Tensor(x), ms.Tensor(X_train)
    indices = knn_net(x, X_train)
    topk_cls = [0]*len(indices.asnumpy())
    for idx in indices.asnumpy():
        topk_cls[Y_train[idx]] += 1
    cls = np.argmax(topk_cls)
return cls

基于 KNN 模型的测试集预测与准确率计算


        首先初始化了准确率变量 acc 为 0 ,并创建了一个 KnnNet 实例,设置 k 值为 5 。然后通过遍历测试集的样本 x 和对应的真实标签 y ,使用 knn 函数进行预测得到预测标签 pred 。每次预测后,将预测正确的次数累加到 acc 中,并打印出真实标签和预测标签。最后,计算并打印出验证集的准确率,即预测正确的次数除以测试集样本数量。

        代码如下:

acc = 0
knn_net = KnnNet(5)
for x, y in zip(X_test, Y_test):
    pred = knn(knn_net, x, X_train, Y_train)
    acc += (pred == y)
    print('label: %d, prediction: %s' % (y, pred))
print('Validation accuracy is %f' % (acc/len(Y_test)))

        运行结果:

label: 1, prediction: 1
label: 2, prediction: 2
label: 2, prediction: 3
label: 3, prediction: 3
label: 1, prediction: 1
label: 3, prediction: 2
label: 1, prediction: 1
label: 3, prediction: 2
label: 3, prediction: 3
label: 1, prediction: 1
label: 1, prediction: 1
label: 1, prediction: 2
label: 3, prediction: 3
label: 1, prediction: 3
label: 3, prediction: 3
label: 1, prediction: 1
label: 3, prediction: 3
label: 3, prediction: 2
label: 3, prediction: 3
label: 3, prediction: 2
label: 3, prediction: 3
label: 1, prediction: 1
label: 1, prediction: 3
label: 1, prediction: 3
label: 3, prediction: 2
label: 1, prediction: 1
label: 3, prediction: 3
label: 1, prediction: 1
label: 1, prediction: 1
label: 1, prediction: 1
label: 2, prediction: 2
label: 2, prediction: 3
label: 2, prediction: 2
label: 2, prediction: 1
label: 2, prediction: 2
label: 2, prediction: 2
label: 2, prediction: 3
label: 2, prediction: 2
label: 2, prediction: 3
label: 2, prediction: 3
label: 2, prediction: 2
label: 2, prediction: 2
label: 2, prediction: 2
label: 2, prediction: 2
label: 2, prediction: 2
label: 2, prediction: 2
label: 2, prediction: 2
label: 2, prediction: 3
label: 2, prediction: 3
label: 2, prediction: 2
Validation accuracy is 0.660000

        打印时间:

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值