首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用SKORCH和PyCaret求解回归问题

用SKORCH和PyCaret求解回归问题
EN

Stack Overflow用户
提问于 2022-07-13 09:08:09
回答 1查看 146关注 0票数 1

使用奇妙的文章https://towardsdatascience.com/pycaret-skorch-build-pytorch-neural-networks-using-minimal-code-57079e197f33,有一个很好的例子,使用SKORCH和PyCaret来处理分类问题,但是我在处理回归问题时遇到了困难。

代码语言:javascript
复制
import pycaret
import numpy as np
import torch.nn as nn
import torch.nn.functional as F
from skorch import NeuralNetRegressor
from sklearn.pipeline import Pipeline
from skorch.helper import DataFrameTransformer
from pycaret.regression import *
from pycaret.datasets import get_data

data = get_data('boston')
target = "medv"

reg1 = setup(data = data, 
            target = target,
            train_size = 0.8,
            fold = 5,
            session_id = 123,
            silent = True)

class RegressorModule(nn.Module):
    def __init__(
            self,
            num_units=100,
            nonlin=F.relu,
    ):
        super(RegressorModule, self).__init__()
        self.num_units = num_units
        self.nonlin = nonlin

        self.dense0 = nn.Linear(14, num_units)
        self.nonlin = nonlin
        self.dense1 = nn.Linear(num_units, 10)
        self.output = nn.Linear(10, 1)

    def forward(self, X, **kwargs):
        X = self.nonlin(self.dense0(X))
        X = F.relu(self.dense1(X))
        X = self.output(X)
        return X

net_regr = NeuralNetRegressor(
    RegressorModule,
    max_epochs=20,
    lr=0.1,
    device='cuda'
)

nn_pipe = Pipeline(
    [
        ("transform", DataFrameTransformer()),
        ("net", net_regr),
    ]
)

skorch_model = create_model(nn_pipe)

但它有以下错误:

ValueError:目标数据不应该是1维的,而是有2维的,第二维度的大小与回归目标的数量(通常是1)相同。请将目标数据重塑为二维数据(例如y= y.reshape(-1,1) )。

如果我获取相同的数据,并将其规范化、重塑等等,并将其直接传递给SKORCH,它就能正常工作,如下所示:

代码语言:javascript
复制
X = data.copy().to_numpy().astype(np.float32)
mean = X.mean(axis=0)
X -= mean
std = X.std(axis=0)
X /= std

y = data[target].to_numpy().astype(np.float32)
y = y.reshape(-1, 1)
net_regr.fit(X, y)

所以问题就在于它如何将PyCaret (基于DataFrame)数据和SKORCH转换到PyTorch中,即y保持一维,这对于上面链接中的分类模型来说是很好的,但对于需要2D的回归则不是这样。有我能拦截/转换y吗?

谢谢:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-17 23:52:14

带Skorch的Py呼尔数据集中提到了这一点。无论如何,这并不能解决问题。如果您重载NeuralNetworkRegressor的适配,如下所示:

代码语言:javascript
复制
class MyNet(NeuralNetRegressor):
def fit(self, X, y):
    if y.ndim == 1:
        y = y.values.reshape(-1, 1)
    return super().fit(X, y)

net_regr = MyNet(
    RegressorModule,
    max_epochs=20,
    lr=0.1,
    train_split=None
)

应该管用的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72963666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档