機器學習之鳶尾花-樸素貝葉斯方法


在全部的機器學習分類算法中,樸素貝葉斯和其餘絕大多數的分類算法都不一樣。算法

對於大多數的分類算法,好比決策樹,KNN,邏輯迴歸,支持向量機等,他們都是判別方法,也就是直接學習出特徵輸出Y和特徵X之間的關係,要麼是決策函數Y=f(X),要麼是條件分佈P(Y|X)。微信

樸素貝葉斯方法是基於貝葉斯定理的一組有監督學習算法,即「簡單」地假設每對特徵之間相互獨立,也就是直接找出特徵輸出Y和特徵X的聯合分佈P(X,Y),而後用P(Y|X)=P(X,Y)/P(X)得出。app

樸素貝葉斯很直觀,計算量也不大,在不少領域有普遍的應用dom

在scikit-learn中,一共有3個樸素貝葉斯的分類算法類。機器學習

分別是GaussianNB,MultinomialNB和BernoulliNB。函數

    其中GaussianNB就是先驗爲高斯分佈的樸素貝葉斯,學習

    MultinomialNB就是先驗爲多項式分佈的樸素貝葉斯,測試

    而BernoulliNB就是先驗爲伯努利分佈的樸素貝葉斯。spa

就鳶尾花例子而言,高斯樸素貝葉斯的準確率>多項分佈樸素貝葉斯準確率>伯努利樸素貝葉斯準確率,大概和數據的分佈狀況有關,後續專門再針對性的評估和學習一下.net

以下:

