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

在所有的机器学习分类算法中,朴素贝叶斯和其他绝大多数的分类算法都不同。 对于大多数的分类算法,比如决策树,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就是先验为伯努利分布的朴素贝叶斯。 就鸢尾花例子而言,高斯朴素贝叶斯的准确率>多项分布朴素贝叶斯准确率>伯努利朴素贝叶斯准确率,大概和数据的分布情况有关,后续专门再针对性的评估和学习一下 如下:

# 在所有的机器学习分类算法中,朴素贝叶斯和其他绝大多数的分类算法都不同。

# 对于大多数的分类算法,比如决策树,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

136be34314a57ba454d97dfa8ef5d707.png

figure = plt.figure(figsize=(10, 6))

for name, clf in zip(names, classifiers):

ax = plt.subplot(2, 2, 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支撑向量机-----------------------

你可能感兴趣的:(鸢尾花python贝叶斯分类)