一、自动评估
keras可将数据集一部分分成评估数据集,并在每个epoch中使用该评估数据集对模型进行评估,通过对验证分割参数(validation_split
)设置为数据集大小的百分比来实现。
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'])
# 训练模型并自动评估模型
model.fit(x=x, y=Y, epochs=150, batch_size=10, validation_split=0.2)
二、手动评估
在训练期间进行验证,使用scikit机器学习库的train_test_split()
函数将数据分成训练数据集和评估数据集。
函数解释:
train_test_split函数用于将矩阵随机划分为训练子集和测试子集,并返回划分好的训练集测试集样本和训练集测试集标签。
格式:X_train,X_test, y_train, y_test =cross_validation.train_test_split(train_data,train_target,test_size=0.2, random_state=0)
参数解释:
train_data
:被划分的样本特征集
train_target
:被划分的样本标签
test_size
:如果是浮点数,在0-1之间,表示样本占比;如果是整数的话就是样本的数量
random_state
:是随机数的种子。
随机数种子:其实就是该组随机数的编号,在需要重复试验的时候,保证得到一组一样的随机数。比如你每次都填1,其他参数一样的情况下你得到的随机数组是一样的。但填0或不填,每次都会不一样。
随机数的产生取决于种子,随机数和种子之间的关系遵从以下两个规则:
种子不同,产生不同的随机数;种子相同,即使实例不同也产生相同的随机数。
这个例子80%用于训练,剩余20%用于评估。
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)
三、k折交叉验证
机器学习模型的黄金评估标准。
分为k个子集,1一个评估,剩余k-1作为训练。通常k取5-10。
速度极慢!!!
函数解释:
StratifiedKFold
函数是Kfold的变体,通过算法来平衡每个子集中每个类的实例数。即将数据分割为多少个子集。
格式:kfold = StratifiedKFold(n_splits=10, random_state=seed, shuffle=True)
参数解释:
n_splits
:被划分的子集数量。最少为2,默认为3
random_state
:(int,RandomState实例或None,可选,默认=无)
如果是int,则random_state是随机数生成器使用的种子;
如果是RandomState实例,则random_state是随机数生成器;
如果为None,则随机数生成器是np.random
使用的RandomState实例。 当shuffle
== True时使用。
shuffle
:布尔值,可选,是否在拆分之前对数据的每个分层进行洗牌成批。
通过设置verbose为0来关闭模型的fit()和evaluate()函数的详细输出
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]
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[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)))