在之前的教程章节中,我们从头开始编写了朴素贝叶斯分类器。在本部分关于使用 Python 进行机器学习的教程中,我们将向您展示如何使用现成的分类器。Scikit 模块提供了“开箱即用”的朴素贝叶斯分类器。

我们的第一个例子使用模型中包含的“鸢尾花数据集”来训练和测试分类器。

Python
# 高斯朴素贝叶斯
from sklearn import datasets
from sklearn import metrics
from sklearn.naive_bayes import GaussianNB

# 加载鸢尾花数据集
dataset = datasets.load_iris()

# 用数据拟合朴素贝叶斯模型
model = GaussianNB()
model.fit(dataset.data, dataset.target)
print(model)

# 进行预测
expected = dataset.target
predicted = model.predict(dataset.data)

# 总结模型的拟合情况
print(metrics.classification_report(expected, predicted))
print(metrics.confusion_matrix(expected, predicted))

Output:

GaussianNB()
              precision    recall  f1-score   support

           0       1.00      1.00      1.00        50
           1       0.94      0.94      0.94        50
           2       0.94      0.94      0.94        50

avg / total    0.96      0.96      0.96       150

[[50  0  0]
 [ 0 47  3]
 [ 0  3 47]]

在下一个示例中,我们使用教程上一章中的人物数据来训练另一个分类器:

Python
import numpy as np

def prepare_person_dataset(fname):
    genders = ["male", "female"]
    persons = []
    with open(fname) as fh:
        for line in fh:
            persons.append(line.strip().split())
    firstnames = []
    dataset = [] # weight and height
    for person in persons:
        firstnames.append( (person[0], person[4]) )
        height_weight = (float(person[2]), float(person[3]))
        dataset.append( (height_weight, person[4]))
    return dataset

learnset = prepare_person_dataset("data/person_data.txt")
testset = prepare_person_dataset("data/person_data_testset.txt")
print(learnset)

Output:

[((184.0, 73.0), 'male'), ((149.0, 52.0), 'female'), ((174.0, 63.0), 'female'), ((175.0, 67.0), 'male'), ((183.0, 81.0), 'female'), ((187.0, 60.0), 'male'), ((192.0, 96.0), 'male'), ((204.0, 91.0), 'male'), ((180.0, 66.0), 'male'), ((184.0, 52.0), 'male'), ((174.0, 53.0), 'male'), ((177.0, 91.0), 'male'), ((138.0, 37.0), 'female'), ((200.0, 82.0), 'male'), ((193.0, 79.0), 'male'), ((189.0, 79.0), 'male'), ((145.0, 59.0), 'female'), ((188.0, 53.0), 'male'), ((187.0, 81.0), 'male'), ((187.0, 99.0), 'male'), ((190.0, 81.0), 'male'), ((161.0, 48.0), 'female'), ((179.0, 75.0), 'female'), ((180.0, 67.0), 'male'), ((155.0, 48.0), 'male'), ((201.0, 122.0), 'male'), ((162.0, 62.0), 'female'), ((148.0, 49.0), 'female'), ((171.0, 50.0), 'male'), ((196.0, 86.0), 'female'), ((163.0, 46.0), 'female'), ((159.0, 37.0), 'female'), ((163.0, 53.0), 'male'), ((150.0, 39.0), 'female'), ((170.0, 56.0), 'female'), ((191.0, 55.0), 'male'), ((175.0, 37.0), 'male'), ((169.0, 78.0), 'female'), ((167.0, 59.0), 'female'), ((170.0, 78.0), 'male'), ((178.0, 79.0), 'male'), ((168.0, 71.0), 'female'), ((170.0, 37.0), 'female'), ((167.0, 58.0), 'female'), ((152.0, 43.0), 'female'), ((191.0, 81.0), 'male'), ((155.0, 48.0), 'female'), ((176.0, 61.0), 'male'), ((151.0, 41.0), 'female'), ((166.0, 59.0), 'female'), ((168.0, 46.0), 'male'), ((165.0, 65.0), 'female'), ((169.0, 67.0), 'male'), ((158.0, 43.0), 'female'), ((173.0, 61.0), 'male'), ((180.0, 74.0), 'male'), ((212.0, 59.0), 'male'), ((152.0, 62.0), 'female'), ((189.0, 67.0), 'male'), ((159.0, 56.0), 'female'), ((163.0, 58.0), 'female'), ((174.0, 45.0), 'female'), ((174.0, 69.0), 'male'), ((167.0, 47.0), 'male'), ((131.0, 37.0), 'female'), ((154.0, 74.0), 'female'), ((159.0, 59.0), 'female'), ((159.0, 58.0), 'female'), ((177.0, 83.0), 'female'), ((193.0, 96.0), 'male'), ((180.0, 83.0), 'female'), ((164.0, 54.0), 'male'), ((164.0, 64.0), 'female'), ((171.0, 52.0), 'male'), ((163.0, 41.0), 'female'), ((165.0, 30.0), 'male'), ((161.0, 61.0), 'female'), ((198.0, 75.0), 'male'), ((183.0, 70.0), 'female'), ((185.0, 71.0), 'male'), ((175.0, 58.0), 'male'), ((195.0, 89.0), 'male'), ((170.0, 66.0), 'female'), ((167.0, 61.0), 'female'), ((166.0, 65.0), 'female'), ((180.0, 88.0), 'female'), ((164.0, 55.0), 'male'), ((161.0, 53.0), 'female'), ((187.0, 76.0), 'male'), ((170.0, 63.0), 'female'), ((192.0, 101.0), 'male'), ((175.0, 56.0), 'male'), ((190.0, 100.0), 'male'), ((164.0, 63.0), 'male'), ((172.0, 61.0), 'female'), ((168.0, 69.0), 'female'), ((156.0, 51.0), 'female'), ((167.0, 40.0), 'female'), ((161.0, 18.0), 'male'), ((167.0, 56.0), 'female')]
Python
# 高斯朴素贝叶斯
from sklearn import datasets
from sklearn import metrics
from sklearn.naive_bayes import GaussianNB

