본문 바로가기
CS/MachineLearning

sklearn개발자가 쓴 교과서 - 파이썬 라이브러리를 활용한 머신러닝

by Diligejy 2022. 5. 16.

이 글은 책 증정 이벤트에 당첨되어 저자에게 책을 제공받아 작성하였습니다.

(그렇지만 늘 그래왔듯 책을 받은 것과 별개로 최대한 주관적인 관점을 담아 적습니다)

 

머신러닝이 유행하고 계속해서 책이 쏟아져나옵니다만, 가끔 보면 비싼 돈을 주고 구매했는데 번역이 이상하거나 책의 내용이 너무 기초적이거나 혹은 반대로 너무 알아듣기 어렵게 서술되어있는 경우를 봅니다. 물론 잘 하시는 분은 책을 볼 필요도 없이 구글링만으로 뚝딱뚝딱 좋은 작품을 만들어내겠지만, 이 분야를 잘 모르거나, 책을 보는 성향이 강한 저 같은 사람에게는 좋은 책만큼 소중한 학습도구도 없습니다.

 

그렇지만 좋은 책이 나오기란 굉장히 어렵습니다. 능력의 문제가 아닌 구조적인 문제 때문입니다. 더 적나라하게 말해 돈과 시간의 문제라는 겁니다. 

 

다른 소리가 길었지만 하고 싶은 얘기는 분명합니다. 지금 현재 구조에서는 좋은 번역서를 만들기 어렵다는 겁니다. 하지만 시장에는 항상 아웃라이어가 존재하고 박해선님은 아웃라이어에 해당합니다. 

 

물론 전업번역가라는 점이 아웃라이어로 발돋움하는데 큰 역할을 했지만, 이 분의 열의와 노력도 한 몫 합니다. 예를 들어 박해선님의 번역서를 보면 '번역은 제2의 창작'이라는 말이 절로 납득될 정도로 꼼꼼한 주석을 자랑합니다.

사실 책을 번역하는 것만으로도 힘든 일입니다. 이렇게 꼼꼼한 주석을 단다는 것은 더더욱 어려운 일이죠. 그럼에도 이 책에는 엄청난 주석들이 담겨 있고 이를 통해 원저자가 담지 못한 내용까지 풍부하게 알 수 있습니다.

 

물론 이런 걸 다 알아야만 머신러닝을 할 수 있는 건 아닙니다. sklearn과 같은 라이브러리가 생긴 목적도 모든 걸 다 알지 않더라도 간단하게 구현하고 실험해볼 수 있도록 하는 것인만큼, 주석에 나온 모든 지식을 알아야 한다는 압박은 느끼지 않아도 괜찮습니다. 하지만, 단순 구현을 넘어 '원리'를 이해해보고 싶은 때가 가끔 찾아올 때 꼼꼼한 주석은 구글링을 하더라도 어떤 키워드로 구글링을 해야할지 조금 더 시간을 아껴주고 때로는 구글링이 필요없이 상세한 해설만 참고해도 되는 혜택을 제공합니다.

 

이렇게 칭찬했지만, 책 자체에 아쉬운 점이 없는 건 아닙니다. 이 책의 장점은 매우 교과서적이라는 점입니다. 반대로 교과서적이기 때문에 약간 딱딱한 면이 없지 않습니다. 말랑말랑한 책을 좋아하신다면 약간은 아쉬움이 남을 수도 있습니다. 그렇지만 sklearn 개발자의 책이라는 점에서 매우 중요한 책이고 이런 중요한 책이 좋은 번역자에 의해 꼼꼼히 제대로 번역되었다는 건 머신러닝 생태계 발전에 있어 중요하다고 생각합니다.

 

말랑말랑한 책으로 입문하신 뒤에 교과서를 보고 싶으시다면 추천드립니다.

 

 

밑줄긋기

 

 

p.31

