글쟁이, 코딩한다

0106 / k_digital 21일차 / ML이론기초(지도학습) 본문

나는 코딩도 한다/TIL

0106 / k_digital 21일차 / ML이론기초(지도학습)

Algori 2021. 1. 7. 00:12

0. 

머신러닝은 놀랍다.

간단히만 이해하자면 내가 이해할 수 있다는 점도 놀랍다.

 

 

1.

전통적인 머신러닝의 대장들. 이해가 온전하지 않았던 수학공식들은 추가 공부를 한 후에 기록한다.

SVM

  (Support Vector Machine, 서포트 벡터 머신)
    패턴 인식을 위한 지도 학습 모델

(x가 여럿인 data에서) 두 종류의 데이터를 가르는 더 나은 결정 경계(Decision boundary, 모델선)를 찾는다.
서포트 벡터(Support vector) : 결정 경계에 가장 가까운 클래스 데이터  
  결정 경계와 평행하며 위쪽 서포트 벡터와 맞닿은 선 : plus-plane
  결정 경계와 평행하며 아래쪽 서포트 벡터와 맞닿은 선 : minus-plane
   plus-plane과 minus-plane 사이 거리 : Margin : 서로 다른 두 클래스 사이 최단거리

  SVM은 Margin이 가장 큰 결정 경계를 찾는 방법이다. 


Soft Margin SVM

  문제1 : plus, minus-plane과 동떨어져 자기 클래스 영역을 벗어난 noise들이 있다


 => noise들이 plane과 떨어진 거리의 합 * C의 값을 minimize // hyper-parameter인 C가 클수록 에러를 적게 허용
 => 결정 경계가 먼 오류(minimize해 작아진 값)를 무시하도록 해줌으로써 결정 경계를 과감하게 그리도록 해준다

 

KSVMs (커널 서포트 벡터 머신, Kernel Support Vector Machines)

  문제2 : 데이터가 직선으로 나뉘지 않는다 = 선형분리 불가능 = Linearly Unseparable

 => 어떤 x데이터를 제곱한 임시 x데이터를 만들어 데이터를 고차원 공간으로 잠시 올려보내 가른다. 

 => 구분선을 구한 후 임시 공간을 날리면, 원 모양 선만 남는다.
   => 이렇게 차원을 올려주는 방법 : Kernel Function(여러 개가 있다. 어떤 것을 쓰느냐도 선택(hyper-parameter)) 

 

<코드 실습> Feature scailing, HPO를 기억해두자

#data 처리

@feature scailing
  #data 자릿값 맞추기 = Normalization

1) Min-Max Algorithm
#min(열) = 0, max(열) = 1

  from sklearn.preprocessing import MinMaxScaler
  
  sc = MinMaxScaler()
  sc.fit(X_train)	#밀어넣은 data의 min, max를 구한다
  sc.transform(X_train)	#정규화로 변환

2) Standardization (보통은 minmax보다 성능 우수)
#mean(열) = 0, std(열) = 1

  from sklearn.preprocessing import StandardScaler
  
  sc = StandardScaler()
  sc.fit(X_train)	#밀어넣은 data의 mean, std를 구한다
  sc.transform(X_train)	#정규화로 변환

 #train data와 test data의 정규화는 train data의 값을 기준으로 한다.(new data와도 min값, max값, mean값 등은 새로 구하지 않는다)
 #SVM은 자릿수가 다를 때면 모델이 무너진다. 성능을 올리기 위해서는 맞춰주자.
 #SVM 함수를 가지고 나갈 때는, scaler도 같이 들고 나가야 한다.

 #열이 어떤 분류로 나눠졌을 때(ex. 0, 1, 2로 구분된 값) -이 때 정수들은 일종의 심볼. 이들의 scale을 맞추려면
         from sklearn.preprocessing import OneHotEncoder

@모델 생성
from sklearn.svm import SVC
svc = SVC(kernel='rbf', C=10, gamma=0.1).fit(X, y)

#SVC : SVM Classifier(분류 문제) #SVR : SVM Regressor(회귀 문제)

