본문 바로가기
Python/DeepLearning

ANN - 개념정리

by 하니__ 2024. 4. 16.

 

 

원하는 데이터를 얻기 위해 가공한 데이터들의 column값들이

 

입력되며

 

가중치에 의해 변형되어 합산되고

 

액티베이션함수에 의해서

 

다음 뉴런에게로 전파된다

 

 

 

액티베이션 함수에는 이런것들이 있다

 

 

 

 

그리고 그렇게 전달받은 히든레이어들은 그걸 다시아웃풋 레이어로 다시 전달한다

 

히든레이어는 몇개가 될지 모른다

 

사용자가 설정하는데로 정해지기 때문에 1개일수도 100개 일수도 있다

 

다만 1개 일때보다 100개일때

 

데이터처리가 늦을것이며 정확해질것이다

 

 

 

 

보통의 딥러닝은 이런식으로 진행되며 좌측 인풋레이어에서 데이터를 입력받아

 

우측 아웃풋레이어까지 가중치와 함수에 의해 수정의 수정을 거치며 답을 도출해내고

 

다시 좌측으로 한칸한칸 돌아가며 다시 수정의 수정을 거치게 된다

 

 

이것을 1회 하는것을 epochs라고 한다

 

 

 

 

이렇게 해서 하려는 목표는 가중치의 값을 구하는것이며

가중치를 구하는것은 아주 정밀한 오차를 구하기 위함이다

 

 

이 중 정밀한 오차를 구하기 위한 방법으로써

 

 

 

 

그라디언트 디센트 라는 방법을 사용하는데

 

 

 

 

 

기울기를 찾아 오차율이 높다면 오차율을 낮추기 위해 한걸음 한걸음 나아가는 방식이다

 

 

 

 

 

이 때 낮은 오차율을 찾기 위해 가중치(보폭)을 줄인다면

가장 낮은 오차를 찾기전에 데이터를 다 쓸것이며

 

 

그렇다고 빠르게 찾겠다고 가중치(보폭)을 늘린다면

가장 낮은 오차를 건너 뛰게되어 더 오래걸릴 수도 있다

 

그러니 적당한 가중치를 설정하는것이 좋겠다

 

 

 

 

이런 데이터가 있다고 할때

Exited 여부를 예측하는 딥러닝 머신을 만들어보자

 

우선 예측이 필요하니 Exited는 y로 설정하고

 

나머지중 X는

0,1 콜럼은 도움이 안되니 제외하고 모두로 설정하면 되겠다

y = df['Exited']
X = df.loc[ : , 'CreditScore' : 'EstimatedSalary']

 

 

그 후에 X의 데이터들을 보니

 

문자열이 있으니 처리를 해줘야겠다

 

df['Geography'].unique()
array(['France', 'Spain', 'Germany'], dtype=object)

 

df['Gender'].unique()
array(['Female', 'Male'], dtype=object)

 

 

국가는 원 핫 인코딩을 해주면 되겠고 성별은 레이블 인코딩을 해주면 되겠다

 

 

from sklearn.preprocessing import LabelEncoder
label_encoder = LabelEncoder()
X['Gender'] = label_encoder.fit_transform(X['Gender'])
X['Gender']
0       0
1       0
2       0
3       0
4       0
       ..
9995    1
9996    1
9997    0
9998    1
9999    0
Name: Gender, Length: 10000, dtype: int64

 

성별은 레이블인코딩으로 0 과 1로 만들었고

 

 
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
ct = ColumnTransformer( [('encoding', OneHotEncoder(), [1])], remainder='passthrough' )

X = ct.fit_transform(X)
array([[1.0000000e+00, 0.0000000e+00, 0.0000000e+00, ..., 1.0000000e+00,
        1.0000000e+00, 1.0134888e+05],
       [0.0000000e+00, 0.0000000e+00, 1.0000000e+00, ..., 0.0000000e+00,
        1.0000000e+00, 1.1254258e+05],
       [1.0000000e+00, 0.0000000e+00, 0.0000000e+00, ..., 1.0000000e+00,
        0.0000000e+00, 1.1393157e+05],
       ...,
       [1.0000000e+00, 0.0000000e+00, 0.0000000e+00, ..., 0.0000000e+00,
        1.0000000e+00, 4.2085580e+04],
       [0.0000000e+00, 1.0000000e+00, 0.0000000e+00, ..., 1.0000000e+00,
        0.0000000e+00, 9.2888520e+04],
       [1.0000000e+00, 0.0000000e+00, 0.0000000e+00, ..., 1.0000000e+00,
        0.0000000e+00, 3.8190780e+04]])

 