sklearn에서 Numpy 배열은 기본 데이터 구조입니다. sklearn은 Numpy배열 형태의 데이터를 입력으로 받습니다. 그래서 우리가 사용할 데이터는 모두 Numpy배열로 변환되어야 합니다. Numpy의 핵심 기능은 다차원 배열인 ndarray 클래스입니다. 이 배열의 모든 원소는 동일한 데이터 타입이어야 합니다.

 

p.32

scikit-learn은 알고리즘을 구현할 때 SciPy의 여러 함수를 사용합니다. 그중에서 가장 중요한 기능은 scipy.sparse입니다. 이 모듈은 scikit-learn에서 데이터를 표현하는 또 다른 방법인 희소 행렬 기능을 사용합니다. 희소행렬(sparse matrix)은 0을 많이 포함한 2차원 배열을 저장할 때 사용합니다.

 

p.33

SciPy 희소행렬에 대한 자세한 내용 

https://scipy-lectures.org/advanced/scipy_sparse/index.html 

 

2.5. Sparse Matrices in SciPy — Scipy lecture notes

 

scipy-lectures.org

p.45

시각화는 데이터를 조사하는 아주 좋은 방법입니다. 산점도(scatter plot)가 그 중 하나입니다. 산점도는 데이터에서 한 특성을 x축에 놓고 다른 하나는 y축에 놓아 각 데이터 포인트를 하나의 점으로 나타내는 그래프입니다. 아쉽게도 컴퓨터 화면은 2차원이라 한 번에 2개(혹은 3개)의 특성만 그릴 수 있습니다. 따라서 이 그래프로는 3개 이상의 특성을 표현하기 어렵습니다. 대신 모든 특성을 짝지어 만드는 산점도 행렬(Scatter Matrix)을 사용할 수 있습니다. 4개의 특성을 가진 붓꽃의 경우처럼 특성의 수가 적다면 꽤 괜찮은 방법입니다. 하지만 잊지 말아야 할 것은, 산점도 행렬은 한 그래프에 모든 특성의 관계가 나타나는 것이 아니기 때문에 각각의 나누어진 산점도 그래프에는 드러나지 않는 중요한 성질이 있을 수 있습니다.

 

p.47

KNN에서 k는 가장 가까운 이웃 '하나'가 아니라 훈련 데이터에서 새로운 데이터 포인트에 가장 가까운 'k개'의 이웃을 찾는다는 뜻입니다 (예를 들면 가장 가까운 세 개 혹은 다섯 개의 이웃)

 

p.67

KNN

 

이웃의 수를 늘릴수록 결정 경계는 더 부드러워집니다. 부드러운 경계는 더 단순한 모델을 의미합니다. 다시 말해 이웃을 적게 사용하면 모델의 복잡도가 높아지고 많이 사용하면 복잡도는 낮아집니다. 훈련 데이터 전체 개수를 이웃의 수로 지정하는 극단적인 경우에는 모든 테스트 포인트가 같은 이웃을 가지게 되므로 테스트 포인트에 대한 예측은 모두 같은 값이 됩니다. 즉 훈련 세트에서 가장 많은 데이터 포인트를 가진 클래스가 예측값이 됩니다.

 

p.73

일반적으로 KNeighbors 분류기에 중요한 매개변수는 두 개입니다. 데이터 포인트 사이의 거리를 재는 방법과 이웃의 수입니다. 실제로 이웃의 수는 3개나 5개로 적을 때 잘 작동하지만, 이 매개변수는 잘 조정해야 합니다. 거리 재는 방법을 고르는 문제는 이 책에서 다루지 않습니다만, 기본적으로 여러 환경에서 잘 동작하는 유클리디안 거리 방식을 사용합니다.

 

