13일차 [ Machine Learning ] - votus777/AI_study GitHub Wiki

Machine Learning


<SVC ( Support Vector Classifier) >

  • SVM의 산하 파티 ( 같은 알고리즘의 다른 적용 방식)

  • 클래스를 구분하는 분류 문제에서, 각 클래스를 구분하는 선을 그어주는 방식

  • 데이터 하나 하나에 영향을 받기 보다 경계에 위치한 샘플(vector)에 결정, 의지 된다고 해서 support vector machine이라 불림.

  • 예측을 계산할 때는 전체 훈련 세트가 아니라 서포트 벡터만 관여한다.
    probability = True -> 훈련이 끝난 후 SVM에 로지스틱 회귀를 훈련시켜 확률 계산

  • SVC(kernel = 'linear'), SGDClassifier 와 LinearSVC는 이론적으로는 같다.
    하지만 LinearSVC는 오로지 선형회귀만을 지원하기 때문에 비교적 더 빠르다.


하지만 기존 선형 분류로는 XOR 문제 해결 못함


  • 그래서 Kernel - SVM 으로 해결 (다항식 커널)

      원공간(Input Space)의 데이터를 선형분류가 가능한 고차원 공간(Feature Space)으로 
      매핑한 뒤 두 범주를 분류하는 초평면을 찾는다
      
      쉽게말해 종이를 접어서 선을 긋는 것
    
  • 정확히는 특성(feature)을 추가해 고차원으로 만든다. 이래서 텐서 텐서 하는구나.
    커널 트릭을 함으로써 실제로는 특성을 추가하지 않았지만 특성을 추가한 효과를 낼 수 있다.

  • SVM으로 이상치 탐지,회귀 분석도 가능하다고 한다.

     회귀 -> 분류모델에서처럼 선을 그을 때 되도록 많은 것을 구분하도록 분류하는게 아니라
     반대로 제한된 오차 범위내에 가능한 많은 데이터가 들어가도록 하는 것이다. (SVR)
    

< Decision Tree > - 의사결정 나무

분류, 회귀, 다중출력가지 할 수 있는 알고리즘

   2차원 특성 평면을 과녁이라 생각해보자.   
   각 특성의 데이터가 곧 정확한 표적 위치를 말해준다.   
   여기서 특성을 보고 예/아니오 구분으로 맞는 방향으로 한 발씩 점사한다.  탕!   
   이것이 Decision Tree 이다.     

< Random Forest >

Bagging을 적용한 결정 트리의 앙상블
처음부터 정확한 특성을 찾는 것보다 랜덤하게 특성을 뽑고 그 중에서 최적의 특성을 뽑는 방식

나무가 모여 숲을 이뤘다. 위에 친구는 단발 사격인데 이 놈은 연발로 쏘는 거다.

못맞추겠으면 일단 난사가 답이다. 대충 갈기다 보면 대충 한 발은 맞겠지 뭐..
정확한 값을 노리고 쏘는 것이 아니라 어느 정도 편향은 있지만 분산은 줄일 수 있다
-> 그래도 맞추려고 노력하면 어떻게든 탄착군이 형성될 가능성이 높음 )
-> overfitting 방지 (편향은 작지만 분산이 클 때 발생)

또한 마구 갈기다 보니 결측치, 이상치에 둔감하다.
중간에 한두발 튄 게 무슨 상관이겠나 수백발을 갈기는데..
대신 너무 복잡하게 생긴 놈은 잘 못맞춘다.
가운데 구멍이 뚫려있다던가... 뭐 그런 고차원적인 데이터들

그래도 자기가 쏜 곳의 위치 (여기서는 특성)을 쏜 사람 본인이 알 수 있어서
feature importance (특성의 중요성)를 쉽게 파악할 수 있다.
자기가 어떻게 했을 때 가장 잘 맞았는지 알테니까.
변수 저장되어 있으니 뽑아쓰면 된다.

비슷한 친구로 Extremley randomized trees(Extra tree)도 있다.

