<jupyter_start><jupyter_text>Week 7 Assignment: Normalization, Standardization, Initialization, optimization -------<jupyter_code>import numpy as np
import pandas as pd

%matplotlib inline
from google.colab import drive
drive.mount('/content/drive')
URL = '/content/drive/MyDrive/미래연구소/7주차/heart.csv'
raw_df = pd.read_csv(URL)            # 심장병 질환 데이터 -> regression (이미지가 아닌 정형데이터)
raw_df<jupyter_output><empty_output><jupyter_text>Dataset클리블랜드(Cleveland) 심장병 재단에서 제공한 작은 [데이터셋](https://archive.ics.uci.edu/ml/datasets/heart+Disease)을 사용하겠습니다. 이 CSV 파일은 수백 개의 행으로 이루어져 있습니다. 각 행은 환자 한 명을 나타내고 각 열은 환자에 대한 속성 값입니다. 이 정보를 사용해 환자의 심장병 발병 여부를 예측해 보겠습니다. 즉 이 데이터셋은 이진 분류 문제입니다.다음은 이 데이터셋에 대한 [설명](https://archive.ics.uci.edu/ml/machine-learning-databases/heart-disease/heart-disease.names)입니다. 수치형과 범주형 열이 모두 있다는 점을 주목하세요.>열| 설명| 특성 타입 | 데이터 타입>------------|--------------------|----------------------|----------------->Age | 나이 | 수치형 | 정수>Sex | (1 = 남성; 0 = 여성) | 범주형 | 정수>CP | 가슴 통증 유형 (0, 1, 2, 3, 4) | 범주형 | 정수>Trestbpd | 안정 혈압 (병원 입원시 mm Hg) | 수치형 | 정수>Chol | 혈청 콜레스테롤 (mg/dl) | 수치형 | 정수>FBS | (공복 혈당 > 120 mg/dl) (1 = true; 0 = false) | 범주형 | 정수>RestECG | 안정 심전도 결과 (0, 1, 2) | 범주형 | 정수>Thalach | 최대 심박동수 | 수치형 | 정수>Exang | 협심증 유발 운동 (1 = yes; 0 = no) | 범주형 | 정수>Oldpeak | 비교적 안정되기까지 운동으로 유발되는 ST depression | 수치형 | 정수>Slope | 최대 운동 ST segment의 기울기 | 수치형 | 실수>CA | 형광 투시된 주요 혈관의 수 (0-3) | 수치형 | 정수>Thal | 3 = 보통; 6 = 해결된 결함; 7 = 해결가능한 결함 | 범주형 | 문자열>Target | 심장병 진단 (1 = true; 0 = false) | 분류 | 정수 Thal은 제외하고 진행합니다.<jupyter_code>raw_df.drop(columns='thal')<jupyter_output><empty_output><jupyter_text>-------   Question 1    **문제:** 해당 data의 feature 중 'age','trestbps','chol','thalach','oldpeak'를 StandardScaler로 standardization 하시오.    **소문제 1:** StandardScaler를 import하기    **소문제 2:** StandardScaler를 인스턴스하기    **소문제 3:** StandardScaler를 standardization하고 저장하기 (StandardScaler의 어떤 메서드를 사용해야 한다.)<jupyter_code>x_raw1 = raw_df.loc[:,['age','trestbps','chol','thalach','oldpeak']]
x_raw1    # numpy.ndarray형태로 나오게된다<jupyter_output><empty_output><jupyter_text>**소문제 1:** StandardScaler를 import하기<jupyter_code>### START CODE HERE ### (≈ 1 line of code)
from sklearn.preprocessing import StandardScaler     
### END CODE HERE ###<jupyter_output><empty_output><jupyter_text>**소문제 2:** StandardScaler를 인스턴스하기<jupyter_code>### START CODE HERE ### (≈ 1 line of code)
sds = StandardScaler()   # 클래스이므로 객체로 만들어서 사용한다 
### END CODE HERE ###<jupyter_output><empty_output><jupyter_text>**소문제 3:** StandardScaler를 standardization하고 저장하기 (StandardScaler의 어떤 메서드를 사용해야 한다.)<jupyter_code>### START CODE HERE ### (≈ 1 line of code) (2줄로 만들어도 괜찮습니다.)
x1 = sds.fit_transform(x_raw1)
### END CODE HERE ###
# 해당 셀이 실행되어야 정답

assert(x1[0][0] == 0.9521966015692286)
assert(x1[3][3] == 1.2398969233511221)<jupyter_output><empty_output><jupyter_text>------ >열| 설명| 특성 타입 | 데이터 타입>------------|--------------------|----------------------|----------------->Age | 나이 | 수치형 | 정수>Sex | (1 = 남성; 0 = 여성) | 범주형 | 정수>CP | 가슴 통증 유형 (0, 1, 2, 3, 4) | 범주형 | 정수>Trestbpd | 안정 혈압 (병원 입원시 mm Hg) | 수치형 | 정수>Chol | 혈청 콜레스테롤 (mg/dl) | 수치형 | 정수>FBS | (공복 혈당 > 120 mg/dl) (1 = true; 0 = false) | 범주형 | 정수>RestECG | 안정 심전도 결과 (0, 1, 2) | 범주형 | 정수>Thalach | 최대 심박동수 | 수치형 | 정수>Exang | 협심증 유발 운동 (1 = yes; 0 = no) | 범주형 | 정수>Oldpeak | 비교적 안정되기까지 운동으로 유발되는 ST depression | 수치형 | 정수>Slope | 최대 운동 ST segment의 기울기 | 수치형 | 실수>CA | 형광 투시된 주요 혈관의 수 (0-3) | 수치형 | 정수>Thal | 3 = 보통; 6 = 해결된 결함; 7 = 해결가능한 결함 | 범주형 | 문자열>Target | 심장병 진단 (1 = true; 0 = false) | 분류 | 정수 ---------   Question 2    **문제:** 해당 data의 feature 중 'cp', 'restecg', 'slope', 'ca'를 MinMaxScaler로 normalize (0과 1사이로 minmaxscaling)하시오.<jupyter_code>x_raw2 = raw_df.loc[:,['cp', 'restecg', 'slope', 'ca']]
x_raw2
x_raw2.loc[:,'slope'].unique()
### START CODE HERE ### (≈ 3 line of code) (4줄로 적어도 됩니다.)
from sklearn.preprocessing import MinMaxScaler
mm = MinMaxScaler()
x2 = mm.fit_transform(x_raw2)
### END CODE HERE ###

# 해당 셀이 정상적으로 실행되어야 정답입니다.

assert(np.array(x2[10] == [1. , 0. , 0.5, 0. ]).all)
assert(np.array(x2[100] == [1. , 1. , 0.5, 0. ]).all)<jupyter_output><empty_output><jupyter_text>-------- 12개 feature를 이제 하나로 합치고 label(y)도 확보해본다.<jupyter_code>x1 = pd.DataFrame(x1, columns=['age', 'trestbps','chol', 'thalach', 'oldpeak'])   # standarization
x2 = pd.DataFrame(x2, columns=['cp', 'restecg', 'slope','ca'])   # normalization
x3 = raw_df.loc[:,['exang', 'sex', 'fbs']]
y = raw_df.target   # y값을 따로 분할해서 딥러닝 모델안에 넣어줄것이다
x = x1.join(x2)
x
x = x.join(x3)
x
y<jupyter_output><empty_output><jupyter_text>-------<jupyter_code>type(x)<jupyter_output><empty_output><jupyter_text>Question 3    **문제:** momentum optimizer를 learning rate는 0.001, momentum은 0.9로 설정해서 학습해 보시오. (마지막 layer와 input_dim 설정까지 그동안 배운 지식으로 해보기 바랍니다.) (현재 binary classification입니다.)    **소문제 1:** 사용할 optimizer import    **소문제 2:** momentum optimizer를 learning rate는 0.001, momentum은 0.9로 설정해서 만들기    **소문제 3:** 조건에 맞는 모델 만들기 해당 함수를 만드시오.(1> input_dim 설정 2> binary classification에 맞는 output layer의 2가지 설정 3> loss 설정)<jupyter_code>from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense<jupyter_output><empty_output><jupyter_text>**소문제 1:** 사용할 optimizer import<jupyter_code>### START CODE HERE ### (≈ 1 line of code)
from tensorflow.keras.optimizers import SGD, Adagrad, RMSprop, Adam
### END CODE HERE ###<jupyter_output><empty_output><jupyter_text>**소문제 2:** momentum optimizer를 learning rate는 0.001, momentum은 0.9로 설정해서 만들기<jupyter_code>### START CODE HERE ### (≈ 1 line of code)
sgd = SGD(learning_rate=0.001, momentum=0.9, nesterov=False)
### END CODE HERE ###
x.shape<jupyter_output><empty_output><jupyter_text>**소문제 3:** 조건에 맞는 모델 만들기 해당 함수를 만드시오.(1> input_dim 설정 2> binary classification에 맞는 output layer의 2가지 설정 3> loss 설정)<jupyter_code>def create_momentum_model():
    model = Sequential()
    ### START CODE HERE ### (≈ 1 line of code)
    model.add(Dense(units = 32,input_dim=12 ,activation='relu'))  # feature이 12개있다는 소리
    ### END CODE HERE ###
    
    model.add(Dense(64, activation = 'relu'))
    
    ### START CODE HERE ### (≈ 1 line of code)
    model.add(Dense(units = 1,activation='sigmoid'))
    ### END CODE HERE ###
    
    ### START CODE HERE ### (≈ 1 line of code)
    model.compile(optimizer = sgd, metrics = ['accuracy'],loss ='binary_crossentropy' )
    ### END CODE HERE ###
    
    return model
model = create_momentum_model()
history = model.fit(np.array(x),np.array(y),epochs = 10, batch_size = 1, shuffle=False)  #batch_size가 1이다<jupyter_output>Epoch 1/10
303/303 [==============================] - 1s 888us/step - loss: 0.4771 - accuracy: 0.7600
Epoch 2/10
303/303 [==============================] - 0s 942us/step - loss: 0.8066 - accuracy: 0.5420
Epoch 3/10
303/303 [==============================] - 0s 967us/step - loss: 0.7130 - accuracy: 0.5800
Epoch 4/10
303/303 [==============================] - 0s 928us/step - loss: 0.6592 - accuracy: 0.6061
Epoch 5/10
303/303 [==============================] - 0s 911us/step - loss: 0.6139 - accuracy: 0.6912
Epoch 6/10
303/303 [==============================] - 0s 956us/step - loss: 0.5792 - accuracy: 0.7417
Epoch 7/10
303/303 [==============================] - 0s 910us/step - loss: 0.5549 - accuracy: 0.7549
Epoch 8/10
303/303 [==============================] - 0s 908us/step - loss: 0.5342 - accuracy: 0.7580
Epoch 9/10
303/303 [==============================] - 0s 971us/step - loss: 0.5139 - accuracy: 0.7779
Epoch 10/10
303/303 [==============================] - 0s 917us/step - loss: 0.495[...]<jupyter_text>-------<jupyter_code>np.array(x).shape<jupyter_output><empty_output><jupyter_text>Question 4**문제:** 모든 layer의 W(weight=kernel)를 he_normal로 initialization 해보시오<jupyter_code>from tensorflow.keras.datasets import fashion_mnist

(x,y), (x_test, y_test) = fashion_mnist.load_data()

from tensorflow.keras.utils import to_categorical

x = x.astype('float32')
x_test = x_test.astype('float32')

x = x.reshape(60000,-1)
x_test = x_test.reshape(10000,-1)

x = x/255.
x_test = x/ 255.

y = to_categorical(y, 10)
y_test = to_categorical(y_test, 10)

from sklearn.model_selection import train_test_split

x_train, x_val, y_train, y_val = train_test_split(x, y, train_size = 1/2, random_state = 3, stratify=y)


x[0].ndim
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

def create_hn_model():
    model = Sequential()
    ### START CODE HERE ### (≈ 4 line of code)
    model.add(Dense(64, input_shape=(784,) , activation = 'relu', kernel_initializer = 'he_normal'))
    model.add(Dense(128, activation = 'relu',kernel_initializer = 'he_normal' ))
    model.add(Dense(256, activation = 'relu', kernel_initializer = 'he_normal'))
    model.add(Dense(10, activation = 'softmax', kernel_initializer = 'he_normal'))
    ### END CODE HERE ###
    
    model.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics = ['accuracy'])
    return model
