Python Sklearn在训练过程中显示损失值



我想在训练时间内检查我的损失值,以便我可以在每次迭代处观察损失。到目前为止

如果没有办法绘制此内容,那么如果我可以简单地在分类器的末尾获取最终损失值。

注意:我知道某些解决方案是封闭形式的事实。我正在使用几个没有分析解决方案的分类器,例如逻辑回归和SVM。

有人有任何建议吗?

,所以我找不到关于直接获取每次迭代损失值的很好的文档,但我希望这将来会对某人有所帮助:

old_stdout = sys.stdout
sys.stdout = mystdout = StringIO()
clf = SGDClassifier(**kwargs, verbose=1)
clf.fit(X_tr, y_tr)
sys.stdout = old_stdout
loss_history = mystdout.getvalue()
loss_list = []
for line in loss_history.split('n'):
    if(len(line.split("loss: ")) == 1):
        continue
    loss_list.append(float(line.split("loss: ")[-1]))
plt.figure()
plt.plot(np.arange(len(loss_list)), loss_list)
plt.savefig("warmstart_plots/pure_SGD:"+str(kwargs)+".png")
plt.xlabel("Time in epochs")
plt.ylabel("Loss")
plt.close()

此代码将采用普通的SGDClassifier(几乎所有线性分类器(,并拦截verbose=1标志,然后将分开以从冗长的打印中损失。显然这是较慢的,但会给我们带来损失并打印。

使用model.loss_curve_

您可以使用verbose选项在每次迭代上打印值,但是如果您想要实际的值,这不是继续进行的最佳方法,因为您需要做一些骇人听闻的事情来解析它们。

是的,该文档不会提及有关此属性的任何内容,但是如果您检查源代码,您可能会注意到MLPClassifier基类(BaseMultilayerPerceptron(中的一个实际上定义了一个属性loss_curve_iterarion。

当您在列表中获取所有值时,绘图应使用任何库。

请注意,此属性仅在使用随机求解器(即sgdadam(时存在。

我刚刚改编并更新了@oneraynyday的答案。使用上下文管理器更优雅。

定义上下文管理器:

import sys
import io
import matplotlib.pyplot as plt
class DisplayLossCurve(object):
  def __init__(self, print_loss=False):
    self.print_loss = print_loss
  """Make sure the model verbose is set to 1"""
  def __enter__(self):
    self.old_stdout = sys.stdout
    sys.stdout = self.mystdout = io.StringIO()
  
  def __exit__(self, *args, **kwargs):
    sys.stdout = self.old_stdout
    loss_history = self.mystdout.getvalue()
    loss_list = []
    for line in loss_history.split('n'):
      if(len(line.split("loss: ")) == 1):
        continue
      loss_list.append(float(line.split("loss: ")[-1]))
    plt.figure()
    plt.plot(np.arange(len(loss_list)), loss_list)
    plt.xlabel("Epoch")
    plt.ylabel("Loss")
    if self.print_loss:
      print("=============== Loss Array ===============")
      print(np.array(loss_list))
      
    return True

用法:

from sklearn.linear_model import SGDRegressor
model = SGDRegressor(verbose=1)
with DisplayLossCurve():
  model.fit(X, Y)
# OR
with DisplayLossCurve(print_loss=True):
  model.fit(X, Y)

最新更新