KNN의 장점은 이해하기 매우 쉬운 모델이고 많이 조정하지 않아도 자주 좋은 성능을 발휘한다는 점입니다. 더 복잡한 알고리즘을 적용해보기 전에 시도해볼 수 있는 좋은 시작점입니다. 보통 최근접 이웃 모델은 매우 빠르게 만들 수 있지만, 훈련 세트가 매우 크면 (특성의 수나 샘플의 수가 클 경우) 예측이 느려집니다. KNN 알고리즘을 사용할 땐 데이터를 전처리하는 과정이 중요합니다. 그리고 (수백 개 이상의) 많은 특성을 가진 데이터셋에는 잘 동작하지 않으며, 특성 값 대부분이 0인 (즉 희소한) 데이터셋과는 특히 잘 작동하지 않습니다.

 

KNN이 이해하긴 쉽지만 예측이 느리고 많은 특성을 처리하는 능력이 부족해 현업에서는 잘 쓰지 않습니다.

 

p.75

회귀를 위한 선형 모델은 특성이 하나일 땐 직선, 두 개일 땐 평면이 되며, 더 높은 차원(특성이 더 많음)에서는 초평면(hyperplane)이 되는 회귀 모델의 특징을 가지고 있습니다.

 

이 직선과 KNeighborsRegressor를 사용하여 만든 선과 비교해보면 직선을 사용한 예측이 더 제약이 많아 보입니다. 즉 데이터의 상세 정보를 모두 잃어버린 것처럼 보입니다. 어느 정도는 사실입니다. 타깃 y가 특성들의 선형 조합이라는 것은 매우 과한 (때론 비현실적인) 가정입니다. 하지만 1차원 데이터만 놓고 봐서 생긴 편견일 수 있습니다. 특성이 많은 데이터셋이라면 선형 모델은 매우 훌륭한 성능을 낼 수 있습니다. 특히 훈련 데이터보다 특성이 더 많은 경우엔 어떤 타깃 y도 완벽하게 (훈련 세트에 대해서) 선형 함수로 모델링할 수 있습니다.

 

p.76

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

 

p.77

coef_와 intercept_ 뒤의 밑줄이 이상하게 보일지 모르겠습니다. scikit-learn은 훈련 데이터에서 유도된 속성은 항상 끝에 밑줄을 붙입니다. 그 이유는 사용자가 지정한 매개변수와 구분하기 위해서입니다.

 

p.78

훈련 데이터와 테스트 데이터 사이의 이런 성능 차이는 모델이 과대적합되었다는 확실한 신호이므로 복잡도를 제어할 수 있는 모델을 사용해야 합니다.

기본 선형 회귀 방식 대신 가장 널리 쓰이는 모델은 리지 회귀입니다.

 

p.78

리지

 

Ridge도 회귀를 위한 선형 모델이므로 최소적합법에서 사용한 것과 같은 예측 함수를 사용합니다. 하지만 리지 회귀에서의 가중치(w) 선택은 훈련 데이터를 잘 예측하기 위해서 뿐만 아니라 추가 제약 조건을 만족시키기 위한 목적도 있습니다. 가중치의 절댓값을 가능한 한 작게 만드는 것입니다. 다시 말해서 w의 모든 원소가 0에 가깝게 되길 원합니다. 직관적으로 생각하면 이는 모든 특성이 출력에 주는 영향을 최소한으로 만듭니다 (기울기를 작게 만듭니다). 이런 제약을 규제(Regularization)라고 합니다. 규제란 과대적합이 되지 않도록 모델을 강제로 제한한다는 의미입니다. 리지 회귀에 사용하는 규제 방식을 L2 규제라고 합니다.

 

p.79

Ridge는 모델을 단순하게 (계수를 0에 가깝게) 해주고 훈련 세트에 대한 성능 사이를 절충할 수 있는 방법을 제공합니다. 사용자는 alpha 매개변수로 훈련 세트의 성능 대비 모델을 얼마나 단순화할지를 지정할 수 있습니다. 앞의 예제에서는 매개변수의 기본값인 alpha=1.0을 사용했습니다. 하지만 이 값이 최적이라고 생각할 이유는 없습니다. 최적의 alpha 값은 사용하는 데이터셋에 달렸습니다. alpha값을 높이면 계수를 0에 더 가깝게 만들어서 훈련 세트의 성능은 나빠지지만 일반화에는 도움을 줄 수 있습니다.

 

