第二个作业:贝叶斯估计实战
第一小题:试使用西瓜数据集3.0作为训练集,通过AIC准则构建一个贝叶斯网
我先看看scikit-learn官网上关于贝叶斯估计,特别是贝叶斯网的构建方面的包和函数。然后再看看这个AIC准则具体是怎么样的。
如何构造一个贝叶斯网络
如何构造一个贝叶斯网。
from pgmpy.models import BayesianModel
我看到这个pgmpy,这个是什么?
pgmpy
pgmpy是一个单纯的针对贝叶斯网络的python包。我不清楚这个pgmpy是否支持现在西瓜数据集中离散数据和连续值数据混合的情况。
暂时先不管这个,我先把pgmpy中的有用的函数看完。
from pgmpy.factors.discrete.CPD import TabularCPD
这个TabularCPD是什么东西呢?
大概明白了,是构造需要输入的条件变量概率组成的条件概率表函数。
连续数据离散化
字符串型离散数据变为数值类型可以使用OrdinalEncoder,但是连续型数据离散化(一般的贝叶斯网络都支持离散数据)方法未知。
方法包括:
(1)等宽法:将属性中的最大最小值提取出来,然后使用等宽度的区域切分,标记为0,1,2…
(2)基于聚类的方法:将数据聚类处理。
我打算对含糖率和密度采用聚类的方式来进行连续值离散化处理,大体要分割成三个簇,代表密度低、较低、高;含糖率低、较低、高。
聚类的办法:
使用K-means聚类算法:
K=3.
from sklearn.cluster import KMeans
# 将连续数据一列一列抽出来做聚类。
# 这里必须要reshape(-1,1)?
c_d_1 = (c_d[:,0]).reshape(-1,1)
c_d_2 = (c_d[:,1]).reshape(-1,1)
kmeans_1 = KMeans(n_clusters=3, random_state=0).fit(c_d_1)
c_1 = kmeans_1.labels_
kmeans_2 = KMeans(n_clusters=3, random_state=0).fit(c_d_2)
c_2 = kmeans_2.labels_
c_1 = c_1.transpose()
c_2 = c_2.transpose()
continuous_data = np.hstack((c_1,c_2))
完成连续数据离散化
接下来完成字符串型离散数据向数值型数据的转换.
字符串型离散数据向数值型数据的转换.
from sklearn.preprocessing import OrdinalEncoder
enc = OrdinalEncoder()
# d_d:离散数据
enc.fit(d_d)
discrete_data = enc.fit_transform(d_d)
# 数据类型更改:
continuous_data = continuous_data.astype(np.float32)
discrete_data = discrete_data.astype(np.float32)
T_data = np.hstack((discrete_data, continuous_data))
数据预处理完成.
网络结构
这里就需要用到pgmpy这个包了,我首先在anaconda propmt中用
pip install pgmpy
完成对pgmpy的安装,但是出现了奇怪的事情,就是jupyter notebook中一直找不到这个包。
如何查看jupyter中的安装包
笨蛋,使用jupyter的魔术命令啊,这个就可以帮助我在jupyter虚拟环境中直接使用pip了。
查看安装包:
!pip list
我就直接在jupyter notebook的虚拟环境中直接安装,成功了
!pip install pgmpy
DataFrame对象该如何构造:
Raw_data = pd.DataFrame(whole_data, columns=['色泽','根蒂','敲声','纹理','脐部','触感','密度','含糖率','好瓜'])
构造贝叶斯网络模型:
代码如下:
model = BayesianModel([['色泽','好瓜'],['根蒂','好瓜'],['敲声','好瓜'],['纹理','好瓜'],['脐部','好瓜'],['触感','好瓜'],['密度','好瓜'],['含糖率','好瓜']])
model.fit(Raw_data, estimator=BayesianEstimator, prior_type="BDeu")
好了,我们的贝叶斯网络模型训练好了,因为我的网络结构是我主观上设计的,所以可能会造成最终精度不高。
什么是AIC准则,如何使用AIC准则构造合适的贝叶斯网络