model = GaussianNB()
#print(dataset.data, dataset.target)
w, l = zip(*learnset) # w: features (height, weight), l: labels (gender)
w = np.array(w)
l = np.array(l)
model.fit(w, l)
print(model)

w, l = zip(*testset)
w = np.array(w)
l = np.array(l)
predicted = model.predict(w)
print(predicted)
print(l)

# 总结模型的拟合情况
print(metrics.classification_report(l, predicted))
print(metrics.confusion_matrix(l, predicted))

Output:

GaussianNB()
['female' 'male' 'male' 'female' 'female' 'male' 'female' 'female' 'female'
 'female' 'female' 'female' 'female' 'female' 'male' 'female' 'male'
 'female' 'female' 'female' 'male' 'female' 'female' 'male' 'male' 'female'
 'female' 'male' 'male' 'male' 'female' 'female' 'male' 'male' 'male'
 'female' 'female' 'male' 'female' 'male' 'male' 'female' 'female' 'male'
 'female' 'male' 'male' 'female' 'male' 'female' 'female' 'female' 'male'
 'female' 'female' 'male' 'female' 'female' 'male' 'female' 'female' 'male'
 'female' 'female' 'female' 'female' 'male' 'female' 'female' 'fem
ale'
 'female' 'female' 'male' 'male' 'female' 'female' 'male' 'male'
 'female'
 'female' 'male' 'male' 'female' 'male' 'male' 'male' 'female' 'ma
le'
 'female' 'female' 'male' 'male' 'female' 'male' 'female' 'femal
e' 'female'
 'male' 'female' 'male']
['female' 'male' 'male' 'female' 'female' 'male' 'male' 'male' 'fe
male'
 'female' 'female' 'female' 'female' 'female' 'male' 'male' 'mal
e' 'female'
 'female' 'female' 'male' 'female' 'female' 'male' 'male' 'femal
e' 'male'
 'female' 'male' 'female' 'male' 'male' 'male' 'male' 'female' 'fe
male'
 'female' 'male' 'male' 'female' 'male' 'female' 'male' 'male' 'fe
male'
 'male' 'female' 'male' 'female' 'female' 'female' 'male' 'male'
 'male'
 'male' 'male' 'female' 'male' 'male' 'female' 'female' 'female'
 'male'
 'female' 'male' 'female' 'male' 'female' 'male' 'female' 'femal
e' 'female'
 'male' 'male' 'male' 'female' 'male' 'male' 'female' 'female' 'ma
le'
 'male' 'female' 'female' 'male' 'male' 'female' 'male' 'female'
 'male'
 'male' 'female' 'female' 'male' 'male' 'female' 'female' 'male'
 'female'
 'female']
              precision    recall  f1-score   support

      female       0.68      0.80      0.73        50
        male       0.76      0.62      0.68        50

    accuracy                           0.71       100
   macro avg       0.72      0.71      0.71       100
weighted avg       0.72      0.71      0.71       100

[[40 10]
 [19 31]]

