Python에서 Support Vector Regression(SVR)의 힘을 활용하기: 종합 가이드
목차
- 소개
- Support Vector Regression(SVR)이란?
- 왜 SVR을 선택해야 하나요?
- 데이터셋 개요: 보험 데이터 분석
- 데이터 전처리
- SVR 모델 구축 및 학습
- 예측 및 모델 평가
- 결과 해석
- SVR 성능 향상
- 결론
- 추가 자료
- 자주 묻는 질문
소개
머신러닝의 광대한 영역에서, 회귀 모델은 연속적인 결과를 예측하는 데 중요한 역할을 합니다. 이러한 모델 중 Support Vector Regression (SVR)은 강력하지만 종종 활용되지 않는 도구로 두드러집니다. Support Vector Machines (SVMs)이 주로 분류 작업에 선호되는 반면, SVR은 회귀 문제를 해결하는 독특한 접근 방식을 제공합니다. 이 종합 가이드는 SVR의 복잡성, Python에서의 구현, 및 실제 시나리오에서의 성능, 특히 보험 데이터셋을 사용한 사례를 자세히 다룹니다.
Support Vector Regression(SVR)이란?
Support Vector Regression은 회귀 작업을 위해 맞춤화된 Support Vector Machine (SVM) 알고리즘의 확장입니다. 예측 값과 실제 값 사이의 오류를 최소화하려는 전통적인 회귀 모델과 달리, SVR은 epsilon-무감도 손실 함수에 중점을 둡니다. 이 접근 방식은 오류가 무시되는 허용 마진(epsilon)을 생성하여 이상값에 대해 더 견고한 모델을 만드는 것을 가능하게 합니다.
왜 SVR을 선택해야 하나요?
SVR은 회귀를 위한 견고한 도구이지만, 머신러닝 영역에서의 위치를 이해하는 것이 중요합니다:
- 강점:
- 고차원 공간에서 효과적입니다.
- 특히 데이터 포인트가 제한된 경우 오버피팅에 강합니다.
- 커널 함수를 사용하여 비선형 관계를 모델링할 수 있습니다.
- 약점:
- 계산 집약적이어서 대규모 데이터셋에는 적합하지 않을 수 있습니다.
- 하이퍼파라미터 튜닝이 복잡할 수 있습니다.
- 회귀 작업에서 종종 랜덤 포레스트(Random Forests)나 그래디언트 부스팅(Gradient Boosting)과 같은 앙상블 방법에 의해 성능이 더 우수합니다.
이러한 특성으로 인해 SVR은 그 강점을 충분히 활용할 수 있는 특정 시나리오에 가장 적합합니다.
데이터셋 개요: 보험 데이터 분석
SVR의 구현을 설명하기 위해 우리는 Kaggle의 보험 데이터셋을 사용할 것입니다. 이 데이터셋은 개인의 인구통계 및 건강 관련 속성에 대한 정보를 제공하며, 보험 비용을 예측하는 것을 목표로 합니다.
데이터셋 특징:
- age: 주 보험 수혜자의 나이.
- sex: 개인의 성별.
- bmi: 체질량 지수.
- children: 건강 보험에 가입된 자녀 수.
- smoker: 개인의 흡연 여부.
- region: 미국 내 거주 지역.
- charges: 건강 보험에서 청구한 의료 비용.
데이터 전처리
효과적인 데이터 전처리는 모든 머신러닝 모델의 성공에 필수적입니다. 여기서는 Python의 pandas
와 sklearn
라이브러리를 사용한 전처리 단계에 대한 단계별 분석을 제공합니다.
1. 라이브러리 임포트
1 2 3 4 5 |
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns sns.set() |
2. 데이터셋 로딩
1 2 3 |
# 보험 데이터셋 로드 data = pd.read_csv('S07_datasets_13720_18513_insurance.csv') print(data.head()) |
샘플 출력:
age | sex | bmi | children | smoker | region | charges |
---|---|---|---|---|---|---|
19 | female | 27.900 | 0 | yes | southwest | 16884.92400 |
18 | male | 33.770 | 1 | no | southeast | 1725.55230 |
28 | male | 33.000 | 3 | no | southeast | 4449.46200 |
33 | male | 22.705 | 0 | no | northwest | 21984.47061 |
32 | male | 28.880 | 0 | no | northwest | 3866.85520 |
3. 특징 및 타겟 변수 분리
1 2 |
X = data.iloc[:,:-1] # 특징 Y = data.iloc[:,-1] # 타겟 변수 (charges) |
4. 레이블 인코딩
범주형 변수는 숫자 형식으로 변환해야 합니다. ‘sex’와 ‘smoker’와 같은 이진 범주에는 레이블 인코딩을 사용합니다.
1 2 3 4 5 6 7 |
from sklearn import preprocessing le = preprocessing.LabelEncoder() # 'sex'와 'smoker' 열 인코딩 X['sex'] = le.fit_transform(X['sex']) X['smoker'] = le.fit_transform(X['smoker']) print(X.head()) |
샘플 출력:
age | sex | bmi | children | smoker | region |
---|---|---|---|---|---|
19 | 0 | 27.9 | 0 | 1 | southwest |
18 | 1 | 33.77 | 1 | 0 | southeast |
28 | 1 | 33.0 | 3 | 0 | southeast |
33 | 1 | 22.705 | 0 | 0 | northwest |
32 | 1 | 28.88 | 0 | 0 | northwest |
5. 원-핫 인코딩
두 개 이상의 카테고리를 가진 범주형 변수에는 원-핫 인코딩을 사용하는 것이 좋습니다. 여기서는 ‘region’ 열이 그러한 범주형 변수입니다.
1 2 3 4 5 6 7 |
from sklearn.preprocessing import OneHotEncoder from sklearn.compose import ColumnTransformer # 'region' 열에 원-핫 인코딩 적용 columnTransformer = ColumnTransformer([('encoder', OneHotEncoder(), [5])], remainder='passthrough') X = columnTransformer.fit_transform(X) print(X) |
샘플 출력:
1 2 3 4 5 6 7 |
[[0. 0. 0. ... 27.9 0. 1. ] [0. 0. 1. ... 33.77 1. 0. ] [0. 0. 1. ... 33. 3. 0. ] ... [0. 0. 1. ... 36.85 0. 0. ] [0. 0. 0. ... 25.8 0. 0. ] [0. 1. 0. ... 29.07 0. 1. ]] |
6. 데이터 분할
모델의 성능을 평가하기 위해 데이터셋을 학습용과 테스트용으로 나눕니다.
1 2 3 4 |
from sklearn.model_selection import train_test_split # 데이터 분할: 80% 학습용, 20% 테스트용 X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.20, random_state=1) |
SVR 모델 구축 및 학습
데이터 전처리가 완료되었으므로 이제 sklearn
을 사용하여 SVR 모델을 구축할 수 있습니다.
1. SVR 임포트
1 |
from sklearn.svm import SVR |
2. 모델 초기화 및 학습
1 2 3 4 5 |
# 기본 파라미터로 SVR 모델 초기화 model = SVR() # 학습 데이터로 모델 학습 model.fit(X_train, y_train) |
모델 출력:
1 |
SVR() |
예측 및 모델 평가
학습 후, 우리는 모델을 사용하여 테스트 세트에 대한 예측을 수행하고 R² 점수를 사용하여 성능을 평가합니다.
1. 예측
1 2 |
# 테스트 데이터에 대한 예측 y_pred = model.predict(X_test) |
2. 실제 값과 예측 값 비교
1 2 3 4 5 |
# 실제 청구 비용과 예측된 청구 비용을 비교하는 DataFrame 생성 comparison = pd.DataFrame() comparison['Actual'] = y_test comparison['Predicted'] = y_pred print(comparison.head()) |
샘플 출력:
Actual | Predicted |
---|---|
1646.43 | 9111.903501 |
11353.23 | 9307.009935 |
8798.59 | 9277.155786 |
10381.48 | 9265.538282 |
2103.08 | 9114.774006 |
3. 모델 평가
R² 점수는 모델의 예측이 실제 데이터와 얼마나 잘 일치하는지를 나타냅니다. R² 점수가 1에 가까울수록 적합도가 더 좋음을 의미합니다.
1 2 3 4 5 |
from sklearn.metrics import r2_score # R² 점수 계산 r2 = r2_score(y_test, y_pred) print(f'R² Score: {r2}') |
출력:
1 |
R² Score: -0.1157396589643176 |
결과 해석
-0.1157의 R² 점수는 주어진 데이터셋에서 SVR 모델의 성능이 저조함을 나타냅니다. 회귀 분석에서 음수의 R² 값은 모델이 수평선(즉, 타겟 변수의 평균)을 예측하는 것보다 데이터에 더 나쁘게 맞는다는 것을 의미합니다.
SVR이 성능이 좋지 않았던 이유
이 시나리오에서 SVR의 성능 저하에 기여할 수 있는 몇 가지 요인은 다음과 같습니다:
- 기본 하이퍼파라미터: SVR의 성능은 하이퍼파라미터(예: 커널 유형, C, epsilon)에 매우 민감합니다. 기본 설정을 사용하면 데이터의 기본 패턴을 효과적으로 포착하지 못할 수 있습니다.
- 데이터셋 크기: SVR은 특히 큰 데이터셋에서 계산 집약적일 수 있습니다. 1,338개의 레코드를 가진 보험 데이터셋은 SVR이 효과적으로 일반화하는 데 여전히 도전 과제를 제시할 수 있습니다.
- 특징 스케일링: SVR은 입력 특징이 적절하게 스케일링되기를 요구합니다. 특징 스케일링이 없으면 최적의 성능을 발휘하지 못할 수 있습니다.
- 비선형 관계: SVR은 커널 함수를 사용하여 비선형 관계를 처리할 수 있지만, 커널의 선택과 그 파라미터는 성능에 큰 영향을 미칩니다.
SVR 성능 향상
SVR 모델의 성능을 개선하기 위해 다음 단계를 고려하십시오:
1. 특징 스케일링:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
from sklearn.preprocessing import StandardScaler # 스케일러 초기화 sc_X = StandardScaler() sc_y = StandardScaler() # 학습 데이터에 적합 및 변환 X_train = sc_X.fit_transform(X_train) y_train = sc_y.fit_transform(y_train.values.reshape(-1, 1)).ravel() # 테스트 데이터 변환 X_test = sc_X.transform(X_test) y_test = sc_y.transform(y_test.values.reshape(-1, 1)).ravel() |
2. 하이퍼파라미터 튜닝:
그리드 서치와 교차 검증과 같은 기법을 사용하여 최적의 하이퍼파라미터를 찾습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
from sklearn.model_selection import GridSearchCV # 파라미터 그리드 정의 param_grid = { 'C': [0.1, 1, 10, 100], 'epsilon': [0.01, 0.1, 0.2, 0.5], 'kernel': ['linear', 'rbf', 'poly'] } # 그리드 서치 초기화 grid_search = GridSearchCV(SVR(), param_grid, cv=5, scoring='r2', n_jobs=-1) # 그리드 서치 학습 grid_search.fit(X_train, y_train) # 최적의 파라미터 print(grid_search.best_params_) |
3. 대체 모델:
관찰된 한계를 고려할 때, 랜덤 포레스트(Random Forests)나 XGBoost와 같은 다른 회귀 모델을 탐색하면 더 나은 결과를 얻을 수 있습니다.
결론
Support Vector Regression은 특히 이상값에 대한 견고함과 고차원 데이터를 처리해야 하는 시나리오에서 머신러닝 도구군에서 강력한 도구입니다. 그러나 그 효율성은 세심한 전처리와 하이퍼파라미터 튜닝에 달려 있습니다. 보험 데이터셋을 사용한 실제 응용 사례에서와 같이, SVR은 회귀 작업에서 종종 더 우수한 정확도를 제공하는 랜덤 포레스트(Random Forests)나 그래디언트 부스팅(Gradient Boosting)과 같은 앙상블 방법에 비해 성능이 떨어질 수 있습니다.
SVR을 활용하려는 실무자라면 다음을 반드시 수행해야 합니다:
- 특징을 적절하게 스케일링: 모든 특징이 모델에 동등하게 기여하도록 합니다.
- 하이퍼파라미터 최적화: 그리드 서치와 같은 기법을 사용하여 모델 설정을 미세 조정합니다.
- 대체 모델 평가: 때로는 다른 알고리즘이 당면한 작업에 본질적으로 더 적합할 수 있습니다.
SVR의 강점과 한계를 이해함으로써, 데이터 과학자들은 정보에 입각한 결정을 내릴 수 있으며, 특정 사용 사례에 가장 효과적인 회귀 모델을 배포할 수 있습니다.
추가 자료
자주 묻는 질문
1. 언제 다른 회귀 모델보다 Support Vector Regression을 사용해야 하나요?
SVR은 고차원 데이터셋을 다루거나 특징과 타겟 변수 간의 관계가 비선형인 경우에 특히 유용합니다. 또한, 데이터셋에 이상값이 포함되어 있을 때 SVR은 견고함을 제공하기 때문에 유리합니다.
2. SVR은 대규모 데이터셋을 효율적으로 처리할 수 있나요?
SVR은 대규모 데이터셋에서 계산 집약적일 수 있어 학습 시간이 길어질 수 있습니다. 큰 데이터셋의 경우, 랜덤 포레스트(Random Forests)나 그래디언트 부스팅(Gradient Boosting)과 같은 앙상블 방법이 더 효율적이고 더 나은 성능을 제공할 수 있습니다.
3. 커널 선택이 SVR 성능에 어떻게 영향을 미치나요?
커널 함수는 데이터를 고차원 공간으로 변환하여 모델이 비선형 관계를 포착할 수 있게 합니다. 일반적인 커널로는 선형(linear), 다항식(poly), 그리고 방사 기저 함수(rbf)가 있습니다. 커널의 선택과 그 파라미터(예: rbf의 gamma)는 SVR의 성능에 큰 영향을 미칩니다.
4. SVR에는 특징 스케일링이 필수인가요?
네, 특징 스케일링은 SVR에 매우 중요합니다. 스케일링이 없으면 큰 규모의 특징이 목적 함수에 지배적이 되어 최적의 성능을 발휘하지 못할 수 있습니다. 스케일링은 모든 특징이 모델에 동등하게 기여하도록 보장합니다.
5. 회귀 작업을 위한 SVR의 대안은 무엇이 있나요?
인기 있는 대안으로는 선형 회귀(Linear Regression), 결정 트리(Decision Trees), 랜덤 포레스트(Random Forests), 그래디언트 부스팅 머신(Gradient Boosting Machines, 예: XGBoost), 그리고 신경망(Neural Networks)이 있습니다. 각 모델은 고유한 강점을 가지며 다양한 유형의 회귀 문제에 적합합니다.