使用Python完成朴素贝叶斯算法实现周志华《机器学习》好瓜坏瓜分类
时间: 2023-12-05 07:33:52 浏览: 171
首先,我们需要加载数据集,好瓜坏瓜数据集可以在UCI机器学习库中找到,下载地址为:https://archive.ics.uci.edu/ml/datasets/Watermelon+Dataset+3.0。
数据集中包含17个属性,如下所示:
1. 编号
2. 色泽
3. 根蒂
4. 敲声
5. 纹理
6. 脐部
7. 触感
8. 密度
9. 含糖率
10. 类别
其中,前9个属性为特征,第10个属性为类别,表示该瓜是好瓜还是坏瓜。
接下来,我们先加载数据集,然后将数据集划分为训练集和测试集。代码如下:
```python
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
# 加载数据集
data = pd.read_csv('watermelon.csv')
# 划分训练集和测试集
train_data, test_data = train_test_split(data, test_size=0.3, random_state=1)
```
接着,我们需要对训练集进行处理,计算出每个特征在不同类别下出现的概率以及每个类别的概率。具体地,我们需要计算出以下三个概率:
1. P(c):类别为c的概率
2. P(x|c):在类别为c的情况下,特征x出现的概率
3. P(x):特征x出现的概率
其中,P(c)可以通过训练集中类别为c的样本数量除以总样本数量得到,P(x|c)可以通过训练集中类别为c且特征x出现的样本数量除以类别为c的样本数量得到,P(x)可以通过训练集中特征x出现的样本数量除以总样本数量得到。
代码如下:
```python
# 计算P(c)
def calc_pc(train_data):
pc = {}
for i in train_data['class'].unique():
pc[i] = (train_data['class']==i).sum() / train_data.shape[0]
return pc
# 计算P(x|c)
def calc_pxc(train_data):
pxc = {}
for c in train_data['class'].unique():
pxc[c] = {}
for column in train_data.columns[:-1]:
pxc[c][column] = {}
for value in train_data[column].unique():
pxc[c][column][value] = \
((train_data[column]==value) & (train_data['class']==c)).sum() \
/ (train_data['class']==c).sum()
return pxc
# 计算P(x)
def calc_px(train_data):
px = {}
for column in train_data.columns[:-1]:
px[column] = {}
for value in train_data[column].unique():
px[column][value] = (train_data[column]==value).sum() / train_data.shape[0]
return px
# 计算P(c)、P(x|c)和P(x)
pc = calc_pc(train_data)
pxc = calc_pxc(train_data)
px = calc_px(train_data)
```
最后,我们可以根据朴素贝叶斯算法,计算出测试集中每个样本属于不同类别的概率,并根据概率大小进行分类。代码如下:
```python
# 对测试集进行分类
def classify(test_data, pc, pxc, px):
y_pred = []
for i in test_data.index:
p = {}
for c in pc.keys():
p[c] = pc[c]
for column in test_data.columns[:-1]:
p[c] *= pxc[c][column][test_data.loc[i, column]] / px[column][test_data.loc[i, column]]
y_pred.append(max(p, key=p.get))
return y_pred
# 对测试集进行分类
y_pred = classify(test_data, pc, pxc, px)
# 计算分类准确率
acc = (y_pred==test_data['class']).sum() / test_data.shape[0]
print('Accuracy:', acc)
```
完整代码如下:
阅读全文