这个也是模式识别的小作业,利用朴素贝叶斯实现森林分类,不明白朴素贝叶斯的同学推荐去看看西瓜书,本文的实现方法和书上一致。PS:转载请注明本文链接
1.数据集下载地址
2.相关资源
我的另一篇博文是利用BP神经网络实现相同任务,如下:
注解超详细的不借助框架实现带dropout的BP神经网络python代码
3.代码运行结果
先放一个代码运行完的结果,证明这个代码是可以运行的
4.实现代码
# 导入包
import pandas as pd
import numpy as np
import time
def load_datasets(filepath):
"""
功能:
读取csv文件数据并进行分割,分割为特征集和标签集
输入参数:
filepath - 数据文件路径
返回值:
feature - 特征集,一个m*n矩阵,m为样本数,n为特征维度
label - 标签集,一个m*1的矩阵,m为样本数,1为标签维度,值为0,1,2,3
"""
dataset = pd.read_csv(filepath) # 读取csv文件
dataset['class'] = dataset['class'].map({
"s ": 0, "h ": 1, "d ": 2, "o ": 3}) # 将字符转换为数值,注意字符后面的空格不能去掉,这是一个坑
label = dataset.loc[:, ['class']] # 读取标签,数据类型为DataFrame
label = np.array(label) # 转换为array
feature = dataset.iloc[:, 1:dataset.shape[1]] # 将特征数据分割出来
feature = np.array(feature) # 转换为array
return feature, label # (198, 27) (198, 1)
def random_dataset(train_x, train_y, test_x, test_y, seed):
"""
功能:
打乱训练集和测试集数据,使数据同分布
输入参数:
train_x - 训练特征集,一个m1*n矩阵,m1为训练样本数,n为特征维度
train_y - 训练标签集,一个m1*1阵,m1为训练样本数
test_x - 测试特征集,一个m2*n矩阵,m2为测试样本数,n为特征维度
test_y - 测试标签集,一个m2*1矩阵,m2为测试样本数
seed - 程序随机种子
返回值:
new_train_x - 打乱后的训练特征集,一个m1*n矩阵,m1为训练样本数,n为特征维度
new_train_y - 打乱后的训练标签集,一个m1*1阵,m1为训练样本数
new_test_x - 打乱后的测试特征集,一个m2*n矩阵,m2为测试样本数,n为特征维度
new_test_y - 打乱后的测试标签集,一个m2*1矩阵,m2为测试样本数
"""
if seed > 0:
np.random.seed(seed) # 随机种子大于0,就打乱数据集,设置随机种子
m = train_x.shape[0] # 训练样本数
new_x = np.concatenate((train_x, test_x), axis=0) # 将特征集进行拼接
new_y = np.concatenate((train_y, test_y), axis=0