1. 程式人生 > >吳裕雄 python 機器學習——人工神經網絡感知機學習算法的應用

吳裕雄 python 機器學習——人工神經網絡感知機學習算法的應用

sgd 加載 pyplot 樣本 rand 列表 mes gen port

import numpy as np

from matplotlib import  pyplot as plt
from sklearn import neighbors, datasets
from matplotlib.colors import ListedColormap
from sklearn.neural_network import MLPClassifier

## 加載數據集
np.random.seed(0)
# 使用 scikit-learn  自帶的 iris 數據集
iris=datasets.load_iris() 
# 使用前兩個特征,方便繪圖
X=iris.data[:,0:2] # 標記值 Y=iris.target data=np.hstack((X,Y.reshape(Y.size,1))) # 混洗數據。因為默認的iris 數據集:前50個數據是類別0,中間50個數據是類別1,末尾50個數據是類別2.混洗將打亂這個順序 np.random.shuffle(data) X=data[:,:-1] Y=data[:,-1] train_x=X[:-30] train_y=Y[:-30] # 最後30個樣本作為測試集 test_x=X[-30:] test_y=Y[-30:] def plot_classifier_predict_meshgrid(ax,clf,x_min,x_max,y_min,y_max):
‘‘‘ 繪制 MLPClassifier 的分類結果 :param ax: Axes 實例,用於繪圖 :param clf: MLPClassifier 實例 :param x_min: 第一維特征的最小值 :param x_max: 第一維特征的最大值 :param y_min: 第二維特征的最小值 :param y_max: 第二維特征的最大值 :return: None ‘‘‘ plot_step = 0.02 # 步長 xx, yy = np.meshgrid(np.arange(x_min, x_max, plot_step),np.arange(y_min, y_max, plot_step)) Z
= clf.predict(np.c_[xx.ravel(), yy.ravel()]) Z = Z.reshape(xx.shape) # 繪圖 ax.contourf(xx, yy, Z, cmap=plt.cm.Paired) def plot_samples(ax,x,y): ‘‘‘ 繪制二維數據集 :param ax: Axes 實例,用於繪圖 :param x: 第一維特征 :param y: 第二維特征 :return: None ‘‘‘ n_classes = 3 # 顏色數組。每個類別的樣本使用一種顏色 plot_colors = "bry" for i, color in zip(range(n_classes), plot_colors): idx = np.where(y == i) # 繪圖 ax.scatter(x[idx, 0], x[idx, 1], c=color,label=iris.target_names[i], cmap=plt.cm.Paired) def mlpclassifier_iris(): ‘‘‘ 使用 MLPClassifier 預測調整後的 iris 數據集 ‘‘‘ fig=plt.figure() ax=fig.add_subplot(1,1,1) classifier=MLPClassifier(activation=logistic,max_iter=10000,hidden_layer_sizes=(30,)) classifier.fit(train_x,train_y) train_score=classifier.score(train_x,train_y) test_score=classifier.score(test_x,test_y) x_min, x_max = train_x[:, 0].min() - 1, train_x[:, 0].max() + 2 y_min, y_max = train_x[:, 1].min() - 1, train_x[:, 1].max() + 2 plot_classifier_predict_meshgrid(ax,classifier,x_min,x_max,y_min,y_max) plot_samples(ax,train_x,train_y) ax.legend(loc=best) ax.set_xlabel(iris.feature_names[0]) ax.set_ylabel(iris.feature_names[1]) ax.set_title("train score:%f;test score:%f"%(train_score,test_score)) plt.show() mlpclassifier_iris()

技術分享圖片

def mlpclassifier_iris_hidden_layer_sizes():
    ‘‘‘
    使用 MLPClassifier 預測調整後的 iris 數據集。考察不同的 hidden_layer_sizes 的影響

    :return: None
    ‘‘‘
    fig=plt.figure()
    # 候選的 hidden_layer_sizes 參數值組成的數組
    hidden_layer_sizes=[(10,),(30,),(100,),(5,5),(10,10),(30,30)] 
    for itx,size in enumerate(hidden_layer_sizes):
        ax=fig.add_subplot(2,3,itx+1)
        classifier=MLPClassifier(activation=logistic,max_iter=10000,hidden_layer_sizes=size)
        classifier.fit(train_x,train_y)
        train_score=classifier.score(train_x,train_y)
        test_score=classifier.score(test_x,test_y)
        x_min, x_max = train_x[:, 0].min() - 1, train_x[:, 0].max() + 2
        y_min, y_max = train_x[:, 1].min() - 1, train_x[:, 1].max() + 2
        plot_classifier_predict_meshgrid(ax,classifier,x_min,x_max,y_min,y_max)
        plot_samples(ax,train_x,train_y)
        ax.legend(loc=best)
        ax.set_xlabel(iris.feature_names[0])
        ax.set_ylabel(iris.feature_names[1])
        ax.set_title("layer_size:%s;train score:%f;test score:%f"%(size,train_score,test_score))
    plt.show()
    
