实战 Kaggle 比赛:预测房价

跟之前准确率一样,只是方便人的观察,训练还是用之前的

1 Like

net = nn.Sequential(nn.Linear(in_features,1)) # 线性层会自动初始化权重w和b

1 Like

折1,训练log rmsenan, 验证log rmsenan
折2,训练log rmsenan, 验证log rmsenan
折3,训练log rmsenan, 验证log rmsenan
折4,训练log rmsenan, 验证log rmsenan
折5,训练log rmsenan, 验证log rmsenan
5-折验证: 平均训练log rmse: nan, 平均验证log rmse: nan

这是梯度消失了嘛,为什么我的参数都一样,我会一直梯度消失。该怎么调呢

感觉应该是梯度爆炸了,示例代码中的lr设置的是5,我不知道为什么设这么大的lr,调小点可能会好一些

1 Like

TypeError: linear(): argument ‘input’ (position 1) must be Tensor, not NoneType
不知道为啥我这里的None不能当作tensor进行运算,train_and_pred里面的train会报错,实测把None改为同等形状的空tensor就可以了
train_ls, _ = train(net, train_features, train_labels,None, None,
num_epochs, lr, weight_decay, batch_size)
# train_ls, _ = train(net, train_features, train_labels,torch.empty(train_features.shape), torch.empty(train_labels.shape),
# num_epochs, lr, weight_decay, batch_size)

在把非数值型数据转化成独热编码时,可以换成在每一列用一个数字代表一类,比如该列有三类“红”,“黄”,“蓝”,“红”用1表示,“黄”用2表示,“蓝”用3表示?

拿价格的对数作为loss函数好像结果很不好。平均验证log rmse: 8.059207 :sweat:

3 Likes

我的最好成绩是这样的:
k, num_epochs, lr, weight_decay, batch_size = 5, 100, 0.2, 25, 128
多层网络(in_features, 1024)ReLU(1024, 1), 直接loss(net(x), y)
5-折验证: 平均训练log rmse: 0.028177, 平均验证log rmse: 0.135742

另外训练集的损失可以很低,比如这个:
k, num_epochs, lr, weight_decay, batch_size = 10, 800, 0.02, 25, 128
多层网络(in_features, 1024)ReLU(1024, 1), 直接loss(net(x), y)
10-折验证: 平均训练log rmse: 0.007594, 平均验证log rmse: 0.145192
但是验证集的损失仍然在0.14左右,这是不是说明数据集还是太小了?

2 Likes

我试了一下dropout,结果过拟合果然降低了,但是主要是通过升高了训练损失,而验证损失几乎没怎么改善 :joy:

1 Like

kaggle最好成绩

net = nn.Sequential(nn.Flatten(), 
                        nn.Linear(in_features, 1024),
                       nn.ReLU(),
                       nn.Linear(1024, 1))
k, num_epochs, lr, weight_decay, batch_size = 5, 100, 0.1, 35, 256
7 Likes

k, num_epochs, lr, weight_decay, batch_size = 7, 100, 0.1, 0.00001, 128
这个参数能有更好结果,kaggle的public score可以降到5.52295


有没有colab出现这个问题的,请教解决方法

/usr/local/lib/python3.9/dist-packages/matplotlib/_api/init.py in check_getitem(_mapping, **kwargs)

ValueError: ‘svg’ is not a valid value for output; supported values are ‘path’, ‘agg’, ‘macosx’

SEARCH STACK OVERFLOW

是d2l 里面這句不行, 把svg 改成png 就好了
backend_inline.set_matplotlib_formats(‘svg’)

加入下面的代碼, 把k_fold里面的d2l.plot 改為指向本地的plot就好了

from matplotlib_inline import backend_inline
def set_figsize(figsize=(3.5, 2.5)):
    """Set the figure size for matplotlib.

    Defined in :numref:`sec_calculus`"""
    backend_inline.set_matplotlib_formats('png')
    d2l.plt.rcParams['figure.figsize'] = figsize

def plot(X, Y=None, xlabel=None, ylabel=None, legend=None, xlim=None,
         ylim=None, xscale='linear', yscale='linear',
         fmts=('-', 'm--', 'g-.', 'r:'), figsize=(3.5, 2.5), axes=None):
    """Plot data points.

    Defined in :numref:`sec_calculus`"""
    if legend is None:
        legend = []

    set_figsize(figsize)
    axes = axes if axes else d2l.plt.gca()

    # Return True if `X` (tensor or list) has 1 axis
    def has_one_axis(X):
        return (hasattr(X, "ndim") and X.ndim == 1 or isinstance(X, list)
                and not hasattr(X[0], "__len__"))

    if has_one_axis(X):
        X = [X]
    if Y is None:
        X, Y = [[]] * len(X), X
    elif has_one_axis(Y):
        Y = [Y]
    if len(X) != len(Y):
        X = X * len(Y)
    axes.cla()
    for x, y, fmt in zip(X, Y, fmts):
        if len(x):
            axes.plot(x, y, fmt)
        else:
            axes.plot(y, fmt)
    d2l.set_axes(axes, xlabel, ylabel, xlim, ylim, xscale, yscale, legend)

1 Like

非常感谢!我找到了另一个解决办法,也分享一下:
!pip install --upgrade matplotlib
似乎是matplotlib版本的问题

我做了测试,是可以的哦

1 Like

你好,我想问一下这段代码要放进哪里呢?我在colab上运行李沐老师的这个notebook,然后找不到d2l.plot在哪里 :sob:

为什么我在数据预处理转换为张量时会显示TypeError: can’t convert np.ndarray of type numpy.object_.的报错,这个报错应该如何解决?是因为我没有GPU的原因吗?

2 Likes

训练和验证的log_rmse都是0.16,提交分数0.57,正常吗?(有可能我submission那里出bug了)

确实是我出bug了,现在修了之后 训练和提交分数都是0.16

我对这部分有些疑问。前面提到,我们真正关心的是相对误差,但是这一段代码显示,训练时使用的损失函数实际上是绝对误差,只是记录loss时记录的是相对误差。这样子是否实际上并没有从相对误差的角度对模型的效果进行提升呢?如果将loss(net(x, y))换成log(rmse(net, x, y)),是否会更合理呢

1 Like