【问题标题】:How can plot loss curves for training and test for multi-output regression task?如何为多输出回归任务的训练和测试绘制损失曲线?
【发布时间】:2022-03-02 18:42:22
【问题描述】:

我正在试验MultiOutputRegressor(),我想知道一旦测量到损失,是否有可能在多输出回归任务的训练集和测试集上达到损失曲线。

我尝试过的:

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 的一种方法,用于(多输出)回归任务,比如时期/训练迭代?我也进行了一些搜索,发现了一些 postpost2,但我无法达到适合我的问题的输出。

【问题讨论】:

    标签: python machine-learning scikit-learn regression loss-function


    【解决方案1】:

    首先,您需要更具体地提出您的问题,并多解释一下您想要实现的目标,而不是仅仅发布一大堆代码。还尝试提供您的代码的最小示例,而不是例如带有随机 cmets 的代码。

    通过查看 Ridge 回归器和 MultiOutputRegressor 的文档,它们都没有提供您正在寻找的功能。此外,sklearn 似乎也没有可用的接口来提供开箱即用的功能。

    TensorFlowKerasPyTorch 等大多数框架中,您可以直接访问训练循环,这样您就可以决定每一步要记录/保存什么或在那里是一个回调系统,允许您在培训的特定步骤中做特定的事情。然而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

    【讨论】:

    • 感谢您的意见;首先,我知道MRE,如果问题仍然不清楚,您可以询问或发表评论以更新它。第二,您在要求绘制损失训练曲线的帖子中没有明白这一点。您可以在发布不完整的答案之前询问/评论!基于此postlearning_curveloss 训练曲线 之间存在差异。我希望这个包也可以为我们提供损失训练曲线
    • 很明显你不知道,但无论如何。然后我问你......你期望这个特定算法的损失曲线有什么?这种算法不需要迭代优化的概念。
    猜你喜欢
    • 1970-01-01
    • 2021-02-07
    • 2021-08-18
    • 2019-03-07
    • 1970-01-01
    • 2021-04-23
    • 1970-01-01
    • 2020-01-22
    • 1970-01-01
    相关资源
    最近更新 更多