내 연락처 정보
우편메소피아@프로톤메일.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
SVM(지원 벡터 머신)은 선형 및 비선형 분류, 회귀, 이상치 감지에 적합한 강력하고 다양한 기계 학습 모델입니다. 이 기사에서는 지원 벡터 머신 알고리즘과 scikit-learn의 구현을 소개하고 scikit-learn의 주성분 분석 및 적용을 간략하게 살펴봅니다.
SVM(Support Vector Machine)은 기계 학습 분야에서 널리 사용되는 알고리즘으로, 적은 컴퓨팅 리소스로 상당한 정확성을 제공한다는 특성으로 인해 선호됩니다. SVM은 분류 및 회귀 작업 모두에 사용할 수 있지만 분류 문제에 가장 널리 사용됩니다.
서포트 벡터 머신의 목표는 다음과 같습니다. 네.엔.N 차원 공간 ( 네.엔.N 특징의 개수) 데이터 포인트를 명확하게 구분할 수 있는 초평면을 찾습니다. 이 초평면을 사용하면 다양한 범주의 데이터 포인트를 분리하고 초평면에서 최대한 멀리 떨어져 분류의 견고성을 보장할 수 있습니다.
데이터 포인트를 효과적으로 분리하기 위해 여러 개의 초평면이 존재할 수 있습니다. 우리의 목표는 최대 마진, 즉 두 클래스 사이의 최대 거리를 가진 초평면을 선택하는 것입니다. 마진을 최대화하면 분류 정확도를 높이는 데 도움이 됩니다.
초평면은 데이터 포인트를 나누는 결정 경계입니다. 초평면의 양쪽에 위치한 데이터 포인트는 서로 다른 범주로 분류될 수 있습니다. 초평면의 차원은 특징의 수에 따라 달라집니다. 입력 특징이 2이면 초평면은 직선이고, 특징이 3이면 초평면은 2차원 평면입니다. 특징 개수가 3개를 초과하면 초평면을 직관적으로 이해하기 어려워집니다.
서포트 벡터는 초평면에 가장 가까운 점을 나타내며 초평면의 위치와 방향에 영향을 미칩니다. 이러한 서포트 벡터를 사용하면 분류기의 마진을 최대화할 수 있습니다. 서포트 벡터를 제거하면 초평면의 위치가 변경되므로 SVM을 구축하는 데 중요합니다.
로지스틱 회귀에서는 시그모이드 함수를 사용하여 선형 함수의 출력 값을 [0,1] 범위로 압축하고 임계값(0.5)을 기준으로 레이블을 할당합니다. SVM에서는 선형 함수의 출력 값을 사용하여 분류를 결정합니다. 출력이 1보다 크면 한 클래스에 속하고, 출력이 -1이면 다른 클래스에 속합니다. SVM은 출력값의 임계값을 1과 -1로 설정하여 한계 범위 [-1,1]을 형성합니다.
서포트 벡터 머신을 사용하여 양성 및 악성 암 진단을 예측합니다.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
sns.set_style('whitegrid')
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()
df.info()print(cancer.target_names)
# ['malignant', 'benign']
# 数据描述:
df.describe()
# 统计摘要:
df.info()
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'
])
sns.countplot(x=df['target'], label="Count")
plt.figure(figsize=(10, 8))
sns.scatterplot(x='mean area', y='mean smoothness', hue='target', data=df)
plt.figure(figsize=(20,10))
sns.heatmap(df.corr(), annot=True)
기계 학습에서 모델 훈련은 문제에 대한 해결책을 찾는 데 중요한 단계입니다.아래에서는 사용법을 소개하겠습니다.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)
우리가 사용하는 코드에서는 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")
SVM(지원 벡터 머신)은 성능이 하이퍼파라미터의 영향을 받는 강력한 분류 알고리즘입니다. 다음은 SVM의 주요 매개변수와 이것이 모델 성능에 미치는 영향을 소개합니다.
'poly'
), 다른 커널에서는 무시됩니다. 그리드 검색을 통해 최적의 하이퍼파라미터 값을 찾을 수 있습니다.선형 커널 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)
훈련 및 테스트 결과는 다음과 같습니다.
훈련 결과:
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]]
시험 결과:
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]]
다항식 커널 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)
훈련 및 테스트 결과는 다음과 같습니다.
훈련 결과:
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]]
시험 결과:
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]]
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)
훈련 및 테스트 결과는 다음과 같습니다.
훈련 결과:
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]]
시험 결과:
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]]
위의 모델 훈련 및 평가 프로세스를 통해 다양한 SVM 커널의 성능 차이를 관찰할 수 있습니다. 선형 커널 SVM은 정확도와 훈련 시간 측면에서 우수한 성능을 발휘하며 데이터 차원이 더 높은 상황에 적합합니다. 다항식 커널 SVM 및 RBF 커널 SVM은 비선형 데이터에서 더 나은 성능을 제공하지만 특정 매개변수 설정에서 과적합이 발생할 수 있습니다. 모델 성능을 향상하려면 적절한 커널과 하이퍼파라미터를 선택하는 것이 중요합니다.
디지털 입력 : SVM은 입력 데이터가 숫자라고 가정합니다. 입력 데이터가 범주형 변수인 경우 이진 더미 변수(범주당 하나의 변수)로 변환해야 할 수도 있습니다.
이진 분류 :기본 SVM은 이진 분류 문제에 적합합니다. SVM은 주로 이진 분류에 사용되지만 회귀 및 다중 클래스 분류를 위한 확장 버전도 있습니다.
X_train = pipeline.fit_transform(X_train)
X_test = pipeline.transform(X_test)
다음은 다양한 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)
훈련 결과:
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]]
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)
훈련 결과:
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]]
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)
훈련 결과:
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]]
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)
훈련 결과:
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]]
주성분 분석(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()
처음 두 가지 주요 구성 요소를 통해 2차원 공간에서 다양한 범주의 데이터 포인트를 쉽게 분리할 수 있습니다.
차원 축소는 강력하지만 구성요소의 의미를 직접적으로 이해하기는 어렵습니다. 각 구성 요소는 PCA 개체를 피팅하여 얻을 수 있는 원래 기능의 조합에 해당합니다.
구성요소 관련 속성은 다음과 같습니다.
모델 훈련을 위해 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)
훈련 결과:
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]]
이 기사에서 우리는 다음을 배웠습니다.
인용하다:초보자를 위한 지원 벡터 머신 및 PCA 튜토리얼
내 관련 칼럼 추천: