기술나눔

[머신러닝] 머신러닝에서의 서포트 벡터 머신 활용 및 주성분 분석

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

SVM(지원 벡터 머신)은 선형 및 비선형 분류, 회귀, 이상치 감지에 적합한 강력하고 다양한 기계 학습 모델입니다. 이 기사에서는 지원 벡터 머신 알고리즘과 scikit-learn의 구현을 소개하고 scikit-learn의 주성분 분석 및 적용을 간략하게 살펴봅니다.

1. 서포트 벡터 머신 개요

SVM(Support Vector Machine)은 기계 학습 분야에서 널리 사용되는 알고리즘으로, 적은 컴퓨팅 리소스로 상당한 정확성을 제공한다는 특성으로 인해 선호됩니다. SVM은 분류 및 회귀 작업 모두에 사용할 수 있지만 분류 문제에 가장 널리 사용됩니다.

서포트 벡터 머신이란 무엇입니까?

서포트 벡터 머신의 목표는 다음과 같습니다. 네.엔.N 차원 공간 ( 네.엔.N 특징의 개수) 데이터 포인트를 명확하게 구분할 수 있는 초평면을 찾습니다. 이 초평면을 사용하면 다양한 범주의 데이터 포인트를 분리하고 초평면에서 최대한 멀리 떨어져 분류의 견고성을 보장할 수 있습니다.

여기에 이미지 설명을 삽입하세요.

데이터 포인트를 효과적으로 분리하기 위해 여러 개의 초평면이 존재할 수 있습니다. 우리의 목표는 최대 마진, 즉 두 클래스 사이의 최대 거리를 가진 초평면을 선택하는 것입니다. 마진을 최대화하면 분류 정확도를 높이는 데 도움이 됩니다.

초평면 및 서포트 벡터

여기에 이미지 설명을 삽입하세요.

초평면은 데이터 포인트를 나누는 결정 경계입니다. 초평면의 양쪽에 위치한 데이터 포인트는 서로 다른 범주로 분류될 수 있습니다. 초평면의 차원은 특징의 수에 따라 달라집니다. 입력 특징이 2이면 초평면은 직선이고, 특징이 3이면 초평면은 2차원 평면입니다. 특징 개수가 3개를 초과하면 초평면을 직관적으로 이해하기 어려워집니다.

여기에 이미지 설명을 삽입하세요.

서포트 벡터는 초평면에 가장 가까운 점을 나타내며 초평면의 위치와 방향에 영향을 미칩니다. 이러한 서포트 벡터를 사용하면 분류기의 마진을 최대화할 수 있습니다. 서포트 벡터를 제거하면 초평면의 위치가 변경되므로 SVM을 구축하는 데 중요합니다.

큰 마진 직관

로지스틱 회귀에서는 시그모이드 함수를 사용하여 선형 함수의 출력 값을 [0,1] 범위로 압축하고 임계값(0.5)을 기준으로 레이블을 할당합니다. SVM에서는 선형 함수의 출력 값을 사용하여 분류를 결정합니다. 출력이 1보다 크면 한 클래스에 속하고, 출력이 -1이면 다른 클래스에 속합니다. SVM은 출력값의 임계값을 1과 -1로 설정하여 한계 범위 [-1,1]을 형성합니다.

2. 데이터 전처리 및 시각화

서포트 벡터 머신을 사용하여 양성 및 악성 암 진단을 예측합니다.

데이터 세트에 대한 기본 정보

  • 기능 수는 30개입니다. 예를 들면 다음과 같습니다.
    • 반경(중심에서 주변 지점까지의 평균 거리)
    • 질감(회색조 값의 표준 편차)
    • 둘레
    • 영역
    • 매끄러움(반지름 길이의 국지적 변화)
    • 컴팩트함(둘레^2 / 면적 - 1.0)
    • 오목함(윤곽선의 움푹 들어간 부분의 심각도)
    • 딤플(윤곽의 오목한 부분의 수)
    • 대칭
    • 프랙탈 차원("해안선 근사" - 1)
  • 데이터 세트에는 569개의 샘플이 포함되어 있으며 클래스 분포는 212개의 악성 샘플과 357개의 양성 샘플입니다.
  • 대상 카테고리:
    • 악의 있는
    • 온화한

