Майкл Гроган здесь - я являюсь первоначальным автором этих данных и примера, поэтому надеюсь, что смогу вам помочь.
Вы упоминаете, что не вызывали разделение проверки в ваших данных. Могу ли я спросить, есть ли причина для этого? Цель разделения на обучение и проверку состоит в том, что модель получает обратную связь от параметров проверки и затем соответствующим образом обновляет прогнозы.
Прошло довольно много времени с тех пор, как я смотрел на этот пример, но здесь пример разделения обучения / проверки, и потери обучения и проверки, по-видимому, достигают своего пика после 20 эпох - так что 1000 строго не требуется. Исходный учебник, который я написал, использовал 150 эпох в этом примере.
x и y разделены следующим образом:
x_train, x_val, y_train, y_val = train_test_split(xscale, yscale, random_state=0)
Затем я запустил модель, используя ваши конфигурации:
model = Sequential([
Dense(2048, activation='relu', input_dim=5),
Dense(1024, activation='relu'),
Dense(512, activation='relu'),
Dense(1)
])
model.compile(loss='mse', optimizer='adam', metrics=['mse','mae'])
history = model.fit(x_train, y_train, epochs=20, batch_size=577, verbose=1, validation_data=(x_val, y_val))
Вот график потерь обучения и проверки:
Какая модель наименьшей регрессии Кераса ( с точки зрения общего количества обучаемых параметров), которые будут тренироваться почти до идеального соответствия этим данным (которые имеют 5 входных параметров, 1 выходной параметр и 963 выборки)?
Когда вы говорите «модель наименьшей регрессии Кераса», вы, похоже, имеете в виду ту, которая использует наименьшее количество функций для достижения того же (или большей точности). Один из способов определить это - использовать инструмент выбора объектов, такой как ExtraTreesClassifier , где каждая функция ранжируется с точки зрения ее важности (чем больше число, тем важнее).
Учитывая характеристики возраст, пол, мили, долг и доход, вот результаты:
In:
from sklearn.ensemble import ExtraTreesClassifier
model = ExtraTreesClassifier()
model.fit(x, y)
print(model.feature_importances_)
Out: [0.23371284 0.01554055 0.23787049 0.25267784 0.26019827]
За исключением пола, другие функции ранжируются аналогично по важности.
В связи с этим, давайте снова запустим модель, но на этот раз без переменной пола.
Вот модель (единственное изменение - это input_dim = 4), а вот новая потеря обучения и проверки:
model = Sequential([
Dense(2048, activation='relu', input_dim=4),
Dense(1024, activation='relu'),
Dense(512, activation='relu'),
Dense(1)
])
model.compile(loss='mse', optimizer='adam', metrics=['mse','mae'])
history = model.fit(x_train, y_train, epochs=20, batch_size=577, verbose=1, validation_data=(x_val, y_val))
Скрытые слои в вашем примере выглядят довольно большими, поэтому давайте попробуем немного упростить это:
model = Sequential([
Dense(12, activation='relu', input_dim=4),
Dense(8, activation='relu'),
Dense(1, activation='linear')
])
model.compile(loss='mse', optimizer='adam', metrics=['mse','mae'])
history = model.fit(x_train, y_train, epochs=20, batch_size=577, verbose=1, validation_data=(x_val, y_val))
Теперь, когда модель обучается снова, вот новая потеря обучения и проверки:
Теперь мы видим, что это занимает примерно 50 эпох вместо 20, чтобы получить аналогичную потеря и проверка достоверности. В этом отношении, похоже, существует компромисс между размером скрытых слоев и количеством эпох, используемых для обучения модели.
В общем, модели требовалось 4 входных параметра и намного меньше 1000 эпохи для создания хорошего соответствия.
Одно предостережение - истинный тест на то, будут ли данные соответствовать «идеально», состоит в проверке предсказаний против невидимых данных. Например, мы использовали данные обучения и проверки для построения модели. Часть этих данных должна храниться полностью отдельно, а затем сравниваться с предсказаниями модели для обеспечения точности - это лакмусовая бумажка относительно того, действительно ли модель работает, - и я рекомендую это как следующий шаг, чтобы гарантировать, что ваша модель надежна.
Надеюсь, что выше поможет.