이 글은 파이썬 라이브러리를 활용한 머신러닝 책을 본 사람에게만 유효. (안드레아스 뮐러, 세라 가이도 지음. 박해선 옮김. O'REILLY)

파이썬 라이브러리: scikit-learn

jupyter notebook을 제공하기 때문에, 파이썬 코드나, 각각에 대한 그래프를 확인 할 수는 있지만, 

글의 경우 잊어먹기 쉽기 때문에, 소장을 위한 포스팅 

교재 소스 코드: https://github.com/rickiepark/introduction_to_ml_with_python/


2장. 지도학습


지도학습에는 분류와 회귀가 있음.

- 분류는 미리 정의된, 가능성 있는 여러 클래스 레이블 중 하나를 예측.

  이진 분류(binary classfication), 다중 분류(multiclass classfication)으로 나눌 수 있음.

- 회귀는 연속적인 숫자, 또는 프로그래밍 언어로 말하면 부동소수점수(수학 용어로는 실수)를 예측


지도학습 알고리즘 모델 요약


1) KNN: 작은 데이터셋일 경우, 기본 모델로서 좋고 설명하기 쉬움.

- 훈련 데이터셋을 그냥 저장하는 것이 모델을 만드는 과정의 전부. 별도의 학습이 필요 없음

- 새로운 데이터 포인트에 대해 예측할 땐 알고리즘이 훈련 데이터셋에서 가장 가까운 데이터 포인트, 즉 '최근접 이웃'을 찾음

  (scikit-learn에서 classfication, Regression 모두 지원)


- 매개변수: 중요한 매개변수는 2개. 데이터 포인트 사이의 거리를 재는 방법과 이웃의 수 (실제로 이웃의 수는 3,5개 정도로 적을 때 잘 작동하지만, 조정 필요) 거리를 잴 때, 유클리디안 거리 방식 사용

- 장점: 이해하기 매우 쉬운 모델.

- 단점: 전처리 과정이 중요. 훈련 세트가 매우 크면(특성의 수나 샘플의 수가 클 경우) 예측이 느림. 현업에서는 많이 사용 안함


- 데이터 셋: from sklearn.datasets import load_breast_cancer, from sklearn.datasets import load_boston

- 라이브러리

- graph example: mglearn.plots.plot_knn_classification(n_neighbors=<number>)

     mglearn.plots.plot_knn_regression(n_neighbors=<number>)

- library: from sklearn.neighbors import KNeighborsClassifier

from sklearn.neighbors import KNeighborsRegressor



2) Linear Model: 첫 번째로 시도할 알고리즘. 대용량 데이터셋 가능. 고차원 데이터에 가능.

- 선형 회귀(=LSE): 예측과 훈련 세트 사이에 있는 y 사이의 평균제곱오차(mean squared error)를 최소화 하는 파라미터 w, b를 찾음

- w(가중치:weight 또는 계수: coefficient), b(편향:offset 또는 절편:intercept)

- 평균제곱오차는 예측값과 타깃값의 차이를 제곱하여 더한 후에 샘플의 개수로 나눔

- 선형 회귀는 매개변수가 없는 것이 장점이지만, 그래서 모델의 복잡도를 제어할 방법도 없음

- 릿지 회귀(Ridge): 회귀를 위한 선형 모델로 최소적합법(Least Squares Estimation)에서 사용한 거과 같은 예측 함수 사용

- 하지만 릿지 회귀에서의 가중치(w) 선택은 훈련 데이터를 잘 예측하기 위해서 뿐만 아니라, 추가 제약 조건을 만족시키기 위한 목적도 있음. 가중치의 절대 값을 가능한 작게 만드는 것임. 다시 말해서 w의 모든 원소가 0에 가깝게 되길 원함. 직관적으로 생각하면 이는 모든 특성이 출력에 주는 영향을 최소한으로 만듦(기울기를 작게 만듦) 이러한 제약을 규제(Regularization)이라고 함. 

