[最佳0.11353! @a1041134926,奖励详见2楼,分数持续更新中] 实战Kaggle比赛:房价预测 讨论区


#269

额,公司有proxy限制。这是在https://pypi.org/project/mxnet/#files上刚查到的,上面显示只有mac和linux的


#270

windows的在 https://pypi.org/project/mxnet/1.2.1 , post1版是为了修mac和linux的dependency才发的,windows不受影响


#271

如果公司proxy没有,一种可能性是试试build from source:


#272

感谢,解决了我的问题。前两天都是用1.3.几的测试版本在跑,不过总是心里没底~


#273

clipped_preds = nd.clip(net(train_features), 1, float(‘inf’))
请问这里的 float(‘inf’) 是指没有最大值限制的意思吗? 为什么这样写?


#274

对,只设下限


#275

大佬,我想问一下我的电脑可以装GPU么??


有一个是AMD显卡


#276

为什么我加了一个隐藏层以后,误差变得特别大,训练的过程中误差一直是na


#277

你们这么牛掰都做了什么特征工程吗?看kaggle里面的分享,很多都是做了特征的处理才得到和你们类似的结果呢。。。@sfy020 @pitt


#278

5-fold validation,avg train rmse:0.017150,avg valid rmse:0.164412
训练损失还不错吧?怎么降低验证集的损失啊?
增加了512单元的隐藏层,丢弃率已经是0.1了。。。
从0.5降下来到现在0.1.。。。按道理说应该是会验证集的拟合会越来越好。。。
实际上却得到了相反的结果。。。训练集的损失明显降低,而验证集的不变。。。:sob:
哪里还可以改改,提高一下?


#279

瞎搞一阵,成绩提高了很多。。。在rmse0.12以内了。。。
我的weight_decay是500.。。。有没有吓到大家?%E7%AC%91


#280

想问什么调试weight decay反而效果差了,迭代到后面误差陡然增加


#282

1.对于缺失的特征值,我们将其替换成该特征的均值。all_features = all_features.fillna(all_features.mean())
pandas 里如果这个feature的所有值都是NaN,那他的mean是多少,fillna怎么填入?

In [1]: df = pd.DataFrame({‘A’: [1,2,float(‘nan’),4], ‘B’: float(‘nan’), ‘C’: np.array([3]*4, dtype=‘int32’), ‘D’: pd.Series(2, index=list(range(4)), dtype=‘float32’)})

In [2]: df

Out[2]:
A B C D
0 1.0 NaN 3 2.0
1 2.0 NaN 3 2.0
2 NaN NaN 3 2.0
3 4.0 NaN 3 2.0

In [3]: df.mean()
Out[3]:
A 2.333333
B NaN
C 3.000000
D 2.000000
dtype: float64

In [4]: df.fillna(df.mean())
Out[4]:
A B C D
0 1.000000 NaN 3 2.0
1 2.000000 NaN 3 2.0
2 2.333333 NaN 3 2.0
3 4.000000 NaN 3 2.0

2.log_rmse 将小于 1 的值设成 1, 为何train_labels 不需要nd.clip ?

3.get_k_fold_data 如果X.shape[0] 不是 k的整数倍,那么有最尾不到k个数据没有被训练所使用,对吗?
应该在return前加入如下代码:

    if X.shape[0] > k * fold_size:
      idx = slice(k * fold_size, X.shape[0])
      X_part, y_part = X[idx, :], y[idx]
      nd.concat(X_train, X_part, dim=0)
      nd.concat(y_train, y_part, dim=0)

#283

在书中模型基础上,加了一个隐藏层,调了调参数,达到0.12(但是按之前参数再也调不回来这个成绩了,很奇怪)。看了论坛中各位道友的思路,房价处理成对数,调低学习率,成绩又提高一点。继续炼丹中……


#284

预处理中遇到了点问题,求解答:)
我对房价取log是这样做的
train_labels = nd.array(train_data.SalePrice.values, ctx=mx.gpu(0)).reshape((-1, 1)).log(),最后加了个.log()
这样一来我的model输出的值应该也是取log后的房价吧?所以我把log_rmse也做了修改,改了一行:rmse = nd.sqrt(2 * loss(clipped_preds, train_labels).mean()),这一行原本是rmse = nd.sqrt(2 * loss(clipped_preds.log(), train_labels.log()).mean())
但是这样改动之后,跑k_fold时平均rmse大概是10的样子,不知道是哪里不对。
我目前的模型是这样定义的:

def get_net():
    net = nn.Sequential()
    net.add(nn.Dense(50, activation="relu"),
            nn.Dropout(0.1),
            nn.Dense(1))
    net.initialize(ctx=mx.gpu(0))
    return net

#285

补充一下,我原来的lr是0.15,后来调小了以后变得正常多了,不过模型的表现还是不如不做预处理。。我想知道我这样预处理的做法是不是对的;model表现不如以前是不是因为其他参数的问题呢?


#286

刷到0.11了,分享几点调参经验:

  • 令你的loss函数与你的优化目标相同(或者是线性变换),在不同的目标下工作会让你偏离方向。(aston说log后loss非线性不符合回归假设,我觉得目标一致比较省脑子)

  • 把epochs设的足够长,并且每100个epoch输出一次loss。比曲线精确。在训练完成前就知道结果。觉得训练充分了可以手动停止。

  • 一次只改变一个参数。

  • 开始lr设的小一些,直到观察到train_ls稳定下降,再回调。

  • 开始dropout和wd都设的大一些,直到观察到train_ls和test_ls重合的比较好,再回调。

  • wd会导致损失精度,调到不导致过拟合的最小wd比较好。

  • 更小的lr总是不亏的,搓几把大乱斗再回来看结果,机器辛苦总好过人辛苦。小lr大epoch 比 大lr再early stop 要更容易分析。

  • 不知道为什么,增加网络宽度比增加深度要更有效。(因为这个任务组合特征不强吗?)


#287

不错不错,差点超过我了。。。怕怕。。。:joy:


#290


请问train函数里面的data前为什么需要加 * 号?


#291

Current loss:0.11743

num_epochs, lr, weight_decay, batch_size = 50, 0.05, 80, 64。使用了一层含有128个units的hidden layer,激活函数是relu。


从线性回归的0.17 --> 一层256个units的hidden layer的0.12 --> 现在的0.117。

总结

  • 1.先用小的epochs找到平滑的loss下降。
  • 2.学习率先从一个比较大的数开始(如10),之后不断二分减小,找到合适的值。
  • 3.weight_decay可选一个较小的值开始(如0.001),不断二分倍增,知道找到合适的值
    (第一次调参居然进入前1000了~ 开心!继续加油!