필요한 라이브러리 가져오기

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

%matplotlib inline
sns.set_style('whitegrid')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

데이터세트 로드

from sklearn.datasets import load_breast_cancer

cancer = load_breast_cancer()

# 创建 DataFrame
col_names = list(cancer.feature_names)
col_names.append('target')
df = pd.DataFrame(np.c_[cancer.data, cancer.target], columns=col_names)
df.head()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

데이터 개요

df.info()print(cancer.target_names)
# ['malignant', 'benign']

# 数据描述:
df.describe()
# 统计摘要:
df.info()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

데이터 시각화

특징 쌍의 산점도 행렬
sns.pairplot(df, hue='target', vars=[
    'mean radius', 'mean texture', 'mean perimeter', 'mean area',
    'mean smoothness', 'mean compactness', 'mean concavity',
    'mean concave points', 'mean symmetry', 'mean fractal dimension'
])
  • 1
  • 2
  • 3
  • 4
  • 5
카테고리 분포 막대 차트
sns.countplot(x=df['target'], label="Count")
  • 1

여기에 이미지 설명을 삽입하세요.

평균 면적 대 평균 매끄러움의 산점도
plt.figure(figsize=(10, 8))
sns.scatterplot(x='mean area', y='mean smoothness', hue='target', data=df)
  • 1
  • 2

여기에 이미지 설명을 삽입하세요.

변수 간 ​​상관 관계의 히트맵
plt.figure(figsize=(20,10))
sns.heatmap(df.corr(), annot=True)
  • 1
  • 2

여기에 이미지 설명을 삽입하세요.

3. 모델 훈련(문제 해결)

기계 학습에서 모델 훈련은 문제에 대한 해결책을 찾는 데 중요한 단계입니다.아래에서는 사용법을 소개하겠습니다.scikit-learn 모델 훈련을 수행하고 다양한 커널에서 SVM(지원 벡터 머신)의 성능을 시연합니다.

데이터 준비 및 전처리

먼저 데이터를 준비하고 전처리해야 합니다. 다음은 데이터 전처리에 대한 코드 예시입니다.

from sklearn.model_selection import cross_val_score, train_test_split
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler, MinMaxScaler

X = df.drop('target', axis=1)
y = df.target

print(f"'X' shape: {X.shape}")
print(f"'y' shape: {y.shape}")
# 'X' shape: (569, 30)
# 'y' shape: (569,)

pipeline = Pipeline([
    ('min_max_scaler', MinMaxScaler()),
    ('std_scaler', StandardScaler())
])

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

우리가 사용하는 코드에서는 MinMaxScaler 그리고StandardScaler 데이터를 확장합니다. 데이터는 훈련 세트와 테스트 세트로 나누어지며, 데이터의 30%가 테스트에 사용됩니다.

모델 성능 평가

모델의 성능을 평가하기 위해 다음을 정의합니다. print_score 훈련 및 테스트 결과의 정확도, 분류 보고서, 혼동 행렬을 출력할 수 있는 함수:

from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
import pandas as pd

def print_score(clf, X_train, y_train, X_test, y_test, train=True):
    if train:
        pred = clf.predict(X_train)
        clf_report = pd.DataFrame(classification_report(y_train, pred, output_dict=True))
        print("Train Result:n================================================")
        print(f"Accuracy Score: {accuracy_score(y_train, pred) * 100:.2f}%")
        print("_______________________________________________")
        print(f"CLASSIFICATION REPORT:n{clf_report}")
        print("_______________________________________________")
        print(f"Confusion Matrix: n {confusion_matrix(y_train, pred)}n")
    else:
        pred = clf.predict(X_test)
        clf_report = pd.DataFrame(classification_report(y_test, pred, output_dict=True))
        print("Test Result:n================================================")        
        print(f"Accuracy Score: {accuracy_score(y_test, pred) * 100:.2f}%")
        print("_______________________________________________")
        print(f"CLASSIFICATION REPORT:n{clf_report}")
        print("_______________________________________________")
        print(f"Confusion Matrix: n {confusion_matrix(y_test, pred)}n")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