- 릿지 회귀에 사용하는 규제 방식을 L2규제라고 함

- 수학적으로 릿지의 계수의 L2노름(norm)의 제곱을 패널티로 적용

- 평균제곱오차 식에 아래의 식이 추가 됨

 (카이스트 문일철 교수님 강의를 보면 알파가 알파/2로 되어있음)

- 알파 값을 크게 하면, 패널티의 효과가 커지고(가중치 감소), 알파 값을 작게 하면 그 반대가 됨.

- 선형 회귀보다, 모델이 덜 자유롭기 때문에 과대 적합이 적어짐.

즉, 모델의 복잡도가 낮아지면 성능은 나빠지지만 더 일반화 된 모델

- 알파 값의 매개변수를 조정하여 훈련 세트의 성능 대비 모델을 얼마나 단순화 할지 지정할 수 있음.

- 알파값을 줄이면 계수에 대한 제약이 그만큼 풀리게되고, 아주 작은 알파 값은 선형 회귀로 만든 모델과 같아짐

- 라쏘 회귀(Lasso): 선형 회귀에 규제를 적용하는 데 Ridge의 대안으로 Lasso가 있음. 릿지와 같이 라쏘 또한 계수를 0에 가깝게 만듦

- 라쏘 회귀에 사용하는 규제 방식을 L1규제라고 함

- 라쏘의 계수 벡터의 L1노름을 패널티로 사용. 다른 말로 하면 계수의 절대값의 합

- 평균제곱오차 식에 아래의 식이 추가 됨

- 릿지와 마찬가지로 알파 값을 크게 하면 패널티의 효과가 커지고(가중치 감소), 작게 하면 그 반대가 됨

출처: kooc.kaist.ac.kr 인공지능 및 기계학습 개론1 (6강 Regularization 부분)

위의 그림을 보면 lasso의 경우 단일 부분만 겹치는 것을 확인할 수 있다. Ridge의 경우 제곱식이기 때문에 원의 형태로 모델이 생성되는데, 그렇기 때문에 겹치는 부분이 많음을 확인할 수 있다. 이는 즉 특성이 많고 일부분만 중요하다고 생각될 때에는 Lasso, 그렇지 않다면 Ridge모델을 선택하는 것을 확인할 수 있다.



※ 과소 적합을 줄이기 위해 alpha값을 줄여, 패널티의 효과를 줄임(가중치 증가) 

그러나 alpha값을 너무 낮추면 규제의 효과가 없어져 과대 적합이 된다. Linear Regression과 같은 모델이 됨

실제 두 모델 중 보통은 릿지 회귀를 선호함. 하지만 특성이 많고 그 중 일부분만 중요하다면 Lasso가 더 좋은 선택일 수 있다.

또한 분석하기 쉬운 모델을 원한다면 Lasso가 입력 특성 중 일부만 사용되므로 쉽게 해석할 수 있는 모델을 만들어 줄 것이다.

(scikit-learn은 Lasso와 Ridge의 패널티를 결합한 ElasticNet도 제공함. 실제로 가장 좋은 성능을 내지만 L1/L2규제를 위한 매개변수 두 개 조정 필요)


※Logistic Regression, SVM은 알파 값이 아닌 C값을 사용. Ridge와 마찬가지로 L2규제를 사용.

- 규제의 강도를 결정하기 위한 매개변수는 C.

- 위의 알파와 반대로 C의 값이 높아지면 규제가 감소함.다시 말해 매개변수로 높은 C값을 지정하면 훈련세트와 가능한 최대로 맞추려하고, 반대로 C값을 낮추면 모델은 계수 벡터(w)가 0에 가까워지도록 만듦

-> alpha값을 크게 하면 w가 작아지고, C를 작게 하면 w가 작아진다.

w가 작아진다는 것은, 데이트 포인트 중 다수에 맞추려고 하는 반면, w가 커지면 각각 데이터 포인트를 정확히 분류하려고 노력할 것이다.

