Regresi Linier Sederhana dalam Keras

12

Setelah melihat pertanyaan ini: Mencoba Meniru Regresi Linier menggunakan Keras , saya telah mencoba untuk memutar contoh saya sendiri, hanya untuk tujuan studi dan untuk mengembangkan intuisi saya.

Saya mengunduh dataset sederhana dan menggunakan satu kolom untuk memprediksi yang lain. Data terlihat seperti ini:

televisi-data

Sekarang saya baru saja membuat model keras sederhana dengan satu, lapisan linear satu simpul dan melanjutkan untuk menjalankan gradient descent di atasnya:

from keras.layers import Input, Dense
from keras.models import Model

inputs = Input(shape=(1,))
preds = Dense(1,activation='linear')(inputs)

model = Model(inputs=inputs,outputs=preds)
sgd=keras.optimizers.SGD()
model.compile(optimizer=sgd ,loss='mse',metrics=['mse'])
model.fit(x,y, batch_size=1, epochs=30, shuffle=False)

Menjalankan model seperti itu memberi saya nankerugian di setiap zaman.

Tautan ke notebook jupyter

Jadi saya memutuskan untuk mulai mencoba hal-hal dan saya hanya mendapatkan model yang layak jika saya menggunakan tingkat pembelajaran yang sangat kecil sgd=keras.optimizers.SGD(lr=0.0000001) :

televisi-data-pas

Sekarang mengapa ini terjadi? Apakah saya harus menyesuaikan tingkat pembelajaran secara manual seperti ini untuk setiap masalah yang saya hadapi? Apakah saya melakukan sesuatu yang salah di sini? Ini seharusnya menjadi masalah yang paling sederhana, bukan?

Terima kasih!

Felipe Almeida
sumber

Jawaban:

11

Ini mungkin karena tidak ada normalisasi yang dilakukan. Jaringan saraf sangat sensitif terhadap data non-normal.

Beberapa intuisi: ketika kami mencoba menemukan minimum global multi-dimensi kami (seperti dalam model penurunan gradien stokastik), dalam setiap iterasi setiap fitur "menarik" ke dalam dimensi (arah vektor) dengan beberapa kekuatan (panjang vektor) ). Ketika data tidak dinormalisasi, langkah kecil dalam nilai untuk kolom A dapat menyebabkan perubahan besar dalam kolom B.

Kode Anda mengatasinya dengan menggunakan tingkat belajar Anda yang sangat rendah, yang "menormalkan" efek pada setiap kolom, meskipun menyebabkan proses pembelajaran tertunda, membutuhkan lebih banyak zaman untuk menyelesaikannya.

Tambahkan kode normalisasi ini:

from sklearn.preprocessing import StandardScaler

sc = StandardScaler()
x = sc.fit_transform(x)
y = sc.fit_transform(y)

Dan cukup jatuhkan param tingkat pembelajaran (lr) - membiarkannya memilih dengan bijak nilai otomatis untuk Anda. Saya mendapat grafik yang diinginkan sama seperti Anda sekarang :)

mork
sumber
Terlihat rapi ... satu-satunya hal yang saya tidak suka adalah saya harus menerapkan standar yang sama untuk menguji input dan kemudian output yang saya dapatkan juga akan berada di set unit yang sama sekali berbeda.
Felipe Almeida
2
Itu benar @Felipe Almeida, hasil output harus "dibalik" kembali, tetapi ini biasanya built-in ke perpustakaan. Lihatlah inverse_transform scikit-learn.org/stable/modules/generated/… dan beberapa metode pra-pemrosesan lainnya scikit-learn.org/stable/modules/preprocessing.html
mork
2

Normalisasi lebih penting ketika Anda memiliki lebih dari satu variabel dependen. Jika Anda melihat plot pencar, Anda dapat melihat outlier. Jaring saraf tanpa lapisan tersembunyi sama dengan model regresi linier. Dengan demikian, sangat sesuai dengan garis terbaik untuk meminimalkan jarak residu. Hapus outlier dan itu akan terlihat lebih tepat.

Samuel Sherman
sumber