我想并排查看训练数据和测试数据的损耗曲线。目前,使用clf.loss_curve
(参见下文)获得每次迭代的训练集损失似乎很简单。
from sklearn.neural_network import MLPClassifier
clf = MLPClassifier()
clf.fit(X,y)
clf.loss_curve_ # this seems to have loss for the training set
但是,我还想在测试数据集上绘制性能。这可用吗?
答案 0 :(得分:5)
clf.loss_curve_
不属于API-docs(尽管在某些示例中使用过)。它存在的唯一原因是因为它在内部用于提前停止。
正如汤姆所提到的,还有一些方法可以使用validation_scores_
。
除此之外,更复杂的设置可能需要采用更加手动的培训方式,您可以控制何时,何地以及如何衡量某些内容。
在阅读了Tom的回答之后,可能明智地说:如果只需要进行时间间隔计算,他将warm_start
和max_iter
组合在一起的方法会保存一些代码(并使用更多sklearn的原始代码) )。这里的代码可以进行内部历元计算(如果需要,也可以与keras进行比较)。
简单(原型)示例:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_mldata
from sklearn.neural_network import MLPClassifier
np.random.seed(1)
""" Example based on sklearn's docs """
mnist = fetch_mldata("MNIST original")
# rescale the data, use the traditional train/test split
X, y = mnist.data / 255., mnist.target
X_train, X_test = X[:60000], X[60000:]
y_train, y_test = y[:60000], y[60000:]
mlp = MLPClassifier(hidden_layer_sizes=(50,), max_iter=10, alpha=1e-4,
solver='adam', verbose=0, tol=1e-8, random_state=1,
learning_rate_init=.01)
""" Home-made mini-batch learning
-> not to be used in out-of-core setting!
"""
N_TRAIN_SAMPLES = X_train.shape[0]
N_EPOCHS = 25
N_BATCH = 128
N_CLASSES = np.unique(y_train)
scores_train = []
scores_test = []
# EPOCH
epoch = 0
while epoch < N_EPOCHS:
print('epoch: ', epoch)
# SHUFFLING
random_perm = np.random.permutation(X_train.shape[0])
mini_batch_index = 0
while True:
# MINI-BATCH
indices = random_perm[mini_batch_index:mini_batch_index + N_BATCH]
mlp.partial_fit(X_train[indices], y_train[indices], classes=N_CLASSES)
mini_batch_index += N_BATCH
if mini_batch_index >= N_TRAIN_SAMPLES:
break
# SCORE TRAIN
scores_train.append(mlp.score(X_train, y_train))
# SCORE TEST
scores_test.append(mlp.score(X_test, y_test))
epoch += 1
""" Plot """
fig, ax = plt.subplots(2, sharex=True, sharey=True)
ax[0].plot(scores_train)
ax[0].set_title('Train')
ax[1].plot(scores_test)
ax[1].set_title('Test')
fig.suptitle("Accuracy over epochs", fontsize=14)
plt.show()
输出:
或者更紧凑:
plt.plot(scores_train, color='green', alpha=0.8, label='Train')
plt.plot(scores_test, color='magenta', alpha=0.8, label='Test')
plt.title("Accuracy over epochs", fontsize=14)
plt.xlabel('Epochs')
plt.legend(loc='upper left')
plt.show()
输出:
答案 1 :(得分:4)
使用MLPClassifier(early_stopping=True)
,停止标准从训练损失变为精确分数,该分数是在验证集(其大小由参数validation_fraction
控制)上计算的。
每次迭代的验证分数都存储在clf.validation_scores_
内。
另一种可能性是将warm_start=True
与max_iter=1
一起使用,并在每次迭代后手动计算要监控的所有数量。
答案 2 :(得分:0)
我使用jupyter
,这是我的代码:
clf = MLPClassifier(hidden_layer_sizes=(10,10,10))
clf.fit(train_X,train_Y)
plt.ylabel('cost')
plt.xlabel('iterations')
plt.title("Learning rate =" + str(0.001))
plt.plot(pose_clf.loss_curve_)
plt.show()