联合概率:两件事情同时发生的概率
条件概率:x的前提下y的取值概率
高斯朴素贝叶斯(服从正态分布)
prior | 可输入任何类数组结构,形状为n_classes 表示先验概率,如果指定,不根据数据调整先验,反之,根据数据自行调整计算先验 |
var_smoothing | 浮点数,可不填,默认=1e-9 将所有特征方差中最大的方差一某个比列添加到估计方差中。 |
import numpy as np
import matplotlib.pyplot as plt
from sklearn.naive_bayes import GaussianNB
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
digits = load_digits()
x,y = digits.data,digits.target
Xtrain,Xtest,Ytrain,Ytest = train_test_split(x,y,test_size=0.3,random_state=420)
# 建模
gnb = GaussianNB().fit(Xtrain,Ytrain)
acc_score = gnb.score(Xtest,Ytest) # 返回预测的精确性
acc_score
# 查看预测结果
y_pred = gnb.predict(Xtest)
y_pred
# 查看预测的概率结果
prob = gnb.predict_proba(Xtest)
prob
prob.shape
prob[1,:].sum()
prob.sum(axis=1)
from sklearn.metrics import confusion_matrix as CM
# 混淆矩阵
CM(Ytest,y_pred)
高斯朴素贝叶斯擅长的数据集
在环形数据上表现不好,在二分类数据和月亮型数据上表现优秀。
判断为线性可分数据,使用逻辑回归,判断不是线性可分的,先尝试使用支持向量机。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.naive_bayes import GaussianNB
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 sklearn.model_selection import ShuffleSplit
from time import time
import datetime
# 输入分类器、数据、交叉验证模式、以及其他参数,一次性画出所有学习曲线
# 找出每个图象所需要的横纵坐标 --learning_curve
# 需要绘制子图所在的画布 plt.figure()
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=n_jobs)
# n_jobs每次运行的时候允许算法使用的核心数量
# train_sizes 每次训练集和测试集建模后,训练集上的样本数量
# train_scores 训练集上的分数
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 score")
ax.plot(train_sizes,np.mean(test_scores,axis=1),'o-',color="g",label="Test score")
ax.legend(loc="best")
return ax
digits = load_digits()
x,y = digits.data,digits.target
titles = ["Naive Bayes","DecisionTree","SVM,RBF kernel","RandomForest","Logistic"]
model = [GaussianNB(),DTC(),SVC(gamma=0.001),RFC(n_estimators=50),LR(C=.1,solver="lbfgs")]
cv = ShuffleSplit(n_splits=50,test_size=0.2,random_state=0)
fig,axes = plt.subplots(1,5,figsize=(30,6))
for ind,titless,estimator in zip(range(len(titles)),titles,model):
times = time()
plot_learning_curve(estimator,titless,x,y,ax=axes[ind],ylim=[0.7, 1.05],n_jobs=4,cv=cv)
print(f"{titless}:{datetime.datetime.fromtimestamp(time()-times).strftime('%M:%S:%f')}")
plt.show()
随着样本量的增大,朴素贝叶斯比决策树跑得快
样本量越大时,对模型的拟合程度越差。
贝叶斯:速度快,效果一般,可调实性差。