model_hn = create_hn_model()
history_hn = model_hn.fit(x_train, y_train, validation_data=(x_val, y_val), epochs=10) # batch size가 default값이 32
import matplotlib.pyplot as plt

%matplotlib inline
loss = history_hn.history['loss']
val_loss = history_hn.history['val_loss']

epochs = range(1, len(loss) + 1)

plt.plot(epochs, loss, 'r', label = 'Training loss')
plt.plot(epochs, val_loss, 'b', label = 'Validation loss')
plt.title('Training and validation loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()       

plt.show()<jupyter_output><empty_output><jupyter_text>6주차 과제는 glorot_uniform었고 epoch 10에서 training의 loss가 0.28정도였는데 he_normal이 fashion_mnist에서 더 잘 학습되는 것을 알 수 있습니다.<jupyter_code><jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.19537728026533996, 'fraction_numerical': 0.049854892205638476, 'mean_word_length': 4.198814655172414, 'pattern_counts': {'":': 0, '<': 64, '<?xml version=': 0, '>': 105, 'https://': 2, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '16', 'dir': 'jupyter-structured-clean-dedup', 'id': '518679', 'license': 'MIT', 'n_tokens_mistral': 4927, 'n_tokens_neox': 5176, 'n_words': 969, 'path': 'Week_7_Assignment.ipynb', 'repo_name': 'jiwonlee-0218/colab', 'size': '9648'}