본문 바로가기

배우기/복습노트[Python과 분석]

[복습] Python | 분석 | 딥러닝(ANN)

728x90
반응형

ANN에 들어가기에 앞서 딥러닝 정리를 한번 더 해보겠다.

 

 

딥러닝

  - 머신러닝의 일종(신경망 기반 모델)

  - 비정형 데이터 분석 수요 증가에 따른 딥러닝 모델 발전

  - 지도학습(Y가 존재하는 모형)

  - 종류: ANN(회귀, 분류(2진 class 등에 따라 출력층 변경 가능), CNN(이미지(output이 이미지는 될 수 없음, 라벨링 결과에 맞게 이미지의 특성을 텍스트로 반환함), RNN, LSTM,...
 (RNN, LSTM은 시계열로도 사용하고 텍스트 마이닝에서도 주로 사용함)

  - 구현 프레임 워크

    1) tensorflow(tf): 구글사 개발, 확장성은 좋으나 어려움(또 다른 언어를 배우는 느낌, 그래서 사용자가 사용하기에 버겁다는 느낌을 받음). 즉 문법이 다소 복잡하나 확장성이 강함

    2) keras: 개발사는 구글이 아니지만 결과적으로 구글이 관리하는 중. tensorflow를 백엔드로 가지고 있는 보다 쉬운 프로그래밍 문법 구현

    3) pythorch: 페이스북 인공지능에서 개발. 자체 백엔드로 프로그래밍을 구현. 

 

여기서 백엔드란, 뒷단의 keras가 tesorflow를 호출하는 방식이다. 실제 뒤에서 돌아가는 언어를 의미한다. 실습은 keras로 많이 하겠지만 요즘은 pytorch로 넘어가는 추세이다.

 

 

 

 

ANN(회귀)

pip install tensorflow

pip install keras

딥러닝 모형들은 아나콘다에 포함되어있지 않으므로 설치하여야 한다.

 

일단 버전 확인.

다운 그레이드 하는 방법은 아래와 같다.

pip install tensorflow==2.15.0

pip install keras==2.15.0

 

딥러닝은 input layer가 있고 output layer가 있다.

중간에는 hidden layer가 있는데, 여러 겹 쌓이면 구현 과정이 복잡하다고 하여 딥러닝이라고 한다.

보통 단순하게 하나부터 사용하며, 두 세개씩 늘려가고, 데이터의 복잡도와 데이터 개수에 따라 달라진다.

 

sequential 을 먼저 만들고 층을 겹겹이 쌓는 구조로 만들어진다(꼬치 구조).

 

기존의 머신러닝의 회귀와 다른 점은, 가중치를 찾아가는 과정이다. 기존 회귀는 통계 가정에 의해 잘 짜여진 시나리오대로 계산된다. 그러나 딥러닝은 경험적으로 만들어지는데, 가중치 w1이 만들어지는 과정을 지켜보면 랜덤하게 초기값을 설정하여 오차를 계산하고, 이 오차를 줄여나가는 방식으로 가중치를 추정해나간다. 

 

 

1. 데이터 로딩

Sequential은 기둥을 세우는 느낌이라고 보면 된다(여러 layer를 쌓는 뼈대)

Dense는 기둥에 층을 형성 한다. 즉, 각 layer를 만드는 함수이다.

 

 

 

2. 스케일링

뉴럴 네트워크는 스케일링에 매우 민감하여 스케일링 하지 않으면 성능이 떨어진다. 그러므로 반드시 스케일링을 하여야 한다. (y는 제외 , x는 꼭 해야 함)

데이터 성격에 맞게끔 minmax 스케일링(음의 값이 없는 경우) 또는 standard 스케일링(음의 값이 있는 경우)을 수행한다.

 

 

3. train/test split

train_x, test_x, train_y, test_y = train_test_split(boston_x_sc, boston_y, random_state = 0)

seed 고정은, 비교대상을 제외한 나머지는 고정해야 할 때 사용된다.

교차검증을 하면(현업에서는 굉장히 많이 진행함) 모든 데이터셋을 다 학습하고 전부 평가하겠다는 의도이기 때문에 실험 결과가 달라지는 현상을 막을 수는 있다,

모델링에서도 seed를 고정하여야 하는데 그 이유는, 가중치 초기값 설정이 랜덤하게 들어가기 때문이다. 선생님과 결과를 같이 하기 위해서는 seed를 고정하여야 한다.

 

 

4. 모델링

1) seed값 고정(필수 아님)

 

2) 모델 정의

위에서 unit은 뉴런의 수이고, activation은 활성화 함수를 어떤 것을 사용할 것인지 작성한다.

기존의 tensor는 각 층마다 하나의 layer를 구성한다, keras의 최초 층을 구성할 떄에는 중간 층의 노드 수가 unit으로 들어가며 input dimension의 layer수가 들어간다. 즉 설명변수의 개수이다(여기서는 13개)(즉 설명변수의 수 = 입력층의 노드의 수).

