[머신러닝] 벡터기(SVM) 지원에 관하여 가능한 한 이해하기 쉽게 ④~소프트 여분과 하드 여분의 설치를 정리합니다~

입문


이번 보도는 지난번 보도의 후속이다.
가능하다면 아래의 보도를 보십시오.
[머신러닝] 지원 벡터기(SVM)에 관하여 가능한 한 간단명료하게 정리 ①~이론과 공식편~
[머신러닝] 벡터기(SVM) 지원에 관하여 가능한 한 이해하기 쉽게 정리 ②~라그랑일의 미정승법~
[머신러닝] 지원 벡터기(SVM)에 관하여 가능한 한 간단명료하게 요약하기 ③~내핵법에 관하여~

분류 문제: 하드 이윤


분리 선형으로 데이터를 분리할 수 있는svm를 실현합니다.
사용한 데이터는 아이리스 데이터 집합입니다.

아이리스 데이터 세트 정보


아이리스 데이터는 아이리스 품종의 데이터입니다.
아이리스 품종Setosa, Virginica, Virginica 이 세 품종에 대한 데이터는 각각 50개로 모두 150개이다.
우리 안에 있는 내용을 실제로 봅시다.
from sklearn.datasets import load_iris
import pandas as pd

iris = load_iris()
iris_df = pd.DataFrame(iris.data, columns=iris.feature_names)

print(iris_df.head())
sepal length (cm) sepal width (cm) petal length (cm) petal width (cm)
0 5.1 3.5 1.4 0.2
1 4.9 3.0 1.4 0.2
2 4.7 3.2 1.3 0.2
3 4.6 3.1 1.5 0.2
4 5.0 3.6 1.4 0.2iris.feature_names에 각 열의 이름을 저장하여 판다스의 Dataframe 매개 변수에 전달함으로써 상기 데이터와 같이 출력할 수 있습니다.Sepal Length는 꽃잎의 길이, Sepal Width는 꽃잎의 너비, Petal length는 꽃잎의 길이, Petal Width는 꽃잎의 너비의 데이터입니다.
다음 방법으로 정답 라벨을 표시할 수 있습니다.
print(iris.target)
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2]
이렇게 하면 아이리스 품종setosa, versicolor, virginica은 각각 0, 1, 2이다.
아이리스 데이터에 대한 설명은 여기까지입니다.

실시


다음 코드로 데이터 집합을 만듭니다.
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.svm import LinearSVC
from sklearn.datasets import load_iris
import mglearn

iris = load_iris()
X = iris.data[:100, 2:]
Y = iris.target[:100]
print(X.shape)
print(Y.shape)
(100, 2)
(100,)
이번 사용setosa,versicolorpetal lengthpetal width의 데이터를 분류합니다.
다음 코드를 사용하여 데이터를 그립니다.
mglearn.discrete_scatter(X[:, 0], X[:, 1], Y)
plt.legend(['setosa', 'versicolor'], loc='best')
plt.show()
mglearn.discrete_scatter(X[:, 0], X[:, 1], Y)의 코드는 첫 번째 파라미터는 X축, 두 번째 파라미터는 Y축, 세 번째 파라미터는 정해 라벨로 scatter 그림을 그린다.loc='best' 도표를 방해하지 않는 위치로 도례를 조정합니다.
위의 데이터에서 직선으로 분리할 수 있음을 뚜렷하게 알 수 있다.오히려 너무 쉬워요.
다음 코드를 사용하여 모델을 생성합니다.
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, stratify=Y, random_state=0)
svm = LinearSVC()
svm.fit(X_train, Y_train)
모델 생성 자체가 이 코드로 끝납니다.간단하네.
아래의 코드는 모델이 어떤 형상인지 설명한다.
plt.figure(figsize=(10, 6))
mglearn.plots.plot_2d_separator(svm, X)
mglearn.discrete_scatter(X[:, 0], X[:, 1], Y)
plt.xlabel('petal length')
plt.ylabel('petal width')
plt.legend(['setosa', 'versicolor'], loc='best')
plt.show()

데이터의 경계선을 잘 분리하는 것을 확인할 수 있다.mglearn.plots.plot_2d_separator(svm, X)의 부분은 이해하기 어려워서 해설을 한다.정의된 코드를 확인해 보세요.
plot_2d_separator(classifier, X, fill=False, ax=None, eps=None, alpha=1,cm=cm2, linewidth=None, threshold=None,linestyle="solid"):
분류 모델을 첫 번째 파라미터에 맡기고 원래의 데이터를 두 번째 파라미터에 맡기면 경계선의 함수를 그립니다.
이로써 svm모델은 선형 분리 가능한 문제의 실현이 끝났다.

분류 문제: 소프트 이윤


이번에 소프트웨어 이윤 문제에 대해 처리하다.
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.svm import LinearSVC
from sklearn.datasets import load_iris
import mglearn

iris = load_iris()

X = iris.data[50:, 2:]
Y = iris.target[50:] - 1

mglearn.discrete_scatter(X[:, 0], X[:, 1], Y)
plt.legend(['versicolor', 'virginica'], loc='best')
plt.show()

이번에는 versicolorverginicapetal lengthpetal width 데이터를 그렸습니다.
완전 선형 분리는 불가능한 문제다.
여기서 소프트웨어 이윤의 공식을 복습하다.내보내기 여기 를 참조하십시오.
min_{W, \xi}\Bigl\{\frac{1}{2}||W||^2 + C\sum_{i=1}^{N} \xi_i\Bigr\} \quad \quad
t_i(W^TX_i + b)\geq 1 - \xi_i\\
\xi_i = max\Bigl\{0, M - \frac{t_i(W^TX_i + b)}{||W||}\Bigr\}\\
i = 1, 2, 3, ... N
데이터가 여분의 안쪽으로 들어가기 때문에 $C\sum_{i=1}^{N}\xi_i$항목에 따라 제한을 완화했습니다.
이 C의 값은 기본적으로 1.0skleaarn입니다.이 수치를 변화시켜 그림에 어떤 변화가 있는지 확인해 보세요.다음 코드는 매개 변수에 사용할 모델 경계를 그리는 함수를 정의합니다.
def make_separate(model):
    mglearn.plots.plot_2d_separator(svm, X)
    mglearn.discrete_scatter(X[:, 0], X[:, 1], Y)
    plt.xlabel('petal length')
    plt.ylabel('petal width')
    plt.legend(['setosa', 'versicolor'], loc='best')
    plt.show()
다음 코드를 사용하여 도면을 그립니다.C=0.1.
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, stratify=Y, random_state=0)
svm = LinearSVC(C=0.1)
svm.fit(X_train, Y_train)
make_separate(svm)
print(svm.score(X_test, Y_test))
0.96

다음은 C=1.0.
svm = LinearSVC(C=1.0)
svm.fit(X_train, Y_train)
make_separate(svm)
print(svm.score(X_test, Y_test))
1.0

다음은 C=100.
svm = LinearSVC(C=100)
svm.fit(X_train, Y_train)
make_separate(svm)
print(svm.score(X_test, Y_test))
1.0

적당한 C를 설정하는 것이 중요하다.여러 가지 변화를 하면서 상황을 보는 것이 좋다.
지금까지 소프트 이윤의 설치가 끝났다.

끝날 때


이번 보도는 이만 마치겠습니다.
고생하셨습니다.
가능하다면 다음 기사를 보십시오.
[머신러닝] 벡터 머신(SVM) 지원에 대해 가능한 한 이해하기 쉽게 정리 ⑤~ 커널 사용법의 분류 설치~

좋은 웹페이지 즐겨찾기