국가는 원 핫 인코딩으로 3개의 콜럼으로 만들 었 으 나

 

 

Dummy Variable Trap을 적용하자

 

딥러닝에서는 컬럼 하나가 연산에 아주 크게 작용하므로

원 핫  인코딩 한 결과에서 가장 왼쪽의 컬럼은 삭제해도 데이터를 표현하는데는 아무 문제가 없다

즉 France, Germany, Spain 3개의 컬럼으로 원 핫 인코딩 되는데

         1            0              0

         0            1              0

         0            0              1

 

이렇게 표현 되는 것에서 France 컬럼을 제거한

   0        0   => France

   1        0   => Germany

   0        1   => Spain

처럼 알아 볼 수 있기 때문에 삭제를 하도록 한다

 

 

 

 

X = pd.DataFrame(X).drop(0,axis=1).values

 

 

 

이후 또 빠른 연산을 위해 피쳐스케일링을 한다

 

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()
X = scaler.fit_transform(X)

 

 

훈련용 데이터와 테스트용의 데이터로 나눈다

 

 

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

 

 

 

 

딥 러닝 시작

 

 

이제부터 시작이다

 

import tensorflow as tf
from tensorflow import keras
from keras.models import Sequential
from keras.layers import Dense

텐서플로우를 활용한다

 

model = Sequential()

시퀀셜을 사용하여 모델을 만들어준다

model.add( Dense(units = 8, activation = 'relu',input_shape = (11, ) )   )

모델에 add( )를 사용하여

파라미터 안에 Dense를 입력해준다

Dense는 히든레이어 안의 계층을 의미한다 그리고 첫번째 add는 첫번째 히든레이어다

units= 는 몇개의 입력받는 뉴런을 만들것인지

activation은 가장 많이 사용되는 relu를 사용해주고

input_shape는 11개의 콜럼들이 입력된다고 적어준다

model.add( Dense( 6, 'relu'  ) )

2번째 계층은 값들만 적어줘도 된다

model.add( Dense( 1, 'sigmoid' ) )

아웃풋 레이어에서는 1개의 뉴런만이 존재하며 sigmoid함수를 사용하기로 한다

 

 

 

 

이로서 모델링이 끝났다

 

 모델링이 끝나면 컴파일(Compile)을 해야한다
 컴파일이란 
        옵티마이저(Optimizer) 셋팅
        로스펑션(loss function 오차함수, 손실함수) 셋팅
        검증방법 셋팅

 

 

 

 

 

model.compile(optimizer = 'adam', loss='binary_crossentropy', metrics = ['accuracy']  )

 

 

optimizer는 가장 보편적인것이 adam

 2개로 분류하는 문제의 loss는 'binary_crossentropy' 로 설정한다

메트릭스는 어떤것으로 판별할것인지 선택하는것

정확도인 accuracy를 선택한다

 

 

 

 

 

컴파일이 끝났다면 테스트를 해보자

 

 

 

model.fit(X_train, y_train, batch_size = 10, epochs = 20 )

 

 

batch_size는 원래는 데이터가 1개씩 들어갔다 나오고 1개씩 들어갔다 나오고 하는 것을

한번에 들어가는 데이터의 갯수를 n개의 숫자로 설정하는것이다

 

이번 테스트에선 10개의 데이터가 한번에 들어가도록 한다

 

 

epochs는 데이터가 아웃풋으로 가서 다시 인풋까지 돌아오며 테스트를 하는데

이 행위를 n번 하도록 하여

 

좀 더 낮은 오차율

좀 더 높은 정확도를 찾도록 한다

 

 

loss는 낮을수록, accuracy는 높을수록 좋다


학습이 끝나면 평가 를 해야한다

 

model.evaluate( X_test, y_test )