p.82

아래 그래프에서 흥미로운 점

- 데이터를 충분히 주면 규제 항은 덜 중요해져서 리지 회귀와 선형 회귀의 성능이 같아짐
- 선형 회귀의 훈련 데이터 성능이 감소한다는 것. (데이터가 많아질수록 모델이 데이터를 기억하거나 과대적합하기 어려워지기 때문)

p.83

 

라쏘

 

선형 회귀에 규제를 적용하는 데 Ridge의 대안으로 Lasso가 있습니다. 리지 회귀에서와 같이 Lasso도 계수를 0에 가깝게 만들려고 합니다. 하지만 방식이 조금 다르며 이를 L1 규제라고 합니다. L1 규제의 결과로 라소를 사용할 때 어떤 계수는 정말 0이 됩니다. 이 말은 모델에서 완전히 제외되는 특성이 생긴다는 뜻입니다. 어떻게 보면 특성 선택(Feature Selection)이 자동으로 이뤄진다고 볼 수 있습니다. 일부 계수를 0으로 만들면 모델을 이해하기 쉬워지고 이 모델의 가장 중요한 특성이 무엇인지 드러내줍니다.

 

p.83~84

Ridge와 마찬가지로 Lasso도 계수를 얼마나 강하게 0으로 보낼지를 조절하는 alpha 매개변수를 지원합니다. 앞에서는 기본값인 alpha=1.0을 사용했습니다. 과소적합을 줄이기 위해서 alpha 값을 줄여보겠습니다. 이렇게 하려면 max_iter(반복 실행하는 최대 횟수)의 기본값을 늘려야 합니다.

 

옮긴이 주석

Lasso는 L1, L2 규제를 함께 쓰는 엘라스틱넷(Elastic-Net)방식에서 L2 규제가 빠진 것입니다. Lasso의 alpha 매개변수는 R의 엘라스틱넷 패키지인 glmnet의 lambda 매개변수와 같은 의미입니다. 이들은 한 특성씩 좌표축을 따라 최적화하는 좌표 하강법(coordinate descent) 방식을 사용하며 학습 과정이 반복적으로 여러 번 진행되면서 최적의 값을 찾아가게 됩니다. alpha값을 줄이게 되면 가장 낮은 오차를 찾아가는 이 반복 횟수가 늘어나게 됩니다. 모델이 반복한 횟수는 Lasso 객체의 n_iter_ 속성에 저장됩니다.

 

p.86

실제로 이 두 모델 중 보통은 리지 회귀를 선호합니다. 하지만 특성이 많고 그중 일부분만 중요하다면 Lasso가 더 좋은 선택일 수 있습니다. 또한 분석하기 쉬운 모델을 원한다면 Lasso가 입력 특성 중 일부만 사용하므로 쉽게 해석할 수 있는 모델을 만들어줄 것입니다. scikit-learn은 Lasso와 Ridge의 패널티를 결합한 ElasticNet도 제공합니다. 실제로 이 조합은 최상의 성능을 내지만 L1 규제와 L2규제를 위한 매개변수 두 개를 조정해야 합니다.

 

p.86

QuantileRegressor

 

사이킷런 1.0 버전에서 하나의 예측값이 아니라 예측의 백분위 간격을 구하는 데 사용할 수 있는 QuantileRegressor 클래스가 추가되었습니다. quantile 매개변수에 예측하려는 매개변수를 0~1 사이로 지정합니다. 기본값은 0.5로 중간값을 예측합니다. 라소 모델과 비슷하게 alpha 매개변수로 L1규제를 조정합니다. alpha 매개변수의 기본값은 1.0이고 커질수록 규제가 강해져 과소적합된 모델을 만듭니다.

 

