使用朴素贝叶斯对数据集进行训练,并预测给出的一个数据判断属于哪一类。数据集由多个医学预测变量和一个目标变量结果组成。预测变量包括患者怀孕的次数、BMI、胰岛素水平、年龄等。
这次实验分为自行实现朴素贝叶斯和scikit learn中朴素贝叶斯的使用。
首先熟悉朴素贝叶斯的原理:
其中 P(c|x) 是给定预测变量(特征)的 c 类的后验概率。
P(c)是类的概率。
P(x|c) 是给定类的预测变量的概率的可能性。
P(x) 是预测变量的先验概率。
因为我们不关心真正的后验值是什么,所以我们只关心哪个类具有最高的后验值。而且因为所有类的边际概率都是相同的,所以可以用计算分子。
且朴素贝叶斯的假设就是,特征之间是相互独立的,所以我们可以进一步分解,这里用怀孕次数在分类1上举例子:
然后计算每一个似然概率,这里是连续值,根据中心极限定理,我们可以假设怀孕次数服从高斯分布,这意味着p (妊娠∣结果1) 是通过将所需参数输入正态分布的概率密度函数来计算的,现在,根据概率密度函数的公式,我们的可能性将是:
而先验概率就是每个类占总数的多少,比较简单。
根据上述的这些,我们就可以计算给定数据在每个类上的概率,取其中的最大值,即该数据点属于哪一个类。
在理解了上层代码后,我们才能更好的在scikit learn中使用朴素贝叶斯。
导入的数据集的部分展示如下:
因为根据高斯分布求似然概率,所以我们需要求每个特征在每个类的均值和方差:
每个特征在每个类的均值如下:
每个特征在每个类的方差如下:
这是给定需要预测的数据点:
之后我们可以根据朴素贝叶斯预测该数据点属于哪一个类:
通过计算:该数据属于类别1为2.2311606712297407e-13
该数据属于类别0为1.7904471741735295e-13
取二者的最大值,所以该数据应该属于类别1.
朴素贝叶斯的主要优点有:
1)朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。
2)对小规模的数据表现很好,能个处理多分类任务,适合增量式训练,尤其是数据量超出内存时,我们可以一批批的去增量训练。
3)对缺失数据不太敏感,算法也比较简单,常用于文本分类。
朴素贝叶斯的主要缺点有:
1) 理论上,朴素贝叶斯模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为朴素贝叶斯模型假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果不好。而在属性相关性较小时,朴素贝叶斯性能最为良好。对于这一点,有半朴素贝叶斯之类的算法通过考虑部分关联性适度改进。
2)需要知道先验概率,且先验概率很多时候取决于假设,假设的模型可以有很多种,因此在某些时候会由于假设的先验模型的原因导致预测效果不佳。
3)由于我们是通过先验和数据来决定后验的概率从而决定分类,所以分类决策存在一定的错误率。
4)对输入数据的表达形式很敏感。
这里附上scikit learn中使用朴素贝叶斯的代码,便于将来使用以及复习理解:
# import dependencies
import numpy as np
import pandas as pd
# other dependencies that you might not need
# just for publishing image in notebook
from IPython.display import Image
from IPython.core.display import HTML
%matplotlib inline
# column has all the name of column name
# our data is stored in dataframe: data
column = ["Pregnancies","Glucose","BloodPressure","SkinThickness","Insulin","BMI","DiabetesPedigreeFunction","Age","Outcome"]
data = pd.read_csv('pima-indians-diabetes.data.csv',names=column)
X = data.iloc[:,0:-1] # X is the features in our dataset
y = data.iloc[:,-1] # y is the Labels in our dataset
# divide the dataset in train test using scikit learn
# now the model will train in training dataset and then we will use test dataset to predict its accuracy
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)
# now preparing our model as per Gaussian Naive Bayesian
from sklearn.naive_bayes import GaussianNB
model = GaussianNB().fit(X_train, y_train) #fitting our model
from sklearn.metrics import accuracy_score
# now calculating that how much accurate our model is with comparing our predicted values and y_test values
accuracy_score = accuracy_score(y_test, predicted_y)
print (accuracy_score)
# Create an empty dataframe that we have to predict
person = pd.DataFrame()
# Create some feature values for this single row
person['Pregnancies'] = [7]
person['Glucose'] = [130]
person['BloodPressure'] = [86]
person['SkinThickness'] = [34]
person['Insulin'] = [0]
person['BMI'] = [33.5]
person['DiabetesPedigreeFunction'] = [0.564]
person['Age'] = [50]
# the data is stored in Datadrame person
predicted_y = model.predict(person)
print (predicted_y)