지원 벡터 머신(SVM)

SVM(지원 벡터 머신)은 성능이 하이퍼파라미터의 영향을 받는 강력한 분류 알고리즘입니다. 다음은 SVM의 주요 매개변수와 이것이 모델 성능에 미치는 영향을 소개합니다.

  • C 매개변수 : 훈련 포인트를 올바르게 분류하는 것과 원활한 결정 경계를 갖는 것 사이의 균형을 제어합니다.더 작은 참조(느슨함)은 오분류 비용(페널티)을 낮추고(소프트 마진) 더 크게 만듭니다. 참조(엄격)은 잘못된 분류에 더 큰 비용을 발생시키며(하드 마진) 모델이 입력 데이터를 더 엄격하게 해석하도록 합니다.
  • 감마 매개변수 : 단일 훈련 세트의 영향 범위를 제어합니다.더 큰 감마(γ)γ 영향 범위를 더 가깝게 만듭니다(데이터 포인트가 가까울수록 가중치가 더 높음). 감마(γ)γ 도달 범위를 더 넓게 만듭니다(더 넓은 솔루션).
  • 학위 매개변수: 다항식 커널 함수('poly' ), 다른 커널에서는 무시됩니다. 그리드 검색을 통해 최적의 하이퍼파라미터 값을 찾을 수 있습니다.

선형 커널 SVM

선형 커널 SVM은 대부분의 상황, 특히 데이터 세트에 많은 기능이 있는 경우에 적합합니다. 다음은 선형 커널 SVM을 사용하는 코드 예제입니다.

from sklearn.svm import LinearSVC

model = LinearSVC(loss='hinge', dual=True)
model.fit(X_train, y_train)

print_score(model, X_train, y_train, X_test, y_test, train=True)
print_score(model, X_train, y_train, X_test, y_test, train=False)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

훈련 및 테스트 결과는 다음과 같습니다.

훈련 결과:

Accuracy Score: 86.18%
_______________________________________________
CLASSIFICATION REPORT:
                  0.0         1.0  accuracy   macro avg  weighted avg
precision    1.000000    0.819079  0.861809    0.909539      0.886811
recall       0.630872    1.000000  0.861809    0.815436      0.861809
f1-score     0.773663    0.900542  0.861809    0.837103      0.853042
support    149.000000  249.000000  0.861809  398.000000    398.000000
_______________________________________________
Confusion Matrix: 
 [[ 94  55]
 [  0 249]]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

시험 결과:

Accuracy Score: 89.47%
_______________________________________________
CLASSIFICATION REPORT:
                 0.0         1.0  accuracy   macro avg  weighted avg
precision   1.000000    0.857143  0.894737    0.928571      0.909774
recall      0.714286    1.000000  0.894737    0.857143      0.894737
f1-score    0.833333    0.923077  0.894737    0.878205      0.890013
support    63.000000  108.000000  0.894737  171.000000    171.000000
_______________________________________________
Confusion Matrix: 
 [[ 45  18]
 [  0 108]]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

다항식 커널 SVM

다항식 커널 SVM은 비선형 데이터에 적합합니다. 다음은 2차 다항식 커널을 사용하는 코드 예제입니다.

from sklearn.svm import SVC

model = SVC(kernel='poly', degree=2, gamma='auto', coef0=1, C=5)
model.fit(X_train, y_train)

print_score(model, X_train, y_train, X_test, y_test, train=True)
print_score(model, X_train, y_train, X_test, y_test, train=False)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

