programming/Python

[파이썬/머신러닝] 선형 커널을 가진 SVM분류 모델을 만들고 시각화하는 예제

Jofresh 2024. 2. 4. 17:31
728x90
반응형
  1. 필요한 라이브러리 가져오기:
    • numpy: 수치 계산 라이브러리
    • pandas: 데이터 프레임 처리 라이브러리
    • seaborn: 데이터 시각화 라이브러리
    • sklearn.model_selection: 모델 선택 및 평가 관련 라이브러리
    • sklearn.svm: SVM 모델
    • sklearn.metrics: 모델 평가 지표
    • sklearn.preprocessing: 데이터 전처리
    • matplotlib.pyplot: 그래프 그리기 라이브러리
  2. 펭귄 데이터셋 로드:
    • sns.load_dataset("penguins")를 사용하여 seaborn 라이브러리에서 기본 제공하는 펭귄 데이터셋을 로드합니다.
  3. 데이터 전처리:
    • 결측치를 제거하고, LabelEncoder를 사용하여 'species' 열의 범주형 변수를 숫자로 인코딩합니다.
    • 인코딩 결과를 'species_encoded' 열에 저장합니다.
  4. 특성과 레이블 설정:
    • 'bill_length_mm', 'bill_depth_mm', 'flipper_length_mm', 'body_mass_g' 열을 특성으로 선택합니다.
    • 'species_encoded' 열을 레이블로 선택합니다.
  5. 데이터 분할:
    • train_test_split 함수를 사용하여 데이터를 훈련 데이터와 테스트 데이터로 나눕니다.
  6. SVM 모델 생성 및 학습:
    • 선형 커널을 사용하는 SVM 모델을 생성하고, 훈련 데이터를 사용하여 모델을 학습합니다.
  7. 테스트 데이터에 대한 예측:
    • 학습된 SVM 모델을 사용하여 테스트 데이터에 대한 예측을 수행합니다.
  8. 정확도 평가:
    • accuracy_score 함수를 사용하여 예측 결과의 정확도를 계산하고 출력합니다.
  9. 분류 보고서 출력:
    • classification_report 함수를 사용하여 분류 보고서를 출력합니다. 이 보고서에는 정밀도, 재현율, F1 점수 등의 분류 지표가 포함됩니다.
  10. 결정 경계 시각화:
    • 특성 'bill_length_mm'와 'flipper_length_mm'를 사용하여 SVM 모델의 결정 경계를 시각화합니다.
    • 먼저 산점도를 그린 다음, svm_model.decision_function을 사용하여 결정 경계를 계산하고 등고선을 그립니다.

코드

import numpy as np
import pandas as pd
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score, classification_report
from sklearn.preprocessing import LabelEncoder
import matplotlib.pyplot as plt

# 펭귄 데이터셋 로드
penguins = sns.load_dataset("penguins")

# 데이터 전처리
# - 결측치 제거
# - 범주형 변수(Label)을 숫자로 인코딩
penguins = penguins.dropna()
le = LabelEncoder()
penguins['species_encoded'] = le.fit_transform(penguins['species'])

# 특성과 레이블 설정
X = penguins[['bill_length_mm', 'bill_depth_mm', 'flipper_length_mm', 'body_mass_g']]
y = penguins['species_encoded']

# 데이터 분할 (훈련 데이터와 테스트 데이터)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# SVM 모델 생성 및 학습 (커널 함수를 선형으로 설정)
svm_model = SVC(kernel='linear', C=1)  # 커널을 선형으로 설정
svm_model.fit(X_train, y_train)

# 테스트 데이터에 대한 예측
y_pred = svm_model.predict(X_test)

# 정확도 평가
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.2f}")

# 분류 보고서 출력
print("Classification Report:\n", classification_report(y_test, y_pred))

# 결정 경계 시각화 (2개의 특성만 사용)
sns.scatterplot(x='bill_length_mm', y='flipper_length_mm', hue='species', data=penguins, palette='viridis')
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim()

# 결정 경계 그리기
xx, yy = np.meshgrid(np.linspace(X['bill_length_mm'].min(), X['bill_length_mm'].max(), 500),
                     np.linspace(X['flipper_length_mm'].min(), X['flipper_length_mm'].max(), 500))
Z = svm_model.decision_function(np.c_[xx.ravel(), yy.ravel(), np.zeros_like(xx.ravel()), np.zeros_like(xx.ravel())])

# 각 클래스에 대한 등고선을 채워서 시각화
for i in range(Z.shape[1]):
    plt.contourf(xx, yy, Z[:, i].reshape(xx.shape), levels=20, cmap='RdBu', alpha=0.6)

plt.scatter(X['bill_length_mm'], X['flipper_length_mm'], c=y, cmap='viridis', edgecolors='k', marker='o')
plt.title('SVM Decision Boundary (Linear Kernel)')
plt.xlabel('Bill Length (mm)')
plt.ylabel('Flipper Length (mm)')
plt.show()

 

반응형

 

 

코드 결과

 

산점도
정밀도, 정확도 모두 100%로 아주 정확한 모델링

 

728x90
반응형