SVM(Support Vector Machine)은 분류 및 회귀 문제에 사용되는 가장 널리 사용되는 지도 학습 알고리즘 중 하나입니다. 그러나 주로 기계 학습의 분류 문제에 사용됩니다.
SVM 알고리즘의 목표는 n차원 공간을 클래스로 분리할 수 있는 최상의 선 또는 결정 경계를 생성하여 향후 새로운 데이터 포인트를 올바른 범주에 쉽게 배치할 수 있도록 하는 것입니다. 이 최선의 결정 경계를 초평면(Hyperplane)이라고 합니다.
SVM은 초평면 생성에 도움이 되는 극점/벡터를 선택합니다. 이러한 극단적인 경우를 지원 벡터라고 하며, 따라서 알고리즘을 지원 벡터 머신이라고 합니다. 결정 경계 또는 초평면을 사용하여 분류되는 두 가지 범주가 있는 아래 다이어그램을 고려하세요.
예: SVM은 KNN 분류기에서 사용한 예를 통해 이해할 수 있습니다. 개와 같은 특징을 가지고 있는 이상한 고양이를 본다고 가정해 보겠습니다. 고양이인지 개인지 정확하게 식별할 수 있는 모델을 원한다면 SVM 알고리즘을 사용하여 그러한 모델을 만들 수 있습니다. 먼저 고양이와 개의 다양한 특징을 학습할 수 있도록 고양이와 개의 이미지를 많이 사용하여 모델을 훈련한 다음 이 이상한 생물을 대상으로 테스트할 것입니다. 따라서 서포트 벡터는 이 두 데이터(고양이와 개) 사이에 결정 경계를 만들고 극단적인 경우(서포트 벡터)를 선택하므로 고양이와 개의 극단적인 경우를 보게 됩니다. 서포트 벡터를 기반으로 고양이로 분류하게 됩니다. 아래 다이어그램을 고려하십시오.
SVM 알고리즘을 사용할 수 있습니다. 얼굴 검출, 이미지 분류, 텍스트 분류, 등.
자바 문자열 길이
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('user_data.csv') #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 # 'Support vector classifier' classifier = SVC(kernel='linear', 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='ovr', degree=3, gamma='auto_deprecated', kernel='linear', 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(('red', 'green'))) 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(('red', 'green'))(i), label = j) mtp.title('SVM classifier (Training set)') mtp.xlabel('Age') mtp.ylabel('Estimated Salary') 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(('red','green' ))) 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(('red', 'green'))(i), label = j) mtp.title('SVM classifier (Test set)') mtp.xlabel('Age') mtp.ylabel('Estimated Salary') mtp.legend() mtp.show()
산출:
위의 코드를 실행하면 다음과 같은 결과가 출력됩니다.
위 출력 이미지에서 볼 수 있듯이 SVM 분류자는 사용자를 두 영역(구매함 또는 구매하지 않음)으로 나눴습니다. SUV를 구매한 사용자는 빨간색 분산점이 있는 빨간색 영역에 있습니다. 그리고 SUV를 구매하지 않은 사용자는 녹색 산점도가 있는 녹색 영역에 위치합니다. 초평면은 두 클래스를 구매된 변수와 구매하지 않은 변수로 나눴습니다.
자바 현지 날짜 시간