机器学习之鸢尾花-朴素贝叶斯方法


在全部的机器学习分类算法中,朴素贝叶斯和其余绝大多数的分类算法都不一样。算法

对于大多数的分类算法,好比决策树,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源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索