山东大学机器学习实验7

使用朴素贝叶斯对数据集进行训练,并预测给出的一个数据判断属于哪一类。数据集由多个医学预测变量和一个目标变量结果组成。预测变量包括患者怀孕的次数、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)

猜你喜欢

转载自blog.csdn.net/qq_50213874/article/details/129554926