p.90

회귀에서 본 Ridge와 마찬가지로 이 두 모델은 기본적으로 L2 규제를 사용합니다.

 

LogisticRegression과 LinearSVC에서 규제의 강도를 결정하는 매개변수는 C입니다. C의 값이 높아지면 규제가 감소합니다. 다시 말해 매개변수로 높은 C값을 지정하면 LogisticRegression과 LinearSVC는 훈련 세트에 가능한 최대로 맞추려 하고, 반면에 C 값을 낮추면 모델은 계수 벡터(w)가 0에 가까워지도록 만듭니다. 

 

매개변수 C의 작동 방식을 다르게 설명할 수도 있습니다. 알고리즘은 C의 값이 낮아지면 데이터 포인트 중 다수에 맞추려고 하는 반면, C의 값을 높이면 개개의 데이터 포인트를 정확히 분류하려고 노력할 것입니다.

 

p.91

회귀와 비슷하게 분류에서의 선형 모델은 낮은 차원의 데이터에서는 결정 경계가 직선이거나 평면이어서 매우 제한적인 것처럼 보입니다. 하지만 고차원에서는 분류에 대한 선형 모델이 매우 강력해지며 특성이 많아지면 과대적되지 않도록 하는 것이 매우 중요해집니다.

 

p.95~96

LinearSVC는 loss 매개변수에 사용할 손실 함수를 지정합니다. 기본값은 제곱 힌지 손실인 'squared_hinge'입니다. 제곱 힌지 손실 함수는 penalty 매개변수에 'l1'과 'l2'를 지정할 수 있습니다. 다른 손실 함수로는 힌지 손실인 'hinge'를 지정할 수 있습니다. 이 때는 penalty 매개변수에 'l2'만 사용할 수 있습니다.

 

LogisticRegression은 penalty 매개변수에 L1과 L2 규제를 의미하는 'l1', 'l2' 그리고 L1, L2 규제를 모두 사용하는 'elasticnet', 마지막으로 규제를 사용하지 않으려면 'none'으로 지정할 수 있습니다. 사용할 알고리즘을 지정하는 solver 매개변수를 'saga'로 지정하면 모든 패널티를 지정할 수 있습니다. solver 매개변수를 'liblinear'로 지정하면 'l1', 'l2'를 지정할 수 있습니다. 그 외 'newton-cg', 'lbfgs', 'sag'는 'l2'와 'none'만 지원합니다.

 

LogisticRegression과 LinearSVC는 scikit-learn 0.20 버전부터 verbose 매개변수와 상관없이 알고리즘이 max_iter 반복 안에 수렴하지 않을 경우 반복 횟수를 증가하라는 경고를 출력합니다. LogisticRegression의 max_iter 기본값은 100이고, LinearSVC의 max_iter 기본값은 1,000입니다. LogisticRegression의 solver가 'sag', 'saga', 'liblinear'일 때나 LinearSVC는 기본적으로 훈련하기 전에 데이터를 섞습니다. 훈련 결과를 동일하게 재현해야 한다면 random_state 매개변수를 사용하세요.

 

p.100

선형 모델의 주요 매개변수는 회귀 모델에서는 alpha였고 LinearSVC와 LogisticRegression에서는 C입니다. alpha 값이 클수록, C값이 작을수록 모델이 단순해집니다. 특별히 회귀 모델에서 이 매개변수를 조정하는 일이 매우 중요합니다. 보통 C와 alpha는 로그 스케일로 최적치를 정합니다. 그리고 L1규제를 사용할지 L2규제를 사용할지를 정해야 합니다. 중요한 특성이 많지 않다고 생각하면 L1규제를 사용합니다. 그렇지 않으면 기본적으로 L2 규제를 사용해야 합니다. L1 규제는 모델의 해석이 중요한 요소일 때도 사용할 수 있습니다. L1 규제는 몇 가지 특성만 사용하므로 해당 모델에 중요한 특성이 무엇이고 그 효과가 어느 정도인지 설명하기 쉽습니다.

