본문 바로가기

Deep Learning

[Deep Learning]딥러닝의 Neural Networks and Deep Learning 흐름

Deep Learning

딥러닝은 인공신경망의 한 종류로, 대규모의 데이터를 사용하여 복잡한 패턴이나 특징을 자동으로 학습하는 머신러닝 기법이다. 이러한 신경망은 여러 개의 층(layer)으로 구성되어 있어서 "깊은 신경망"이라고 불린다. 각 층은 입력층(input layer), 은닉층(hidden layer), 출력층(output layer)으로 나뉜다.

  • 입력층(input layer): 데이터를 받아들이는 층으로, 각각의 특징(feature)을 입력으로 받는다.
  • 은닉층(hidden layer): 입력층과 출력층 사이에 위치한 중간 층으로, 데이터의 복잡한 특징을 추출한다.
  • 출력층(output layer): 최종적으로 모델의 결과를 출력하는 층으로, 주어진 문제에 맞는 형태로 결과를 출력한다.

# Importing the libraries
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
%matplotlib inline

먼저 라이브러리들을 모두 임포트 해준다

 

1.na가 있는지 확인

df.isna().sum()
RowNumber          0
CustomerId         0
Surname            0
CreditScore        0
Geography          0
Gender             0
Age                0
Tenure             0
Balance            0
NumOfProducts      0
HasCrCard          0
IsActiveMember     0
EstimatedSalary    0
Exited             0
dtype: int64

2.X, Y 데이터 분리

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

 

3.원핫 인코딩,레이블 인코딩

X['Geography'].unique()  # 레이블이 3개이상 나왔으므로 원핫 인코딩 해준다
array(['France', 'Spain', 'Germany'], dtype=object)
X['Gender'].unique() # 레이블이 2개 나왔으므로 레이블 인코딩 해준다.
array(['Female', 'Male'], dtype=object)
from sklearn.preprocessing import LabelBinarizer,OneHotEncoder

 

4.Dummy Variable Trap 사용

딥러닝에서는 컬럼하나가 연산에 아주 크게 작용하므로
원 핫 인코딩한 결과에서, 가장 왼쪽의 컬럼은 삭제해도
데이터를 표현하는 데는 아무 문제 없다.

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


# Fance, Germerny, Spain 3개 컬럼으로 원핫 인코딩 되는데
#   1       0        0
#   0       1        0
#   0       0        1
# 맨 왼쪽 Fance 컬럼을 삭제해도,
#   0   0  =>  Fance
#   1   0   => Germerny
#   0   1   => Spain

 

5.피쳐 스케일링 및 트레이닝 및 테스트

6.ANN을 만들어보자(딥러닝)

import tensorflow as tf
from tensorflow import keras
from keras.models import Sequential
from keras.layers import Dense
model = Sequential()

"Sequential" 모델은 입력층에서 출력층까지 순서대로 층을 쌓아가며 신경망을 구성하는 방법을 제공한다

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

Dense는 완전 연결층(fully connected layer)을 의미하며, 각 뉴런이 이전 층의 모든 뉴런과 연결되어 있는 층

units는 해당 층의 뉴런 수를 나타냄. 여기서는 8개의 뉴런을 가진 완전 연결층을 추가

activation은 활성화 함수를 지정. 'relu'는 Rectified Linear Unit 함수로, 음수 값을 0으로 만들어 비선형성을 추가

input_shape는 입력 데이터의 형태를 정의. 이 모델에서는 입력 데이터의 차원이 (11,)인 1차원 벡터로 가정

 

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

첫 번째 인자인 6은 해당 층의 뉴런 수를 나타냄. 여기서는 6개의 뉴런을 가진 완전 연결층을 추가.
두 번째 인자인 'relu'는 활성화 함수를 지정. 'relu'는 Rectified Linear Unit 함수로, 음수 값을 0으로 만들어 비선형성을 추가

 

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

첫 번째 인자인 1은 해당 층의 뉴런 수를 나타냄. 여기서는 하나의 뉴런을 가진 완전 연결층을 추가
두 번째 인자인 'sigmoid'는 활성화 함수를 지정 'sigmoid'는 출력 범위를 0과 1 사이로 제한하여 이진 분류 문제에 적합한 함수

 

model.summary()

모델의 구조를 요약하여 출력해준다.

 

7.컴파일(Compile)해준다

odel.fit( X_train, y_train, batch_size = 10, epochs = 20 )
Epoch 1/20
750/750 [==============================] - 3s 2ms/step - loss: 0.4781 - accuracy: 0.7949
Epoch 2/20
750/750 [==============================] - 2s 2ms/step - loss: 0.4343 - accuracy: 0.8053
Epoch 3/20
750/750 [==============================] - 1s 2ms/step - loss: 0.4217 - accuracy: 0.8192
Epoch 4/20
750/750 [==============================] - 1s 2ms/step - loss: 0.4121 - accuracy: 0.8271
Epoch 5/20
750/750 [==============================] - 2s 3ms/step - loss: 0.4053 - accuracy: 0.8317
Epoch 6/20
750/750 [==============================] - 3s 3ms/step - loss: 0.3984 - accuracy: 0.8335
Epoch 7/20
750/750 [==============================] - 1s 2ms/step - loss: 0.3905 - accuracy: 0.8368
Epoch 8/20
750/750 [==============================] - 2s 2ms/step - loss: 0.3808 - accuracy: 0.8400
Epoch 9/20
750/750 [==============================] - 1s 2ms/step - loss: 0.3733 - accuracy: 0.8425
Epoch 10/20
750/750 [==============================] - 2s 2ms/step - loss: 0.3660 - accuracy: 0.8475
Epoch 11/20
750/750 [==============================] - 1s 2ms/step - loss: 0.3611 - accuracy: 0.8509
Epoch 12/20
750/750 [==============================] - 1s 2ms/step - loss: 0.3585 - accuracy: 0.8505
Epoch 13/20
750/750 [==============================] - 2s 2ms/step - loss: 0.3557 - accuracy: 0.8539
Epoch 14/20
750/750 [==============================] - 2s 3ms/step - loss: 0.3541 - accuracy: 0.8559
Epoch 15/20
750/750 [==============================] - 2s 3ms/step - loss: 0.3523 - accuracy: 0.8553
Epoch 16/20
750/750 [==============================] - 1s 2ms/step - loss: 0.3513 - accuracy: 0.8565
Epoch 17/20
750/750 [==============================] - 1s 2ms/step - loss: 0.3503 - accuracy: 0.8557
Epoch 18/20
750/750 [==============================] - 1s 2ms/step - loss: 0.3493 - accuracy: 0.8559
Epoch 19/20
750/750 [==============================] - 1s 2ms/step - loss: 0.3485 - accuracy: 0.8573
Epoch 20/20
750/750 [==============================] - 1s 2ms/step - loss: 0.3469 - accuracy: 0.8580
<keras.src.callbacks.History at 0x7cd9d823d030>
# 학습이 끝나면, 평가를한다. => X_test
model.evaluate(X_test, y_test)
 # 이 함수는 내부적으로 confusion_matrix가 들어있어서 정확도도 자동으로 구해준다
79/79 [==============================] - 0s 2ms/step - loss: 0.3484 - accuracy: 0.8604
[0.3483799695968628, 0.8604000210762024]