html
Python에서 서포트 벡터 머신(SVM) 구현: 종합 가이드
Python의 scikit-learn 라이브러리를 사용하여 서포트 벡터 머신(SVM)을 구현하는 심층 가이드에 오신 것을 환영합니다. 데이터 과학 애호가이든 숙련된 전문가이든 관계없이, 이 글은 SVM의 기본 개념을 이해하는 것부터 Jupyter Notebook을 사용한 완벽한 구현까지 전체 과정을 안내할 것입니다. 시작해보겠습니다!
목차
1. 서포트 벡터 머신(SVM) 소개
서포트 벡터 머신(SVM)은 분류 및 회귀 작업에 사용되는 강력한 지도 학습 모델입니다. 고차원 공간에서 특히 효과적이며, 다양한 커널 함수를 사용함으로써 다용도로 활용할 수 있습니다. SVM은 다른 클래스의 데이터 포인트를 최대 마진으로 최적의 초평면으로 분리하는 것을 목표로 합니다.
SVM의 주요 특징:
- 마진 최적화: SVM은 클래스 간의 마진을 최대화하여 더 나은 일반화를 보장합니다.
- 커널 트릭: 데이터를 고차원으로 변환하여 비선형 분류에서도 우수한 성능을 발휘할 수 있도록 합니다.
- 강건성: 분명한 분리 마진이 있는 경우 및 고차원 공간에서도 효과적입니다.
2. 환경 설정
시작하기 전에 필요한 라이브러리가 설치되어 있는지 확인하세요. pip
을 사용하여 설치할 수 있습니다:
1
pip install pandas numpy scikit-learn seaborn matplotlib mlxtend
참고: mlxtend
는 결정 영역을 시각화하는 데 사용됩니다.
3. 데이터 탐색 및 전처리
데이터 전처리는 모든 머신 러닝 파이프라인에서 중요한 단계입니다. 데이터 정리, 결측값 처리, 범주형 변수 인코딩 및 관련 특징 선택을 포함합니다.
3.1 결측 데이터 처리
결측 데이터는 머신 러닝 모델의 성능에 부정적인 영향을 미칠 수 있습니다. 우리는 결측값을 다음과 같이 처리할 것입니다:
- 수치형 특징: 평균값으로 결측값 대체.
- 범주형 특징: 최빈값으로 결측값 대체.
1234567891011121314151617181920
import pandas as pdimport numpy as npfrom sklearn.impute import SimpleImputer # 데이터셋 로드data = pd.read_csv('weatherAUS.csv') # 특징과 타겟 분리X = data.iloc[:, :-1]y = data.iloc[:, -1] # 수치형 결측값 처리numeric_cols = X.select_dtypes(include=['int64', 'float64']).columnsimputer_numeric = SimpleImputer(strategy='mean')X[numeric_cols] = imputer_numeric.fit_transform(X[numeric_cols]) # 범주형 결측값 처리categorical_cols = X.select_dtypes(include=['object']).columnsimputer_categorical = SimpleImputer(strategy='most_frequent')X[categorical_cols] = imputer_categorical.fit_transform(X[categorical_cols])
3.2 범주형 변수 인코딩
머신 러닝 모델은 수치형 입력을 요구합니다. 우리는 다음을 사용하여 범주형 변수를 변환할 것입니다:
- 레이블 인코딩: 이진 또는 고카디널리티 카테고리에 사용.
- 원-핫 인코딩: 고유 값의 수가 제한된 카테고리에 사용.
123456789101112131415161718192021222324252627
from sklearn.preprocessing import LabelEncoder, OneHotEncoderfrom sklearn.compose import ColumnTransformer # 레이블 인코딩 함수def label_encode(series): le = LabelEncoder() return le.fit_transform(series) # 타겟 변수에 레이블 인코딩 적용y = label_encode(y) # 인코딩할 열 식별def encoding_selection(X, threshold=10): string_cols = X.select_dtypes(include=['object']).columns one_hot_cols = [col for col in string_cols if X[col].nunique() <= threshold] label_encode_cols = [col for col in string_cols if X[col].nunique() > threshold] # 레이블 인코딩 for col in label_encode_cols: X[col] = label_encode(X[col]) # 원-핫 인코딩 ct = ColumnTransformer(transformers=[('encoder', OneHotEncoder(), one_hot_cols)], remainder='passthrough') X = ct.fit_transform(X) return X X = encoding_selection(X)
3.3 특징 선택
관련 특징을 선택하면 모델 성능을 향상시키고 계산 복잡성을 줄일 수 있습니다. 우리는 카이 제곱 통계를 사용한 SelectKBest를 사용할 것입니다.
12345678910
from sklearn.feature_selection import SelectKBest, chi2from sklearn.preprocessing import MinMaxScaler # 특징 스케일링scaler = MinMaxScaler()X_scaled = scaler.fit_transform(X) # 상위 2개 특징 선택selector = SelectKBest(score_func=chi2, k=2)X_selected = selector.fit_transform(X_scaled, y)
4. 데이터셋 분할
훈련 세트와 테스트 세트로 데이터셋을 분할하여 보지 않은 데이터에 대한 모델의 성능을 평가할 것입니다.
123
from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X_selected, y, test_size=0.20, random_state=1)
5. 특징 스케일링
특징 스케일링은 모든 특징이 모델의 성능에 동일하게 기여하도록 합니다.
1234567
from sklearn.preprocessing import StandardScaler scaler = StandardScaler(with_mean=False)scaler.fit(X_train) X_train = scaler.transform(X_train)X_test = scaler.transform(X_test)
6. 모델 구축 및 평가
성능을 비교하기 위해 네 가지 다른 모델을 구축할 것입니다:
- K-최근접 이웃(KNN)
- 로지스틱 회귀
- 가우시안 나이브 베이즈
- 서포트 벡터 머신(SVM)
6.1 K-최근접 이웃(KNN)
12345678
from sklearn.neighbors import KNeighborsClassifierfrom sklearn.metrics import accuracy_score knn = KNeighborsClassifier(n_neighbors=3)knn.fit(X_train, y_train)y_pred_knn = knn.predict(X_test)accuracy_knn = accuracy_score(y_pred_knn, y_test)print(f'KNN Accuracy: {accuracy_knn:.4f}')
출력:
1
KNN Accuracy: 0.8003
6.2 로지스틱 회귀
1234567
from sklearn.linear_model import LogisticRegression log_reg = LogisticRegression(random_state=0, max_iter=200)log_reg.fit(X_train, y_train)y_pred_lr = log_reg.predict(X_test)accuracy_lr = accuracy_score(y_pred_lr, y_test)print(f'Logistic Regression Accuracy: {accuracy_lr:.4f}')
출력:
1
Logistic Regression Accuracy: 0.8297
6.3 가우시안 나이브 베이즈
1234567
from sklearn.naive_bayes import GaussianNB gnb = GaussianNB()gnb.fit(X_train, y_train)y_pred_gnb = gnb.predict(X_test)accuracy_gnb = accuracy_score(y_pred_gnb, y_test)print(f'Gaussian Naive Bayes Accuracy: {accuracy_gnb:.4f}')
출력:
1
Gaussian Naive Bayes Accuracy: 0.7960
6.4 서포트 벡터 머신(SVM)
1234567
from sklearn.svm import SVC svc = SVC()svc.fit(X_train, y_train)y_pred_svc = svc.predict(X_test)accuracy_svc = accuracy_score(y_pred_svc, y_test)print(f'SVM Accuracy: {accuracy_svc:.4f}')
출력:
1
SVM Accuracy: 0.8282
모델 정확도 요약:
모델
정확도
KNN
80.03%
로지스틱 회귀
82.97%
가우시안 나이브 베이즈
79.60%
SVM
82.82%
평가된 모델 중에서, 로지스틱 회귀가 SVM을 약간 앞서며, SVM 자체도 그 뒤를 이어 근소한 차이로 뒤따릅니다.
7. 결정 영역 시각화
결정 경계를 시각화하면 다양한 모델이 데이터를 어떻게 분류하는지 이해하는 데 도움이 됩니다.
12345678910111213141516171819202122232425262728293031323334
from mlxtend.plotting import plot_decision_regionsimport matplotlib.pyplot as pltfrom sklearn import datasets # 시각화를 위한 아이리스 데이터셋 로드iris = datasets.load_iris()X_vis = iris.data[:, :2]y_vis = iris.target # 모델 초기화knn_vis = KNeighborsClassifier(n_neighbors=3)log_reg_vis = LogisticRegression(random_state=0, max_iter=200)gnb_vis = GaussianNB()svc_vis = SVC() # 모델 학습knn_vis.fit(X_vis, y_vis)log_reg_vis.fit(X_vis, y_vis)gnb_vis.fit(X_vis, y_vis)svc_vis.fit(X_vis, y_vis) # 시각화 함수def visualize_decision_regions(X, y, model, title): plot_decision_regions(X, y, clf=model, legend=2) plt.title(title) plt.xlabel('Feature 1') plt.ylabel('Feature 2') plt.show() # 각 모델의 결정 영역 그리기visualize_decision_regions(X_vis, y_vis, knn_vis, 'K-최근접 이웃 결정 영역')visualize_decision_regions(X_vis, y_vis, log_reg_vis, '로지스틱 회귀 결정 영역')visualize_decision_regions(X_vis, y_vis, gnb_vis, '가우시안 나이브 베이즈 결정 영역')visualize_decision_regions(X_vis, y_vis, svc_vis, 'SVM 결정 영역')
시각화:
각 모델의 결정 경계는 별도의 플롯으로 표시되어, 특징 공간에서 각 모델이 서로 다른 영역을 어떻게 분류하는지 보여줍니다.
8. 결론
이 가이드에서는 Python의 scikit-learn 라이브러리를 사용하여 서포트 벡터 머신(SVM)을 구현하는 방법을 살펴보았습니다. 데이터 전처리부터 다양한 모델 구축 및 평가, SVM 포함, 전형적인 머신 러닝 파이프라인의 필수 단계를 다루었습니다. 또한, 결정 영역을 시각화하여 다양한 알고리즘이 분류 작업을 수행하는 방식을 보다 깊이 이해할 수 있었습니다.
주요 요점:
- 데이터 전처리: 모델링을 위한 데이터 정리 및 준비에 필수적입니다.
- 특징 선택 및 스케일링: 모델 성능과 효율성을 향상시킵니다.
- 모델 비교: 여러 알고리즘을 평가하여 데이터셋에 가장 적합한 성능을 발휘하는 모델을 선택합니다.
- 시각화: 모델의 동작 및 의사 결정 과정을 이해하는 강력한 도구입니다.
이러한 종합적인 접근 방식을 따르면 SVM 및 다른 분류 알고리즘을 효과적으로 구현하여 실제 문제를 해결할 수 있습니다.
9. 참고문헌
읽어주셔서 감사합니다! 질문이나 피드백이 있으시면 아래에 댓글을 남겨주세요.