對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,學藝不精,如有錯誤,請大家指正。