응 교수님의 2차식과 9차식을 생각해보자. 9차식은 w가 크기 때문에 엄청 난잡한 그래프가 그려지지 않았던가..... 


- 매개변수

- 보통 C와 alpha값은 로그스케일로 최적치를 정한다. (예: 0.01,0.1,1,10)

- L1, L2규제를 정해야 한다. 중요한 특성이 많지 않다고 생각하면 L1규제를 사용. 그렇지 않으면 기본적으로 L2규제 사용

- 장점: 학습 속도가 빠르고 예측도 빠르다. 매우 큰 데이터셋과 희소한 데이터셋에서도 잘 작동한다.

- 단점: 예측이 어떻게 만들어지는지 비교적 쉽게 이해할 수 있지만, 계수의 값들이 왜 그런지 명확하지 않을 때가 있음.

   저 차원 데이터셋 일 때에는 다른 모델이 일반화 성능이 더 좋음


- 데이터 셋: mglearn.datasets.load_extended_boston(), mglearn.datasets.make_forge(), 

   from sklearn.datasets import load_breast_cancer

- 라이브러리

- example: mglearn.plots.plot_linear_regression_wave()

- library: from sklearn.linear_model import LinearRegression        //선형 회귀

from sklearn.linear_model import Ridge                         //Ridge회귀

from sklearn.linear_model import Lasso                         //Lasso 회귀

        from sklearn.linear_model import LogisticRegression    //Logistic 회귀

from sklearn.svm import LinearSVC                               //support vector machine (c는 classifier)



3) Naive Bayes: 분류만 가능. 선형 모델보다 훨씬 빠름. 대용량 데이터셋과 고차원 데이터에 가능. 선형모델보다 덜 정확

- 매개변수: 모델의 복잡도를 조절하는 alpha매개변수 하나를 가지고 있음 (alpha값이 크면 완만해지고, 모델의 복잡도는 낮아짐)

그러나 성능 변동은 비교적 크지 않아...

- 장점: 선형 모델과 비슷함. 훈련과 예측 속도가 빠르며 훈련 과정을 이해하기 쉬움.

희소한 고차원 데이터에서 잘 작동하며, 비교적 매개변수에 민감하지 않음

선형 모델로는 학스 시간이 너무 오래 걸리는 매우 큰 데이터셋에는 나이브 베이즈 모델을 시도해볼 만하며 종종 사용됨.

- 단점: 분류밖에 안된다?



4) Decision Tree: 매우 빠름. 데이터 스케일 조정이 필요 없음. 시각화하기 좋고 설명하기 쉬움.

- 결정트리는 분류와 회귀 문제에 널리 사용하는 모델. 기본적으로 결정 트리는 결정에 다다르기 위해 예/아니오 질문을 하면서 학습

- 일반적으로 트리만들기를 모든 리프 노드가 순수 노드가 될 때까지 진행하면 모델이 매우 복잡해지고, 훈련데이터에 과대 적합됨

  순수 노드로 이루어진 트리는 훈련 세트에 100% 정확하게 맞는 것을 의미. 즉 훈련 세트의 모든 데이터 포인트는 정확한 클래스의 리

  프 노드에 있음. 이렇게 될 경우에는 결정 경계가 클래스의 포인트들에서 멀리 떨어진 이상치 하나에 민감하게 작용됨

- 과대 적합을 막기 위해서는 두 가지가 있음

- 사전 가지치기(pre-pruning): 트리 생성을 일찍 중단하는 전략

- 사후 가지치기(post-pruning 또는 pruning): 트리를 만든 후 데이터 포인트가 적은 노드를 삭제하거나 병합하는 전략

(scikit-learn에서는 사전 가지치기만 지원)


- 매개변수: 트리가 완전히 만들어기 전에 멈추게 하는 사전 가지치기 매개변수. 보통은 사전 가지치기 방법 중 max_depth,

