Primer¶

Potpuno povezane neuronske mreže se mogu koristiti i za regresiju i za klasifikaciju. Mnogo češće se koriste za regresiju jer su se u zadacima klasifikacije mnogo bolje pokazale konvolutivne neuronske mreže.

Glavna razlika u odnosu na klasifikaciju je ta što u izlaznom sloju imamo tačno jedan neuron i to što koristimo drugu funkciju gubitaka, odnosno umesto funkcije verodostojnosti koristimo srednjekvadratnu grešku.

Model pravimo na skupu podataka California Housing. Skup podataka sadrži informacije o nekretninama, a potrebni je napraviti model koji će predvideti cenu nekretnine.

In [1]:
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import InputLayer, Dense, Activation
from tensorflow.keras.losses import MeanSquaredError, MeanAbsoluteError
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.datasets import boston_housing
In [2]:
import numpy as np
from matplotlib import pyplot as plt
from sklearn import preprocessing
from sklearn import model_selection
from sklearn import datasets
In [3]:
data = datasets.fetch_california_housing()
X = data.data
y = data.target
In [4]:
X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.33, random_state=7)
In [5]:
X_train.shape
Out[5]:
(13828, 8)
In [6]:
scaler = preprocessing.StandardScaler()
scaler.fit(X_train)
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)

Pravimo mrežu sa dva skrivena sloja. Prvi skriveni sloj će sadržati 64 neurona, a drugi 32 neurona. U oba sloja koristimo relu aktivacionu funkciju. Ulazni sloj sadrži 8 neurona jer imamo toliko prediktora, a izlazni sadrži 1 neuron jer je u pitanju regresija.

In [7]:
model = Sequential([
    InputLayer(input_shape=(8, )), 
    Dense(units=64, activation='relu'),
    Dense(units=32, activation='relu'), 
    Dense(units=1)
])
In [8]:
model.compile(optimizer=Adam(learning_rate=0.001), loss=MeanSquaredError(), metrics=[MeanAbsoluteError()])
Sada ćemo prilikom treniranja mreže, jedan deo podataka iskoristiti za validaciju. Parametar validation_split omogućava da se u zadatoj srazmeri izdvoji deo skupa za treniranje koji će biti korišćen isključivo za validaciju. Na kraju svake epohe nad ovim skupom će biti izračunate i sačuvane metrike zadate na nivou modela.
Mrežu ćemo trenirati u 100 epoha (epochs) sa paketićima veličine (batch_size) 32 instance. Batch_size predstavlja broj instanci koje uzimamo prilikom jednog koraka gradijentnog spusta, dok broj epoha predstavlja broj prolazaka kroz trening skup.
In [9]:
history = model.fit(X_train, y_train, epochs=100,
                    batch_size=32, verbose=0, validation_split=0.2)
2023-03-26 18:49:24.981737: W tensorflow/core/platform/profile_utils/cpu_utils.cc:128] Failed to get CPU frequency: 0 Hz

Prvo ćemo prikazati na zajedničkom grafiku funkcije gubitka na skupu za treniranje i validaciju, a potom i srednju apsolutnu grešku.

In [10]:
loss = history.history['loss']
mea = history.history['mean_absolute_error']
val_loss = history.history['val_loss']
val_mea = history.history['val_mean_absolute_error']
In [11]:
plt.title('Funkcija gubitka')
plt.xlabel('epochs')
plt.ylabel('loss')
plt.plot(history.epoch, loss, label='training')
plt.plot(history.epoch, val_loss, label='validation')
plt.legend(loc='best')
plt.show()
In [12]:
plt.title('Srednja apsolutna greška')
plt.xlabel('epochs')
plt.ylabel('mae')
plt.plot(history.epoch, mea)
plt.plot(history.epoch, val_mea)
plt.show()

Izračunaćemo $R^2$ skor na test skupu.

In [13]:
from sklearn import metrics
In [14]:
y_predicted = model.predict(X_test)
metrics.r2_score(y_predicted, y_test)
213/213 [==============================] - 0s 274us/step
Out[14]:
0.7569578105380371

Zadatak za rad na času¶

Sa linka https://drive.google.com/file/d/1QM4HCtIivMpBDjeQsVCggDTVFeOMWWw9/view preuzeti bazu podataka. Napraviti različite varijante potpuno povezane mreže za predviđanje kolone charges na osnovu ostalih kolona. Uporediti dobijene rezultate.