在keras中,模型评估可以分为自动评估模型和手动评估模型
自动评估模型 自动在每一次epoch中将数据分割为训练集和验证集,并
在每一次epoch后进行验证
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和输出Y
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'])
# 训练模型并自动评估模型
# validation_split=0.2 在每一轮的epoch中,自动将数据集按照8:2的比例进行分割为训练集和validation,
# 并在每一轮epoch后执行validate
model.fit(x=x, y=Y, epochs=10, batch_size=10, validation_split=0.2)
K折交叉验证:sklearn.model_selection.KFold(n_splits=3, shuffle=False, random_state=None)
思路:将训练/测试数据集划分n_splits个互斥子集,每次用其中一个子集当作验证集,剩下的n_splits-1个作为训练集,进行n_splits次训练和测试,得到n_splits个结果
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和输出Y
x = dataset[:, 0 : 8]
Y = dataset[:, 8]
#将数据划分为10分,每次使用的时候都进行洗牌
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可以关闭训练模型过程中的状态输出
# 使用分割的训练集进行训练
model.fit(x[train], Y[train], epochs=10, 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)))
使用数据分割的方式
from keras.models import Sequential
from keras.layers import Dense
from sklearn.model_selection import train_test_split
import numpy as np
seed = 7
# 设定随机数种子
np.random.seed(seed)
# 导入数据
dataset = np.loadtxt('pima-indians-diabetes.csv', delimiter=',')
# 分割输入x和输出Y
x = dataset[:, 0 : 8]
Y = dataset[:, 8]
# 分割数据集
x_train, x_validation, Y_train, Y_validation = train_test_split(x, Y, test_size=0.2, random_state=seed)
# 构建模型
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_train, Y_train, validation_data=(x_validation, Y_validation), epochs=150, batch_size=10)