max_leaf_nodes 또는 min_samples_leaf중 하나만 지정해도 과대적합을 막는 데 충분

- 장점: 만들어진 모델을 쉽게 시각화할 수 있어서 비전문가도 이해하기 쉬움. 또한 데이터의 스케일에 구애 받지 않음.

각 특성이 개별적으로 처리되어 데이터를 분할할하는 데 데이터 스케일의 영향을 받지 않으므로 결정트리에서는 특성의 정규화나 표준화 같은 전처리 과정이 필요 없음. 특히 특성의 스케일이 서로 다르거나 이진 특성과 연속적인 특성이 혼합되어 있을 때도 잘 작동

- 단점: 사전 가지치기를 사용함에도 불구하고 과대적합되는 경향이 있어 일반화 성능이 좋지 않음.


- 데이터 셋:  from sklearn.datasets import load_breast_cancer

- 라이브러리

- graph example: mglearn.plots.plot_animal_tree()

- library: from sklearn.tree import DecisionTreeClassifier, from sklearn.tree import DecisionTreeRegressor



5) Random Forest: 결정 트리 하나보다 거의 항상 좋은 성능을 냄. 매우 안정적이고 강력함. 

데이터 스케일 조정 필요없음. 고차원 희소 데이터에는 잘 안 맞음.

- 앞서 확인한 것처럼 결정트리의 주요 단점은 훈련 데이터에 과대적합되는 경향이 있다는 것이다. R.F는 이 문제를 회피하는 방법이다.

- R.F는 기본적으로 조금씩 다른 여러 결정 트리의 묶음이다. R.F의 아이디어는 서로 다른 방향으로 과대적합된 트리를 많이 만들면 그 결과를 평균냄으로써 과대적합된 양을 줄일 수 있다는 것이다. 이렇게 하면 트리 모델의 예측 성능은 유지되면서 과대적합이 줄어드는 것이 수학적으로 증명 되었다.

- 랜덤 포레스트에서 트리를 랜덤하게 만드는 방법은 두 가지 이다.

- 트리를 만들 때 사용하는 데이터 포인트를 무작위로 선택하는 방법

- 분할 테스트에서 특성을 무작위로 선택하는 방법


- R.F 모델을 만들려면 생성할 트리의 개수를 정해야 한다. (RandomForest Regressor나 Classifier의 n_estimators 매개변수)

- 트리를 만들기 위해 부트스트랩 샘플을 생성 (n_samples개의 데이터 포인트 중에서 무작위로 데이터를 n_samples횟수만큼 반복 추출)

- 예를 들면 리스트 ['a','b','c','d']에서 부트스트랩 샘플을 만들면 ['b','d','c','d']가 될 수 있고 ['d','a','d','a']도 가능

- 이렇게 만든 데이터셋으로 결정 트리를 만듦. 이전의 결정 트리 알고리즘과 같이 각 노드에서 전체 특성을 대상으로 최선의 테스트를 찾는 것이 아니고, 알고리즘이 각 노드에서 후보 특성을 무작위로 선택한 후 이 후보들 중에서 최선의 테스트를 찾음. 몇 개의 특성을 고를지는 max_feature 매개변수로 조정할 수 있음. 후보 특성을 고르는 것은 매 노드마다 반복되므로 트리의 각 노드는 다른 후보 특성들을 사용하여 테스트를 만듦

- 부트스트랩 샘플링은 랜덤 포레스트의 트리가 조금씩 다른 데이터셋을 이용해 만들어지도록 함. 또 각 노드에서 특성의 일부만 사용하기 때문에 트리의 각 분기는 각기 다른 특성 부분 집합을 사용. 이 두 메커니즘이 합쳐져서 R.F의 모든 트리가 서도 달라지도록 만듦

- 이 방식에서 핵심 매개변수는 max_feature. max_feature를 n_feature로 설정하면 트리의 각 분기에서 모든 특성을 고려하므로 특성 선택에 무작위성이 들어가지 않음. max_features를 낮추면 R.F 트리들은 많이 달라지고 각 트리는 데이터에 맞추기 위해 깊이가 깊어짐

