对iris数据集使用mlp进行分类预测
如果你有一个自己的数据集,数据集得格式是 .csv,那么你可以按照以下步骤将数据集导进mxnet中,本教程使用iris的数据集进行示范
第一步:确定你数据集的保存位置
笔者的数据集保存在以下路径:C:/Users/d2l-zh-1.0/data/iris.csv
数据集中的数据情况如下:
第二步:导入需要的库,将csv文件读进程序中,笔者使用pandas.read_csv读入csv文件:
import mxnet as mx import numpy as np import pandas as pd import matplotlib.pyplot as plt import d2lzh as d2l %matplotlib inline from sklearn.model_selection import train_test_split from mxnet import autograd, gluon, init, nd from mxnet.gluon import loss as gloss, nn iris_data = pd.read_csv('C:/Users/d2l-zh-1.0/data/iris.csv')
此时,你的csv文件已经读进了内存,对iris数据集还需要进行进一步的处理:增加iris的分类标签
iris_data['target'] = 0 iris_data.loc[(iris_data['Class'] == 'Iris-setosa', 'target')] = 0 iris_data.loc[(iris_data['Class'] == 'Iris-versicolor', 'target')] = 1 iris_data.loc[(iris_data['Class'] == 'Iris-virginica', 'target')] = 2
增加之后的数据集情况如下:
第三步:使用sklearn中的train_test_split函数划分训练集和测试集
X, y = iris_data.ix[:, 0:4], iris_data.ix[:, 5] X_train, X_test, y_train, y_test = train_test_split(X, y, random_state = 0)
此时,数据被分成了包含112个数据的训练集和38个数据的测试集。
第四步:将读入的数据转化为NDArray的形式
X_train_nd = nd.array(X_train.values) X_test_nd = nd.array(X_test.values) y_train_nd = nd.array(y_train.values) y_test_nd = nd.array(y_test.values)
第五步:使用mxnet中自带的函数 mx.io.NDArrayIter将其转化为 train_iter和 test_iter
batch_size = 10 train_iter = mx.io.NDArrayIter(data = X_train_nd, label = y_train_nd, batch_size = batch_size) test_iter = mx.io.NDArrayIter(data = X_test_nd, label = y_test_nd, batch_size = batch_size)
第六步:使用下面的类使得 train_iter和 test_iter可以迭代,如果不进行这步,后续的程序会报错,提示 'DataBatch' object is not iterable
class DataIterLoader(): def __init__(self, data_iter): self.data_iter = data_iter def __iter__(self): self.data_iter.reset() return self def __next__(self): batch = self.data_iter.__next__() assert len(batch.data) == len(batch.label) == 1 data = batch.data[0] label = batch.label[0] return data, label def next(self): return self.__next__() train_iter_loader = DataIterLoader(train_iter) test_iter_loader = DataIterLoader(test_iter)
此时我们已经将一个csv数据转换为mxnet中可以使用的 train_iter_loader 和 test_iter_loader,这两个数据形式可以套用进我们在mxnet中学习过的模型
我们用一个mlp来测试一下:
net = nn.Sequential() net.add(nn.Dense(100, activation='relu'), nn.Dense(3)) net.initialize(init.Normal(sigma=0.01)) loss = gloss.SoftmaxCrossEntropyLoss() trainer = gluon.Trainer(net.collect_params(), 'sgd', {'learning_rate': 0.01}) num_epochs = 60 d2l.train_ch3(net, train_iter_loader, test_iter_loader, loss, num_epochs, batch_size, None, None, trainer)
经过60轮的迭代,测试集精度达到了100%
这样,我们就完成了对iris数据集使用mlp进行分类预测,如有疑问,在留言区告诉我。笔者也是刚入门mxnet,学艺不精,如有错误,请大家指正。