Какая модель наименьшей регрессионной нейронной сети Кераса идеально подойдет для данных автомобилей? - PullRequest
0 голосов
/ 30 января 2020

Я ищу этот набор данных автомобилей . Я строю и обучаю регрессионную модель с помощью этого кода, адаптированного из этой статьи и этой . Я использую все данные обучения (без разделения на поезд / тест):

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import KFold
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import MinMaxScaler
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.wrappers.scikit_learn import KerasRegressor
dataset=np.loadtxt("cars.csv", delimiter=",", skiprows=1)
x=dataset[:,0:5]
y=dataset[:,5]
y=np.reshape(y, (-1,1))
scaler_x = MinMaxScaler()
scaler_y = MinMaxScaler()
print(scaler_x.fit(x))
xscale=scaler_x.transform(x)
print(scaler_y.fit(y))
yscale=scaler_y.transform(y)
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(xscale, yscale, epochs=1000, batch_size=577,  verbose=1, validation_split=0)
Xnew= scaler_x.transform(Xnew)
ynew= model.predict(Xnew)
ynew = scaler_y.inverse_transform(ynew) 
Znew = scaler_y.inverse_transform(y_train)
plt.figure(figsize=(15,8))
plt.scatter(Znew,ynew);

После 1000 эпох эта модель будет близко, но не совсем соответствовать входным данным обучения:

enter image description here

Эта модель имеет 2 635 777 обучаемых параметров (в самих данных содержится только 5 778 чисел).

Какая модель наименьшей регрессии Кераса (с точки зрения общего числа обучаемых параметров), которые будут тренироваться почти до идеального соответствия этим данным (которые имеют 5 входных параметров, 1 выходной параметр и 963 выборки)?

1 Ответ

1 голос
/ 30 января 2020

Майкл Гроган здесь - я являюсь первоначальным автором этих данных и примера, поэтому надеюсь, что смогу вам помочь.

Вы упоминаете, что не вызывали разделение проверки в ваших данных. Могу ли я спросить, есть ли причина для этого? Цель разделения на обучение и проверку состоит в том, что модель получает обратную связь от параметров проверки и затем соответствующим образом обновляет прогнозы.

Прошло довольно много времени с тех пор, как я смотрел на этот пример, но здесь пример разделения обучения / проверки, и потери обучения и проверки, по-видимому, достигают своего пика после 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))

Вот график потерь обучения и проверки:

graph

Какая модель наименьшей регрессии Кераса ( с точки зрения общего количества обучаемых параметров), которые будут тренироваться почти до идеального соответствия этим данным (которые имеют 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))

graph2

Скрытые слои в вашем примере выглядят довольно большими, поэтому давайте попробуем немного упростить это:

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))

Теперь, когда модель обучается снова, вот новая потеря обучения и проверки:

graph3

Теперь мы видим, что это занимает примерно 50 эпох вместо 20, чтобы получить аналогичную потеря и проверка достоверности. В этом отношении, похоже, существует компромисс между размером скрытых слоев и количеством эпох, используемых для обучения модели.

В общем, модели требовалось 4 входных параметра и намного меньше 1000 эпохи для создания хорошего соответствия.

Одно предостережение - истинный тест на то, будут ли данные соответствовать «идеально», состоит в проверке предсказаний против невидимых данных. Например, мы использовали данные обучения и проверки для построения модели. Часть этих данных должна храниться полностью отдельно, а затем сравниваться с предсказаниями модели для обеспечения точности - это лакмусовая бумажка относительно того, действительно ли модель работает, - и я рекомендую это как следующий шаг, чтобы гарантировать, что ваша модель надежна.

Надеюсь, что выше поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...