k-최근접 이웃(k-Nearest Neighbor, kNN)

: 특정 공간 내에서 입력과 제일 근접한 k개의 요소를 찾아, 더 많이 일치하는 것으로 분류 하는 알고리즘 입니다. 

 

k - 최근접 이웃 특징 

① 데이터 분류에 사용되는 아주 간단한 지도학습 알고리즘 
- 지도학습 : 머신러닝 학습 시 데이터와 함께 데이터에 대한 레이블(정답)을 함께 부여하는 학습 방식.
- 데이터 분류 : 새로운 데이터를 기존 데이터의 레이블 중 하나로 분류하는 작업.

② 유사한 특성을 가진 데이터들끼리는 거리가 가깝고, 거리 공식을 사용하여 데이터 사이의 거리를 구함 
③ 분류기의 효과를 높이기 위해 파라미터를 조정 
④ K-Nearest Neighbors의 경우 k 값을 변경 
⑤ 분류기가 부적절하게 학습되면 overfitting 또는 underfitting이 나타날 수 있음 
⑥ K-Nearest Neighbors의 경우 너무 작은 k는 overfitting, 너무 큰 k는 underfitting을 보임

 

 

k-최근접 이웃(k-Nearest Neighbor, kNN)의 장단점

장점 단점
구현이 쉽다. 예측 속도가 느리다.
알고리즘을 이해하기 쉽다.   메모리를 많이 쓴다.
별도의 모델 학습이 필요 없다.  노이즈 데이터에 예민하다. 
하이퍼 파라미터가 적다 - 이웃의 개수(k)  

 

 

농구 선수의 경기 기록을 바탕으로, 그 선수의 포지션을 예측해보기!

 

데이터 전처리 

 

 

데이터 시각화 

 