# 在全部的機器學習分類算法中,樸素貝葉斯和其餘絕大多數的分類算法都不一樣。
# 對於大多數的分類算法,好比決策樹,KNN,邏輯迴歸,支持向量機等,他們都是判別方法,也就是直接學習出特徵輸出Y和特徵X之間的關係,要麼是決策函數Y=f(X),要麼是條件分佈P(Y|X)。
# 樸素貝葉斯方法是基於貝葉斯定理的一組有監督學習算法,即「簡單」地假設每對特徵之間相互獨立,也就是直接找出特徵輸出Y和特徵X的聯合分佈P(X,Y),而後用P(Y|X)=P(X,Y)/P(X)得出。
# 樸素貝葉斯很直觀,計算量也不大,在不少領域有普遍的應用
# 在scikit-learn中,一共有3個樸素貝葉斯的分類算法類。
# 分別是GaussianNB,MultinomialNB和BernoulliNB。
#     其中GaussianNB就是先驗爲高斯分佈的樸素貝葉斯,
#     MultinomialNB就是先驗爲多項式分佈的樸素貝葉斯,
#     而BernoulliNB就是先驗爲伯努利分佈的樸素貝葉斯。
# GaussianNB類參數
#     GaussianNB類的主要參數僅有一個,即先驗機率priors,對應Y的各個類別的先驗機率P(Y=Ck)。
#         這個值默認不給出,若是不給出此時P(Y=Ck)=mk/m。
#         其中m爲訓練集樣本總數量,mk爲輸出爲第k類別的訓練集樣本數。
#         若是給出的話就以priors 爲準。
#     在使用GaussianNB的fit方法擬合數據後,咱們能夠進行預測。
#         此時預測有三種方法,包括predict,predict_log_proba和predict_proba。
#         GaussianNB一個重要的功能是有 partial_fit方法,這個方法的通常用在若是訓練集數據量很是大,一次不能所有載入內存的時候。
#         這時咱們能夠把訓練集分紅若干等分,重複調用partial_fit來一步步的學習訓練集
# MultinomialNB類參數
#     MultinomialNB參數比GaussianNB多,可是一共也只有僅僅3個。
#         其中,參數alpha即爲上面的常數λ,若是你沒有特別的須要,用默認的1便可。
#         若是發現擬合的很差,須要調優時,能夠選擇稍大於1或者稍小於1的數。
#         布爾參數fit_prior表示是否要考慮先驗機率,若是是false,則全部的樣本類別輸出都有相同的類別先驗機率。
#         不然能夠本身用第三個參數class_prior輸入先驗機率,或者不輸入第三個參數class_prior讓MultinomialNB本身從訓練集樣原本計算先驗機率,此時的先驗機率爲P(Y=Ck)=mk/m。
#         其中m爲訓練集樣本總數量,mk爲輸出爲第k類別的訓練集樣本數。
# BernoulliNB類參數
#     BernoulliNB一共有4個參數,其中3個參數的名字和意義和MultinomialNB徹底相同。
#         惟一增長的一個參數是binarize。
#         這個參數主要是用來幫BernoulliNB處理二項分佈的,能夠是數值或者不輸入。
#         若是不輸入,則BernoulliNB認爲每一個數據特徵都已是二元的。
#         不然的話,小於binarize的會歸爲一類,大於binarize的會歸爲另一類。
from sklearn.naive_bayes import GaussianNB,MultinomialNB,BernoulliNB
def test_naive_bayes(X_train, X_test, y_train, y_test,X,y):
    # 訓練數據和測試數據進行標準化
    # sc = StandardScaler()
    # X_train = sc.fit_transform(X_train)
    # X_test = sc.transform(X_test)
    scores_train=[]
    scores_test=[]
    names= ['GaussianNB''MultinomialNB''BernoulliNB' ]
    classifiers = [
        GaussianNB(),
        MultinomialNB(),
        BernoulliNB()
    ]

    h=0.02
    X= X[:,:2]
    #X = StandardScaler().fit_transform(X)
    # X_train = StandardScaler().fit_transform(X_train)
    # X_test = StandardScaler().fit_transform(X_test)
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.4, random_state=42)
    x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
    y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
                         np.arange(y_min, y_max, h))

    # just plot the dataset first
    #cmap_light = ListedColormap(['#AAAAFF', '#AAFFAA', '#FFAAAA'])  # 給不一樣區域賦以顏色
    #cmap_bold = ListedColormap(['#FF0000', '#003300', '#0000FF'])  # 給不一樣屬性的點賦以顏色
    cmap_bold = ListedColormap(['#AAAAFF''#AAFFAA''#FFAAAA'])  # 給不一樣區域賦以顏色
    cmap_light = ListedColormap(['#FF0000''#00FF00''#0000FF'])  # 給不一樣屬性的點賦以顏色
    plt.figure(figsize=(10,6))
    plt.title("Input data")
    plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=cmap_light,edgecolors='k')
    # Plot the testing points
    plt.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=cmap_light, alpha=0.5,edgecolors='k')
    plt.xlim(xx.min(), xx.max())
    plt.ylim(yy.min(), yy.max())
    plt.xticks(())
    plt.yticks(())
    plt.show()
    i=1
    figure = plt.figure(figsize=(106))
    for name, clf in zip(names, classifiers):
        ax = plt.subplot(22, i)
        clf.fit(X_train, y_train)
        score = clf.score(X_test, y_test)
        print('模型名稱:{},得分={}'.format(name,score))
        # 模型名稱:GaussianNB,得分=0.8333333333333334
        # 模型名稱:MultinomialNB,得分=0.4666666666666667
        # 模型名稱:BernoulliNB,得分=0.3
        #Z = clf.predict_proba(np.c_[xx.ravel(), yy.ravel()])[:, 1]
        Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
        Z = Z.reshape(xx.shape)
        ax.contourf(xx, yy, Z, cmap=cmap_bold, alpha=.6)
        #plt.pcolormesh(xx, yy, Z, cmap=cmap_bold, alpha=.6)
        # Plot the training points
        ax.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=cmap_light,edgecolors='k')
        # Plot the testing points
        ax.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=cmap_light,edgecolors='k', alpha=0.6)

        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() - .3, yy.min() + .3, ('%.2f' % score).lstrip('0'), size=15, horizontalalignment='right')
        i=i+1
    plt.show()
if __name__=='__main__':
    X_train,X_test,y_train,y_test,X,y=load_data(iris)
    # -----------------------邏輯迴歸--------------------------------
    # test_LogisticRegression(X_train,X_test,y_train,y_test)
    # test_LogisticRegression_C(X_train, X_test, y_train, y_test)
    # test_LogisticRegression_Cpenaltyssolvers(X_train, X_test, y_train, y_test)
    # test_LogisticRegression_Cmulti_classsolvers(X_train, X_test, y_train, y_test)
    # test_LogisticRegression_penaltyssolvers(X_train, X_test, y_train, y_test)
    # test_LogisticRegression_multi_classssolvers(X_train, X_test, y_train, y_test)
    # test_LogisticRegression_best(X_train, X_test, y_train, y_test)
    # ---------------------K近鄰算法-----------------------
    #test_KNeighborsClassifier(X_train, X_test, y_train, y_test, X, y)

    # ------------------樸素貝葉斯-----------------------
    # 高斯樸素貝葉斯
    # 多項分佈樸素貝葉斯
    # 伯努利樸素貝葉斯
    test_naive_bayes(X_train, X_test, y_train, y_test, X, y)
    # ---------------------決策樹-----------------------

    # ---------------------K Means聚類-----------------------

    # ------------------高斯混合模型聚類-----------------------

    # -------------------SVM支撐向量機-----------------------



長按二維碼關注「追夢IT人」


本文分享自微信公衆號 - 追夢IT人(baoqiangwang2020)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索