<jupyter_start><jupyter_text>Chapter 5.3 서포트 벡터 머신<jupyter_code>import numpy as np
import pandas as pd
import matplotlib.pyplot as plt<jupyter_output><empty_output><jupyter_text>그래프 그리기 전용 함수 정의하기<jupyter_code>def plot_dataset(dataset):
    fig, ax = plt.subplots()
    ax.tick_params(direction='in')
    for key, g in dataset.groupby('y'):
        color = 'k' if key == 1 else 'w'
        g.plot(ax=ax, kind='scatter', x='x0', y='x1',
               label=key, color=color, s=40,
               edgecolor='black', linewidth='1',
               xticks=np.arange(-10, 10, 5), yticks=np.arange(-10, 10, 5),
               xlim=(-10, 10), ylim=(-10, 10), figsize=(5, 5))
        plt.grid(which='major', color='grey', linestyle='--')
    return fig, ax

def plot_boundary(clf):
    # 0.01 간격의 그리드 만들기
    xx, yy = np.meshgrid(np.arange(-10, 10, 0.1),
                         np.arange(-10, 10, 0.1))
    # 생성한 그리드의 점을 하나하나 추론하기
    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])

    # 그래프를 그릴 수 있게 2차원 배열로 변환하기
    Z = Z.reshape(xx.shape)

    # 식별 경계 그리기
    plt.contour(xx, yy, Z, colors='b', levels=[0], linestyles=['-'])<jupyter_output><empty_output><jupyter_text>데이터 세트 만들기<jupyter_code>from sklearn.datasets import make_blobs

X_dataset, y_dataset = make_blobs(centers=[[-5, 5], [5, -3]],
                                  cluster_std=3,
                                  n_samples=20,
                                  center_box=(-10, 10),
                                  random_state=42)
dataset = pd.DataFrame(X_dataset, columns=['x0', 'x1'])
dataset['y'] = y_dataset
plot_dataset(dataset)<jupyter_output><empty_output><jupyter_text>SVMで학습し、식별 경계 그리기<jupyter_code>from sklearn.svm import SVC

# 선형 SVM으로 학습하기
classifier = SVC(kernel='linear')
classifier.fit(X_dataset, y_dataset)

plot_dataset(dataset)
plot_boundary(classifier)<jupyter_output><empty_output><jupyter_text>서포트 벡터 머신을 그래프로 그리기<jupyter_code>plot_dataset(dataset)
plot_boundary(classifier)

# 서포트 벡터 머신을 그래프로 그리기
plt.scatter(classifier.support_vectors_[:, 0],
            classifier.support_vectors_[:, 1],
            facecolor='none', edgecolor='b',
            s=200)<jupyter_output><empty_output><jupyter_text>그래프 그리기 전용 함수 정의하기<jupyter_code>def plot_dataset2(dataset):
    fig, ax = plt.subplots()
    ax.tick_params(direction='in')
    for key, g in dataset.groupby('y'):
        color = 'k' if key == 1 else 'w'
        g.plot(ax=ax, kind='scatter', x='x0', y='x1',
               label=key, color=color, s=40,
               edgecolor='black', linewidth='1',
               xticks=np.arange(-2.5, 2.5, 1), yticks=np.arange(-2.5, 2.5, 1),
               xlim=(-2.5, 2.5), ylim=(-2.5, 2.5), figsize=(5, 5))
        plt.grid(which='major', color='grey', linestyle='--')
    return fig, ax

def plot_boundary2(clf):
    #0.01 간격의 그리드 만들기
    xx, yy = np.meshgrid(np.arange(-2.5, 2.5, 0.01),
                         np.arange(-2.5, 2.5, 0.01))
    # 생성한 그리드의 점을 하나하나 추론하기
    Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])

    # 그래프를 그릴 수 있게 2차원 배열로 변환하기
    Z = Z.reshape(xx.shape)

    # 식별 경계 그리기
    plt.contour(xx, yy, Z, colors='b',
                levels=[-1, 0, 1], linestyles=['--', '-', '--'])<jupyter_output><empty_output><jupyter_text>비선형 식별 경계를 위한 데이터 세트 만들기<jupyter_code>from sklearn.datasets import make_moons

X_dataset, y_dataset = make_moons(n_samples=100, noise=0.05, random_state=42)

dataset = pd.DataFrame(X_dataset, columns=['x0', 'x1'])
dataset['y'] = y_dataset

plot_dataset2(dataset)<jupyter_output><empty_output><jupyter_text>비선형 SVM으로 학습하기<jupyter_code>from sklearn.svm import SVC

# 비선형 SVM으로 학습하기
classifier = SVC(kernel='rbf')
classifier.fit(X_dataset, y_dataset)

plot_dataset2(dataset)
plot_boundary2(classifier)<jupyter_output><empty_output><jupyter_text>클래스가 이리저리 섞인 데이터 세트 만들기<jupyter_code>from sklearn.datasets import make_moons

# noise를 0.2로 늘려서 데이터의 분산 늘리기
X_dataset, y_dataset = make_moons(n_samples=100, noise=0.2, random_state=42)

dataset = pd.DataFrame(X_dataset, columns=['x0', 'x1'])
dataset['y'] = y_dataset

plot_dataset2(dataset)<jupyter_output><empty_output><jupyter_text>비선형 SVM의 매개 변수를 바꾼 뒤 하고, 각각의 식별 경계 그리기<jupyter_code>from sklearn.svm import SVC

# 비선형 SVM으로 학습하기
classifier = SVC(kernel='rbf')

# 매개 변수의 범위 설정하기
c_range = [0.1, 1.0, 100.0]
gamma_range = [0.5, 5.0, 50.0]

# 각 매개변수 별로 학습하기
for row, c in enumerate(c_range):
    for col, gamma in enumerate(gamma_range):
        classifier.C = c
        classifier.gamma = gamma
        classifier.fit(X_dataset, y_dataset)

        # 식별 경계 그리기
        plot_dataset2(dataset)
        plot_boundary2(classifier)
        plt.title('gamma=%.1f, C=%.1f' % (gamma, c))
        plt.show()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.14895877603059923, 'fraction_numerical': 0.03357416064598385, 'mean_word_length': 3.213965980304387, 'pattern_counts': {'":': 0, '<': 41, '<?xml version=': 0, '>': 41, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 4, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '10', 'dir': 'jupyter-structured-clean-dedup', 'id': '410133', 'license': 'Apache-2.0', 'n_tokens_mistral': 2202, 'n_tokens_neox': 2280, 'n_words': 370, 'path': 'Part2/Chapter5.3.ipynb', 'repo_name': 'hasarat/gcpml-freelec', 'size': '4706'}