# Import potrebných balíčkov
import numpy as np
import pandas as pd
from sklearn.metrics import mean_squared_error, mean_absolute_error
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler, OneHotEncoder, KBinsDiscretizer
from sklearn.compose import make_column_transformer
import seaborn as sns
from keras.layers import Dense, Input, Activation
from keras.callbacks import Callback
from keras.models import Model
# Uistíme sa, že máme všetky potrebné dáta
!mkdir -p data/boston_housing
!wget -nc -O data/boston_housing.zip https://www.dropbox.com/s/3jnf3000vwaxtcg/boston_housing.zip?dl=1
!unzip -oq -d data/boston_housing data/boston_housing.zip
# Pomocný kód
class NEpochLogger(Callback):
"""
Trieda na menej časté zobrazovanie priebehu učenia.
"""
def __init__(self, n_epochs=100):
super(NEpochLogger, self).__init__()
self.n_epochs = n_epochs
def on_epoch_end(self, epoch, logs=None):
logs = logs or {}
if epoch % self.n_epochs == 0:
curr_loss = logs.get('loss')
print("epoch = {}; loss = {}".format(
epoch, curr_loss))
V tomto notebook-u budeme aplikovať regresiu na báze umelých neurónových sietí na problém predikcie ceny nehnuteľností. Pracovať budeme s dátovou množinou Boston housing dataset. Cieľom bude z niekoľkých vstupných premenných predikovať cenu nehnuteľnosti.
Začnime tým, že si zobrazíme opis dát:
with open("data/boston_housing/description.txt", "r") as file:
print("".join(file.readlines()))
Ďalej si z CSV súboru načítajme samotnú dátovú množinu:
df = pd.read_csv("data/boston_housing/housing.csv")
df.head()
Dáta rozdelíme na tréningové a testovacie. Použijeme stratifikáciu:
kbins = KBinsDiscretizer(10, encode='ordinal')
y_stratify = kbins.fit_transform(df[["medv"]])
df_train, df_test = train_test_split(df, stratify=y_stratify,
test_size=0.25, random_state=4)
Môžeme si overiť, aké stĺpce máme k dispozícii:
df.columns
Ďalej si dáta predspracujeme. Budeme postupovať podobne ako v doterajších príkladoch. Rozdiel bude v prístupe ku kategorickým premenným. Doteraz sme ich typicky prekódovali tak, že sme každej hodnote priradili nejaké poradové číšlo (pomocou OrdinalEncoder
). V prípade neurónových sietí môže byť vhodnejšie použiť kódovanie 1 z n. Slúži na to trieda OneHotEncoder
, ktorú používame aj pri kódovaní požadovaných výstupov pri klasifikácii.
categorical_inputs = ['chas']
numeric_inputs = ['crim', 'zn', 'indus', 'nox', 'rm', 'age', 'dis', 'rad', 'tax',
'ptratio', 'black', 'lstat']
output = ["medv"]
input_preproc = make_column_transformer(
(OneHotEncoder(categories='auto'), categorical_inputs),
(StandardScaler(), numeric_inputs)
)
output_preproc = StandardScaler()
X_train_raw = df_train[categorical_inputs + numeric_inputs]
Y_train_raw = df_train[output]
X_test_raw = df_test[categorical_inputs + numeric_inputs]
Y_test_raw = df_test[output]
X_train = input_preproc.fit_transform(X_train_raw)
X_test = input_preproc.transform(X_test_raw)
Y_train = output_preproc.fit_transform(Y_train_raw)
Y_test = output_preproc.transform(Y_test_raw)
Vytvorte pomocou balíčka keras
neurónovú sieť, ktorá vykoná regresiu na dátovej množine, ktorú sme vyššie predspracovali.
Otestujte vytvorený klasifikátor na testovacích dátach. Vyhodnoťte strednú kvadratickú chybu, strednú absolútnu chybu a zobrazte histogram chýb.