다층 퍼셉트론 정규화

Beginner

This tutorial is from open-source community. Access the source code

소개

이 실험은 다층 퍼셉트론 (MLP) 에서 정규화를 사용하여 과적합을 방지하는 방법을 보여줍니다. 정규화 매개변수 알파의 값을 다르게 설정하여 결정 함수가 어떻게 변하는지 비교해 보겠습니다.

VM 팁

VM 시작이 완료되면 왼쪽 상단 모서리를 클릭하여 Notebook 탭으로 전환하여 연습용 Jupyter Notebook에 접근할 수 있습니다.

때때로 Jupyter Notebook 이 완전히 로드되기까지 몇 초 정도 기다려야 할 수 있습니다. Jupyter Notebook 의 제한으로 인해 작업의 유효성 검사를 자동화할 수 없습니다.

학습 중 문제가 발생하면 Labby 에 문의하십시오. 세션 후 피드백을 제공하면 문제를 신속하게 해결해 드리겠습니다.

라이브러리 가져오기

이 실험에서는 필요한 라이브러리를 가져오는 것으로 시작합니다. scikit-learn 을 사용하여 합성 데이터셋을 생성하고, MLPClassifier 를 사용하여 MLP 모델을 구축하며, StandardScaler 를 사용하여 데이터를 표준화하고, make_pipeline 을 사용하여 변환 및 분류기의 파이프라인을 생성합니다.

import numpy as np
from matplotlib import pyplot as plt
from matplotlib.colors import ListedColormap
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import make_moons, make_circles, make_classification
from sklearn.neural_network import MLPClassifier
from sklearn.pipeline import make_pipeline

알파 값 정의

정규화 매개변수인 알파의 값을 다양하게 정의합니다. np.logspace를 사용하여 0.1 과 10 사이에 5 개의 로그 스케일 값을 생성합니다.

alphas = np.logspace(-1, 1, 5)

분류기 생성

각 알파 값에 대해 MLP 분류기를 생성합니다. 데이터를 표준화하는 StandardScaler 와 다양한 알파 값을 가진 MLPClassifier 를 포함하는 파이프라인을 생성합니다. 최적화기로 quasi-Newton 계열의 'lbfgs'를 사용합니다. 과적합을 방지하기 위해 max_iter 를 2000 으로, early_stopping 을 True 로 설정합니다. 각각 10 개의 뉴런을 가진 두 개의 은닉층을 사용합니다.

classifiers = []
names = []
for alpha in alphas:
    classifiers.append(
        make_pipeline(
            StandardScaler(),
            MLPClassifier(
                solver="lbfgs",
                alpha=alpha,
                random_state=1,
                max_iter=2000,
                early_stopping=True,
                hidden_layer_sizes=[10, 10],
            ),
        )
    )
    names.append(f"alpha {alpha:.2f}")

데이터셋 생성

make_classification, make_moons, 그리고 make_circles 함수를 사용하여 scikit-learn 에서 세 가지 합성 데이터셋을 생성합니다. 각 데이터셋을 학습용과 테스트용으로 분할합니다.

X, y = make_classification(
    n_features=2, n_redundant=0, n_informative=2, random_state=0, n_clusters_per_class=1
)
rng = np.random.RandomState(2)
X += 2 * rng.uniform(size=X.shape)
linearly_separable = (X, y)

datasets = [
    make_moons(noise=0.3, random_state=0),
    make_circles(noise=0.2, factor=0.5, random_state=1),
    linearly_separable,
]

figure = plt.figure(figsize=(17, 9))
i = 1
## 데이터셋 반복
for X, y in datasets:
    ## 학습 및 테스트 데이터 분할
    X_train, X_test, y_train, y_test = train_test_split(
        X, y, test_size=0.4, random_state=42
    )

데이터셋 시각화

각 데이터셋을 시각화하고 학습 및 테스트 데이터 포인트를 다른 색상으로 표시합니다.

    x_min, x_max = X[:, 0].min() - 0.5, X[:, 0].max() + 0.5
    y_min, y_max = X[:, 1].min() - 0.5, X[:, 1].max() + 0.5
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))

    ## 먼저 데이터셋을 플롯합니다.
    cm = plt.cm.RdBu
    cm_bright = ListedColormap(["#FF0000", "#0000FF"])
    ax = plt.subplot(len(datasets), len(classifiers) + 1, i)
    ## 학습 데이터 포인트를 플롯합니다.
    ax.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=cm_bright)
    ## 그리고 테스트 데이터 포인트를 플롯합니다.
    ax.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=cm_bright, alpha=0.6)
    ax.set_xlim(xx.min(), xx.max())
    ax.set_ylim(yy.min(), yy.max())
    ax.set_xticks(())
    ax.set_yticks(())
    i += 1

분류기 적합 및 결정 경계 시각화

각 분류기를 각 데이터셋에 적용하고 결정 경계를 시각화합니다. contourf를 사용하여 결정 경계를 그리고 scatter를 사용하여 학습 및 테스트 데이터 포인트를 시각화합니다. 각 플롯에 정확도 점수도 표시합니다.

    ## 분류기 반복
    for name, clf in zip(names, classifiers):
        ax = plt.subplot(len(datasets), len(classifiers) + 1, i)
        clf.fit(X_train, y_train)
        score = clf.score(X_test, y_test)

        ## 결정 경계를 플롯합니다. 이를 위해 [x_min, x_max] x [y_min, y_max] 메쉬의 각 점에 색상을 할당합니다.
        if hasattr(clf, "decision_function"):
            Z = clf.decision_function(np.column_stack([xx.ravel(), yy.ravel()]))
        else:
            Z = clf.predict_proba(np.column_stack([xx.ravel(), yy.ravel()]))[:, 1]

        ## 결과를 색상 플롯으로 표시
        Z = Z.reshape(xx.shape)
        ax.contourf(xx, yy, Z, cmap=cm, alpha=0.8)

        ## 학습 데이터 포인트도 플롯합니다.
        ax.scatter(
            X_train[:, 0],
            X_train[:, 1],
            c=y_train,
            cmap=cm_bright,
            edgecolors="black",
            s=25,
        )
        ## 그리고 테스트 데이터 포인트를 플롯합니다.
        ax.scatter(
            X_test[:, 0],
            X_test[:, 1],
            c=y_test,
            cmap=cm_bright,
            alpha=0.6,
            edgecolors="black",
            s=25,
        )

        ax.set_xlim(xx.min(), xx.max())
        ax.set_ylim(yy.min(), yy.max())
        ax.set_xticks(())
        ax.set_yticks(())
        ax.set_title(name)
        ax.text(
            xx.max() - 0.3,
            yy.min() + 0.3,
            f"{score:.3f}".lstrip("0"),
            size=15,
            horizontalalignment="right",
        )
        i += 1

플롯 표시

마지막으로, 서브플롯 레이아웃을 조정하고 플롯을 표시합니다.

figure.subplots_adjust(left=0.02, right=0.98)
plt.show()

요약

이 실험에서 다층 퍼셉트론 (MLP) 에 정규화를 적용하여 과적합을 방지하는 방법을 배웠습니다. 정규화 매개변수 알파의 값을 다르게 설정하여 결정 함수가 어떻게 변하는지 관찰했습니다. 또한, 합성 데이터셋을 생성하고, 데이터를 표준화하며, MLP 분류기를 생성하고, 결정 경계를 시각화하는 방법을 배웠습니다.