Random Forest에서는 그래도 어느 정도 조준은 하고 난사를 했는데
이 친구는 더 극단적인 난사를 한다. 그냥 총 잡자마자 쏴재끼는 것이다.
명중률은 떨어지지만 더 화끈해서 그런지 처리 속도도 더 빠르다고 한다.
심지어 Random forest랑 똑같이 병렬 구조라
양 손에 쥐고 따발이로 동시에 갈기는 것도 가능하다
병렬 연산이 가능하면 연산 속도가 더 빠르다는 얘기.

다만 둘 중에 어느것이 더 나은지는 예단하기 어렵다.
둘 다 해보고 교차 검증 및 그리드 탐색으로 하이퍼파라미터 튜닝을 해보자

< Gradient Boosting >

이 놈은 좀 다르다.
앞에서 먼저 쏜 놈한테 대충 표적의 방향을 듣고
다음 사람이 그 방향에 대고 어림 잡아서 쏜다.
다시 이 학습 결과를 다음 사람에게 전해주고,
그 다음 사람은 경사하강법과 손실함수를 이용하여 오차를 줄여나간다. 이것의 반복.

난사와 다르게 삽질을 안하기 때문에
메모리 낭비도 적고 예측도 빠르게 감을 잡는다.
표적의 위치 좌표를 전 사수에게 전달 받기에 편차,error가 적지만
각자가 가진 영점이 달라서 쏘는 위치는 맞음에도 정작 빗나가는 분산이 크다.
-> overfitting의 가능성

게다가 중간에 고문관 한 놈이 껴있으면
잘못된 정보가 그대로 뒤에 전파되기 때문에 특이값, 매개 변수에 매우 민감하다.
아 제가 분명히 맞췄지 말입니다

또한 Random Forest와 반대로 직렬 연결이기 때문에 속도가 느려질 가능성이 있다.
무조건 한 놈이 사격을 끝나고 나서야 정보를 전달 받아야 하니까,
여러 명이 동시에 사격하고 우르르 나가서
내가 맞네 니가 틀렸네 하면 혼란만 가중될 것이다

그런데 이 과정을 조금더 효율적이게 병렬 구성으로 만든 것이 바로 인기있는 XGBoost이다.
여러 명을 동시에 세우는 대신에 그 중에서 이상한 놈들을 배제하고
상태 괜찮은 녀석들의 결과만 참고하는 식
속도고 빨라지고 확장성, 이식성도 높아졌다.

< 데이터 분류 및 차원 죽소 >


데이터 차원 축소


데이터의 feature가 증가하면 데이터 차원 또한 증가하게 되는데
이렇게 차원이 증가할 수록 데이터의 밀도는 희소해진다.
데이터 사이의 거리가 서로 멀어짐. 모델이 매우 복잡해지는 현상 발생
-> overfitting


PCA ( Principal component analysis ) 주성분분석


   원 데이터의 분산을 최대한 보존하면서 데이터의 초평면(hyperplane)을 구한 다음 데이터를 이 초평면에 투영 시킨다. 

   PCA는 feature을 가능한한 손실이 없게 줄이지만 randomforeset는 중요한 feature들을 뽑아내준다

압축하면서 자동적으로 이상치 제거까지 된다.
단 적용하기 전에 "무조건!!" standard scaler 적용 해야한다!


  • 투영 (Projection)

  • 매니폴드 학습 (manifold learning)

이 둘을 사용함으로써 실질적으로 model을 만들때 필요한 기준치를 제시

데이터 분류 모델로서 LDA 라는 것도 있다 카더라
-> 각 데이터들을 멀리 떨어지게 분리 (분산 대비 평균의 차이가 가장 크게 분리)

각 변수의 관계, 경중을 판단하지 않는 나이브 베이즈 모델과 다르게
LDA는 공분산 구조를 반영한다.
(공분산 : 2개의 확률변수의 상관정도, 하나가 상승할 때 다른 값도 상승하면 공분산은 양수)

정규분포 가정에 크게 벗어나는 경우는 효과가 떨어진다

구조가 더 복잡한 경우 자매품으로 QDA
그렇다고 꼭 그런건 아니고..

차원 축소는 여러 개를 연결해서 쓸 수 있다.
예를 들어 속도가 빠른 PCA로 불필요한 차원을
빠르게 없애고 LEE같이 느린 알고리즘을 사용하는 방법도 가능하다.

reference