We have written Naive Bayes Classifiers
from scratch in our previous chapter of
our tutorial. In this part of the tutorial on
Machine Learning with Python, we want
to show you how to use ready-made
classifiers. The module Scikit provides
naive Bayes classifiers "off the rack".
Our first example uses the "iris dataset"
contained in the model to train and test the
classifier
# Gaussian Naive Bayes
from sklearn import datas
ets
from sklearn import metri
cs
from sklearn.naive_bayes
import GaussianNB
# load the iris datasets
dataset = datasets.load_i
ris()
# fit a Naive Bayes mode
l to the data
model = GaussianNB()
model.fit(dataset.data, dataset.target)
print(model)
# make predictions
expected = dataset.target
predicted = model.predict(dataset.data)
# summarize the fit of the model
print(metrics.classification_report(expected, predicted))
print(metrics.confusion_matrix(expected, predicted))
316
GaussianNB()
precision
 recall
 f1-score
 support
0
 1.00
 1.00
 1.00
 50
1
 0.94
 0.94
 0.94
 50
2
 0.94
 0.94
 0.94
 50
avg / total
[[50 0 0]
[ 0 47 3]
[ 0 3 47]]
0.96
0.96
 0.96
150
We use our person data from the previous chapter of our tutorial to train another classifier in the next example:
import numpy as np
def prepare_person_dataset(fname):
genders = ["male", "female"]
persons = []
with open(fname) as fh:
for line in fh:
persons.append(line.strip().split())
firstnames = []
dataset = [] # weight and height
for person in persons:
firstnames.append( (person[0], person[4]) )
height_weight = (float(person[2]), float(person[3]))
dataset.append( (height_weight, person[4]))
return dataset
learnset = prepare_person_dataset("data/person_data.txt")
testset = prepare_person_dataset("data/person_data_testset.txt")
print(learnset)
317
[((184.0, 73.0), 'male'), ((149.0, 52.0), 'female'), ((174.0, 6
3.0), 'female'), ((175.0, 67.0), 'male'), ((183.0, 81.0), 'femal
e'), ((187.0, 60.0), 'male'), ((192.0, 96.0), 'male'), ((204.0, 9
1.0), 'male'), ((180.0, 66.0), 'male'), ((184.0, 52.0), 'male'),
((174.0, 53.0), 'male'), ((177.0, 91.0), 'male'), ((138.0, 37.0),
'female'), ((200.0, 82.0), 'male'), ((193.0, 79.0), 'male'), ((18
9.0, 79.0), 'male'), ((145.0, 59.0), 'female'), ((188.0, 53.0), 'm
ale'), ((187.0, 81.0), 'male'), ((187.0, 99.0), 'male'), ((190.0,
81.0), 'male'), ((161.0, 48.0), 'female'), ((179.0, 75.0), 'femal
e'), ((180.0, 67.0), 'male'), ((155.0, 48.0), 'male'), ((201.0, 12
2.0), 'male'), ((162.0, 62.0), 'female'), ((148.0, 49.0), 'femal
e'), ((171.0, 50.0), 'male'), ((196.0, 86.0), 'female'), ((163.0,
46.0), 'female'), ((159.0, 37.0), 'female'), ((163.0, 53.0), 'mal
e'), ((150.0, 39.0), 'female'), ((170.0, 56.0), 'female'), ((19
1.0, 55.0), 'male'), ((175.0, 37.0), 'male'), ((169.0, 78.0), 'fem
ale'), ((167.0, 59.0), 'female'), ((170.0, 78.0), 'male'), ((17
8.0, 79.0), 'male'), ((168.0, 71.0), 'female'), ((170.0, 37.0), 'f
emale'), ((167.0, 58.0), 'female'), ((152.0, 43.0), 'female'), ((1
91.0, 81.0), 'male'), ((155.0, 48.0), 'female'), ((176.0, 61.0),
'male'), ((151.0, 41.0), 'female'), ((166.0, 59.0), 'female'), ((1
68.0, 46.0), 'male'), ((165.0, 65.0), 'female'), ((169.0, 67.0),
'male'), ((158.0, 43.0), 'female'), ((173.0, 61.0), 'male'), ((18
0.0, 74.0), 'male'), ((212.0, 59.0), 'male'), ((152.0, 62.0), 'fem
ale'), ((189.0, 67.0), 'male'), ((159.0, 56.0), 'female'), ((16
3.0, 58.0), 'female'), ((174.0, 45.0), 'female'), ((174.0, 69.0),
'male'), ((167.0, 47.0), 'male'), ((131.0, 37.0), 'female'), ((15
4.0, 74.0), 'female'), ((159.0, 59.0), 'female'), ((159.0, 58.0),
'female'), ((177.0, 83.0), 'female'), ((193.0, 96.0), 'male'), ((1
80.0, 83.0), 'female'), ((164.0, 54.0), 'male'), ((164.0, 64.0),
'female'), ((171.0, 52.0), 'male'), ((163.0, 41.0), 'female'), ((1
65.0, 30.0), 'male'), ((161.0, 61.0), 'female'), ((198.0, 75.0),
'male'), ((183.0, 70.0), 'female'), ((185.0, 71.0), 'male'), ((17
5.0, 58.0), 'male'), ((195.0, 89.0), 'male'), ((170.0, 66.0), 'fem
ale'), ((167.0, 61.0), 'female'), ((166.0, 65.0), 'female'), ((18
0.0, 88.0), 'female'), ((164.0, 55.0), 'male'), ((161.0, 53.0), 'f
emale'), ((187.0, 76.0), 'male'), ((170.0, 63.0), 'female'), ((19
2.0, 101.0), 'male'), ((175.0, 56.0), 'male'), ((190.0, 100.0), 'm
ale'), ((164.0, 63.0), 'male'), ((172.0, 61.0), 'female'), ((16
8.0, 69.0), 'female'), ((156.0, 51.0), 'female'), ((167.0, 40.0),
'female'), ((161.0, 18.0), 'male'), ((167.0, 56.0), 'female')]
# Gaussian Naive Bayes
from sklearn import datasets
from sklearn import metrics
from sklearn.naive_bayes import GaussianNB
318
model = GaussianNB()
#print(dataset.data, dataset.target)
w, l = zip(*learnset)
w = np.array(w)
l = np.array(l)
model.fit(w,print(model)
l)
w, l = zip(*testset)
w = np.array(w)
l = np.array(l)
predicted = model.predict(w)
print(predicted)
print(l)
# summarize the fit of the model
print(metrics.classification_report(l, predicted))
print(metrics.confusion_matrix(l, predicted))
319
GaussianNB()
['female' 'male' 'male' 'female' 'female' 'male' 'female' 'femal
e' 'female'
'female' 'female' 'female' 'female' 'female' 'male' 'female' 'mal
e'
'female' 'female' 'female' 'male' 'female' 'female' 'male' 'mal
e' 'female'
'female' 'male' 'male' 'male' 'female' 'female' 'male' 'male' 'ma
le'
'female' 'female' 'male' 'female' 'male' 'male' 'female' 'femal
e' 'male'
'female' 'male' 'male' 'female' 'male' 'female' 'female' 'femal
e' 'male'
'female' 'female' 'male' 'female' 'female' 'male' 'female' 'femal
e' 'male'
'female' 'female' 'female' 'female' 'male' 'female' 'female' 'fem
ale'
'female' 'female' 'male' 'male' 'female' 'female' 'male' 'male'
'female'
'female' 'male' 'male' 'female' 'male' 'male' 'male' 'female' 'ma
le'
'female' 'female' 'male' 'male' 'female' 'male' 'female' 'femal
e' 'female'
'male' 'female' 'male']
['female' 'male' 'male' 'female' 'female' 'male' 'male' 'male' 'fe
male'
'female' 'female' 'female' 'female' 'female' 'male' 'male' 'mal
e' 'female'
'female' 'female' 'male' 'female' 'female' 'male' 'male' 'femal
e' 'male'
'female' 'male' 'female' 'male' 'male' 'male' 'male' 'female' 'fe
male'
'female' 'male' 'male' 'female' 'male' 'female' 'male' 'male' 'fe
male'
'male' 'female' 'male' 'female' 'female' 'female' 'male' 'male'
'male'
'male' 'male' 'female' 'male' 'male' 'female' 'female' 'female'
'male'
'female' 'male' 'female' 'male' 'female' 'male' 'female' 'femal
e' 'female'
'male' 'male' 'male' 'female' 'male' 'male' 'female' 'female' 'ma
le'
'male' 'female' 'female' 'male' 'male' 'female' 'male' 'female'
'male'
'male' 'female' 'female' 'male' 'male' 'female' 'female' 'male'
'female'
320
'female']
precision
 recall
 f1-score
 support
female
 0.68
 0.80
 0.73
 50
male
 0.76
 0.62
 0.68
 50
avg / total
 0.72
 0.71
 0.71
 100
[[40 10]
[19 31]]
In [ ]:
In [ ]:

 
Last modified: Wednesday, 2 July 2025, 12:51 PM