선형 모델은 학습 속도가 빠르고 예측도 빠릅니다. 매우 큰 데이터셋과 희소한 데이터셋에도 잘 작동합니다. 수십만에서 수백만 개의 샘플로 이뤄진 대용량 데이터셋이라면 기본 설정보다 빨리 처리하도록 LogisticRegression과 Ridge에 solver='sag'옵션을 줍니다. 다른 대안으로는 여기서 설명한 선형 모델의 대용량 처리 버전으로 구현된 SGDClassifier와 SGDRegressor를 사용할 수 있습니다.

선형 모델의 또 다른 장점은 앞서 회귀와 분류에서 본 공식을 사용해 예측이 어떻게 만들어지는지 비교적 쉽게 이해할 수 있다는 것입니다. 하지만 계수의 값들이 왜 그런지 명확하지 않을 때가 종종 있습니다. 특히 데이터셋의 특성들이 서로 깊게 연관되어 있을 때 그렇습니다. 그리고 이럴 땐 계수를 분석하기가 매우 어려울 수 있습니다.

선형 모델은 샘플에 비해 특성이 많을 때 잘 작동합니다. 다른 모델로 학습하기 어려운 매우 큰 데이터셋에도 선형 모델을 많이 사용합니다. 그러나 저차원의 데이터셋에서는 다른 모델들의 일반화 성능이 더 좋습니다. 

 

p.104

Naive Bayes는 선형 모델과 매우 유사합니다. LogisticRegression이나 LinearSVC 같은 선형 분류기보다 훈련 속도가 빠른 편이지만, 그 대신 일반화 성능이 조금 뒤집니다.

 

나이브 베이즈 분류기가 효과적인 이유는 각 특성을 개별로 취급해 파라미터를 학습하고 각 특성에서 클래스별 통계를 단순하게 취합하기 때문입니다. scikit-learn에 구현된 나이브 베이즈 분류기는 GaussianNB, BernoulliNB, MultinomialNB 이렇게 세 가지입니다. GaussianNB는 연속적인 어떤 데이터에도 적용할 수 있고 BernoulliNB는 이진 데이터를, MultinomialNB는 카운트 데이터(특성이 어떤 것을 헤아린 정수 카운트로, 예를 들면 문장에 나타난 단어의 횟수입니다)에 적용됩니다. BernoulliNB, MultinomialNB는 대부분 텍스트 데이터를 분류할 때 사용합니다.

 

p.105

다른 두 나이브 베이즈 모델 MultinomialNB와 GaussianNB는 계산하는 통계 데이터의 종류가 조금 다릅니다. MultinomialNB는 클래스별로 특성의 평균을 계산하고 GaussianNB는 클래스별로 각 특성의 분산과 평균을 저장합니다.

 

예측할 땐 데이터 포인트를 클래스의 통계 값과 비교해서 가장 잘 맞는 클래스를 예측값으로 합니다. MultinomialNB와 BernoulliNB의 예측 공식은 선형 모델과 형태가 같습니다. 그러나 나이브 베이즈 모델의 coef_는 기울기 w가 아니라서 선형 모델과는 의미가 다릅니다.

 

p.105~106

MultinomialNB와 BernoulliNB는 모델의 복잡도를 조절하는 alpha 매개변수 하나를 가지고 있습니다. alpha가 주어지면 알고리즘이 모든 특성에 양의 값을 가진 가상의 데이터 포인트를 alpha 개수만큼 추가합니다. 이는 통계 데이터를 완만하게 만들어줍니다. alpha가 크면 더 완만해지고 모델의 복잡도는 낮아집니다. alpha에 따른 알고리즘 성능 변동은 비교적 크지 않아서, alpha 값이 성능 향상에 크게 기여하지 않습니다. 그러나 이 값을 조정하면 어느 정도는 정확도를 높일 수 있습니다.

 