- R.F로 예측을 할 때는 먼저 알고리즘이 모델에 있는 모든 트리의 예측을 만듦. 회귀의 경우에는 이 예측들을 평균하여 최종 예측을 만듦. 분류의 경우에는 약한 투표 전략을 사용. 즉 각 알고리즘이 가능성 있는 출력 레이블의 확률을 제공함으로써 간접적인 예측을 함. 트리들이 예측한 확률을 평균내어 가장 높은 확률을 가진 클래스가 예측값이 된다.


- 매개변수: n_estimators(클수록 좋음. 더 많은 트리를 평균하면 과대적합을 줄여 안정적임), 

max_features(작은 max_feature는 과대적합을 줄여줌. 일반적으로 기본 값을 쓰는 것이 좋음), max_depth와 같은 가지치기 옵션 

- 장점: 성능이 매우 뛰어나고 매개변수 튜닝을 많이 하지 않아도 잘 작동하며 데이터의 스케일을 맞출 필요가 없음

단일 트리의 단점을 보완하고 장점은 그대로 가지고 있음. 만약 의사 결정 과정을 간소하게 표현해야 한다면 단일 트리를 사용 가능

- 단점: 텍스트 데이터 같이 매우 차원이 높고, 희소한 데이터에는 잘 작동하지 않음. 이런 데이터에는 선형 모델이 더 적합.

또한, 선형 모델보다 많은 메모리를 사용하며 휸련과 예측이 느림.


- 데이터 셋: from sklearn.datasets import make_moons, from sklearn.datasets import load_breast_cancer

- 라이브러리

- library: from sklearn.ensemble import RandomForestClassifier



6) Gradient Boosting Decision Tree: 랜덤 포레스트보다 조금 더 성능이 좋음. 랜덤 포레스트보다 학습은 느리나,

예측은 빠르고, 메모리를 조금 사용. 랜덤포레스트보다 매개변수 튜닝 많이 필요

- 그래디언트 부스팅 회귀 트리는 여러 개의 결정 트리를 묶어 강력한 모델을 만드는 또 다른 앙상블 방법 (이름만 회귀, 분류도 함)

- 랜덤 포레스트와 달리 그래디언트 부스팅은 이전 트리의 오차를 보완하는 방식으로 순차적으로 트리를 만듦

- 기본적으로 그래디언트 부스팅은 무작위성이 없음. 대신 강력한 사전 가지치기가 사용됨

- 그래디언트 부스팅은 보통 하나에서 다섯 정도의 깊지 않은 트리를 사용하기 때문에 메모리를 적게 사용하고 예측도 빠름

- 기본적인 아이디어는 얕은 트리 같은 간단한 모델을 많이 연결하는 것. 각각의 트리는 데이터의 일부에 대해서만 예측을 잘 수행할 수 있어서 트리가 많이 추가 될수록 성능이 좋아짐

- 중요한 매개변수로는 이전 트리의 오차를 얼마나 강하게 보정할 것인지를 제어하는 learning_rate가 있음. 학습률이 크면  트리는 보정을 하기 때문에 복잡한 모델을 만듦, n_estimators 값을 키우면 앙상블에 트리가 더 많이 추가되어 모델이 복잡도가 커지고 훈련 세트에서의 실수를 바로잡을 기회가 더 많아짐


- 매개변수: n_estimator, learning_rate

※ n_estimator가 클수록 좋은 랜덤 포레스트와는 달리, 그래디언트 부스팅에서는 크게하면 모델이 복잡해지고 과대적합될 가능성이 높아짐. 일반적인 관례는 가용한 시간과 메모리 한도에서 n_estimator를 맞추고 나서 적절한 learning_rate를 찾음

