【SCAU_educoder数据挖掘】scau数据挖掘实验1-1
任务描述
本关任务:根据所学知识完成贝叶斯分类。
相关知识
贝叶斯分类算法是统计学的一种分类方法,它是一类利用概率统计知识进行分类的算法。在许多场合,朴素贝叶斯(Naïve Bayes,NB)分类算法可以与决策树和神经网络分类算法相媲美,该算法能运用到大型数据库中,而且方法简单、分类准确率高、速度快。
鸢尾花介绍

sepal:萼片,petal:花瓣 鸢尾属(拉丁学名:Iris L.), 单子叶植物纲, 鸢尾科多年生草本植物, 开的花大而美丽, 观赏价值很高。 鸢尾属约300种, Iris数据集中包含了其中的三种: 山鸢尾(Setosa), 杂色鸢尾(Versicolour), 维吉尼亚鸢尾(Virginica), 每种50个数据, 共含150个数据。 在每个数据包含四个属性: 花萼长度,花萼宽度,花瓣长度,花瓣宽度, 可通过这四个属性预测鸢尾花卉属于 (山鸢尾, 杂色鸢尾, 维吉尼亚鸢尾) 哪一类。
数据集中部分数据如下图所示:

朴素贝叶斯分类
分类概念
什么是分类? 找出描述和区分数据类或概念的模型 ,以便能够使用模型预测类标号未知的对象的类标号 。
一般过程 1.学习阶段
- 建立描述预先定义的数据类或概念集的分类器 。
- 训练集 提供了每个训练元组的类标号,分类的学习过程也称为监督学习。
2.分类阶段
- 使用定义好的分类器进行分类的过程
分类中的训练集与测试集
训练集:

测试集: 一个收入中等、信用度良好的青年爱好游戏顾客。是否会购买电脑呢?
朴素贝叶斯模型
在介绍模型之前,我们先来看几组概念: 先验概率 :先验概率是根据以往经验和分析得到的概率,如全概率公式,它往往作为"由因求果"问题中的"因"出现的概率。 条件概率 :条件概率是指事件A在另外一个事件B已经发生条件下的发生概率。条件概率表示为:P(A|B) 后验概率 :后验概率是指在得到“结果”的信息后重新修正的概率,是“执果寻因”问题中的"果",即朴素贝叶斯模型得出的结果。
先验概率与后验概率有不可分割的联系,后验概率的计算要以先验概率为基础,可以根据通过贝叶斯公式,用先验概率和似然函数计算出来:

贝叶斯分类器总结
本质上是同时考虑了先验概率和似然概率的重要性。
特点:
- 属性可以离散、也可以连续
- 数学基础坚实、分类效率稳定
- 对缺失和噪声数据不太敏感
- 属性如果不相关,分类效果很好
分类评估过程 数据预处理→模型训练→模型调整→对新数据分类→模型评价

准确率评价 下图是某次分类的结果:

该分类的准确率计算公式为:

K折交叉验证 所谓K折交叉验证,就是将数据集等比例划分成K份,以其中的一份作为测试数据,其他的K-1份数据作为训练数据。然后,这样算是一次实验,而K折交叉验证只有实验K次才算完成完整的一次,也就是说交叉验证实际是把实验重复做了K次,每次实验都是从K个部分选取一份不同的数据部分作为测试数据(保证K个部分的数据都分别做过测试数据),剩下的K-1个当作训练数据,最后把得到的K个实验结果进行平分。下图白色是训练集,黑色是测试集:

编程要求
根据提示,在右侧编辑器补充代码,对鸢尾花特征按下列步骤进行分类:
- 读数据;
- 数据划分;
- 训练;
- 模型评估;
- 预测。

测试说明
平台会对你编写的代码进行测试: Test Acc大于90即可 Test Acc: 0.952
源代码:
import sklearn
# 导入高斯朴素贝叶斯分类器
import numpy as np
import pandas as pd
import sklearn
from sklearn.naive_bayes import GaussianNB
from sklearn.model_selection import train_test_split
def knn_test():
data_url = "/data/workspace/myshixun/step1/iris_train.csv"
df = pd.read_csv(data_url)
X = df.iloc[:, 1:4]
y = df.iloc[:, 4]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
clf = simpleGaussianNB()
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
acc = np.sum(y_test == y_pred) / X_test.shape[0]
return acc
class simpleGaussianNB:
def __init__(self, var_smoothing=1e-9):
self.var_smoothing = var_smoothing
self.classes = None
self.mu_ = None
self.class_prior_ = None
def fit(self, X, y):
self.classes_ = np.unique(y)
n_samples, n_features = X.shape
n_classes = len(self.classes_)
self.mu_ = np.zeros((n_classes, n_features))
self.sigma2_ = np.zeros((n_classes, n_features))
self.class_prior_ = np.zeros(n_classes)
for idx, cls in enumerate(self.classes_):
cls_mask = (y == cls)
self.mu_[idx, :] = np.mean(X[cls_mask], axis=0)
self.sigma2_[idx, :] = np.var(X[cls_mask], axis=0) + self.var_smoothing
self.class_prior_[idx] = np.sum(cls_mask) / n_samples
def _compute_log_likelihood(self, X):
n_samples, n_features = X.shape
log_likelihood = np.zeros((n_samples, len(self.classes_)))
for idx, cls in enumerate(self.classes_):
norm_term = -0.5 * np.log(2. * np.pi) * n_features
norm_term -= 0.5 * np.sum(np.log(self.sigma2_[idx, :]))
exponent_term = -0.5 * np.sum((X - self.mu_[idx, :]) ** 2 / self.sigma2_[idx, :], axis=1)
log_likelihood[:, idx] = np.log(self.class_prior_[idx]) + norm_term + exponent_term
return log_likelihood
def predict(self, X):
log_likelihood = self._compute_log_likelihood(X)
return self.classes_[np.argmax(log_likelihood, axis=1)]
def predict_proba(self, X):
log_likelihood = self._compute_log_likelihood(X)
likelihood = np.exp(log_likelihood)
return likelihood / likelihood.sum(axis=1, keepdims=True)
