logo

지원 벡터 머신 알고리즘

SVM(Support Vector Machine)은 분류 및 회귀 문제에 사용되는 가장 널리 사용되는 지도 학습 알고리즘 중 하나입니다. 그러나 주로 기계 학습의 분류 문제에 사용됩니다.

SVM 알고리즘의 목표는 n차원 공간을 클래스로 분리할 수 있는 최상의 선 또는 결정 경계를 생성하여 향후 새로운 데이터 포인트를 올바른 범주에 쉽게 배치할 수 있도록 하는 것입니다. 이 최선의 결정 경계를 초평면(Hyperplane)이라고 합니다.

SVM은 초평면 생성에 도움이 되는 극점/벡터를 선택합니다. 이러한 극단적인 경우를 지원 벡터라고 하며, 따라서 알고리즘을 지원 벡터 머신이라고 합니다. 결정 경계 또는 초평면을 사용하여 분류되는 두 가지 범주가 있는 아래 다이어그램을 고려하세요.

지원 벡터 머신 알고리즘

예: SVM은 KNN 분류기에서 사용한 예를 통해 이해할 수 있습니다. 개와 같은 특징을 가지고 있는 이상한 고양이를 본다고 가정해 보겠습니다. 고양이인지 개인지 정확하게 식별할 수 있는 모델을 원한다면 SVM 알고리즘을 사용하여 그러한 모델을 만들 수 있습니다. 먼저 고양이와 개의 다양한 특징을 학습할 수 있도록 고양이와 개의 이미지를 많이 사용하여 모델을 훈련한 다음 이 이상한 생물을 대상으로 테스트할 것입니다. 따라서 서포트 벡터는 이 두 데이터(고양이와 개) 사이에 결정 경계를 만들고 극단적인 경우(서포트 벡터)를 선택하므로 고양이와 개의 극단적인 경우를 보게 됩니다. 서포트 벡터를 기반으로 고양이로 분류하게 됩니다. 아래 다이어그램을 고려하십시오.

지원 벡터 머신 알고리즘

SVM 알고리즘을 사용할 수 있습니다. 얼굴 검출, 이미지 분류, 텍스트 분류, 등.

자바 문자열 길이

SVM의 종류

SVM에는 두 가지 유형이 있습니다.

    선형 SVM:선형 SVM은 선형 분리 가능한 데이터에 사용됩니다. 즉, 데이터 세트를 단일 직선을 사용하여 두 클래스로 분류할 수 있는 경우 이러한 데이터를 선형 분리 가능한 데이터라고 하고 분류기를 선형 SVM 분류기라고 합니다.비선형 SVM:Non-Linear SVM은 비선형적으로 분리된 데이터에 사용됩니다. 즉, 데이터 세트를 직선으로 분류할 수 없는 경우 해당 데이터를 비선형 데이터라고 하고 사용된 분류기를 비선형 SVM 분류기라고 합니다.

SVM 알고리즘의 초평면 및 서포트 벡터:

초평면: n차원 공간에서 클래스를 분리하기 위해 여러 개의 선/결정 경계가 있을 수 있지만 데이터 포인트를 분류하는 데 도움이 되는 최상의 결정 경계를 찾아야 합니다. 이 최상의 경계는 SVM의 초평면으로 알려져 있습니다.

초평면의 차원은 데이터세트에 있는 특징에 따라 달라집니다. 즉, 2개의 특징(이미지에 표시됨)이 있는 경우 초평면은 직선이 됩니다. 그리고 3개의 특징이 있다면 초평면은 2차원 평면이 될 것입니다.

우리는 항상 최대 마진, 즉 데이터 포인트 사이의 최대 거리를 갖는 초평면을 만듭니다.

지원 벡터:

초평면에 가장 가깝고 초평면의 위치에 영향을 미치는 데이터 점 또는 벡터를 지원 벡터라고 합니다. 이러한 벡터는 초평면을 지원하므로 지원 벡터라고 합니다.

SVM은 어떻게 작동하나요?

선형 SVM:

SVM 알고리즘의 작동은 예제를 사용하여 이해할 수 있습니다. 두 개의 태그(녹색과 파란색)가 있는 데이터 세트가 있고 데이터 세트에 x1과 x2의 두 가지 특성이 있다고 가정합니다. 우리는 녹색 또는 파란색 좌표 쌍(x1, x2)을 분류할 수 있는 분류기를 원합니다. 아래 이미지를 고려하십시오.

지원 벡터 머신 알고리즘

따라서 2차원 공간이므로 직선만 사용하면 이 두 클래스를 쉽게 구분할 수 있습니다. 그러나 이러한 클래스를 구분할 수 있는 여러 줄이 있을 수 있습니다. 아래 이미지를 고려하십시오.

지원 벡터 머신 알고리즘

