解释一下统计学中的两个通用性模型
贝叶斯网络
贝叶斯网络 也称作 贝叶斯有向无环图或者概率依赖网络。
核心概念
预先知识:
核心公式: 贝叶斯定理
贝叶斯的相关应用
正式开始:
贝叶斯网络又称 有向无环图模型,是一种概率图模型
贝叶斯网络中的有向无环图的基本特征节点表示随机变量
边表示: 因果关系 , 表示在 A 的基础上 B发生的概率
联合概率分布
贝叶斯网络的结构形式
(1) head-to-head
两个不相关的节点相对独立
(2) tail-to-tail
两个不相关的节点都由一个节点进行 控制
(3) head_to_tail
每一个节点状态只与上一个节点有关这种链式网络,每一个节点的状态只与上一个状态有关,这个过程可以叫做马尔可夫链
因子图
在因子图中:顶点是函数节点,边线表示它们之间的函数关系
其实就是 变量和函数关系的概率图举个例子:
Sum-product 算法
这个算法我感觉可以理解成算法中的递归思路,就是我将一个函数拆分成很多小函数,然后再吧小函数的值进行聚合成最终结果
核心思想
我们可以通过提取公因子得到
然后根据下面的图像的公式可得,我们可以拆分计算然后进行汇总
Sum-product算法的总体框架
这个一个因子图的例子
下面是 sum-product 算法的消息计算规则
根据 sum-product 定理,下面就是关于 X 的概率
相关代码实现
高斯朴素贝叶斯模型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 import pandas as pdimport numpy as npfrom sklearn.model_selection import train_test_splitfrom sklearn.naive_bayes import GaussianNBdf = pd.read_csv('UniversalBank.csv' ) y = df['Personal Loan' ] X = df.drop(['ID' , 'ZIP Code' , 'Personal Loan' ], axis = 1 ) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3 , random_state = 0 ) gnb = GaussianNB() gnb.fit(X_train, y_train) y_pred = gnb.predict(X_test) acc = gnb.score(X_test, y_test) print ('GaussianNB模型的准确度: %s' %acc)y_pred = gnb.predict_proba(X_test) print ('测试数据对象0的预测结果(概率):' , y_pred[0 ])
进行参数调整,观察数据集中,上面代码使用的特征是 ID,ZIP Code,Personal Loan,我感觉可以多增加特征值,看能否提高预测准确率实验表明,增加特征值会提高准确率 ,修改部分(也可以修改标签,但是二分类标签一般不好修改,或者修改数据集划分,但是常用数据集划分就是7:3)
1 1. X = df.drop(['ID' , 'ZIP Code' , 'Personal Loan' ,'CCAvg' ,'Income' ], axis = 1 )
多项式朴素贝叶斯模型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 import pandas as pdimport numpy as npfrom sklearn.model_selection import train_test_splitfrom sklearn.naive_bayes import MultinomialNBdf = pd.read_csv('UniversalBank.csv' ) y = df['Personal Loan' ] X = df[['Family' , 'Education' , 'Securities Account' , 'CD Account' , 'Online' , 'CreditCard' ]] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3 , random_state = 0 ) mnb = MultinomialNB() mnb.fit(X_train, y_train) acc = mnb.score(X_test, y_test) print ('MultinomialNB模型的准确度: %s' %acc)
跟上面的修改一致,只是这一次我们可以减少特征值,但是精确度没有变化(不理解)
K近邻算法
一种基本分类和回归的方法
概念
给定一个训练数据集,对新的输入实例,在训练数据集中找到与这实例最邻近的K个例,这K个实例多数属于某一个类别,就把这个输入实例分类到这个类中
核心流程:
就是每输入一个实例,然后进行距离计算,选取前 K 个实例,然后计算属于每一个类别的概率
核心结构
距离的度量
归一化
为了防止部分特征的权重过大,从而弱化其他特征,我们要进行归一化
核心代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 """ Created on Thu Mar 2 10:25:47 2023 @author: 数据挖掘课程组 """ import pandas as pdimport numpy as npfrom sklearn.model_selection import train_test_splitfrom sklearn.neighbors import KNeighborsClassifierdf = pd.read_csv('UniversalBank.csv' ) y = df['Personal Loan' ] X = df.drop(['ID' , 'ZIP Code' , 'Personal Loan' ], axis = 1 ) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3 , random_state = 0 ) n_neighbors = 10 for weights in ['uniform' , 'distance' ]: knn = KNeighborsClassifier(n_neighbors, weights = weights) knn.fit(X_train, y_train) acc = knn.score(X_test, y_test) print ('%s 准确度: %s' %(weights, acc))
和 贝叶斯的实现差不多,就是 n_neighbors 就是 K 的数量,选择 K 的数量
我对 K 进行调整,将 K 变成 10,精度有所提高
决策树
决策树我的理解就是一个二叉树,就是针对于这个特征的0/1选择
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 """ Created on Mon Feb 27 15:30:58 2023 @author: 数据挖掘课程组 """ import pandas as pdimport numpy as npfrom sklearn.model_selection import train_test_splitfrom sklearn.tree import DecisionTreeClassifiernp.random.seed(10 ) df = pd.read_csv('UniversalBank.csv' ) y = df['Personal Loan' ] X = df.drop(['ID' , 'ZIP Code' , 'Personal Loan' , ], axis = 1 ) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3 , random_state = 0 ) model1 = DecisionTreeClassifier() model2 = model1.fit(X_train, y_train) acc1 = model1.score(X_test, y_test) print ('默认参数的CART决策树的准确度: \n' , acc1)sample_weight = np.ones((y_train.shape[0 ],)) sample_weight[y_train == 1 ] = np.ceil(sum (y_train == 0 ) / sum (y_train == 1 )) model2 = DecisionTreeClassifier(max_depth = 10 ) model2 = model2.fit(X_train, y_train, sample_weight) acc2 = model2.score(X_test, y_test) print ('设置参数后的CART决策树的准确度:\n' , acc2)from sklearn.tree import export_graphvizimport graphvizdot_data = export_graphviz(model2, out_file = None , feature_names = X.columns, class_names=["0" ,"1" ], filled=True ) graph = graphviz.Source(dot_data) graph.render(r'wine' ) graph.view()
我增加特征后,精度有所上升