目录
1. 经验法评估网络配置
2. 数据拆分
2.1 使用自动验证数据集
2.2 使用手动验证数据集
2.3 使用手动k-折交叉验证
总结
在设计和配置你的深度学习模型时,你必须做出无数决策。
这些决策大都可以通过复制其他网络的结构和使用启发法来解决。然而,最好的方法是实际设计小型实验,并用实际的数据进行经验评估。
这包括高级别决策,如网络中的层数,数量和类型。它还包括较低级别的决策,如选择损失函数,激活函数,优化过程和周期数。
深度学习常用于有非常大的数据集的问题上,这种问题往往有成千上万个实例。
因此,你需要有一个强大的测试工具,可以让你在不可见的数据上估计给定配置的性能,并可靠地将性能与其他配置进行比较。
大量的数据和复杂的模型需要很长的训练时间。
因此,通常使用简单的数据分离将数据分成训练和测试数据集或者训练和验证数据集。
Keras可将你的训练数据的一部分分成验证数据集,然后评估每个周期该验证数据集的性能。
你可以通过设置fit()函数上的validation_split参数(设置成你的训练数据集尺寸的百分比)来实现。
例如,一个合理的值可能是0.2或0.33,即设置20%或33%的训练数据被用于验证。
下面的示例演示了如何在小型二进制分类问题上使用自动验证数据集。本文中的所有例子都使用了Pima印度人发病的糖尿病数据集。你可以从UCI Machine Learning Repository下载,并将数据文件保存在你当前的工作目录中,文件名为pima-indians-diabetes.csv。
# MLP with automatic validation set
from keras.models import Sequential
from keras.layers import Dense
import numpy
# fix random seed for reproducibility
numpy.random.seed(7)
# load pima indians dataset
dataset = numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",")
# split into input (X) and output (Y) variables
X = dataset[:,0:8]
Y = dataset[:,8]
# create model
model = Sequential()
model.add(Dense(12, input_dim=8, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
# Compile model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# Fit the model
model.fit(X, Y, validation_split=0.33, epochs=150, batch_size=10)
运行示例,你可以看到每个周期的详细输出,显示了训练数据集和验证数据集的损失和准确度。
...
Epoch 145/150
514/514 [==============================] - 0s - loss: 0.5252 - acc: 0.7335 - val_loss: 0.5489 - val_acc: 0.7244
Epoch 146/150
514/514 [==============================] - 0s - loss: 0.5198 - acc: 0.7296 - val_loss: 0.5918 - val_acc: 0.7244
Epoch 147/150
514/514 [==============================] - 0s - loss: 0.5175 - acc: 0.7335 - val_loss: 0.5365 - val_acc: 0.7441
Epoch 148/150
514/514 [==============================] - 0s - loss: 0.5219 - acc: 0.7354 - val_loss: 0.5414 - val_acc: 0.7520
Epoch 149/150
514/514 [==============================] - 0s - loss: 0.5089 - acc: 0.7432 - val_loss: 0.5417 - val_acc: 0.7520
Epoch 150/150
514/514 [==============================] - 0s - loss: 0.5148 - acc: 0.7490 - val_loss: 0.5549 - val_acc: 0.7520
Keras还允许你手动设置要在训练期间进行验证的数据集。
在这个例子中,我们使用Python的scikit-learn机器学习库的train_test_split()函数将我们的数据分成训练和测试数据集。我们使用67%的训练,剩下的33%的数据用于验证。
验证数据集可以通过validation_data参数指定给Keras中的fit()函数。它需要一个输入和输出数据集的数组:
# MLP with manual validation set
from keras.models import Sequential
from keras.layers import Dense
from sklearn.model_selection import train_test_split
import numpy
# fix random seed for reproducibility
seed = 7
numpy.random.seed(seed)
# load pima indians dataset
dataset = numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",")
# split into input (X) and output (Y) variables
X = dataset[:,0:8]
Y = dataset[:,8]
# split into 67% for train and 33% for test
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.33, random_state=seed)
# create model
model = Sequential()
model.add(Dense(12, input_dim=8, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
# Compile model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# Fit the model
model.fit(X_train, y_train, validation_data=(X_test,y_test), epochs=150, batch_size=10)
像以前一样,运行示例提供详细的训练输出,包括每个周期的训练和验证数据集上的模型的损失和准确度。
...
Epoch 145/150
514/514 [==============================] - 0s - loss: 0.4847 - acc: 0.7704 - val_loss: 0.5668 - val_acc: 0.7323
Epoch 146/150
514/514 [==============================] - 0s - loss: 0.4853 - acc: 0.7549 - val_loss: 0.5768 - val_acc: 0.7087
Epoch 147/150
514/514 [==============================] - 0s - loss: 0.4864 - acc: 0.7743 - val_loss: 0.5604 - val_acc: 0.7244
Epoch 148/150
514/514 [==============================] - 0s - loss: 0.4831 - acc: 0.7665 - val_loss: 0.5589 - val_acc: 0.7126
Epoch 149/150
514/514 [==============================] - 0s - loss: 0.4961 - acc: 0.7782 - val_loss: 0.5663 - val_acc: 0.7126
Epoch 150/150
514/514 [==============================] - 0s - loss: 0.4967 - acc: 0.7588 - val_loss: 0.5810 - val_acc: 0.6929
评估机器学习模型的黄金标准是k-折交叉验证(k-fold cross validation)。
它为未知数据模型性能提供了可靠的评估。它通过将训练数据集分为k个子集,推出一个子集做测试集,剩下的子集轮流与它比较来训练模型。重复这个过程直到所有数据集都曾成为验证数据集。最后将所有模型的性能评估平均。
交叉验证通常不用于评估深度学习模型,因为计算代价更大。例如k-折交叉验证通常使用5或10次折叠。因此,必须构建和评估5或10个模型,大大增加了模型的评估时间。
然而,当问题足够小或者如果你有足够的计算资源时,k-折交叉验证可以让你对模型性能的估计偏倚较少。
在下面的例子中,我们使用Python的scikit-learn机器学习库中的StratifiedKFold类,将训练数据集分为10折。折叠是分层的,这意味着算法试图平衡每一个类的实例数量
该示例使用10个分裂数据创建和评估10个模型,并收集所有得分。通过将“verbose=0”传递给模型上的fit()函数和evaluate()函数,关闭每个周期的详细输出。
打印每个模型的性能,并存储。然后在运行结束时打印模型性能的平均值和标准偏差,以提供可靠的模型精度估计。
# MLP for Pima Indians Dataset with 10-fold cross validation
from keras.models import Sequential
from keras.layers import Dense
from sklearn.model_selection import StratifiedKFold
import numpy
# fix random seed for reproducibility
seed = 7
numpy.random.seed(seed)
# load pima indians dataset
dataset = numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",")
# split into input (X) and output (Y) variables
X = dataset[:,0:8]
Y = dataset[:,8]
# define 10-fold cross validation test harness
kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=seed)
cvscores = []
for train, test in kfold.split(X, Y):
# create model
model = Sequential()
model.add(Dense(12, input_dim=8, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
# Compile model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# Fit the model
model.fit(X[train], Y[train], epochs=150, batch_size=10, verbose=0)
# evaluate the model
scores = model.evaluate(X[test], Y[test], verbose=0)
print("%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))
cvscores.append(scores[1] * 100)
print("%.2f%% (+/- %.2f%%)" % (numpy.mean(cvscores), numpy.std(cvscores)))
运行示例需要不到一分钟,产生以下输出:
acc: 77.92%
acc: 68.83%
acc: 72.73%
acc: 64.94%
acc: 77.92%
acc: 35.06%
acc: 74.03%
acc: 68.83%
acc: 34.21%
acc: 72.37%
64.68% (+/- 15.50%)
转载:http://machinelearningmastery.com/evaluate-performance-deep-learning-models-keras