`

 

 

k-최근접 이웃 적용 

 

 

 

 

 

 

 

 

'

서포트 벡터머신(Support Vector Machine, SVM)

: 사용하기 편하면서도 높은 정확도를 보이는 데이터 분류를 위한 지도학습 머신러닝 알고리즘.

 

 

 

① 서포트 벡터를 사용해서 결정 경계를 정의하고, 분류되지 않은 점을 해당 결정 경계와 비교해서 분류.
② SVM의 중요 용어


- 결정 경계(Decision Boundary) : 서로 다른 분류 값을 결정하는 경계

 

데이터에 2개 속성(feature)만 있다면 결정 경계는 이렇게 간단한 선 형태

속성이 3개로 늘어난다면 이렇게 3차원으로 그려야 한다.



 

- 이때의 결정 경계는 ‘선’이 아닌 ‘평면’이 된다.

 

- 우리가 이렇게 시각적으로 인지할 수 있는

  범위는 딱 3차원까지다.

 

- 차원, 즉 속성의 개수가 늘어날수록 당연히

  복잡

 

- 결정 경계도 단순한 평면이 아닌 고차원이

  될 텐데 이를 “초평면(hyperplane)” 이라고

  부른다

 

 

 

 

 

 

 

 

최적의 결정 경계(Decision Boundary)

- 어떤 그래프가 제일 위태로워 보이는가?

• C를 보면 선이 파란색 부류와 너무 가까워서 아슬아슬해 보인다.

 

- 그렇다면 어떤 결정 경계가 가장 적절해 보이는가?

• 당연히 F다. 두 클래스(분류) 사이에서 거리가 가장 멀기 때문이다.

 

- 결정 경계는 데이터 군으로부터 최대한 멀리 떨어지는 게 좋다는 걸 알았다.

- 실제로 서포트 벡터 머신(Support Vector Machine)이라는 이름에서 Support Vectors는 결정 경계와 가까이 있는 데이터 포인트들을 의미한다.

- 이 데이터들이 경계를 정의하는 결정적인 역할을 하는 셈이다.

 

 

 

- 서포트 벡터(support vector) : 결정 경계선과 가장 가까이 맞닿은 데이터 포인트(클래스의 점 들).
마진(margin) : 서포트 벡터와 결정 경계 사이의 거리.

 

- 가운데 실선이 하나 그어져있 는데, 이게 바로 ‘결정 경계’

 

- 그리고 그 실선으로부터 검은 테두리가 있는 빨간점 1개, 파 란점 2개까지 영역을 두고 점 선을 그어놓았다. 이게 바로 ‘마진(margin)’

 

- 최적의 결정 경계는 마진을 최대화한다.

 

- 옆 그림에서는 x축과 y축 2개 의 속성을 가진 데이터로 결 정 경계를 그었는데, 총 3개의 데이터 포인트(서포트 벡터)가 필요했다.

 

즉, n개의 속성을 가진 데이터에는 최소 n+1개 의 서포트 벡터가 존재한다는 걸 알 수 있다.

 

 

 

③ SVM의 목표는 바로 이 마진을 최대로 하는 결정 경계를 찾는 것.

고정된 학습 데이터와 테스트 데이터로 평가를 하다 보면 테스트 데이터에서만 성능이 좋은 과적합 문제가 발생할 수 있습니다. 이러한 문제점을 개선하기 위해서 교차 검증을 이용합니다. 

 

교차 데이터는 데이터 편중을 막기 위해서 별도의 여러 세트로 구성된 학습 데이터 세트와 검증 데이터 세트에서 학습과 평가르 수행하는 것입니다. 그리고 각 세트에서 수행한 평가 결과에 따라 하이퍼 파라미터 튜닝등의 모델 최적화를 더 손쉽게 할 수 있습니다. 

 

 

● K 폴드 교차 검증 

: 가장 보편적으로 사용되는 교차 검증 기법으로 먼저 K개의 폴트 세트를 만들어서 K번 만큼 각 폴트 세트에 학습과 검증 평가를 반복적으로 수행하는 방법입니다. 

 

 

사이킷런에서 K 폴트 교차 검증 프로세스 구현하기 위해 KFold와 StratifiedKFold 클래스를 제공합니다. 

 

KFold

 

1. 라이브러리

 

2. 데이터 불러오기

 

3. 5개의 폴드 세트로 분리하는 KFold 객체와 폴드 세트별 정확도를 담을 리스트 객체 생성

 

4.  KFold 객체의 split()를 호출하면 폴드 별 학습용, 검증용 테스트의 로우 인덱스를 array로 반환 및 학습 

 

5. 개별 iteration별 정확도를 합하여 평균 정확도 계산

 사이킷런(scikit-learn) 이란?

 : 파이썬 머시러닝 라이브러리 중 가장 많이 사용되는 라이브러리입니다. 파이썬 기반의 머신러닝은 곧 사이킷런으로 개발하는 것을 의미할 정도로 오랜 기간 파이썬 세계에서 인정 받았으며 사용되고 있습니다. 

 

사이킷런의 특징 

1. 파이썬 기반의 다른 머스러닝 패키지도 사이킷런 스타일의 API를 지향할 정도로 쉽게 가장 파이썬 스러운 API를 제공

2. 머신러닝을 위한 매우 다양한 알고리즘과 개발을 위한 편리한 프레임워크와 API를 제공

3. 오랜 기간 실적 환경에서 검증됐으며, 매우 맣은 환경에서 사용되는 성숙한 라이브러리 

 

사이킬런 설치 

 

1.  Anaconda prompt 

conda install scikit-learn 

 

 

2. Jupyter Notebook

pip install scikit-learn 

 

- Anaconda를 설치하면 기본 사이킷런까지 설치가 완료되기 때문에 별도의 설치가 필요 없습니다. 

 

 

붓꽃 품종 예측하기 

 

- 붓꽃 데이터 세트로 분꽃의 품종을 분류하는 것입니다. 붓꽃 데이터 세트는 꽃이의 길이와 너비, 꽃받침의 길이와 너비 피처를 기반으로 꽃의 품종을 예측하기 위한 것 입니다. 

 

분류 - 대표적인 지도학습 방법으로 명확한 정답이 주어진 데이터를 먼저 학습한 뒤 미지의 정답을 예측하는 방식입니다.

 

1. 라이브러리 

- sklearn.datasets : 사이킷런에서 자체적으로 제공하는 데이터 세트를 생성하는 모듈의 모임입니다. 

- DecisionTreeClassifier : 의사 결정 트리 알고리즘입니다. 

- train_test_split : 데이터 세트를 학습 데이터와 테스트 데이터로 분리하는데 사용하는 함수입니다. 

 

 

2. 데이터 불러오기 

 

3. DataFrame 으로 변환 

 

4. 학습용 데이터와 테스트용 데이터 분리 

test_size = 0.2 : 전체 데이이터 중 테스트 데이터가 20%, 학습 데이터가 80%로 데이터를 분활합니다. 

random_state : 호출할 떄마다 같은 학습/테스트 용 데이터 세트를 생성하기 위해 주어지는 난수 발생 값입니다. 

- 어떤 값을 지정해도 상관 없습니다. 

 

 

5. DecisionTreeClassifier 객체 생성

DecisionTreeClassifier 객체는 fit() 메서드에 학습용 피처 데이터 속성과 결정 값 데이터 세트를 입력해 호출하면 학습을 수행합니다. 

 

 

6. 학습 수행

 

7. 학습이 완료된  DecisionTreeClassifier 객체에서 테스트 데이터 세트로 예측 수행

예측은 반드시 학습 데이터가 아닌 다른 데이터를 이용해야 하며, 일반적으로 테스트 데이터 세트를 이용합니다. 

- predict( ) 메서드에 테스트용 피처 데이터 세트를 입력해 호출하면 학습된 모델 기반에서 테스트 데이터 세트에 대한 예측갑이 반환됩니다. 

 

 

8. 성능 평가(정확도)

accuracy_score( ) 함수를 통해서 정확도를 출력합니다. 

 

 

1. 데이터 세트 분리 : 데이터를 학습데이터와 데스트 데이터로 분리
2. 모델 학습 : 학습데이터를 기반으로 ML 알고리즘을 적용해 모델 학습
3. 예측 수행 : 학습된 ML 모델을 이용해 테스트 데이터 분류 예측
4. 평가 : 이렇게 예측된 결과값과 테스트 데이터의 실제 결과값을 비교 모델 성능 평가.

 

순환신경망

: RNN(Recurrent Neural Network)는 뉴런의 상태(state)를 저장하고 이를 다음 스텝에서의 입력으로 사용함으로써 긴 순서열에 대해서도 예측을 할 수 있는 신경망 구조이다.

 

- 순차적(sequence) 인 데이터를 입력 받아 결과값을 도출하는데 사용하는 딥러닝 모델
- 대표적으로 자연어 처리에 상당히 많이 사용
- 이전 입력 값들(단어들)이 현재 입력 값(단어)의 출력 값(품사)에 영향을 줌

 

품사가 도출 되도록 프로그램을 만들었는데, google 이라는 단어를 봤을 때 자리에 따라서 동사와 명사로 다른 품사로 출력됩니다. 문장을 통해서 공통점을 찾아 출력될 수 있도록 만듭니다 . 제시된 방향성을 정해줘야지 정확한 데이터를 출력해줍니다. 

 

RNN의 일반적인 구조

 

RNN 의 심층 구조

활성화 함수 : 탄젠트 함수 사용. 

 

시간 차를 두고 순차적인 데이터를 넣습니다. 시계열의 특징을 가지고 있습니다. 

 

RNN 의 구조 메모리 셀

메모리 셀 (memory cell 혹은 간단히 cell)
- 타임 스텝 t 에서 순환 뉴런의 출력은 이전 타임 스텝의 모든 입력에 대한 함수이기 때문에 이를

  일종의 메모리 형태라고 말할 수 있음

- 타임 스텝에 걸쳐서 어떤 상태를 보존하는 신경망의 구성 요소
- 보통 RNN 에서 셀이라고 말할 때는 완전 연결 신경망에서 층 ( 을 의미

일반적으로 타임 스텝 t 에서의 셀의 상태 ℎ𝑡 ℎ는 hidden 을 의미

RNN 네트워크에 셀이 한 개일 경우의 가중치 , 상태값 , 출력값

 

 

import tensorflow as tf
import numpy as np

tf.set_random_seed(777)

# hello 다음을 추천해주게끔 하는...
# 스펠링은 각각의 독립적인 의미를 가지고 있지만
# 'he'를 입력 했을 때, 서로의 연관성을 가지고 추천하게끔 만들어준다.
# 컴퓨터 선택의 최적화 되어 있는 수치로 표현 해야한다.

# h:0 , e:1 , l:2 , o:3 임의의 수를 넣어준다.
# One Hot Encoding

h = [1,0,0,0]
e = [0,1,0,0]
l = [0,0,1,0]
o = [0,0,0,1]

# RNN input_dim(4) -> output_dim(2), hidden_size(2)
hidden_size = 2

cell = tf.contrib.rnn.BasicRNNCell(num_units=hidden_size) 
# contrib : 상당수 많은 개발자들이 미리 구현해서 오픈하거나 공개하는 경우가 많다.
# print("cell:", cell.output_size, cell.state_size)

x_data = np.array([[h,e,l,l,o]],dtype=np.float32)
# print("x_data:", x_data)

output, _states = tf.nn.dynamic_rnn(cell, x_data, dtype=tf.float32)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())

    print('output: ',output.eval())
    
eval() : 내부에서 자동적으로 tensor들의 동작이 되어지고 출력되지는 결과값 들을 return 시킨다.

 

입력값이 1x2 행렬이고 , RNN 의 상태값이 1x3 의 행렬일 경우 , W 는 총 5 개의 행을 가지게 됩니다

매개변수 갱신
신경망 학습의 목적 : 손실 함수의 값을 가능한 한 낮추는 매개변수를 찾는 것입니다. 

 

- 확률적 경사 하강법(SGD : Stochastic Gradient descent)
: 최적의 매개변수 값을 찾는 단서로 매개변수의 기울기(미분)를 이용합니다. 

SGD 단점

: 방향성이 위에서 아래로 내려올 때는 빠를게 학습하면서 찾아가지만 평면적인 면으로 가게 되면 더이상 오차가 줄어들지 않는 문제점이 생길 수 있습니다. 

 

위의 그림과 같은 모습으로 나타나게 됩니다. 

 

SGD에 의한 최적화 갱신 경로 : 최소값인 (0, 0)까지 지그재그로 이동하니 비효율적이며 퍼포먼스의 문제를 야기합니다. 

 

 

① SGD 단점의 개선책 - 모멘텀(Momentum)

- V : 속도(Velocity)
- 기울기 방향으로 힘을 받아 물체가 가속된다는 물리 법칙

- 올바르게 최소값을 찾아가는 장점을 가집니다. 

 

 

 

- 모멘텀에 의한 최적화 갱신 경로

 

② AdaGrad :  : 각각의 매개변수에 맞춤형 값을 만들어 주는 방식

 

- 신경망 학습에서는 학습률 값이 중요한데, 학습률 값이 너무 작으면 학습 시간이 너무 길어지고, 반대로 너무 크면

  발산하여 학습이 제대로 이뤄지지 않습니다. 효율적으로 빠르게 최소값을 찾아가도록 하는 것입니다. 


- 학습률 감소(learning rate decay) :
    학습률을 정하는 효과적 기술
    처음에는 크게 학습하다가 학습률을 점차 줄여가면서 조금씩 작게 학습시키는 방법
    학습률을 서서히 낮추는 가장 간단한 방법은 매개변수 전체의 학습률 값을 일괄적으로 낮추는 것

 

- 최소값을 향해 효율적으로 이동
- y축 방향은 기울기가 커서 처음에는 크게 움직이지만, 그 큰 움직임에 비례해 갱신 정도도 큰 폭으로 작아지도록 조정
- 따라서 y축 방향으로 갱신 강도가 빠르게 약해지고, 지그재그 움직임이 줄어듬

 

 

③ Adam

: 모멘텀과 AdaGrad를 융합한 듯한 방법으로 2015년에 제안된 새로운 방법으로 두가지의 특징을 같이 점목하여 효율적으로 처리 할 수 있도록 만들어진 것이다. 

무조건 이상적인 최적의 값이 나온다고 할 수 없습니다. 그렇기 때문에 입력으로 전달되는 데이터에 따라서 최적인 알고리즘을 골라서 사용하는 것이 중요합니다. 

 

1) 경사하강법을 적용

2) 결과를 확인 - 데이터에 따라서 값이 오차가 클 때

3) 새로운 알고리즘을 적용

 

가장 중요한 것은!!! data 입니다!!! 절대적이라고 해도 과언은 아니라고 할 수 있습니다. 

data에 맞는 최적의 모델을 설계하는 것이 포인트 입니다!!

 

 

MNIST 데이터셋으로 본 갱신 방법 비교

가장 크게 효과를 발휘하는 AdaGrad인것을 확인 할 수 있습니다. 가장 안좋은 포퍼먼스를 보여주는 알고리즘은 SGD(경사하강법)인 것을 확인 할 수 있으며, 가장 손실함수의 값이 크다는 사실까지 확인됩니다.

 

 

 

가중치 초기값

 

가중치 감소(weight decay) 기법
 - 오버피팅을 억제해 범용 성능을 높이는 테크닉
 - 가중치 매개변수의 값이 작아지도록 학습하는 방법
 - 즉, 가중치 값을 작게 하여 오버피팅이 일어나지 않게 하는 것


지금까지의 가중치 초기값은 0.01 * np.random.randn(10,100) 처럼 정규분포에서 생성되는 값을 0.01배 한 작은 값(표준편차가 0.01인 정규분포)을 사용.

가중치를 표준편차가 0.01인 정규분포로 초기화할 때의 각 층의 활성화값 분포

 

 

- 가중치의 초기값으로 Xavier 초기값을 이용할 때의 각 층의 활성화값 분포

- 각 층의 활성화 값들을 광범위하게 분포시킬 목적으로 가중치의 적절한 분포를 찾고자 함.

- 앞 계층의 노드가 n개라면 표준편차가 sqrt(1/n)인 분포를 사용하면 된다는 결론.

- He 초기값 : sqrt(2/n)

 

 

ReLU를 사용할 때의 가중치 초기값

 

- 활성화 함수로 ReLU를 사용한 경우의 가중치 초기값에 따른

  활성화값 분포변화

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

MNIST 데이터셋으로 본 가중치 초기값 비교

 

배치 정규화
- 배치 정규화를 사용한 신경망의 예

 

 

 

- 배치 정규화는 데이터 분포가 평균이 0, 분산이 1이

  되도록 정규화함

 

 

 

 

 

 

 

- 배치 정규화 계산 그래프

 

 

- 배치 정규화의 효과 : 배치 정규화가 학습 속도를 높인다.

 

 

 

 

 

 

 

 

 

 

 

오버피팅
: 신경망이 훈련 데이터에만 지나치게 적응되어 그 외의 데이터에는 제대로 대응하지 못하는 상태

 

오버피팅 발생 주요 원인
 - 매개변수가 많고 표현력이 높은 모델
 - 훈련 데이터가 적음

 

오버피팅 억제용 : 가중치 감소(weight decay)
 - 학습 과정에서 큰 가중치에 대해서는 그에 상응하는 큰 페널티를 부과하여 오버피팅 억제하는 방법
 - 원래 오버피팅은 가중치 매개변수의 값이 커서 발생하는 경우가 많음.

 

 

 

드롭아웃
 - 신경망 모델이 복잡해지면 가중치 감소만으로는 대응하기 어려울 때 이용할 수 있는 기법
 - 뉴런을 임의로 삭제하면서 학습하는 방법으로 초적의 파라미터를 찾는 것 
 - 훈련때는 데이터를 흘릴 때마다 삭제할 뉴런을 무작위로 선택하고, 시험 때는 모든 뉴런에 신호를 전달하되

   각 뉴런의 출력에 훈련 때 삭제한 비율을 곱하여 출력(완전연결형). 

 

 

 

하이퍼파라미터 

  - 각 층의 뉴런 수
  - 배치 크기
  - 매개변수 갱신 시의 학습률
  - 가중치 감소 등의 매개변수

 

데이터 셋의 구별

  - 훈련 데이터 : 매개변수 학습
  - 검증 데이터 : 하이퍼파라미터 성능 평가(훈련 데이터 중 20% 정도 분리)
  - 시험 데이터 : 신경망의 범용 성능 평가

 

하이퍼파라미터 최적화

 - 0단계 : 하이퍼파라미터 값의 범위를 설정
 - 1단계 : 설정된 범위에서 하이퍼파라미터의 값을 무작위로 추출
 - 2단계 : 1단계에서 샘플링한 하이퍼파라미터 값을 사용하여 학습하고, 검증 데이터로 정확도를 평가

             (단, 에폭은 작게 설정)
 - 3단계 : 1단계와 2단계를 특정 횟수(100회 등) 반복하여, 그 정확도의 결과를 보고 하이퍼파라미터의 범위를 좁힘

 

 

 

- 실선은 검증 데이터에 대한 정확도

- 점선은 훈련 데이터에 대한 정확도

논리 연산자 AND, OR, XOR, NOT 이 존재합니다. 

 

XOR data set

: 입력 신호가 다를 때 신호를 내보내는 연산자 입니다. 

- 서로 다른 값 True , 서로 같은 값 False 선형적으로 구분할 수 있는 방법이 물리적으로 불가능합니다. 

- 하나의 게이트로는 그래프로 그릴 수 없지만, 다층의 멀티 레이어로 구성할 때 그래프 그리는 것이 가능합니다. 

 

노드를 다층으로 가져가므로 물리적으로 gate를 

조합 함으로 분류가 가능하도록 되었습니다. 

 

- 비선형의 모형으로 구분

 

 

 

 

 

 

 

 

 

 

 

0) 데이터 정리 

1) 가설함수 설정 

 

2) 손실함수 설정

 

3) 경사하강법 적용

 

4) tensorflow 흐름

 

결과) 

50퍼센트의 정확도를 보이는 결과가 나타납니다. 

- Xor의 모델은 단독의 gate로 설계할 수 없습니다.  신경망을 멀티레이어드의 형태로 추가해보록 하겠습니다. 

 

 

추가 레이어드 구성) 

 

가설함수 변경) 

 

W1, W2의 값의 변화 확인으로 변경) 

 

결과) 

100프로로 정답과 일치하게 되었습니다. 

 

Softmax 함수 

: 최종출력의 결과를 확률적인 의미로, 최종 출력의 합이 1이 되도록 변환해주는 함수입니다. 

- 학습시 최종출력단에 softmax함수를 연결시켜주는 것이 일반적입니다. 

 

0) 데이터 정리

 

1) 가설함수 정의 - softmax 함수

 

2) 손실함수 정의 

 

3) 경사하강법 적용( Gradient Descent Algorithm )

 

4) tensorflow 흐름

 

 

+ Recent posts