GaussianNB는 대부분 매우 고차원인 데이터셋에 사용하고, 다른 두 나이브 베이즈 모델은 텍스트 같은 희소한 데이터를 카운트하는 데 사용합니다. MultinomialNB는 보통 0이 아닌 특성이 비교적 많은 데이터셋(예를 들어 큰 문서들)에서 BernoulliNB보다 성능이 높습니다.

 

나이브 베이즈 모델과 선형 모델의 장단점은 비슷합니다. 훈련과 예측 속도가 빠르며 훈련 과정을 이해하기 쉽습니다. 희소한 고차원 데이터에서 잘 작동하며 비교적 매개변수에 민감하지 않습니다. 선형 모델로는 학습 시간이 너무 오래 걸리는 매우 큰 데이터셋에는 나이브 베이즈 모델을 시도해볼 만하며 종종 사용됩니다.

 

p.110~111

일반적으로 트리 만들기를 모든 리프 노드가 순수 노드가 될 때까지 진행하면 모델이 매우 복잡해지고 훈련 데이터에 과대적합됩니다. 순수 노드로 이루어진 트리는 훈련 세트에 100% 정확하게 맞는다는 의미입니다. 즉 훈련 세트의 모든 데이터 포인트는 정확한 클래스의 리프 노드에 있습니다. 

 

과대적합을 막는 전략은 크게 두 가지입니다.

 

트리 생성을 일찍 중단하는 전략(사전 가지치기 pre-pruning)과 트리를 만든 후 데이터 포인트가 적은 노드를 삭제하거나 병합하는 전략입니다(사후 가지치기 post-pruning 또는 그냥 가지치기 pruning). 사전 가지치기 방법은 트리의 최대 깊이나 리프의 최대 개수를 제한하거나, 또한 노드가 분할하기 위한 포인트의 최소 개수를 지정하는 것입니다.

 

scikit-learn에서 결정 트리는 DecisionTreeRegressor와 DecisionTreeClassifier에 구현되어 있습니다. scikit-learn은 사전 가지치기만 지원합니다.

 

p.114~116

 

Decision Tree Feature Importance

전체 트리를 살펴보는 건 어려우므로 트리가 어떻게 작동하는지 요약하는 속성 사용

- 0이면 전혀 사용되지 않았다는 뜻
- 1이면 완벽하게 타깃 클래스를 예측했다는 뜻.
- Feature Importances의 전체 합은 1
- 어떤 특성의 feature_importances_ 값이 낮다고 해서 이 특성이 유용하지 않다는 뜻은 아니고 단지 트리가 그 특성을 선택하지 않았을 뿐이며 다른 특성이 동일한 정보를 지니고 있어서일 수 있음
- 선형 모델의 계수와는 달리, 특성 중요도는 항상 양수이며 특성이 어떤 클래스를 지지하는지는 알 수 없음. (양성 악성 모름)

 

p.117

회귀를 위한 트리 기반의 모델을 사용할 때 짚고 넘어가야 할 특별한 속성이 하나 있습니다. DecisionTreeRegressor(그리고 모든 다른 트리 기반 회귀 모델)는 외삽(extrapolation), 즉 훈련 데이터의 범위 밖의 포인트에 대해 예측을 할 수 없습니다.

 

p.120

선형 모델은 우리가 아는 대로 직선으로 데이터를 근사하였습니다. 이 직선은 훈련 데이터와 테스트 데이터가 있는 미세한 굴곡을 매끈하게 근사하여 테스트 데이터를 꽤 정확히 예측합니다. 반면에 트리 모델은 훈련 데이터를 완벽하게 예측합니다. 트리의 복잡도에 제한을 두지 않아서 전체 데이터셋을 모두 기억하기 때문입니다. 그러나 모델이 가진 데이터 범위 밖으로 나가면 단순히 마지막 포인트를 이용해 예측하는 게 전부입니다. 트리 모델은 훈련 데이터 밖의 새로운 데이터를 예측할 능력이 없습니다. 이는 모든 트리 기반 모델의 공통된 단점입니다.

 