따라서 SVM 알고리즘은 최상의 라인 또는 결정 경계를 찾는 데 도움이 됩니다. 이 가장 좋은 경계 또는 지역을 다음과 같이 부릅니다. 초평면 . SVM 알고리즘은 두 클래스 모두에서 가장 가까운 선 지점을 찾습니다. 이러한 점을 서포트 벡터라고 합니다. 벡터와 초평면 사이의 거리를 다음과 같이 부릅니다. 여유 . 그리고 SVM의 목표는 이 마진을 극대화하는 것입니다. 그만큼 초평면 최대 마진을 갖는 것을 최적의 초평면 .

지원 벡터 머신 알고리즘

비선형 SVM:

데이터가 선형적으로 배열되어 있으면 직선을 사용하여 분리할 수 있지만, 비선형 데이터의 경우 직선 하나를 그릴 수 없습니다. 아래 이미지를 고려하십시오.

지원 벡터 머신 알고리즘

따라서 이러한 데이터 포인트를 분리하려면 차원을 하나 더 추가해야 합니다. 선형 데이터의 경우 두 차원 x와 y를 사용했으므로 비선형 데이터의 경우 세 번째 차원 z를 추가합니다. 다음과 같이 계산할 수 있습니다.

 z=x<sup>2</sup> +y<sup>2</sup> 

3차원을 추가하면 샘플 공간은 아래 이미지와 같이 됩니다.

지원 벡터 머신 알고리즘

이제 SVM은 다음과 같은 방식으로 데이터 세트를 클래스로 나눕니다. 아래 이미지를 고려하십시오.

지원 벡터 머신 알고리즘

우리는 3차원 공간에 있기 때문에 x축에 평행한 평면처럼 보입니다. z=1로 2차원 공간에서 변환하면 다음과 같습니다.

지원 벡터 머신 알고리즘

따라서 비선형 데이터의 경우 반경 1의 원주를 얻습니다.

서포트 벡터 머신의 Python 구현

이제 Python을 사용하여 SVM 알고리즘을 구현하겠습니다. 여기서는 동일한 데이터세트를 사용하겠습니다. 사용자 데이터 , 로지스틱 회귀 및 KNN 분류에 사용되었습니다.

    데이터 전처리 단계

데이터 전처리 단계까지 코드는 동일하게 유지됩니다. 아래는 코드입니다:

배열의 C 문자열
 #Data Pre-processing Step # importing libraries import numpy as nm import matplotlib.pyplot as mtp import pandas as pd #importing datasets data_set= pd.read_csv(&apos;user_data.csv&apos;) #Extracting Independent and dependent Variable x= data_set.iloc[:, [2,3]].values y= data_set.iloc[:, 4].values # Splitting the dataset into training and test set. from sklearn.model_selection import train_test_split x_train, x_test, y_train, y_test= train_test_split(x, y, test_size= 0.25, random_state=0) #feature Scaling from sklearn.preprocessing import StandardScaler st_x= StandardScaler() x_train= st_x.fit_transform(x_train) x_test= st_x.transform(x_test) 

위의 코드를 실행한 후 데이터를 전처리하겠습니다. 코드는 데이터 세트를 다음과 같이 제공합니다.

지원 벡터 머신 알고리즘

테스트 세트의 확장된 출력은 다음과 같습니다.

지원 벡터 머신 알고리즘

훈련 세트에 SVM 분류기를 맞추는 방법:

이제 훈련 세트가 SVM 분류기에 맞춰질 것입니다. SVM 분류기를 생성하기 위해 다음을 가져옵니다. SVC 수업 Sklearn.svm 도서관. 아래는 그에 대한 코드입니다:

 from sklearn.svm import SVC # &apos;Support vector classifier&apos; classifier = SVC(kernel=&apos;linear&apos;, random_state=0) classifier.fit(x_train, y_train) 

위의 코드에서 우리는 커널='선형' , 여기서는 선형으로 분리 가능한 데이터에 대한 SVM을 생성합니다. 그러나 비선형 데이터에 대해서는 이를 변경할 수 있습니다. 그런 다음 분류기를 훈련 데이터 세트(x_train, y_train)에 적용했습니다.

산출:

 Out[8]: SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, decision_function_shape=&apos;ovr&apos;, degree=3, gamma=&apos;auto_deprecated&apos;, kernel=&apos;linear&apos;, max_iter=-1, probability=False, random_state=0, shrinking=True, tol=0.001, verbose=False) 

모델 성능은 값을 변경하여 변경할 수 있습니다. C(정규화 인자), 감마, 커널 .

    테스트 세트 결과 예측:
    이제 테스트 세트의 출력을 예측하겠습니다. 이를 위해 새로운 벡터 y_pred를 생성합니다. 아래는 그에 대한 코드입니다:
 #Predicting the test set result y_pred= classifier.predict(x_test) 

y_pred 벡터를 얻은 후 다음의 결과를 비교할 수 있습니다. y_pred 그리고 y_test 실제 값과 예측 값의 차이를 확인합니다.