훈련 및 테스트 결과는 다음과 같습니다.

훈련 결과:

Accuracy Score: 96.98%
_______________________________________________
CLASSIFICATION REPORT:
                  0.0         1.0  accuracy   macro avg  weighted avg
precision    0.985816    0.961089  0.969849    0.973453      0.970346
recall       0.932886    0.991968  0.969849    0.962427      0.969849
f1-score     0.958621    0.976285  0.969849    0.967453      0.969672
support    149.000000  249.000000  0.969849  398.000000    398.000000
_______________________________________________
Confusion Matrix: 
 [[139  10]
 [  2 247]]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

시험 결과:

Accuracy Score: 97.08%
_______________________________________________
CLASSIFICATION REPORT:
                 0.0         1.0  accuracy   macro avg  weighted avg
precision   0.967742    0.972477   0.97076    0.970109      0.970733
recall      0.952381    0.981481   0.97076    0.966931      0.970760
f1-score    0.960000    0.976959   0.97076    0.968479      0.970711
support    63.000000  108.000000   0.97076  171.000000    171.000000
_______________________________________________
Confusion Matrix: 
 [[ 60   3]
 [  2 106]]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

RBF(방사형 기반 함수) 커널 SVM

RBF(방사형 기초 함수) 커널은 비선형 데이터 처리에 적합합니다. 다음은 RBF 코어를 사용하는 코드 예제입니다.

model = SVC(kernel='rbf', gamma=0.5, C=0.1)
model.fit(X_train, y_train)

print_score(model, X_train, y_train, X_test, y_test, train=True)
print_score(model, X_train, y_train, X_test, y_test, train=False)
  • 1
  • 2
  • 3
  • 4
  • 5

훈련 및 테스트 결과는 다음과 같습니다.

훈련 결과:

Accuracy Score: 62.56%
_______________________________________________
CLASSIFICATION REPORT:
             0.0         1.0  accuracy   macro avg  weighted avg
precision    0.0    0.625628  0.625628    0.312814      0.392314
recall       0.0    1.000000  0.625628    0.500000      0.625628
f1-score     0.0    0.769231  0.625628    0.384615      0.615385
support    149.0  249.0    0.625628  398.0        398.0
_______________________________________________
Confusion Matrix: 
 [[  0 149]
 [  0 249]]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

시험 결과:

Accuracy Score: 64.97%
_______________________________________________
CLASSIFICATION REPORT:
             0.0         1.0  accuracy   macro avg  weighted avg
precision    0.0    0.655172  0.649661    0.327586      0.409551
recall       0.0    1.000000  0.649661    0.500000      0.649661
f1-score     0.0    0.792453  0.649661    0.396226      0.628252
support    63.0  108.0    0.649661  171.0        171.0
_______________________________________________
Confusion Matrix: 
 [[  0  63]
 [  0 108]]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

요약하다

위의 모델 훈련 및 평가 프로세스를 통해 다양한 SVM 커널의 성능 차이를 관찰할 수 있습니다. 선형 커널 SVM은 정확도와 훈련 시간 측면에서 우수한 성능을 발휘하며 데이터 차원이 더 높은 상황에 적합합니다. 다항식 커널 SVM 및 RBF 커널 SVM은 비선형 데이터에서 더 나은 성능을 제공하지만 특정 매개변수 설정에서 과적합이 발생할 수 있습니다. 모델 성능을 향상하려면 적절한 커널과 하이퍼파라미터를 선택하는 것이 중요합니다.

4. SVM 데이터 준비

디지털 입력 : SVM은 입력 데이터가 숫자라고 가정합니다. 입력 데이터가 범주형 변수인 경우 이진 더미 변수(범주당 하나의 변수)로 변환해야 할 수도 있습니다.

이진 분류 :기본 SVM은 이진 분류 문제에 적합합니다. SVM은 주로 이진 분류에 사용되지만 회귀 및 다중 클래스 분류를 위한 확장 버전도 있습니다.

X_train = pipeline.fit_transform(X_train)
X_test = pipeline.transform(X_test)
  • 1
  • 2

모델 훈련 및 평가

다음은 다양한 SVM 커널의 훈련 및 테스트 결과를 보여줍니다.

선형 커널 SVM

print("=======================Linear Kernel SVM==========================")
model = SVC(kernel='linear')
model.fit(X_train, y_train)

print_score(model, X_train, y_train, X_test, y_test, train=True)
print_score(model, X_train, y_train, X_test, y_test, train=False)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

훈련 결과:

Accuracy Score: 98.99%
_______________________________________________
CLASSIFICATION REPORT:
                  0.0         1.0  accuracy   macro avg  weighted avg
precision    1.000000    0.984190   0.98995    0.992095      0.990109
recall       0.973154    1.000000   0.98995    0.986577      0.989950
f1-score     0.986395    0.992032   0.98995    0.989213      0.989921
support    149.000000  249.000000   0.98995  398.000000    398.000000
_______________________________________________
Confusion Matrix: 
 [[145   4]
 [  0 249]]

测试结果

Accuracy Score: 97.66%
_______________________________________________
CLASSIFICATION REPORT:
                 0.0         1.0  accuracy   macro avg  weighted avg
precision   0.968254    0.981481  0.976608    0.974868      0.976608
recall      0.968254    0.981481  0.976608    0.974868      0.976608
f1-score    0.968254    0.981481  0.976608    0.974868      0.976608
support    63.000000  108.000000  0.976608  171.000000    171.000000
_______________________________________________
Confusion Matrix: 
 [[ 61   2]
 [  2 106]]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
다항식 커널 SVM
print("=======================Polynomial Kernel SVM==========================")
from sklearn.svm import SVC

model = SVC(kernel='poly', degree=2, gamma='auto')
model.fit(X_train, y_train)

print_score(model, X_train, y_train, X_test, y_test, train=True)
print_score(model, X_train, y_train, X_test, y_test, train=False)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

훈련 결과:

Accuracy Score: 85.18%
_______________________________________________
CLASSIFICATION REPORT:
                  0.0         1.0  accuracy   macro avg  weighted avg
precision    0.978723    0.812500  0.851759    0.895612      0.874729
recall       0.617450    0.991968  0.851759    0.804709      0.851759
f1-score     0.757202    0.893309  0.851759    0.825255      0.842354
support    149.000000  249.000000  0.851759  398.000000    398.000000
_______________________________________________
Confusion Matrix: 
 [[ 92  57]
 [  2 247]]

测试结果:

Accuracy Score: 82.46%
_______________________________________________
CLASSIFICATION REPORT:
                 0.0         1.0  accuracy   macro avg  weighted avg
precision   0.923077    0.795455  0.824561    0.859266      0.842473
recall      0.571429    0.972222  0.824561    0.771825      0.824561
f1-score    0.705882    0.875000  0.824561    0.790441      0.812693
support    63.000000  108.000000  0.824561  171.000000    171.000000
_______________________________________________
Confusion Matrix: 
 [[ 36  27]
 [  3 105]]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
방사형 기반 함수 커널 SVM
print("=======================Radial Kernel SVM==========================")
from sklearn.svm import SVC

model = SVC(kernel='rbf', gamma=1)
model.fit(X_train, y_train)

print_score(model, X_train, y_train, X_test, y_test, train=True)
print_score(model, X_train, y_train, X_test, y_test, train=False)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

훈련 결과:

Accuracy Score: 100.00%
_______________________________________________
CLASSIFICATION REPORT:
             0.0    1.0  accuracy  macro avg  weighted avg
precision    1.0    1.0       1.0        1.0           1.0
recall       1.0    1.0       1.0        1.0           1.0
f1-score     1.0    1.0       1.0        1.0           1.0
support    149.0  249.0       1.0      398.0         398.0
_______________________________________________
Confusion Matrix: 
 [[149   0]
 [  0 249]]

