from sklearn.datasets import fetch_california_housing
import numpy as np
from tensorflow.python.keras.models import Sequential, Model
from tensorflow.python.keras.layers import Dense, Input
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score, mean_squared_error
import matplotlib.pyplot as plt
import matplotlib as mpl
from tensorflow.python.keras.callbacks import EarlyStopping
from sklearn.preprocessing import MinMaxScaler, MaxAbsScaler, StandardScaler, RobustScaler

#1. 데이터

datasets= fetch_california_housing()
x = datasets.data
y = datasets.target

x_train, x_test, y_train, y_test = train_test_split(
    x, y,
    train_size=0.9, random_state=12)

scaler=MinMaxScaler()
# scaler=MaxAbsScaler()
# scaler=StandardScaler()
# scaler=RobustScaler()
scaler.fit(x_train)
x_train = scaler.transform(x_train)
x_test = scaler.transform(x_test)

#2. 모델구성

# model = Sequential()
# model.add(Dense(5, input_dim=8))
# model.add(Dense(12, activation='relu'))
# model.add(Dense(27, activation='relu'))
# model.add(Dense(38, activation='relu'))
# model.add(Dense(42, activation='relu'))
# model.add(Dense(50, activation='relu'))
# model.add(Dense(32, activation='relu'))
# model.add(Dense(24, activation='relu'))
# model.add(Dense(12, activation='relu'))
# model.add(Dense(8, activation='relu'))
# model.add(Dense(1))

input1 = Input(shape=(8,))
dense1 = Dense(5)(input1)
dense2 = Dense(12, activation='relu')(dense1)
dense3 = Dense(27, activation='relu')(dense2)
dense4 = Dense(38, activation='relu')(dense3)
dense5 = Dense(42, activation='relu')(dense4)
dense6 = Dense(50, activation='relu')(dense5)
dense7 = Dense(32, activation='relu')(dense6)
dense8 = Dense(24, activation='relu')(dense7)
dense9 = Dense(12, activation='relu')(dense8)
dense10 = Dense(8, activation='relu')(dense9)
output1 = Dense(1)(dense10)

model = Model(inputs=input1, outputs=output1)

#3. 컴파일, 훈련

model.compile(loss='mse', optimizer='adam')

#es -> EarlyStopping에 대한 정의

es = EarlyStopping(monitor='val_loss',     #발로스를 주시할거다
                   patience=50,             #50번 참아라
                   mode='min',               #최소값으로
                   verbose=1,                  #텍스트로 출력해라
                   restore_best_weights=True     #최고의 w값을 저장해라
                   )

hist = model.fit(x_train, y_train, epochs=1000, batch_size= 100,
          validation_split=0.2, callbacks=[es])

#4. 평가, 예측

loss = model.evaluate(x_test,y_test)
print("loss :", loss)

y_predict= model.predict(x_test)

r2=r2_score(y_test, y_predict)
print("r2 스코어 :", r2)

#loss : 0.6160849928855896
# r2 스코어 : 0.5407027611021253

#relu, es 첨가
# loss : 0.4392976760864258
# r2 스코어 : 0.6724994342047677

#plt 이용한 시각화

# plt.rcParams['font.family'] = 'Malgun Gothic'
# plt.title='캘리포니아'
# plt.grid()
# plt.figure(figsize=(9,6))
# plt.plot(hist.history['loss'], c='red', label='로쓰', marker='.')
# plt.plot(hist.history['val_loss'], c='blue', label='발_로쓰', marker='.')
# plt.legend()
# plt.show()

# loss : 0.4312790036201477
# r2 스코어 : 0.6784774127262672

#loss : 0.23141787946224213
# r2 스코어 : 0.8274757606796423     스케일러 적용