산출: 다음은 테스트 세트 예측에 대한 출력입니다.

지원 벡터 머신 알고리즘
    혼동 행렬 만들기:
    이제 로지스틱 회귀 분류기와 비교하여 얼마나 많은 잘못된 예측이 있는지 SVM 분류기의 성능을 살펴보겠습니다. 혼동 행렬을 만들려면 다음을 가져와야 합니다. 혼란_행렬 sklearn 라이브러리의 기능. 함수를 가져온 후 새 변수를 사용하여 함수를 호출합니다. 센티미터 . 이 함수는 주로 두 개의 매개변수를 사용합니다. y_true (실제 값) 및 y_pred (분류자가 반환한 목표 값) 아래는 그에 대한 코드입니다:
 #Creating the Confusion matrix from sklearn.metrics import confusion_matrix cm= confusion_matrix(y_test, y_pred) 

산출:

지원 벡터 머신 알고리즘

위 출력 이미지에서 볼 수 있듯이 66+24= 90개의 올바른 예측과 8+2= 10개의 올바른 예측이 있습니다. 따라서 SVM 모델이 로지스틱 회귀 모델에 비해 향상되었다고 말할 수 있습니다.

    훈련 세트 결과 시각화:
    이제 훈련 세트 결과를 시각화하겠습니다. 아래 코드는 다음과 같습니다.
 from matplotlib.colors import ListedColormap x_set, y_set = x_train, y_train x1, x2 = nm.meshgrid(nm.arange(start = x_set[:, 0].min() - 1, stop = x_set[:, 0].max() + 1, step =0.01), nm.arange(start = x_set[:, 1].min() - 1, stop = x_set[:, 1].max() + 1, step = 0.01)) mtp.contourf(x1, x2, classifier.predict(nm.array([x1.ravel(), x2.ravel()]).T).reshape(x1.shape), alpha = 0.75, cmap = ListedColormap((&apos;red&apos;, &apos;green&apos;))) mtp.xlim(x1.min(), x1.max()) mtp.ylim(x2.min(), x2.max()) for i, j in enumerate(nm.unique(y_set)): mtp.scatter(x_set[y_set == j, 0], x_set[y_set == j, 1], c = ListedColormap((&apos;red&apos;, &apos;green&apos;))(i), label = j) mtp.title(&apos;SVM classifier (Training set)&apos;) mtp.xlabel(&apos;Age&apos;) mtp.ylabel(&apos;Estimated Salary&apos;) mtp.legend() mtp.show() 

산출:

위의 코드를 실행하면 다음과 같은 결과가 출력됩니다.

지원 벡터 머신 알고리즘

보시다시피 위의 출력은 로지스틱 회귀 출력과 유사하게 나타납니다. 출력에서 우리는 다음과 같이 직선을 초평면으로 얻었습니다. 분류기에서 선형 커널을 사용했습니다. . 그리고 위에서 2D 공간의 경우 SVM의 초평면은 직선이라는 점도 논의했습니다.

    테스트 세트 결과 시각화:
 #Visulaizing the test set result from matplotlib.colors import ListedColormap x_set, y_set = x_test, y_test x1, x2 = nm.meshgrid(nm.arange(start = x_set[:, 0].min() - 1, stop = x_set[:, 0].max() + 1, step =0.01), nm.arange(start = x_set[:, 1].min() - 1, stop = x_set[:, 1].max() + 1, step = 0.01)) mtp.contourf(x1, x2, classifier.predict(nm.array([x1.ravel(), x2.ravel()]).T).reshape(x1.shape), alpha = 0.75, cmap = ListedColormap((&apos;red&apos;,&apos;green&apos; ))) mtp.xlim(x1.min(), x1.max()) mtp.ylim(x2.min(), x2.max()) for i, j in enumerate(nm.unique(y_set)): mtp.scatter(x_set[y_set == j, 0], x_set[y_set == j, 1], c = ListedColormap((&apos;red&apos;, &apos;green&apos;))(i), label = j) mtp.title(&apos;SVM classifier (Test set)&apos;) mtp.xlabel(&apos;Age&apos;) mtp.ylabel(&apos;Estimated Salary&apos;) mtp.legend() mtp.show() 

산출:

위의 코드를 실행하면 다음과 같은 결과가 출력됩니다.

지원 벡터 머신 알고리즘

위 출력 이미지에서 볼 수 있듯이 SVM 분류자는 사용자를 두 영역(구매함 또는 구매하지 않음)으로 나눴습니다. SUV를 구매한 사용자는 빨간색 분산점이 있는 빨간색 영역에 있습니다. 그리고 SUV를 구매하지 않은 사용자는 녹색 산점도가 있는 녹색 영역에 위치합니다. 초평면은 두 클래스를 구매된 변수와 구매하지 않은 변수로 나눴습니다.

자바 현지 날짜 시간