mlpclassifier_iris_hidden_layer_sizes()

技術分享圖片

def mlpclassifier_iris_ativations():
    ‘‘‘
    使用 MLPClassifier 預測調整後的 iris 數據集。考察不同的 activation 的影響
    ‘‘‘
    fig=plt.figure()
    # 候選的激活函數字符串組成的列表
    ativations=["logistic","tanh","relu"] 
    for itx,act in enumerate(ativations):
        ax=fig.add_subplot(1,3,itx+1)
        classifier=MLPClassifier(activation=act,max_iter=10000,hidden_layer_sizes=(30,))
        classifier.fit(train_x,train_y)
        train_score=classifier.score(train_x,train_y)
        test_score=classifier.score(test_x,test_y)
        x_min, x_max = train_x[:, 0].min() - 1, train_x[:, 0].max() + 2
        y_min, y_max = train_x[:, 1].min() - 1, train_x[:, 1].max() + 2
        plot_classifier_predict_meshgrid(ax,classifier,x_min,x_max,y_min,y_max)
        plot_samples(ax,train_x,train_y)
        ax.legend(loc=best)
        ax.set_xlabel(iris.feature_names[0])
        ax.set_ylabel(iris.feature_names[1])
        ax.set_title("activation:%s;train score:%f;test score:%f"%(act,train_score,test_score))
    plt.show()
    
mlpclassifier_iris_ativations()

技術分享圖片

def mlpclassifier_iris_algorithms():
    ‘‘‘
    使用 MLPClassifier 預測調整後的 iris 數據集。考察不同的 algorithm 的影響

    :return: None
    ‘‘‘
    fig=plt.figure()
    algorithms=["lbfgs","sgd","adam"] # 候選的算法字符串組成的列表
    for itx,algo in enumerate(algorithms):
        ax=fig.add_subplot(1,3,itx+1)
        classifier=MLPClassifier(activation="tanh",max_iter=10000,hidden_layer_sizes=(30,),solver=algo)
        classifier.fit(train_x,train_y)
        train_score=classifier.score(train_x,train_y)
        test_score=classifier.score(test_x,test_y)
        x_min, x_max = train_x[:, 0].min() - 1, train_x[:, 0].max() + 2
        y_min, y_max = train_x[:, 1].min() - 1, train_x[:, 1].max() + 2
        plot_classifier_predict_meshgrid(ax,classifier,x_min,x_max,y_min,y_max)
        plot_samples(ax,train_x,train_y)
        ax.legend(loc=best)
        ax.set_xlabel(iris.feature_names[0])
        ax.set_ylabel(iris.feature_names[1])
        ax.set_title("algorithm:%s;train score:%f;test score:%f"%(algo,train_score,test_score))
    plt.show()
    
mlpclassifier_iris_algorithms()

技術分享圖片

def mlpclassifier_iris_eta():
    ‘‘‘
    使用 MLPClassifier 預測調整後的 iris 數據集。考察不同的學習率的影響
    ‘‘‘
    fig=plt.figure()
    etas=[0.1,0.01,0.001,0.0001] # 候選的學習率值組成的列表
    for itx,eta in enumerate(etas):
        ax=fig.add_subplot(2,2,itx+1)
        classifier=MLPClassifier(activation="tanh",max_iter=1000000,
        hidden_layer_sizes=(30,),solver=sgd,learning_rate_init=eta)
        classifier.fit(train_x,train_y)
        iter_num=classifier.n_iter_
        train_score=classifier.score(train_x,train_y)
        test_score=classifier.score(test_x,test_y)
        x_min, x_max = train_x[:, 0].min() - 1, train_x[:, 0].max() + 2
        y_min, y_max = train_x[:, 1].min() - 1, train_x[:, 1].max() + 2
        plot_classifier_predict_meshgrid(ax,classifier,x_min,x_max,y_min,y_max)
        plot_samples(ax,train_x,train_y)
        ax.legend(loc=best)
        ax.set_xlabel(iris.feature_names[0])
        ax.set_ylabel(iris.feature_names[1])
        ax.set_title("eta:%f;train score:%f;test score:%f;iter_num:%d"%(eta,train_score,test_score,iter_num))
    plt.show()
    
mlpclassifier_iris_eta()

技術分享圖片

吳裕雄 python 機器學習——人工神經網絡感知機學習算法的應用