自动评估
keras将数据集的一部分分成评估数据集,在每个epoch中使用评估数据集对模型进行评估。实现可以通过fit()函数的validation_split设置数据集大小的百分比a来进行实现,评估数据集大小=全量数据集*a获取,训练数据集大小=全量数据集*(1-a)。
#keras 深度模型评估
from keras.models import Sequential
from keras.layers import Dense
import numpy as np
np.random.seed(7)
dataset = np.loadtxt("pima-indians-diabetes.csv",delimiter=",")
x = dataset[:, 0 : 8]
y = dataset[:, 8 ]
#构造模型
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"])
#训练模型并自动评估
model.fit(x=x_train,y=y_train,epochs=150,batch_size=10,validation_split=0.2)
训练结果中多了val_loss和val_acc两个项目的输出。
手动评估
1、手动分隔数据集进行评估
使用scikit机器学习库中的train_test_split()函数将数据分为训练数据集和评估数据集。使用80%的数据进行训练,20%的数据进行评估。
from keras.models import Sequential
from keras.layers import Dense
from sklearn.model_selection import train_test_split
from sklearn import metrics
import numpy as np
#设置随机数种子
np.random.seed(7)
dataset = np.loadtxt("pima-indians-diabetes.csv",delimiter=",")
x = dataset[:, 0 : 8]
y = dataset[:, 8 ]
#数据集划分
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.2,random_state=10)
#构造模型
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"])
#训练模型
model.fit(x=x_train,y=y_train,epochs=150,batch_size=10,validation_data=(x_test,y_test))
2、k折交叉验证评估
k折交叉验证是把数据集分成k份,一份作为评估数据集,剩下k-1份作为训练集,共得到k份训练集数据和评估数据。使用k个模型的平均值作为最终的评估结果。
使用scikit-learn中的StratifiedKFold类将数据分成k个子集。
from keras.models import Sequential
from keras.layers import Dense
import numpy as np
from sklearn.model_selection import StratifiedKFold
seed=7
np.random.seed(seed)
dataset = np.loadtxt("pima-indians-diabetes.csv",delimiter=",")
x = dataset[:, 0 : 8]
y = dataset[:, 8 ]
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"])
#训练模型
model.fit(x=x[train],y=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)))
k折共训练了k个模型,如果模型训练时间很长,这大大增加了计算代价。