Machine Learning 54

20. 앙상블 학습과 랜덤 포레스트 - 랜덤 포레스트

랜덤 포레스트는 일반적으로 배깅 방법(또는 페이스팅)을 적용한 결정 트리의 앙상블이다. 전형적으로 max_samples를 훈련 세트의 크기로 지정한다. BaggingClassifier에 DecisionTreeClassifier를 넣어 만드는 대신 결정 트리에 최적화되어 사용하기 편리한 RandomForestClassifier를 사용할 수 있다.(비슷하게 회귀 문제를 위한 RandomForestRegressor 가 있다). 다음은 최대 16개의 리프 노드를 갖는 500개 트리로 이뤄진 랜덤 포레스트 분류기를 여러 CPU코어에서 훈련 시키는 코드이다. from sklearn.ensemble import RandomForestClassifier rnd_clf=RandomForestClassifier(n_est..

19. 앙상블 학습과 랜덤 포레스트 - 배깅과 페이스팅

다양한 분류기를 만드는 한가지 방법은 각기 다른 훈련 알고리즘을 사용하는 것이다. 또 다른 방법은 같은 알고리즘을 사용하고 훈련 세트의 서브셋을 무작위로 구성하여 분류기를 각기 다르게 학습시키는 것이다. 훈련 세트에서 중복을 허용하여 샘플링 하는 방식을 배깅(bagging, bootstrap aggregating의 줄임말)이라 하며, 중복을 허용하지 않고 샘플링 하는 방식을 페이스팅(pasting)이라고 한다. 모든 예측기가 훈련을 마치면 앙상블은 모든 예측기의 예측을모아서 새로운 샘플에 대한 예측을 만든다. 수집 함수는 전형적으로 분류일 때는 통계적 최빈값이고, 회귀에 대해서는 평균을 계산한다. 개별 예측기는 원본 휸련 세트로 훈련시킨 것보다 훨씬 크게 편향되어 있지만 수집 함수를 통과하면 편향과 분산..

19. 앙상블 학습과 랜덤 포레스트 - 투표 기반 분류기

일련의 예측기(즉, 분류나 회귀 모델)로부터 예측을 수집하면 가장 좋은 모델 하나보다 더 좋은 예측을 얻을 수 있다. 일련의 예측기를 앙상블이라고 부르기 때문에 이를 앙상블 학습(ensemble learning)이라고 하며, 앙상블 학습 알고리즘은 앙상블 방법이라고 한다. 앙상블 항법의 예를 들면 훈련 세트로부터 무작위로 각기 다른 서브셋을 만들어 일련의 결정트리 분류기를 훈련시킬 수 있다. 예측을 하려면 모든 개별 트리의 예측을 구하면 된다. 그런 다음 가장 많은 선택을 받은 클래스를 예측으로 삼는다. 결정 트리의 앙상블을 랜덤 포레스트 라고 한다. 간단한 방법임에도 랜덤 포레스트는 오늘날 가장 강력한 머신러닝 알고리즘 중 하나이다. 정확도가 80%인 분류기 여러 개를 훈련시켰다고 가정하자. 아마도 로..

18. 결정트리 실습

1. moons 데이터셋에 결정 트리를 훈련시키고 세밀하게 튜닝해보자. from sklearn.datasets import make_moons from sklearn.model_selection import train_test_split X,y=make_moons(n_samples=1000,noise=0.4, random_state=42) X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42) DecisionTreeClassifier의 최적의 매개변수를 찾기 위해 교차 검증과 함께 그치드 탐색을 수행한다. from sklearn.model_selection import GridSearchCV from sklearn..

19. 결정 트리 - 회귀, 불안정성

결정 트리는 회귀 문제에도 사용할 수 있다. 사이킷런의 DecisionTreeRegressor를 사용해 잡음이 섞인 2차 함수 형태의 데이터셋에서 max_depth=2 설정으로 회귀 트리를 만들어 보자. from sklearn.tree import DecisionTreeRegressor tree_reg=DecisionTreeRegressor(max_depth=2) tree_reg.fit(X,y) 결정 트리는 계단 모양의 결정 경계를 만든다. 그래서 훈련 세트의 회전에 민감하다. 이런 문제를 해결하는 한 가지 방법은 훈련 데이터를 더 좋은 방향으로 회전시키는 PCA기법을 사용하는 것이다.

18. 결정 트리 - 규제 매개변수