중요한 또 다른 매개변수는 각 트리의 복잡도를 낮추는 max_depth(또는 max_leaf_nodes)인데, 통상 그래디언트 부스팅 모델에서는 max_depth를 매우 작게 설정하며 트리의 깊이가 5보다 깊어지지 않게 한다.

- 장점: 다른 트리 기반 모델처럼 특성의 스케일을 조정하지 않아도 되고, 이진 특성이 연속적인 특성에서도 잘 동작함

- 단점: 매개변수를 잘 조정해야 한다는 것과 훈련시간이 김. 희소한 고차원 데이터에는 잘 작동하지 않음


- 데이터 셋: from sklearn.datasets import load_breast_cancer

- 라이브러리

- library: from sklearn.ensemble import GradientBoostingClassifier



7) Support Vector Machine: 비슷한 의미의 특성으로 이뤄진 중간 규모 데이터셋에 잘 맞음. 데이터 스케일 조정필요. 매개변수에 민감

- 커널 서포트 벡터 머신은 입력 데이터에서 단순한 초평면으로 정의되지 않는 더 복잡한 모델을 만들 수 있도록 확장

- 서포터벡터의 이론은 이 책에서는 별로 다루지 않았음.

- 기본적으로 커널, 서포트 벡터, 마진, hard/soft margin, 비선형 decision boundary 등의 내용은 wiki에서 보는 것이 좋다고 판단됨


- 매개변수: 규제 매개변수 C, 어떤 커널을 사용할지와 각 커널에 따른 매개변수

- 장점: 데이터의 특성이 몇 개 안 되더라도 복잡한 결정 경계를 만들 수 있음. 

- 단점: 저차원, 고차원의 데이터에 모두 잘 작동하지만 샘플이 많을 때는 잘 맞지 않음..

또 하나의 단점은 데이터 전처리와 매개변수 설정에 신경을 많이 써야됨. 분석하기도 어려움


근데 다른 책들이나, 요새 논문들을 보면 SVM을 많이 사용하는 데, 이 책의 저자는 SVM을 그닥 높이 평가하지 않는다는 느낌이 들었음..



8) 신경망: 특별히 대용량 데이터셋에서 매우 복잡한 모델을 만들 수 있음. 매개변수 선택과 데이터 스케일에 민감. 학습이 오래 걸림

- MLP(MultiLayer Perceptrons)는 여러 단계를 거쳐 결정을 만들어내는 선형 모델의 일반화된 모습습

- SVM과 마찬가지로, 은닉층, feed-forward, ReLU, tanh 등 wiki에서 보는 것이 더 좋을 것 같음. 내용을 너무 많이 함축시켜놓음음

- 어차피 김성훈 교수님의 딥러닝의 경우 모두를 위한 딥러닝이나 응교수님의 강의를 들을거니깐...?


- 매개변수: 신경망에서 가장 중요한 매개변수는 은닉층의 개수와 각 은닉층의 유닛수이다. 처음에는 한 개 또는 두 개의 은닉층으로 시작해서 늘려가야 된다. 각 은닉층의 유닛 수는 보통 입력 특성의 수와 비슷하게 설정하지만 수천 초중반을 넘는 일은 거의 없다.

신경망의 매개변수를 조정하는 일반적인 방법은 먼저 충분히 과대적합되어서 문제를 해결할만한 큰 모델을 만듦. 그런 다음 훈련데이터가 충분히 학습될 수 있다고 생각 될 때 신경망 구조를 줄이거나 규제 강화를 위해 alpha값을 증가시켜 일반화 성능을 향상시킴


- 장점: 대량의 데이터에 내재된 정보를 잡아내고 매우 복잡한 모델을 만들 수 있음. 충분한 연산 시간과 데이터를 주고 매개변수를 세심하게 조정하면 신경망은 (분류와 회귀 문제에 모두) 종종 다른 머신러닝 알고리즘을 뛰어넘는 성능을 냄

- 단점: 학습이 오래 걸림. 또한 전처리에 주의해야함.

+ Recent posts