tflearn многослойный персептрон с неожиданным предсказанием

Я хотел бы перестроить MLP, который я реализовал первым, с помощью MLPRegressor от scikit-learn с помощью tflearn.

Реализация 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. Теперь я хотел бы создать аналогичный MLP с помощью tflearn. Я начал со следующего кода:

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. Какие-нибудь мысли?

ПОСЛЕДНЕЕ ОБНОВЛЕНИЕ:

Взгляните на принятый ответ.


person Mischa    schedule 10.02.2017    source источник


Ответы (2)


Один шаг должен состоять в том, чтобы не масштабировать вывод. Я также работаю над проблемой регрессии и масштабирую только входные данные, и это нормально работает с некоторыми нейронными сетями. Хотя, если я использую tflearn, я получаю неверные прогнозы.

person CrisH    schedule 15.02.2017

Я сделал пару действительно глупых ошибок.

Прежде всего, я перенаправил вывод в интервал от 0 до 1, но использовал в выходном слое функцию активации tanh, которая выдает значения от -1 до 1. Поэтому мне пришлось использовать либо функцию активации, которая выводит значения между 0 и 1 (например, sigmoid), либо linear без применения масштабирования.

Во-вторых и самое главное, для своих данных я выбрал довольно неудачную комбинацию для learning rate и n_epoch. Я не указывал никакой скорости обучения, и я думаю, что по умолчанию она равна 0.1. В любом случае он был слишком мал (в итоге я использовал 3.0). В то же время счетчик эпох (10) тоже был слишком мал, с 200 все работало нормально.

Я также явно выбрал sgd как optimizer (по умолчанию: adam), что оказалось намного лучше.

Я обновил код в своем вопросе.

person Mischa    schedule 20.02.2017