鸢尾花数据集介绍:
Iris数据集是常用的分类实验数据集,由Fisher, 1936收集整理。Iris也称鸢尾花卉数据集,是一类多重变量分析的数据集。数据集包含150个数据集,分为3类,每类50个数据,每个数据包含4个属性。iris以鸢尾花的特征作为数据来源,常用在分类操作中。该数据集由3种不同类型的鸢尾花的50个样本数据构成。其中的一个种类与另外两个种类是线性可分离的,后两个种类是非线性可分离的。
四个属性:
Sepal.Length(花萼长度),单位是cm;
Sepal.Width(花萼宽度),单位是cm;
Petal.Length(花瓣长度),单位是cm;
Petal.Width(花瓣宽度),单位是cm;
三个种类:
Iris Setosa(山鸢尾);
Iris Versicolour(杂色鸢尾);
Iris Virginica(维吉尼亚鸢尾)。
前7个数据如下表
| Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species |
1 | 5.1 | 3.5 | 1.4 | 0.2 | setosa |
2 | 4.9 | 3 | 1.4 | 0.2 | setosa |
3 | 4.7 | 3.2 | 1.3 | 0.2 | setosa |
4 | 4.6 | 3.1 | 1.5 | 0.2 | setosa |
5 | 5 | 3.6 | 1.4 | 0.2 | setosa |
6 | 5.4 | 3.9 | 1.7 | 0.4 | setosa |
7 | 4.6 | 3.4 | 1.4 | 0.3 | setosa |
提取数据集中花瓣长度与花瓣宽度数据,其中花瓣长度作为特征,花瓣宽度作为标签,即:我们根据花瓣长度来预测花瓣的宽度。可以将花瓣数据分为训练数据与测试数据,训练一个线性回归模型,并对测试数据进行预测。
第一步:导入相应的包
import numpy as np
import pandas as pd
from mxnet import autograd, nd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from mxnet.gluon import nn
from mxnet import init
from mxnet.gluon import loss as gloss
from mxnet import gluon
第二步,将数据划分为训练集和测试集
df = pd.read_csv(r'D:\course\deep_learning\线性回归练习\iris.data',header=None) #读取文件
X = nd.array(df[2]) #花瓣长度
Y = nd.array(df[3]) #花瓣宽度
X = X.reshape(len(X),1)
Y = Y.reshape(len(Y),1)
#划分数据集,80%的数据用来训练,20%的数据用来测试
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=0)
num_input = 1 #输入特征个数为1,即花瓣长度
num_examples = 120 #训练样本个数
features = nd.array(X_train)
labels = nd.array(Y_train) #标签
第三步,将数据打包成需要的格式
from mxnet.gluon import data as gdata
batch_size = 10
dataset = gdata.ArrayDataset(features, labels)
data_iter = gdata.DataLoader(dataset, batch_size, shuffle=True)
第四步,训练模型
net = nn.Sequential()
net.add(nn.Dense(1))
net.initialize(init.Normal(sigma=0.01)) #初始化
loss = gloss.L2Loss() #平方损失函数
#设置学习率为0.01
trainer = gluon.Trainer(net.collect_params(), 'sgd', {'learning_rate' : 0.01})
num_epochs = 5 #迭代次数
for epoch in range(num_epochs):
for X,y in data_iter:
with autograd. record():
l = loss(net(X),y)
l. backward()
trainer.step(batch_size)
l = loss(net(features), labels)
print('epoch %d, loss %f' % (epoch + 1,l.mean().asnumpy()))
迭代五次,损失从0.044510降到了0.033204
打印出权重w和偏置b
dense = net[0]
print(dense.weight.data())
print(dense.bias.data())
训练效果:
X = X_train.asnumpy()
Y = Y_train.asnumpy()
Y_Pred = net(X_train).asnumpy()
plt.scatter(X, Y, color='green')
plt.scatter(X, Y_Pred, color='red')
plt.xlabel(u"花瓣长度",fontproperties='SimHei')
plt.ylabel(u"花瓣宽度",fontproperties='SimHei')
plt.title(u"训练集",fontproperties='SimHei')
plt.show()
预测效果:
X = X_test.asnumpy()
Y = Y_test.asnumpy()
Y_Pred = net(X_test).asnumpy()
plt.scatter(X, Y, color='green')
plt.scatter(X, Y_Pred, color='red')
plt.xlabel(u"花瓣长度",fontproperties='SimHei')
plt.ylabel(u"花瓣宽度",fontproperties='SimHei')
plt.title(u"测试集",fontproperties='SimHei')
plt.show()