我想在训练过程中检查我的损失值,以便观察每一次迭代的损失。到目前为止,我还没有找到一种简单的方法让scikit-learn提供损失值的历史记录,也没有找到scikit-learn内置的功能来为我绘制损失图。
如果没有办法绘制这个图表,那么在分类器.fit结束时能够简单地获取最终的损失值就很好了。
注意:我知道有些解决方案是闭合形式的。我使用了几种没有解析解的分类器,例如逻辑回归和支持向量机(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("时间(轮次)")
plt.ylabel("损失")
plt.close()
这段代码会处理一个普通的SGDClassifier(几乎任何线性分类器),并拦截verbose=1
标志,然后拆分以从详细输出中获取损失值。显然这样做会更慢,但会给我们损失值并打印出来。