学習曲線と決定境界の描画


機械学習モデルの良し悪しを評価する際には,学習曲線の変化や最後の分類結果(二分類)の効果を観察することがしばしば必要である.良い可視化結果はモデルの理解を強化することができる.次は、イメージを強化し、表示を容易にするために、決定境界と学習曲線の描画コードをまとめます.
#決定境界の描画
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
def plot_decision_boundary(clf, X, y, num_row = 100, num_col = 100):
    """
               
    :param clf:    ,       
    :param X:      X
    :param y:        y
    :param num_row:        ,        
    :param num_col:         
    """
    clf.fit(X, y)
    sigma = 1   #                    ,          
    x1_min, x1_max = np.min(X[:, 0])-sigma, np.max(X[:, 0])+sigma
    x2_min, x2_max = np.min(X[:, 1])-sigma, np.max(X[:, 1])+sigma
    t1 = np.linspace(x1_min, x1_max, num_row)
    t2 = np.linspace(x2_min, x2_max, num_col)
    x1, x2 = np.meshgrid(t1, t2)
    x_test = np.stack((x1, x2), axis=1)

    #        colors,               
    cm_dark = mpl.colors.ListedColormap(['#FFA0A0', '#A0FFA0', '#A0A0FF'])
    cm_light = mpl.colors.ListedColormap(['r', 'g', 'b'])

    y_hat = clf.predict(x_test)
    y_hat = y_hat.reshape(x1.shape)

    plt.pcolormesh(x1, x2, y_hat, cmap=cm_dark)   #     
    plt.scatter(X[:, 0], X[:, 1], y, edgecolors='k', cmap=cm_light)   #        
    
    plt.xlabel('x label')
    plt.ylabel('y label')
    plt.title('decision-boundary')
    plt.xlim(x1_min, x1_max)
    plt.ylim(x2_min, x2_max)
    plt.grid()
    plt.show()

#学習曲線の描画
from sklearn.model_selection import learning_curve
import numpy as np
import matplotlib.pyplot as plt
def plot_learning_curve(estimator, X, y, n_jobs=1, cv = 5, train_size = np.linspace(0.02, 1, 50), verbose=0):
    """
          ,         ,         
    :param estimator:      
    """
    train_sizes, train_scores, test_scores = learning_curve(estimator=estimator, X=X, y=y, cv=cv, n_jobs=n_jobs,
                                                            train_sizes=train_size, scoring='accuracy', verbose=verbose)
    #   http://scikit-learn.org/stable/modules/model_evaluation.html#scoring-parameter      scoring
    train_score_mean = train_scores.mean(axis=1)
    train_size_std = train_scores.std(axis=1)
    test_score_mean = np.mean(test_scores, axis=1)
    test_score_std = np.std(test_scores, axis=1)

    plt.figure()
    plt.fill_between(train_sizes, train_score_mean+train_size_std, train_score_mean-train_size_std, color='blue', alpha=0.1)
    plt.fill_between(train_sizes, test_score_mean+test_score_std, test_score_mean-test_score_std, color='red', alpha=0.1)
    plt.plot(train_sizes, train_score_mean, 'o-', color='blue', label='training score')
    plt.plot(train_sizes, test_score_mean, 'o-', color='red', label='testing score')

    plt.xlabel('xlabel')
    plt.ylabel('ylabel')
    plt.title('learning_curve')
    plt.legend(loc='best')
    plt.grid()
    plt.show()

#説明:上記のコードの一部はネットワークから来ている可能性があります.権利侵害がある場合は、削除に連絡してください.