导入库包
from keras.models import Sequential from keras.layers import Dense import numpy as np import pandas as pd
# 设定随机数种子,使得模型参数初始化结果相同 np.random.seed(7)
导入数据,并将其转换为keras指定数据类型
# 导入数据
dataset = pd.read_csv('XXXX/diabetes.csv')
#print(dataset)
# 分割输入x和输出Y
x = dataset.iloc[:,0:8]
Y = dataset.iloc[:,8]
# tensorflow仅接受训练数据为numpy形式
x = np.array(x)
#对Y进行标签编码
from sklearn.preprocessing import LabelEncoder
Y=Y.values.tolist()
label_encoder = LabelEncoder()
Y = np.array(label_encoder.fit_transform(Y))
创建模型
# 创建模型 model = Sequential() # 第一层必须设定input_dim,即输入维度(输入变量个数);input_shape=(8,) 等价于input_dim=8 # Dense类为完全连接的层,参数1为神经元个数,activation为激活函数,可选sigmoid、relu、tanh model.add(Dense(12, input_dim=8, activation='relu')) model.add(Dense(8, activation='relu')) # 由于最后输出结果为“是否为糖尿病”的二分类问题,因此选取sigmoid函数,且输出神经元为1 model.add(Dense(1, activation='sigmoid'))
编译模型
# 编译模型,需要指定用于评估一组权重的损失函数loss、用于搜索网络不同权重的优化器optimizer、以及模型训练报告的评估指标metrics model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
训练模型
# 训练模型,epochs为数据集迭代训练次数,还需设定执行神经网络中的权重跟新的每个批次所用到的实例个数 model.fit(x=x, y=Y, epochs=150, batch_size=10)
评估模型(仅用训练数据进行)
# 评估训练数据模型
scores = model.evaluate(x=x, y=Y)
print('n%s : %.2f%%' % (model.metrics_names[1], scores[1]*100))
此外,可通过kera自动评估来对模型性能进行计算,需要使用到fit()函数中的验证分割参数validation_split,该值接受小数点形式,如validation_split=0.2,表示将数据集的20%用于评估模型,其余80%用于训练模型,而后依据这20%的数据表现来给出val_loss 和val_acc
model.fit(x=x, y=Y, epochs=150, batch_size=10,validation_split=0.2)
手动评估有两种形式,一是手动分离数据集并评估,二是k折交叉验证。对于手动指定验证数据集,可用scikit机器学习库里的train_test_split(),而评估数据集通过元组的形式传递给fit()。如下
x_trian,x_validation,Y_train,Y_validation = train_test_split(x,Y,test_size = 0.2,random_state = seed) model.fit(x_train, Y_train ,validation_data = (x_validation,Y_validation), epochs=150, batch_size=10)
使用k折交叉验证的方法(需要注意,此方法一般不用于深度学习,因为深度学习模型的计算开销比较大),使用scikit-Learn机器学习库中的StratifiedKFold对数据集进行划分。代码如下:
from keras.models import Sequential
from keras.layers import Dense
import numpy as np
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import StratifiedKFold
# 设定随机数种子
seed = 7
np.random.seed(seed)
# 导入数据
dataset = pd.read_csv('XXX/diabetes.csv')
# 分割输入x和输出Y
x = dataset.iloc[:,0:8]
Y = dataset.iloc[:,8]
# tensorflow仅接受训练数据为numpy形式
x = np.array(x)
#对Y进行标签编码
Y=Y.values.tolist()
label_encoder = LabelEncoder()
Y = np.array(label_encoder.fit_transform(Y))
kfold = StratifiedKFold(n_splits=10, random_state = seed, shuffle = True)
cvscores =[]
for train, validation in kfold.split(x,Y):
# 创建模型
model = Sequential()
model.add(Dense(12, input_dim=8, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
# 编译模型
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# 训练模型,通过verbose=0来关闭模型fit()和evaluate()的详细输出,在每个模型构建完成后,进行评估并输出评估结果
model.fit(x[train], Y[train], epochs=150, batch_size=10, verbose=0)
# 评估模型
scores = model.evaluate(x[validation], Y[validation], verbose=0)
#输出评估结果
print('%s : %.2f%%' % (model.metrics_names[1], scores[1]*100))
cvscores.append(scores[1]*100)
# 输出均值和标准差
print('%.2f%% (+/- %.2f%%)'% (np.mean(cvscores),np.std(cvscores)))
该文代码源自魏贞原《深度学习:基于Keras的Python实践》