测试结果:

Accuracy Score: 63.74%
_______________________________________________
CLASSIFICATION REPORT:
                 0.0         1.0  accuracy   macro avg  weighted avg
precision   1.000000    0.635294  0.637427    0.817647      0.769659
recall      0.015873    1.000000  0.637427    0.507937      0.637427
f1-score    0.031250    0.776978  0.637427    0.404114      0.502236
support    63.000000  108.000000  0.637427  171.000000    171.000000
_______________________________________________
Confusion Matrix: 
 [[  1  62]
 [  0 108]]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

벡터 머신 하이퍼파라미터 튜닝 지원

from sklearn.model_selection import GridSearchCV

param_grid = {'C': [0.01, 0.1, 0.5, 1, 10, 100], 
              'gamma': [1, 0.75, 0.5, 0.25, 0.1, 0.01, 0.001], 
              'kernel': ['rbf', 'poly', 'linear']} 

grid = GridSearchCV(SVC(), param_grid, refit=True, verbose=1, cv=5)
grid.fit(X_train, y_train)

best_params = grid.best_params_
print(f"Best params: {best_params}")

svm_clf = SVC(**best_params)
svm_clf.fit(X_train, y_train)
print_score(svm_clf, X_train, y_train, X_test, y_test, train=True)
print_score(svm_clf, X_train, y_train, X_test, y_test, train=False)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

훈련 결과:

Accuracy Score: 98.24%
_______________________________________________
CLASSIFICATION REPORT:
                  0.0         1.0  accuracy   macro avg  weighted avg
precision    0.986301    0.980159  0.982412    0.983230      0.982458
recall       0.966443    0.991968  0.982412    0.979205      0.982412
f1-score     0.976271    0.986028  0.982412    0.981150      0.982375
support    149.000000  249.000000  0.982412  398.000000    398.000000
_______________________________________________
Confusion Matrix: 
 [[144   5]
 [  2 247]]

测试结果:

Accuracy Score: 98.25%
_______________________________________________
CLASSIFICATION REPORT:
                 0.0         1.0  accuracy   macro avg  weighted avg
precision   0.983871    0.981651  0.982456    0.982761      0.982469
recall      0.968254    0.990741  0.982456    0.979497      0.982456
f1-score    0.976000    0.986175  0.982456    0.981088      0.982426
support    63.000000  108.000000  0.982456  171.000000    171.000000
_______________________________________________
Confusion Matrix: 
 [[ 61   2]
 [  1 107]]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

5. 주성분 분석

PCA 소개

주성분 분석(PCA)은 데이터를 저차원 공간에 투영하여 선형 차원 축소를 달성하는 기술입니다. 구체적인 단계는 다음과 같습니다.

  • 특이값 분해 사용: 특이값 분해를 통해 데이터를 저차원 공간에 투영합니다.
  • 비지도 학습:PCA에는 차원 축소를 위해 레이블이 지정된 데이터가 필요하지 않습니다.
  • 기능 변환: 데이터의 가장 큰 변동을 설명하는 특징을 찾아보세요.

PCA 시각화

고차원 데이터는 직접 시각화하기 어렵기 때문에 PCA를 사용하여 처음 두 개의 주성분을 찾고 2차원 공간에서 데이터를 시각화할 수 있습니다. 이를 위해서는 먼저 각 특성의 분산이 단위 분산이 되도록 데이터를 정규화해야 합니다.

from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt

# 数据标准化
scaler = StandardScaler()
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# PCA 降维
pca = PCA(n_components=2)
X_train = pca.fit_transform(X_train)
X_test = pca.transform(X_test)

# 可视化前两个主成分
plt.figure(figsize=(8,6))
plt.scatter(X_train[:,0], X_train[:,1], c=y_train, cmap='plasma')
plt.xlabel('First Principal Component')
plt.ylabel('Second Principal Component')
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

여기에 이미지 설명을 삽입하세요.

