티스토리 뷰
로지스틱 회귀는 선형 회귀 방식을 분류에 적용한 알고리즘입니다. 즉, 로지스틱 회귀는 분류 알고리즘입니다. 로지스틱 회귀가 선형 회귀와 다른 점은, 학습을 통해 선형 함수의 회귀 최적선을 찾는 것이 아니라 시그모이드(Sigmoid) 함수 최적선을 찾고, 시그모이드 함수의 반환 값을 확률로 간주하여 분류를 결정한다는 것입니다.
가령, 종양의 크기에 따라 악성 종양인지(1), 그렇지 않은지(0)를 회귀를 통해 1과 0의 값으로 예측한다고 해봅시다. 종양의 크기를 X축에, 악성 종양의 여부를 Y축에 나타낸다고 하면 데이터의 분포는 위와 같을 것입니다. 이를 단순 선형 회귀 모델로 예측한다면, 왼쪽 그림과 같을 것입니다. 하지만 이를 S자 커브 형태를 가지는 시그모이드 함수로 예측한다면 단순 선형 회귀 모델보다 좀 더 정확하게 0과 1을 분류하는 것을 볼 수 있습니다. 로지스틱 회귀는 이처럼 선형 회귀 방식을 기반으로 하되 시그모이드 함수로 분류를 수행하는 회귀입니다.
사이킷런은 로지스틱 회귀를 위해서 LogisticRegression 클래스를 제공합니다. 해당 클래스의 회귀 계수를 최적화하는 방법은 경사 하강법을 포함한 여러가지가 있습니다. LogisticRegression 클래스의 solver 파라미터의 'lbfgs', 'liblinear', 'newton-cg', 'sag', 'saga' 값을 적용해서 최적화를 선택할 수 있습니다
solver 간의 성능 차이는 미비하며, 일반적으로 lbfgs 또는 liblinear를 선택합니다. 작은 데이터 세트에서는 liblinear가 좀 더 효과적으로 동작한다는 사이킷런 문서의 설명이 있지만, 이를 일반화하긴 어렵습니다. 하지만 본 책의 전반에 걸친 실습에서 liblinear가 lbfgs 방식보다 좀 더 빠르며 수행 성능도 약간 나은 결과를 보이고 있습니다.
사이킷런의 LogisticRegression 클래스를 이용하여 위스콘신 유방암 데이터 세트를 학습하고 예측해봅시다. 선형 회귀 계열의 로지스틱 회귀는 데이터의 정규 분포도에 따라 예측 성능에 영향을 받으므로, 먼저 데이터를 표준화합시다.
로지스틱 회귀 객체를 생성한 뒤 데이터를 학습하고 정확도와 ROC-AUC값을 구했습니다. LogisticRegression 클래스는 별도의 solver를 지정해주지 않으면 자동으로 lbgfgs solver를 사용합니다.
서로 다른 solver를 이용하여 LogisticRegression을 학습하고 성능을 평가해봅시다. 특정 solver는 최적화에 상대적으로 많은 반복 횟수를 필요로 할 수 있으므로, max_iter를 600으로 설정한 뒤 학습을 수행합시다. 이는 최적화 알고리즘이 수렴할 때까지 최대 600번까지 반복하여 회귀 계수를 최적화한다는 뜻입니다.
결과적으로 각 solver 간에 유의미한 성능 차이는 없음이 확인되었습니다. 데이터 세트가 워낙 작은 것도 성능 차이가 거의 없는 이유 중 하나일 것으로 예상됩니다.
LogisticRegression 클래스의 주요 파라미터는 Solver, max_iter 외에 penalty와 C가 있습니다. penalty는 규제의 유형을 설정하여, 'l2'로 설정시 L2 규제를, 'l1'으로 설정시 L1 규제를 뜻합니다. 기본은 'l2'입니다. C는 규제 강도를 조정하는 alpha 값의 역수입니다. 즉, C = 1/alpha이므로 C 값이 작을수록 규제 강도가 큽니다.
L1, L2 규제의 경우 solver 설정에 영향을 받습니다. Liblinear, saga의 경우 L1, L2 규제와 함께 쓰일 수 있지만 lbfgs, newton-cg, sag의 경우 L2 규제만 함께 사용할 수 있습니다.
GridSearchCV() 메서드를 이용해 위스콘신 데이터 세트에 대해 solver, penalty, C를 최적화해보았습니다.
로지스틱 회귀는 가볍고 빠르지만, 이진 분류 예측 성능이 매우 뛰어납니다. 이 때문에 로지스틱 회귀를 이진 분류의 기본 모델로 사용하는 경우가 많습니다. 또한 로지스틱 회귀는 희소한 데이터 세트 분류에도 뛰어난 성능을 보여서 텍스트 분류에도 자주 사용됩니다.
이제 회귀 트리에 대해 알아봅시다. 회귀 트리는 분류에서 언급했던 분류 트리와 크게 다르지 않습니다. 다만 리프 노드에서 예측 결정 값을 만드는 과정에 차이가 있습니다. 분류 트리가 특정 클래스 레이블을 결정하는 것과 달리, 회귀 트리는 리프 노드에 속한 데이터 값의 평균값을 구해 회귀 예측값을 계산합니다.
간단한 데이터 세트를 이용해 회귀 트리의 동작 방식을 살펴봅시다. 피처와 결정값이 단 하나인 데이터를 가정하겠습니다. 이 데이트 세트의 피처를 결정 트리를 기반으로 분할하면 피처의 균일도를 반영한 지니 계수에 따라 위은 방식으로 분할될 것입니다.
리프 노드 생성 기준에 부합하는 트리 분할이 완료됐다면, 리프 노드에 소속된 데이터 값의 평균값을 구해서 최종적으로 리프 노드의 결정 값으로 할당합니다.
결정 트리, 랜덤 포레스트, GBM, XGBoost, LightGBM 등의 모든 트리 기반 알고리즘은 분류 뿐만 아니라 회귀에도 사용가능합니다. 트리 생성이 CART(Classification And Regression Trees) 알고리즘에 기반하고 있기 때문입니다.
사이킷런의 랜덤 포레스트 회귀 트리인 RandomForestRegressor 클래스를 이용해 보스턴 주택 가격 예측을 수행해봅시다.
결정 트리, GBM, XGBoost, LightGBM의 Regressor 모두에 대해 보스턴 주택 가격 예측을 수행하기 위해 입력 모델과 데이터 세트를 받아 교차 검증을 수행하는 메서드를 정의했습니다.
회귀트리 Regressor 클래스는 선형 회귀와 다른 처리 방식으로 학습을 수행하므로 회귀 계수를 제공하는 속성을 가지지 않습니다. 대신 feature_importances_ 속성을 이용해 피처별 중요도를 확인할 수 있습니다.
사이킷런 회귀 트리 Regressor의 하이퍼 파라미터는 분류 트리 Classifier의 하이퍼 파라미터와 거의 동일하므로 추가적인 설명은 하지 않습니다.
이번에는 회귀 트리가 어떻게 예측값을 판단하는지를 선형 회귀 모델과 비교하는 시각화를 해보겠습니다. 결정 트리의 하이퍼 파라미터인 max_depth의 값을 변화시키면서 어떻게 회귀 트리 예측선이 변화하는지 살펴보겠습니다.
보스턴 주택 데이터 세트를 다시 한 번 이용합니다. 2차 원 평면상에서 회귀 예측선을 쉽게 표현하기 위해 피처를 단 1개만 추출합시다. 주택 가격과 가장 밀접한 양의 상관관계를 가지는 "RM" 피처만 가지고 선형 회귀와 결정 트리 회귀로 주택 가격을 예측하는 회귀선을 만들어봅시다.
데이터를 총 100개만 샘플링하여 X축을 "RM", Y축을 "PRICE"로 지정하여 시각화했습니다.
100개의 학습 데이터에 대해 LinearRegression와 max_depth가 각각 2, 7인 DecisionTreeRegressor를 학습시킵니다. 학습된 Regressor에대해 RM값을 4.5 ~ 8.5까지 100개의 균일한 데이터를 샘플링한 테스트 데이터를 제공합시다.
각 회귀 모델에게 테스트 데이터를 예측하도록 한 뒤, 얻은 결과를 시각화해봅시다.
단순 선형 회귀 모델은 직선으로 예측 회귀선을 표현하는 데 반해, 회귀 트리의 경우 분할되는 데이터 지점에 따라 브랜치를 만들면서 계단 형태의 회귀선을 만들었습니다. max_depth가 7인 DecisionTreeRegressor의 경우 학습 데이터의 이상치까지 피팅하게 되면서 복잡한 계단 형태의 회귀선이 생성되면서 과적합에 취약한 모델이 되었음을 알 수 있습니다.
'파이썬 머신러닝 완벽 가이드' 카테고리의 다른 글
파이썬 머신러닝 완벽 가이드 : 캐글 주택 가격 예측 (고급 회귀 기법) (1) | 2023.05.13 |
---|---|
파이썬 머신러닝 완벽 가이드 : 자전거 대여 수요 예측 회귀 실습 (1) | 2023.05.13 |
파이썬 머신러닝 완벽 가이드 : 선형 회귀 모델을 위한 데이터 전처리 (0) | 2023.05.12 |
파이썬 머신러닝 완벽 가이드 : 규제 선형 모델 - 릿지, 라쏘, 엘라스팃넷 (0) | 2023.05.12 |
파이썬 머신러닝 완벽 가이드 : 다항 회귀와 과적합/과소적합 이해 (0) | 2023.05.11 |