결정 트리는 훈련 데이터에 대한 제약 사항이 거의 없다(반대로 선형 모델은 데이터가 선형일 거라 가정한다). 제한을 두지 않으면 트리가 훈련 데이터에 아주 가깝게 맞추려고 해서 대부분 과대적합되기 쉽다. 결정 트리는 모델 파라미터가 전혀 없는 것이 아니라(보통 많다) 훈련되기 전에 파라미터 수가 결정되지 않기 때문에 이런 모델을 비파라미터 모델(nonparametric model)이라고 부르곤 한다. 그래서 모델 구조가 데이터에 맞춰져서 고정되지 않고 자유롭다. 반대로 선형 모델 같은 파라미터 모델(aprametric model)은 미리 정의된 모델 파라미터 수를 가지므로 자유도가 제한되고 과대적합될 위험이 줄어든다(하지만 과소적합될 위험은 커진다). 훈련 데이터에 대한 과대적합을 피하기 위해 학습할 때..

17. 결정 트리 - 클래스 확률 추정, CART 훈련 알고리즘, 계산 복잡도

결정 트리는 한 샘플이 특정 클래스 k에 속할 확률을 추정할 수도 있다. 먼저 이 샘플에 대해 리프 노드를 찾기 위해 트리를 탐색하고 그 노드에 있는 클래스 k의 훈련 샘플의 비율을 반환한다. tree_clf.predict_proba([[5,1.5]]) 사이킷런은 결정 트리를 훈련시키기 위해 CART 알고리즘을 사용한다. 먼저 훈련 세트를 하나의 특성 k의 임계값 tk를 사용해 두개의 서브셋으로 나눈다. 어떻게 k와 tk를 고를까? 크게이 따른 가중치가 적용된 가장 순수한 서브셋으로 나눌 수 있는 (k,tk) 짝을 찾는다. 이 알고리즘이 최소화해야 하는 비용함수는 다음 식과 같다.

16. 결정 트리 - 결정 트리 학습과 시각화, 예측

SVM처럼 결정 트리는 분류와 회귀 작업 그리고 다중출력 작업도 가능한 다재다능한 머신러닝 알고리즘이다. 또한 매우 복잡한 데이터셋도 학습할 수 있는 강력한 알고리즘이다. 결정 트리는 최근에 자주 사용되는 가장 강력한 머신러닝 알고리즘 중 하나인 랜덤 포레스트의 기본 구성 요소이기도 하다. 결정 트리를 이해하기 위해 모델 하나를 만들어서 어떻게 예측을 하는지 살펴보자. 다음은 붓꽃 데이터셋에 DecisionClassifier를 훈련시키는 코드이다. from sklearn.datasets import load_iris from sklearn.tree import DecisionTreeClassifier iris=load_iris() X=iris.data[:,2:] #꽃잎의 길이와 너비 y=iris.targ..

14. 서포트 벡터 머신 - SVM 회귀

SVM을 분류가 아니라 회귀에 적용하는 방법은 목표를 반대로 하는 것이다. 일정한 마진 오류 안에서 두 클래스 간의 도로 폭이 가능한 한 최대가 되도록 하는 대신, SVM 회귀는 제한된 마진 오류(즉, 도로 밖의 샘플) 안에서 도로 안에 가능한 한 많은 샘플이 들어가도록 학습한다. 도로의 폭은 하이퍼파라미터 e(입실론)으로 조절한다. 다음 그림은 무작위로 생성한 선형 데이터셋에 훈련시킨 두 개의 선형 SVM 회귀 모델을 보여준다. 하나는 마진을 크게(e=1.5)하고 다른 하나는 마진을 작게(e=0.5)하여 만들었다. 마진 안에서는 훈련 샘플이 추가되어도 모델의 예측에는 영향이 없다. 그래서 이 모델을 e에 민감하지 않다 라고 한다. 사이킷런의 LinearSVR을 사용해 선형 SVM 회귀를 적용해보겠다. ..

13. 서포트 벡터 머신 - 비선형 SVM 분류

선형 SVM 분류기가 효율적이고 많은 경우에 아주 잘 작동하지만, 선형적으로 분류할 수 없는 데이터셋이 많다. 비선형 데이터셋을 다루는 한 가지 방법은 다항 특성과 같은 특성을 더 추가하는 것이다. 이렇게 하면 선형적으로 구분되는 데이터셋이 만들어질 수 있다. 왼쪽 그래프는 하나의 특성 x1만을 가진 간단한 데이터셋을 나타낸다. 그림에서 볼 수 있듯이 이 데이터셋은 선형적으로 구분이 안 된다. 하지만 두 번째 특성 x2=(x1)^2을 추가하여 만들어진 2차원 데이터셋은 완벽하게 선형적으로 구분할 수 있다. from sklearn.datasets import make_moons from sklearn.pipeline import Pipeline from sklearn.preprocessing import ..