如何绘制多输出回归任务的训练和测试的损失曲线? [英] How can plot loss curves for training and test for multi-output regression task?
本文介绍了如何绘制多输出回归任务的训练和测试的损失曲线?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在试验MultiOutputRegressor(),我想知道一旦测量到损耗后,是否有可能达到多输出回归任务的Trains&;Testset上的损耗曲线。
我尝试的内容:
import matplotlib.pyplot as plt
import numpy as np
#from sklearn import datasets, ensemble
#from sklearn.inspection import permutation_importance
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
from sklearn.multioutput import MultiOutputRegressor
from sklearn.linear_model import Ridge
# Load the data
#diabetes = datasets.load_diabetes()
#X, y = diabetes.data, diabetes.target
from sklearn.datasets import load_linnerud
X, y = load_linnerud(return_X_y=True)
#Data preprocessing
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.1, random_state=13
)
params = {
"n_estimators": 500,
"max_depth": 4,
"min_samples_split": 5,
"learning_rate": 0.01,
"loss": "squared_error",
}
# Fit regression model
#reg = ensemble.GradientBoostingRegressor(**params).fit(X_train, y_train)
# Fit MultiOutput regression model
reg = MultiOutputRegressor(Ridge(random_state=123)).fit(X_train, y_train)
mse = mean_squared_error(y_test, reg.predict(X_test))
print("The mean squared error (MSE) on test set: {:.4f}".format(mse))
#The mean squared error (MSE) on test set: 37.6474
因此,我尝试启发post,并尝试了以下操作:
# Plot training deviance
test_score = np.zeros((params["n_estimators"]), dtype=np.float64)
for i, y_pred in enumerate(reg.staged_predict(X_test)):
test_score[i] = reg.loss_(y_test, y_pred)
fig = plt.figure(figsize=(6, 6))
plt.subplot(1, 1, 1)
plt.title("Deviance")
plt.plot(np.arange(params["n_estimators"]) + 1,
reg.train_score_,
"b-",
label="Training Set Deviance")
plt.plot(np.arange(params["n_estimators"]) + 1,
test_score, "r-",
label="Test Set Deviance")
plt.legend(loc="upper right")
plt.xlabel("Boosting Iterations")
plt.ylabel("Deviance")
fig.tight_layout()
plt.show()
我遇到此错误:
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-17-5db7534b636e> in <module>()
1 test_score = np.zeros((params["n_estimators"],), dtype=np.float64)
----> 2 for i, y_pred in enumerate(reg.staged_predict(X_test)):
3 test_score[i] = reg.loss_(y_test, y_pred)
4
5 fig = plt.figure(figsize=(6, 6))
AttributeError: 'MultiOutputRegressor' object has no attribute 'staged_pre
我已检查此post已尝试:
import matplotlib.pyplot as plt
plt.plot(reg.loss_curve_)
#plt.plot(reg.validation_scores_)
但面向:
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-25-a6d600185ec3> in <module>()
42
43 # Plot training deviance
---> 44 plt.plot(reg.loss_curve_)
AttributeError: 'MultiOutputRegressor' object has no attribute 'loss_curve_'
我不确定是否可以使用基于Keras的方法来收集历元上的求值(例如MSE),就像asnwer中提到的那样。因为我能够计算mse
,所以它应该是一种在像历元/训练迭代这样的东西上对(多输出)回归任务进行plot loss curves的方法?我也搜索了一下,找到了一些post&;post2,但我无法找到适合我问题的输出。
推荐答案
首先,您需要在您的问题中更具体一点,并更多地解释您试图实现的目标,而不是仅仅发布一大堆代码。此外,还应尽量提供最小的代码示例,而不是带有随机注释的代码。
通过查看Ridge
累加器和MultiOutputRegressor
的文档,它们都没有提供您想要的功能。此外,一般情况下,sklearn
似乎没有可用的接口来在FIT内部提供此功能。
在大多数框架中,如TensorFlow
、Keras
、PyTorch
、...您可以直接访问培训循环,这样您可以决定要记录/保存的每个步骤,或者有一个回调系统,允许您在培训中的特定步骤做特定的事情。然而,sklearn
没有提供任何类似的东西。只有Fit方法才能发挥魔力,仅此而已。
但正如您已经发现的,有一种方法可以获得这种类型的曲线图。
# Load your data without splitting in X and y
regressor = MultiOutputRegressor(Ridge())
from sklearn.model_selection import learning_curve
train_sizes, train_scores, test_scores, fit_times, _ = learning_curve(
estimator,
X,
y,
return_times=True,
)
# Create plots given this data
给定输出数据,您现在可以使用matplotlib
或您喜欢的任何工具创建绘图。对于如何绘制的第一个想法,您可以查看sklearn docu。
如果您想使用其他评分函数,也可以查看这里learning_curve docu。
这篇关于如何绘制多输出回归任务的训练和测试的损失曲线?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文