p.120

 

트리 모델 장단점과 매개변수

 

결정 트리에서 모델 복잡도를 조절하는 매개변수는 트리가 완전히 만들어지기 전에 멈추게 하는 사전 가지치기 매개변수입니다. 보통은 사전 가지치기 방법 중 max_depth, max_leaf_nodes 또는 min_samples_leaf 중 하나만 지정해도 과대적합을 막는 데 충분합니다.

 

결정 트리가 이전에 소개한 다른 알고리즘들보다 나은 점은 두 가지입니다.

 

첫째, 만들어진 모델을 쉽게 시각화할 수 있어서 비전문가도 이해하기 쉽습니다(비교적 작은 트리일 때) 그리고 데이터의 스케일에 구애받지 않습니다. 각 특성이 개별적으로 처리되어 데이터를 분할하는 데 데이터의 스케일의 영향을 받지 않으므로 결정 트리에서는 특성의 정규화나 표준화 같은 전처리 과정이 필요 없습니다. 특히 특성의 스케일이 서로 다르거나 이진 특성과 연속적인 특성이 혼합되어 있을 때도 잘 작동합니다.

 

결정 트리의 주요 단점은 사전 가지치기를 사용함에도 불구하고 과대적합되는 경향이 있어 일반화 성능이 좋지 않다는 것입니다. 그래서 앙상블 방법을 단일 결정 트리의 대안으로 흔히 사용합니다.

 

p.121

앙상블(ensemble)은 여러 머신러닝 모델을 연결하여 더 강력한 모델을 만드는 기법입니다. 머신러닝에는 이런 종류의 모델이 많지만, 그중 두 앙상블 모델이 분류와 회귀 문제의 다양한 데이터셋에서 효과적이라고 입증되었습니다. 랜덤 포레스트(random forest)와 그레이디언트 부스팅(gradient boosting) 결정 트리는 둘 다 모델을 구성하는 기본 요소로 결정 트리를 사용합니다.

 

p.122

결정 트리의 주요 단점은 훈련 데이터에 과대적합되는 경향이 있다는 것입니다. 랜덤 포레스트는 이 문제를 회피할 수 있는 방법입니다. 랜덤 포레스트는 기본적으로 조금씩 다른 여러 결정 트리의 묶음입니다. 랜덤 포레스트의 아이디어는 각 트리는 비교적 예측을 잘 할 수 있지만 데이터의 일부에 과대적합하는 경향을 가진다는 데 기초합니다. 예컨대 잘 작동하되 서로 다른 방향으로 과대적합된 트리를 많이 만들면 그 결과를 평균냄으로써 과대적합된 양을 줄일 수 있습니다. 이렇게 하면 트리 모델의 예측 성능이 유지되면서 과대적합이 줄어드는 것이 수학적으로 증명되었습니다.

 

이런 전략을 구현하려면 결정 트리를 많이 만들어야 합니다. 각각의 트리는 타깃 예측을 잘 해야 하고 다른 트리와는 구별되어야 합니다. 랜덤 포레스트는 이름에서 알 수 있듯이 트리들이 달라지도록 트리 생성 시 무작위성을 주입합니다. 랜덤 포레스트에서 트리를 랜덤하게 만드는 방법은 두 가지입니다. 트리를 만들 때 사용하는 데이터 포인트를 무작위로 선택하는 방법과 분할 테스트에서 특성을 무작위로 선택하는 방법입니다. 

'CS > MachineLearning' 카테고리의 다른 글

전체 아키텍처  (0) 2022.05.30
추천 시스템  (0) 2022.05.18
머신러닝 실무 프로젝트  (0) 2022.05.14
머신러닝 시스템 디자인 패턴  (0) 2022.05.10
ML System Design  (0) 2022.05.10

댓글