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.
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
import numpy as np
from matplotlib import pyplot as plt
from sklearn import preprocessing
from sklearn import model_selection
from sklearn import datasets
data = datasets.fetch_california_housing()
X = data.data
y = data.target
X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.33, random_state=7)
X_train.shape
(13828, 8)
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.
model = Sequential([
InputLayer(input_shape=(8, )),
Dense(units=64, activation='relu'),
Dense(units=32, activation='relu'),
Dense(units=1)
])
model.compile(optimizer=Adam(learning_rate=0.001), loss=MeanSquaredError(), metrics=[MeanAbsoluteError()])
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.
loss = history.history['loss']
mea = history.history['mean_absolute_error']
val_loss = history.history['val_loss']
val_mea = history.history['val_mean_absolute_error']
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()
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.
from sklearn import metrics
y_predicted = model.predict(X_test)
metrics.r2_score(y_predicted, y_test)
213/213 [==============================] - 0s 274us/step
0.7569578105380371
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.