具有意外预测的 tflearn 多层感知器

tflearn multi layer perceptron with unexpected prediction

我想重建我首先使用 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 的范围在 2088 之间,预测显示 0.005 左右的数字。在 tflearn 文档中,我刚刚找到了分类示例。

更新 1:

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

最终更新:

看看已接受的答案。

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

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

首先,我将输出调整为 01 的区间,但在 output-layer 中使用了激活函数 tanh,它从 [=13] 传递值=] 到 1。所以我不得不使用激活函数输出 01 之间的值(例如 sigmoid)或 linear 而不应用任何缩放。

其次,也是最重要的一点,对于我的数据,我为 learning raten_epoch 选择了一个非常糟糕的组合。我没有指定任何学习率,我认为默认的学习率是 0.1。无论如何它都太小了(我最终使用 3.0)。同时,纪元计数 (10) 也太小了,200 效果很好。

我还明确选择 sgd 作为 optimizer(默认值:adam),结果效果更好。

我更新了问题中的代码。