1

我想重建一个我首先用 scikit-learn 的 MLPRegressor 和 tflearn 实现的 MLP。

sklearn.neural_network.MLPRegressor 实现:

train_data = pd.read_csv('train_data.csv', delimiter = ';', decimal = ',', header = 0)
test_data = pd.read_csv('test_data.csv', delimiter = ';', decimal = ',', header = 0)

X_train = np.array(train_data.drop(['output'], 1))
X_scaler = StandardScaler()
X_scaler.fit(X_train)
X_train = X_scaler.transform(X_train)

Y_train = np.array(train_data['output'])

clf = MLPRegressor(activation = 'tanh', solver='lbfgs', alpha=0.0001, hidden_layer_sizes=(3))
clf.fit(X_train, Y_train)
prediction = clf.predict(X_train)

该模型有效,我得到了0.85. 现在我想用 tflearn 构建一个类似的 MLP。我从以下代码开始:

train_data = pd.read_csv('train_data.csv', delimiter = ';', decimal = ',', header = 0)
test_data = pd.read_csv('test_data.csv', delimiter = ';', decimal = ',', header = 0)

X_train = np.array(train_data.drop(['output'], 1))
X_scaler = StandardScaler()
X_scaler.fit(X_train)
X_train = X_scaler.transform(X_train)

Y_train = np.array(train_data['output'])
Y_scaler = StandardScaler()
Y_scaler.fit(Y_train)
Y_train = Y_scaler.transform(Y_train.reshape((-1,1)))

net = tfl.input_data(shape=[None, 6])
net = tfl.fully_connected(net, 3, activation='tanh')
net = tfl.fully_connected(net, 1, activation='sigmoid')
net = tfl.regression(net, optimizer='sgd', loss='mean_square', learning_rate=3.)

clf = tfl.DNN(net)
clf.fit(X_train, Y_train, n_epoch=200, show_metric=True)
prediction = clf.predict(X_train)

在某些时候,我肯定以错误的方式配置了一些东西,因为预测已经偏离了。Y_train 的范围在20和之间88,预测显示数字在 左右0.005。在 tflearn 文档中,我刚刚找到了分类示例。

更新 1:

我意识到回归层默认使用'categorical_crossentropy'作为分类问题的损失函数。所以我选择'mean_square'了。我也尝试正常化Y_train. 预测仍然与 的范围不匹配Y_train。有什么想法吗?

最后更新:

看看接受的答案。

4

2 回答 2

0

一个步骤应该是不要缩放输出。我也在研究回归问题,我只缩放输入,它在一些神经网络上工作得很好。虽然如果我使用 tflearn 我会得到错误的预测。

于 2017-02-15T11:16:09.807 回答
0

我犯了几个实际上非常愚蠢的错误。

首先,我将输出调用到区间0to1但在输出层中使用了tanh传递值的激活函数-1to 1。所以我不得不使用一个激活函数来输出01(例如sigmoid)之间的值,或者linear没有应用任何缩放。

其次也是最重要的是,对于我的数据,我为learning rate和选择了一个非常糟糕的组合n_epoch。我没有指定任何学习率0.1,我认为默认的是 。无论如何它太小了(我最终使用3.0)。同时,epoch 计数 ( 10) 也太小了,200但运行良好。

我还明确选择了sgdas optimizer(default: adam),结果证明效果更好。

我更新了我的问题中的代码。

于 2017-02-20T08:23:16.137 回答