처음 두 가지 주요 구성 요소를 통해 2차원 공간에서 다양한 범주의 데이터 포인트를 쉽게 분리할 수 있습니다.

구성 요소 설명

차원 축소는 강력하지만 구성요소의 의미를 직접적으로 이해하기는 어렵습니다. 각 구성 요소는 PCA 개체를 피팅하여 얻을 수 있는 원래 기능의 조합에 해당합니다.

구성요소 관련 속성은 다음과 같습니다.

  • 성분 점수: 변환된 변수 값입니다.
  • 하중(무게): 기능의 조합 가중치입니다.
  • 데이터 압축 및 정보 보존: 주요 정보를 유지하면서 PCA를 통해 데이터 압축을 달성합니다.
  • 소음 필터링: 차원 축소 과정에서 노이즈를 필터링할 수 있습니다.
  • 특징 추출 및 엔지니어링: 새로운 특징을 추출하고 구성하는 데 사용됩니다.

SVM(서포트 벡터 머신) 모델의 매개변수 조정

모델 훈련을 위해 SVM(서포트 벡터 머신)을 사용할 때 최상의 모델을 얻기 위해 하이퍼파라미터를 조정해야 합니다. 다음은 그리드 검색(GridSearchCV)을 사용하여 SVM 매개변수를 조정하는 샘플 코드입니다.

from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV

# 定义参数网格
param_grid = {'C': [0.01, 0.1, 0.5, 1, 10, 100], 
              'gamma': [1, 0.75, 0.5, 0.25, 0.1, 0.01, 0.001], 
              'kernel': ['rbf', 'poly', 'linear']} 

# 网格搜索
grid = GridSearchCV(SVC(), param_grid, refit=True, verbose=1, cv=5)
grid.fit(X_train, y_train)
best_params = grid.best_params_
print(f"Best params: {best_params}")

# 使用最佳参数训练模型
svm_clf = SVC(**best_params)
svm_clf.fit(X_train, y_train)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

훈련 결과:

Accuracy Score: 96.48%
_______________________________________________
CLASSIFICATION REPORT:
                  0.0         1.0  accuracy   macro avg  weighted avg
precision    0.978723    0.957198  0.964824    0.967961      0.965257
recall       0.926174    0.987952  0.964824    0.957063      0.964824
f1-score     0.951724    0.972332  0.964824    0.962028      0.964617
support    149.000000  249.000000  0.964824  398.000000    398.000000
_______________________________________________
Confusion Matrix: 
 [[138  11]
 [  3 246]]

测试结果:

Accuracy Score: 96.49%
_______________________________________________
CLASSIFICATION REPORT:
                 0.0         1.0  accuracy   macro avg  weighted avg
precision   0.967213    0.963636  0.964912    0.965425      0.964954
recall      0.936508    0.981481  0.964912    0.958995      0.964912
f1-score    0.951613    0.972477  0.964912    0.962045      0.964790
support    63.000000  108.000000  0.964912  171.000000    171.000000
_______________________________________________
Confusion Matrix: 
 [[ 59   4]
 [  2 106]]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

6. 요약

이 기사에서 우리는 다음을 배웠습니다.

  • 지원 벡터 머신(SVM): SVM의 기본 개념과 Python에서의 구현을 이해합니다.
  • SVM 커널 기능: 선형, 방사형 기저 함수(RBF) 및 다항식 커널 함수를 포함합니다.
  • 데이터 준비: SVM 알고리즘을 위한 데이터 준비 방법.
  • 초매개변수 조정: 그리드 검색을 통해 SVM 하이퍼파라미터를 튜닝합니다.
  • 주성분 분석(PCA): PCA를 사용하여 데이터 복잡성을 줄이고 scikit-learn에서 재사용하는 방법.

인용하다:초보자를 위한 지원 벡터 머신 및 PCA 튜토리얼
내 관련 칼럼 추천:


여기에 이미지 설명을 삽입하세요.