2016-11-03 2 views
1

Я пытаюсь использовать логистическую регрессию с использованием кера, это один из моих первых экспериментов в ML. Скажем, я хочу, чтобы предсказать значения для некоторых очень простой непрерывной функции с только 1 аргумент, как y = x*10Модель для прогнозирования простой линейной функции

Я попытался обучить модель так:

from matplotlib import pyplot as plt 
import numpy as np 
from keras.models import Sequential 
from keras.layers import Dense, Activation 

# fix random seed for reproducibility 
np.random.seed(7) 

# function 
curve = np.vectorize(lambda x: x*10) 

# data 
Xideal = np.arange(1, 15.5, 0.005) 
Yideal = curve(Xideal) 
X = Xideal[1::5] 
Y = curve(X) 

# Model 
model = Sequential() 
model.add(Dense(20, activation='sigmoid', input_dim=1)) 
model.add(Dense(5, activation='linear')) 
model.add(Dense(1)) 

model.compile(loss='mse', optimizer='rmsprop', metrics=['accuracy']) 

# Fit 

model.fit(X, Y, nb_epoch=1000, batch_size=32, verbose=0) 

# Evaluate 

# evaluate the model 
scores = model.evaluate(Xideal, Yideal) 
print("\n%s: %.2f%%" % (model.metrics_names[1], scores[1]*100)) 
print("\n%s: %.2f%%" % (model.metrics_names[0], scores[0]*100)) 

дает мне результат из 2624/2900 [==========================>...] - ETA: 0s acc: 2.38% loss: 44.35%

не уверен, что это всего лишь 2,38% точности. Я экспериментировал с различными моделями с различными функциями активации, размерами партии и эпохами, но получал максимум 10% точности. Я думаю, что я пропустил здесь что-то основное

+0

1) Логистическая регрессия на самом деле является классификатором, а не регрессором. Но вам, похоже, нужна регрессия для вашей задачи. 2) Вы действительно должны предварительно обрабатывать свои данные (стандартизация/нормализация, одно из наиболее важных правил с NN) – sascha

ответ

2

Для этих линейных данных достаточно одного плотного слоя. Вместо rmsprop я бы просто использовал градиентный спуск.

Я создал IPython ноутбук для Вас: http://nbviewer.jupyter.org/gist/lhk/6650e4fb85f625199ee5be6d52cbbd0d

Пожалуйста, обратите внимание: В сюжете мне пришлось перенести две строки вручную друг от друга. Вот почему есть -2.

+0

Большое вам спасибо! Почему вы выбрали размер партии 10? – ruX

+1

Градиент потерь будет рассчитан для всей партии, обновление весов в сети будет в среднем по производным по отдельным образцам в партии. Это означает: Огромный пакет -> сильный эффект сглаживания градиентов. Для некоторых проблем это может помочь сделать огромные партии, чтобы сделать тренировку более стабильной. Небольшая партия имеет то преимущество, что в каждую эпоху больше партий: в эпоху будет больше шагов по обновлению. Для этой проблемы существует глобальный оптимум. Решение должно быть хорошо кондиционировано. Поэтому я уменьшил размер партии для более быстрого обновления. – lhk