output layer는 무조건 하나이다. 중간층을 쓰지 않으면 무조건 회귀(우리가 알고 있는)에 pca를 하듯, 중간층은 입력 노드의 수를 변환하는 변환장치이다. 중간층에서 과적합의 문제가 따라올 수 있다. 중간층의 unit은 하이퍼 파라미터이므로 직접 설정을 하여야 한다. 보통 다이아몬드식(늘어났다가 줄어드는 형태) 또는 고차원에서 저차원으로 가도록 설정한다.

위에서는 처음에 52개의 인공변수 수를 만들어두고, 50%를 줄이며(26, 보통 짝수개 많이 사용), 또 25%인 13개, 마지막은 1개로 설정하였다.

모든 층마다 activation function이 들어가는데, 중간층에서 sigmoid 처럼 가중 합이 어느 정도 커지지 않으면 0으로 분류, 1로 분류하는 분기가 필요하다. 즉 신호의 연속성 결합 가지고 0, 1로 판별하기 어렵기 떄문에 판별장치를 주는 것이다. 

회귀의 경우에 마지막 층에서 activation function은 꼭 필요하다. 그래서 회귀모형인지 분류모형인지 알려면 끝의 층을 보면 된다. 

이 과정에서 y가 형성된다.

하나의 y를 유도하는 식으로 최적화가 이루어진다.

 

 

3) 오차함수, 최적화 함수 정의

최적화 과정인데 옵티마이저 역할은 최적화(속도나 성능 관련)이다. loss는 잘못 정의하면 모델이 잘못 평가한다.

 

 

 

4) 학습

 

epoch는 반복의 수(오차가 작은데 계속 줄여나갈 경우 과적합 문제, 즉 수치가 너무 커도 안됨)

 

 참고로 모델을 fit 할 때에는 계속 실행을 하면 모델이 계속 fitting 되기 때문에 모델을 다시 만들고 compile을 다시 한 수에 fitting을 하여야 한다.

 

맨 마지막 값을 보면 loss:10.4984, r_square: 0.7751 나온다. 

 

 

 

5) 평가

 

 

728x90

 

ANN(분류)

input dimension은 데이터 셋에 맞게 결정하여야 한다(하이퍼 파라미터가 아니므로 내가 결정할 수 없음).

iris 같은 경우 y가 하나 일 수 있지만, 앞 레이어에서 변수가 3개라면 sigmoid로는 0, 1, 2로 판별할 수 없다(0, 1만 판별 가능)

그러나 y값 하나당 0, 1 0, 1 0, 1로 구분하도록 한다면 sigmoid는 사용 가능하겠다.

 

 

1. 데이터 로딩

 

2. 스케일링

 

 

3. Y 더미 변수 변경

pd.get_dummies로 분류할 수 있으며, drop_first를 true로 바꾸지 않는 이상 y의 개수만큼 분류됨

각 클래스로 구분하기 위함. (학습률이 좋아짐)

 

 

4. train / test split

 

 

 

5. 모델링

1) seed값 고정(필수 아님)

 

 

2) 모델 정의

 

3개 클래스 이상인 경우 보통 sigmoid 보다는 softmax를 더 많이 사용하기는 하다.

 

 

3) 오차함수, 최적화 함수 정의

loss는 여기서 mse를 잘 쓰지는 않는다. 이진클래스의 분류에서는 binary_crossentropy, 세 개 이상에서는 categorical_crossentropy를 사용한다.

metrics도 분류에서는 log loss를 주로 사용한다.

 

 

4) 학습

 

 

 

5) 평가

 

입력 변수가 52개인 경우, 출력 변수가 3개라면 점차 줄어드는 방식으로 설계하면 좋다.

시작점이 고차원이라면 늘릴 필요는 없고, iris 처럼 저차원이라면 4개로 3개 예측하기에는 적절하지 않으므로 다양한 파생변수를 만들어서 늘렸다가 줄어드는 형식으로 설계하는 것이 좋다.

줄어들 때에는 1/2, 1/4 형태로 줄이도록 하자.

많이 해보면 어떤 것들이 효과적인지 알 수 있다.

 

sigmoid func, relu func 등의 어떤 function을 쓸 지는 여러 번의 테스트를 거쳐봐야 최적화된 결과를 알 수 있다.

 

반응형

 

예제 -  cancer data 분류

 

 

 

1. 데이터 로딩

 

 

 

2. 스케일링

 

 

3. 더미변수 변경

 

 

 

4. train/test split

train_x, test_x, train_y, test_y, train_dm_y, test_dm_y = train_test_split(cancer_x_sc, cancer_y, cancer_y_dm, random_state=0)

 

 

5. 모델링

1) seed값 고정

 

 

2) 모델 정의

 

 

3) 오차함수, 최적화 함수 정의

 

 

4) 학습

model1 최종 loss: 0.0132, accuracy : 0.9906

model2 최종 loss: 0.0454, accuracy: 0.9906

 

 

5) 평가

 

 

여기까지 ANN 실습

728x90
반응형