@모델 성능과 이어지는 hyper-para : 
 kernel= 'rbf' : RBF(방사기저함수) : 가우시안 커널 : 가장 기본적인 커널 함수 
 C= 큰 값 : 에러를 적게 허용, 작은 값 : 에러를 곧잘 허용 / 어떤 값이 나은지는 아직 미지수(작다고 무조건 좋지는 않다) 
 gamma= 커널 함수 단면 반지름의 역수 => gamma가 커지면 구분 원(커널 적용 후 남은 구분선)이 작아짐 / gamma가 작아지면 구분 원이 커짐
  !쉽게 생각하기 : C와 gamma값이 커지면 overfitting이 날 확률이 높아진다. 적당히 올려주면 모델 성능이 올라갈 수도 있다.


@Hyper-parameter Optimization (HPO, 하이퍼파라미터 튜닝)
1-Grid Search
from sklearn.model_selection import GridSearchCV

param_grid = {'C' : [0.1, 1, 10], 
             'gamma' : [0.1, 0.01, 0.001],
             'kernel' : ['rbf']}
#hyper-para 값들의 후보군(dict)

grid = GridSearchCV(svm.SVC( ), param_grid, refit=True, verbose=1)
#refit= 나온 grid 값을 model에 덮어씌움(grid 자체가 예측 가능한 model이 됨) #verbose= 수다쟁이, 함수가 길어지면 설명을 써줌

#그 외
2-Random Search
3-Bayesian Search

@분류정확도
svc.score(X_train, Y_train)
  #분류 model.score( ) => accuracy score를 구해주는 함수
  #accuracy score는 굉장히 나이브한 평가법


@classification_report( )
precision, recall, f1-scroe 등을 알려준다

 

Decision Tree 

   의사결정나무, 일정 기준을 두고, 세부로 파고들며 판단 내린다

  이해하기 쉽고 해석이 용이. but 입력 데이터의 작은 변동(이례적인 데이터)에 구성이 요동, overfitting이 쉽게 생김, leaf node(Tree 구조의 최하위 갈래) = 1개인 경우가 자주 생긴다(판단 근거가 취약해짐) 

해결책 => Boosting (model ensemble 중 하나)


@model emsemble : 

1-여러 예측 모형을 만든다 2-값들을 취합해 결정 : 분류는 투표로, 회귀는 평균값으로 
  #다른 하나 : Bagging -> Random Forest

  : X data 일부를 선택해 모델 설계(병렬 연결, 각자 독립적) : 취합 방식은 같다

     #일반적으로는 Boosting 기법의 성능이 좋다고 본다 #속도는 위

Boosting

   중요 의사결정을 내리기는 힘든 weak learner들을 모아 strong learner를 만든다. (모델들은 상호보완적)
  

AdaBoost :

  1. 여러 weak learner를 반복해 생성
  2. 앞선 learner의 error에 가중치를 부여(중요도를 높여줌)
  3. 수없이 반복
  4. 마지막 단계 strong learner(분류: 클래스 투표, 회귀: 선을 겹쳐 평균)를 만들어 예측 

  ==약점 

1-가중치 오류로 덩치가 너무 크게 불려질 수도 -> 정확도 down

   =해결방안=> 가중치를 θ로 두고 옳은 값을 찾는다. Gradient descent : ①Gradient Boosting(2012)
2-시간이 너무 오래 걸림(의사결정나무 시뮬레이션)

   =해결방안=> 시뮬레이션들을 병렬처리(모델은 연결됐으므로 병렬처리 불가능)

       ②XG Boost(Extreme Gradient Boosting, 2016, 하이퍼파라미터 겁나 많음)  ③Light GBM(2018, 콜랩으로 써야함)  

 

④NGBoost(2020)?

 

<코드 실습>

@모델 만들기

from sklearn import ensemble
clf = ensemble.GradientBoostingRegressor(n_estimators=500, 
                                         max_depth=4, 
                                         min_samples_split=2, 
                                         learning_rate=0.01, 
                                         loss='ls')

#n_estimators = 의사결정나무의 숫자 
#gbm python hyperparameter list = https://c11.kr/l4ku

@Tree 기반 모델의 특징 : 열의 중요도를 파악하기 쉽다 : model 해석에 용이

clf.feature_importances_
#열의 중요도를 가리는 함수 #열 중요도를 시각화로 표현해보자

 

오늘의 TML

 

1) 샘플 데이터셋

from sklearn import datasets
datasets.load_sample()
#샘플데이터 불러오기(boston, iris 등)

pd.DataFrame(data.data) 
#dict형태로 나온 데이터를 dataframe으로 변환

 

오늘의 나중 볼 것

 

수학공식 유튜브 3 blue 1 brown

Comments