import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from keras.utils import np_utils
## 数据准备
# 读入数据文件
# pandas库的读取文件,header指明引入的文档是没有的列的,自动编号
data=pd.read_csv('iris.txt',header=None,sep=' ').values
data=data[:,1:6]
data=pd.DataFrame(data)
#data = pd.read_csv('iris.txt', header = None)
# 指定数据的各个列的代表的数据,花萼长度,花萼宽度,花瓣长度,花瓣宽度,种类,设置各个类的标签属性
data.columns = ['sepal length', 'sepal width','petal length','petal width','class']
# 查看5前五条数据
# loc是以列名和行名作为参数,进行返回的
# iloc是以索引作为参数进行返回地
print(data.iloc[0:5,:])
# 数据特征x取值于前四列
X = data.iloc[:,0:4].values.astype(float)
# 将类名转换为整数
data.loc[data['class'] == 'setosa','class'] = 0
data.loc[data['class'] == 'versicolor','class'] = 1
data.loc[data['class'] == 'virginica','class'] = 2
# 标签y取值于第四列
# 将第四列取出来,作为int型
y = data.iloc[:,4].values.astype(int)
# 分割数据为训练集和测试集
# 八成为训练集,两成为测试集
train_x,test_x,train_y,test_y = train_test_split(X,y,train_size=0.8,test_size=0.2,random_state=0)
# 特征数据标准化,转换为均值0,标准差为1的分布
mean=train_x.mean(axis=0)
std=train_x.std (axis=0 )
train_x= (train_x-mean) /std
test_x=(test_x-mean) /std
print (train_x[0 : 5, : ])
# 类别标签独热编码
train_y_ohe = np_utils.to_categorical(train_y,3)
test_y_ohe = np_utils.to_categorical(test_y, 3)
print("前5条测试数据标签值:", test_y[0:5])
print('前五条测试数据标签的独热码:\n',test_y_ohe[0:5])
##搭建模型
from keras.models import Sequential
from keras.layers import Dense,Dropout
# 构建一个模型对象
model = Sequential()
# 堆叠若干网络层构建网络
# dense当前层为全连接层
# 16为当前层的节点数
# activate激活函数,之名为relu
# input_shape输入数据的维度,用元组表示,首层必须说明
# 下述为隐藏层1
model.add(Dense(16,activation='relu',input_shape=(4,)))
# 下述为隐藏层2
model.add(Dense(16,activation='relu'))
model.add(Dense(16,activation='relu'))
model.add(Dense(16,activation='relu'))
model.add(Dense(16,activation='relu'))
model.add(Dense(16,activation='relu'))
model.add(Dense(16,activation='relu'))
model.add(Dense(16,activation='relu'))
# 断开一些神经元的链接,防止过度拟合
# 隐藏层随机失活25%,为什么是随机失活,每一次都是随机的?
model.add(Dropout(0.25))
# 增加输出层
# 多类型的输出值,指定激活函数为softmax,返回一个由多个概率值组成的数组,每个概率值表示输出为某类的概率
# 三中类型的输出,
model.add(Dense(3,activation='softmax'))
# 配置网络
# 指定的损失函数是交叉熵损失函数
# 优化参数的方式是梯度下降发
# 监控指标列表
model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=["accuracy"])
model.fit(train_x,
train_y_ohe,
epochs=50
, batch_size=1,
verbose = 2,
validation_data = (test_x, test_y_ohe))
# 返回记录的是各轮训练的情况,时间,训练集损失值,训练集精确度,验证集损失值,验证集精确率
## 模型评估
loss, accuracy = model.evaluate(test_x, test_y_ohe, verbose=2)
print("loss ={},accuracy={}".format(loss,accuracy))
# 模型预测
classes = model.predict(test_x, batch_size=1, verbose=2)
print("测试样本数: ",len(classes))