朴素贝叶斯法(Naive Bayes model 简称 NBM )是基于「贝叶斯定理」与「特征条件独立假设」的分类方法。
「贝叶斯定理」:也叫贝叶斯公式,用来描述两个「条件概率」之间的关系。比如你看到一个人总是做好事,那这个人多半会是一个好人。
「特征条件独立假设」:为了解决「参数」成指数增长过多的问题,朴素贝叶斯在贝叶斯定理的基础上,假设特征的条件都是「相互独立」的。
「多项式」模型的朴素贝叶斯分类器,用于具有「离散」特征的分类,比如文本分类的单词计数,需要整数特征计数。
sklearn.naive_bayes.MultinomialNB()
参数
函数
这里我们使用sklearn自带的「鸢尾花」数据集。
from sklearn import datasets
# 1、获取数据集
iris = datasets.load_iris()
print(iris.data)
输出:
[[5.1 3.5 1.4 0.2]
[4.9 3. 1.4 0.2]
......
[5.9 3. 5.1 1.8]]
接下来,我们对数据集进行「划分」,传入特征值和目标值,按照默认比例划分(25%测试集、75%训练集)
from sklearn import datasets
from sklearn import model_selection
# 1、获取数据集
iris = datasets.load_iris()
# 2、划分数据集
x_train, x_test, y_train, y_test = model_selection.train_test_split(iris.data, iris.target)
print('训练集特征值:', len(x_train))
print('测试集特征值:', len(x_test))
print('训练集目标值:', len(y_train))
print('测试集目标值:', len(y_test))
输出:
训练集特征值: 112
测试集特征值: 38
训练集目标值: 112
测试集目标值: 38
从结果可以看到,训练集划分了112组、测试集划分了38组,符合预期。
接下来,我们对特征值进行「归一化」处理,需要注意的是,训练集和测试集的处理必须完全相同。
from sklearn import datasets
from sklearn import model_selection
from sklearn import preprocessing
# 1、获取数据集
iris = datasets.load_iris()
# 2、划分数据集
x_train, x_test, y_train, y_test = model_selection.train_test_split(iris.data, iris.target)
# 3、特征归一化
mm = preprocessing.MinMaxScaler()
x_train = mm.fit_transform(x_train)
x_test = mm.fit_transform(x_test)
print(x_train)
print(x_test)
输出:
[[0.8 0.5 0.87719298 0.70833333]
[0.42857143 0.5 0.66666667 0.70833333]
......
从结果我们可以看到,特征值发生了相应的变化。
接下来,实例化贝叶斯的类对象,把训练集的特征值目标值传进去,进行训练。
from sklearn import datasets
from sklearn import model_selection
from sklearn import preprocessing
from sklearn import naive_bayes
# 1、获取数据集
iris = datasets.load_iris()
# 2、划分数据集
x_train, x_test, y_train, y_test = model_selection.train_test_split(iris.data, iris.target)
# 3、特征归一化
mm = preprocessing.MinMaxScaler()
x_train = mm.fit_transform(x_train)
x_test = mm.fit_transform(x_test)
# 4、贝叶斯算法处理
estimator = naive_bayes.MultinomialNB()
estimator.fit(x_train, y_train)
# 5、模型评估
y_predict = estimator.predict(x_test)
print('真实值和预测值对比', y_predict == y_test)
score = estimator.score(x_test, y_test)
print('准确率', score)
输出:
真实值和预测值对比 [ True False True False True False True True True True False True
False False False False False True False True False True True True
True True True True True False False False True True True True
True False]
准确率 0.6052631578947368
MultinomialNB的训练集数据不能为「负数」,否则会报错:Negative values in data passed to MultinomialNB 。
比如标准化处理特征时,会出现负数结果,就会报错,可以改用归一化。