朴素贝叶斯-使用训练样本量来画学习曲线

#绘制学习曲线
import numpy as np 
import matplotlib.pyplot as plt
from sklearn.naive_bayes import GaussianNB
from sklearn.model_selection import ShuffleSplit
from sklearn.svm import SVC
from sklearn.ensemble import RandomForestClassifier as RFC
from sklearn.tree import DecisionTreeClassifier as DTC
from sklearn.linear_model import LogisticRegression as LR
from sklearn.datasets import load_digits
from sklearn.model_selection  import learning_curve
from time import time
import datetime
#定义一个绘制学习曲线的函数
def plot_learning_curve(estimator,title,X,y,
                       ax,#选择子图
                       ylim=None,#设置纵坐标范围
                       cv=None,#交叉验证
                       n_jobs=None#设定线程
                       ): 
    
    train_sizes,train_scores,test_scores=learning_curve(estimator,X,y,cv=cv,n_jobs=4)
    ax.set_title(title)
    if ylim is not None:
        ax.set_ylim(*ylim)
    ax.set_xlabel("Training examples")
    ax.set_ylabel("Score")
    ax.grid()#显示网格作为背景
    ax.plot(train_sizes,np.mean(train_scores,axis=1),'o-',color='r',label="Training sore")
    ax.plot(train_sizes,np.mean(test_scores,axis=1),'o-',color='g',label="Test sore")
    #因为是分成50份,所以会有50个结果,所以要取均值,另外,o-表示以点横的样子画图
    ax.legend(loc="best")
    return ax
  

#把数据集分成50分,其中百分之20是测试集,
digits=load_digits()
X,y=digits.data,digits.target
title=["Naive Bayes","DecisionTree","SVM,RBF kernel","RandomForest","Logistic"]
model=[GaussianNB(),DTC(),SVC(gamma=0.001),RFC(n_estimators=50),LR(C=0.1,solver="lbfgs")]
cv=ShuffleSplit(n_splits=50,test_size=0.2,random_state=0)
fig,axes=plt.subplots(1,5,figsize=(30,6))#设置多个子图,一行5列
#函数返回一个figure图像和子图ax的array列表
fig, axes = plt.subplots(1,5,figsize=(30,6))
for ind,title_,estimator in zip(range(len(title)),title,model):
    times = time()
    plot_learning_curve(estimator, title_, X, y,
    ax=axes[ind], ylim = [0.7, 1.05],n_jobs=4, cv=cv)
    print("{}:{}".format(title_,datetime.datetime.fromtimestamp(time()-
    times).strftime("%M:%S:%f")))
plt.show()#注意缩进

朴素贝叶斯-使用训练样本量来画学习曲线_第1张图片
决策树为什么快呢:没有计算所有特征的信息熵,而是是从中随机选择的几个,随着样本量增大会越来越慢
朴素贝叶斯:再很少的样本上得到不错的效果,随着样本量增大会比决策树跑的更快一些,
因为当特征很大的时候,决策树是万万不敢只选择几个特征进行建模的,但是,朴素贝叶斯仍然会有不错的结果
逻辑回归为什么慢:受到的特征过多,稀疏矩阵的原因,再线性上比较快
再训练集上:其他算法都是百分之百,但是贝叶斯为什么达不到百分之百,而且还在下降,说明贝叶斯不是一个很好的分类器,而且随着样本量增加,需要学习的东西越来越多,贝叶斯学习能力下降
再过拟合方面:过拟合就是训练集上的表现比测试集上的表现好很多的现象,也就是两条线的差异
总之,如果追求概率的话,再能使用逻辑回归的情况下都会使用逻辑回归,因为当数据量比较大的时候,贝叶斯测试结果已经到了极限,没有调参的空间。数据高维,很多的时候,贝叶斯很快

你可能感兴趣的:(朴素贝叶斯-使用训练样本量来画学习曲线)