深度学习模型不会得到完全超出范围的训练预测值,即使对于训练数据集也是如此,并为R2提供了一个巨大的负值。
如果我运行下面的代码,我会得到一个巨大的负值R2。数据集很大,特别是有很多特征。这是一个简化的数据文件,仍然能够重现问题:text。如果我用简单的线性回归或SVR算法运行相同的数据,我会得到一个很好的值(见下一段代码)。
我玩了参数,主要是层数,每层的单元数和学习率,没有成功。我也试着将数据标准化。
对于其他较小的问题,类似的代码起作用。你知道可能是什么问题吗?也许这对DL来说不是问题。
这里是深度学习模型:
import pandas as pd
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
from scikeras.wrappers import KerasRegressor
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import KFold
var='target'
matrixpd = pd.read_csv('data.csv', index_col=0)
md=matrixpd[var]
matrixpd = matrixpd.drop(columns=var)
def build_model():
model = keras.Sequential([
layers.Dense(16, activation='relu', input_shape=[len(matrixpd.keys())]),
# layers.Dense(16, activation='relu'),
layers.Dense(1)
])
optimizer = tf.keras.optimizers.RMSprop(0.01)
model.compile(loss='mse',
optimizer=optimizer,
metrics=['mae', 'mse'])
return model
EPOCHS = 100
estimator = KerasRegressor(model=build_model, epochs=EPOCHS, verbose=0)
kfold = KFold(n_splits=3)
results = cross_val_score(estimator, matrixpd, md, cv=kfold, scoring='r2')
print("R2: %.2f (%.2f)" % (results.mean(), results.std()))
字符串
线性回归模型:
import pandas as pd
from sklearn import datasets, linear_model
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import KFold
var='target'
matrixpd = pd.read_csv('data.csv', index_col=0)
md=matrixpd[var]
matrixpd = matrixpd.drop(columns=var)
model = linear_model.LinearRegression()
kfold = KFold(n_splits=3)
results = cross_val_score(model, matrixpd, md, cv=kfold, scoring='r2')
print("R2: %.2f (%.2f)" % (results.mean(), results.std()))
型
谢谢你,谢谢
2条答案
按热度按时间xghobddn1#
我能够在PyTorch中使用这些数据训练模型。与您的体系结构的主要区别是:
1.我发现它有助于逐渐减少通道,而不是突然过渡到16个单元的层。有500个输入功能,我做了以下工作:
密集(输出=500)、ReLU、BN
密集(250)、ReLU、BN
密集(125),ReLU,BN
密集(64)、ReLU、BN
密集(1)
您可以删除一些批处理规范(BN),根据一些快速实验,它仍然可以正常工作。
1.我发现
RMSprop
很难收敛,而学习率为0.01
的Adam
收敛得很好。1.我运行了200个epoch。列车MSE进展如下:
epoch 0|损失:8250
时代20|损失:7486
时代40|损失:5677
时代60|损失:2932
80年代|损失:699
时代100|损失:16
时代120|损失:6
时代140|损失:0.7
时代160|损失:0.07
时代180|损失:0.01
正如你所看到的,它在前60-80个时期开始时相对较高,之后急剧下降。
我使用下面的方法对数据进行了标准化,但发现它对收敛没有太大影响,可能是因为BN执行了自己的标准化。
字符串
作为参考,我的PyTorch代码是:
型
uz75evzq2#
谢谢,这对我来说也很有用,即使是更大的数据集。我试着用Keras实现一些等价的东西,它适用于这个简化的数据集,但不适用于更大的数据集。而且,PyTorch做得更快。我想知道我没有用Keras做的PyTorch是什么。
以下是PyTorch和Keras的最终实现,以供比较:
PyTorch:
字符串
Keras:
型