• 统计学习方法03—朴素贝叶斯算法


    目录

    1.朴素贝叶斯的基本原理 

    2. 贝叶斯算法实现

    2.1 数据集的准备与处理

    2.2 GaussianNB 高斯朴素贝叶斯

     2.2.1 @staticmethod静态方法

     2.2.2 几种概率统计量的编码

    2.3 scikit-learn 高斯贝叶斯实例 

    2.4 贝叶斯的伯努利模型和多项式模型

     3. 意犹未尽


    1.朴素贝叶斯的基本原理 

    2. 贝叶斯算法实现

    2.1 数据集的准备与处理

    1. import numpy as np
    2. import pandas as pd
    3. import matplotlib.pyplot as plt
    4. from sklearn.datasets import load_iris #数据集提供包
    5. from sklearn.model_selection import train_test_split #数据集划分包
    6. from collections import Counter
    7. import math
    8. # 加载数据,并做预处理
    9. def create_data():
    10. iris = load_iris() # 加载数据集
    11. df = pd.DataFrame(iris.data, columns=iris.feature_names)
    12. df['label'] = iris.target
    13. df.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'label']
    14. data = np.array(df.iloc[:100, :])
    15. print("查看data的数据详情:",data)
    16. return data[:,:-1], data[:,-1]
    17. #将调用create_data()的返回值data[:,:-1], data[:,-1],分别传给X,y
    18. #Tips: data[:,:-1]---> 表示取最后一列以外的全部数据(作为训练数据)
    19. # data[:,-1]----> 表示取最后一列(通常用作标签)
    20. X, y = create_data()
    21. # 将所有训练数据X以及所有标签y,按test_size=0.3的比例分为训练集和测试集
    22. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
    23. print("查看第一个测试集的训练数据和标签数据:",X_test[0], y_test[0])
    1. C:\Users\ZARD\anaconda3\envs\PyTorch\python.exe C:/Users/ZARD/PycharmProjects/pythonProject/统计学习算法实现/Naive_Bayes.py
    2. 查看data的数据详情: [[5.1 3.5 1.4 0.2 0. ]
    3. [4.9 3. 1.4 0.2 0. ]
    4. [4.7 3.2 1.3 0.2 0. ]
    5. [4.6 3.1 1.5 0.2 0. ]
    6. [5. 3.6 1.4 0.2 0. ]
    7. [5.4 3.9 1.7 0.4 0. ]
    8. [4.6 3.4 1.4 0.3 0. ]
    9. [5. 3.4 1.5 0.2 0. ]
    10. [4.4 2.9 1.4 0.2 0. ]
    11. [4.9 3.1 1.5 0.1 0. ]
    12. [5.4 3.7 1.5 0.2 0. ]
    13. [4.8 3.4 1.6 0.2 0. ]
    14. [4.8 3. 1.4 0.1 0. ]
    15. [4.3 3. 1.1 0.1 0. ]
    16. [5.8 4. 1.2 0.2 0. ]
    17. [5.7 4.4 1.5 0.4 0. ]
    18. [5.4 3.9 1.3 0.4 0. ]
    19. [5.1 3.5 1.4 0.3 0. ]
    20. [5.7 3.8 1.7 0.3 0. ]
    21. [5.1 3.8 1.5 0.3 0. ]
    22. [5.4 3.4 1.7 0.2 0. ]
    23. [5.1 3.7 1.5 0.4 0. ]
    24. [4.6 3.6 1. 0.2 0. ]
    25. [5.1 3.3 1.7 0.5 0. ]
    26. [4.8 3.4 1.9 0.2 0. ]
    27. [5. 3. 1.6 0.2 0. ]
    28. [5. 3.4 1.6 0.4 0. ]
    29. [5.2 3.5 1.5 0.2 0. ]
    30. [5.2 3.4 1.4 0.2 0. ]
    31. [4.7 3.2 1.6 0.2 0. ]
    32. [4.8 3.1 1.6 0.2 0. ]
    33. [5.4 3.4 1.5 0.4 0. ]
    34. [5.2 4.1 1.5 0.1 0. ]
    35. [5.5 4.2 1.4 0.2 0. ]
    36. [4.9 3.1 1.5 0.2 0. ]
    37. [5. 3.2 1.2 0.2 0. ]
    38. [5.5 3.5 1.3 0.2 0. ]
    39. [4.9 3.6 1.4 0.1 0. ]
    40. [4.4 3. 1.3 0.2 0. ]
    41. [5.1 3.4 1.5 0.2 0. ]
    42. [5. 3.5 1.3 0.3 0. ]
    43. [4.5 2.3 1.3 0.3 0. ]
    44. [4.4 3.2 1.3 0.2 0. ]
    45. [5. 3.5 1.6 0.6 0. ]
    46. [5.1 3.8 1.9 0.4 0. ]
    47. [4.8 3. 1.4 0.3 0. ]
    48. [5.1 3.8 1.6 0.2 0. ]
    49. [4.6 3.2 1.4 0.2 0. ]
    50. [5.3 3.7 1.5 0.2 0. ]
    51. [5. 3.3 1.4 0.2 0. ]
    52. [7. 3.2 4.7 1.4 1. ]
    53. [6.4 3.2 4.5 1.5 1. ]
    54. [6.9 3.1 4.9 1.5 1. ]
    55. [5.5 2.3 4. 1.3 1. ]
    56. [6.5 2.8 4.6 1.5 1. ]
    57. [5.7 2.8 4.5 1.3 1. ]
    58. [6.3 3.3 4.7 1.6 1. ]
    59. [4.9 2.4 3.3 1. 1. ]
    60. [6.6 2.9 4.6 1.3 1. ]
    61. [5.2 2.7 3.9 1.4 1. ]
    62. [5. 2. 3.5 1. 1. ]
    63. [5.9 3. 4.2 1.5 1. ]
    64. [6. 2.2 4. 1. 1. ]
    65. [6.1 2.9 4.7 1.4 1. ]
    66. [5.6 2.9 3.6 1.3 1. ]
    67. [6.7 3.1 4.4 1.4 1. ]
    68. [5.6 3. 4.5 1.5 1. ]
    69. [5.8 2.7 4.1 1. 1. ]
    70. [6.2 2.2 4.5 1.5 1. ]
    71. [5.6 2.5 3.9 1.1 1. ]
    72. [5.9 3.2 4.8 1.8 1. ]
    73. [6.1 2.8 4. 1.3 1. ]
    74. [6.3 2.5 4.9 1.5 1. ]
    75. [6.1 2.8 4.7 1.2 1. ]
    76. [6.4 2.9 4.3 1.3 1. ]
    77. [6.6 3. 4.4 1.4 1. ]
    78. [6.8 2.8 4.8 1.4 1. ]
    79. [6.7 3. 5. 1.7 1. ]
    80. [6. 2.9 4.5 1.5 1. ]
    81. [5.7 2.6 3.5 1. 1. ]
    82. [5.5 2.4 3.8 1.1 1. ]
    83. [5.5 2.4 3.7 1. 1. ]
    84. [5.8 2.7 3.9 1.2 1. ]
    85. [6. 2.7 5.1 1.6 1. ]
    86. [5.4 3. 4.5 1.5 1. ]
    87. [6. 3.4 4.5 1.6 1. ]
    88. [6.7 3.1 4.7 1.5 1. ]
    89. [6.3 2.3 4.4 1.3 1. ]
    90. [5.6 3. 4.1 1.3 1. ]
    91. [5.5 2.5 4. 1.3 1. ]
    92. [5.5 2.6 4.4 1.2 1. ]
    93. [6.1 3. 4.6 1.4 1. ]
    94. [5.8 2.6 4. 1.2 1. ]
    95. [5. 2.3 3.3 1. 1. ]
    96. [5.6 2.7 4.2 1.3 1. ]
    97. [5.7 3. 4.2 1.2 1. ]
    98. [5.7 2.9 4.2 1.3 1. ]
    99. [6.2 2.9 4.3 1.3 1. ]
    100. [5.1 2.5 3. 1.1 1. ]
    101. [5.7 2.8 4.1 1.3 1. ]]
    102. 查看第一个测试集的训练数据和标签数据: [4.8 3.1 1.6 0.2] 0.0
    103. Process finished with exit code 0

     Tips: data[:,:-1]---> 表示取最后一列以外的全部数据(作为训练数据)
                data[:,-1]----> 表示取最后一列(通常用作标签)

    将加载数据,并做预处理步骤打包成函数,也是不错的一个思想诺!

    2.2 GaussianNB 高斯朴素贝叶斯

    参考:https://machinelearningmastery.com/naive-bayes-classifier-scratch-python/ 

    1. import numpy as np
    2. import pandas as pd
    3. import matplotlib.pyplot as plt
    4. from sklearn.datasets import load_iris #数据集提供包
    5. from sklearn.model_selection import train_test_split #数据集划分包
    6. from collections import Counter
    7. import math
    8. # 加载数据,并做预处理
    9. def create_data():
    10. iris = load_iris() # 加载数据集
    11. df = pd.DataFrame(iris.data, columns=iris.feature_names)
    12. df['label'] = iris.target
    13. df.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'label']
    14. data = np.array(df.iloc[:100, :])
    15. print("查看data的数据详情:",data)
    16. return data[:,:-1], data[:,-1]
    17. #将调用create_data()的返回值data[:,:-1], data[:,-1],分别传给X,y
    18. #Tips: data[:,:-1]---> 表示取最后一列以外的全部数据(作为训练数据)
    19. # data[:,-1]----> 表示取最后一列(通常用作标签)
    20. X, y = create_data()
    21. # 将所有训练数据X以及所有标签y,按test_size=0.3的比例分为训练集和测试集
    22. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
    23. print("查看第一个测试集的训练数据和标签数据:",X_test[0], y_test[0])
    24. class NaiveBayes:
    25. def __init__(self):
    26. self.model = None
    27. # 数学期望
    28. @staticmethod #静态方法:不实例化类的情况下可以直接访问该方法
    29. def mean(X):
    30. return sum(X) / float(len(X))
    31. # 标准差(方差)
    32. def stdev(self, X):
    33. avg = self.mean(X)
    34. return math.sqrt(sum([pow(x - avg, 2) for x in X]) / float(len(X)))
    35. # 概率密度函数
    36. def gaussian_probability(self, x, mean, stdev):
    37. exponent = math.exp(-(math.pow(x - mean, 2) /
    38. (2 * math.pow(stdev, 2))))
    39. return (1 / (math.sqrt(2 * math.pi) * stdev)) * exponent
    40. # 处理X_train
    41. def summarize(self, train_data):
    42. summaries = [(self.mean(i), self.stdev(i)) for i in zip(*train_data)]
    43. return summaries
    44. # 分类别求出数学期望和标准差
    45. def fit(self, X, y):
    46. labels = list(set(y))
    47. data = {label: [] for label in labels}
    48. for f, label in zip(X, y):
    49. data[label].append(f)
    50. self.model = {
    51. label: self.summarize(value)
    52. for label, value in data.items()
    53. }
    54. return 'gaussianNB train done!'
    55. # 计算概率
    56. def calculate_probabilities(self, input_data):
    57. # summaries:{0.0: [(5.0, 0.37),(3.42, 0.40)], 1.0: [(5.8, 0.449),(2.7, 0.27)]}
    58. # input_data:[1.1, 2.2]
    59. probabilities = {}
    60. for label, value in self.model.items():
    61. probabilities[label] = 1
    62. for i in range(len(value)):
    63. mean, stdev = value[i]
    64. probabilities[label] *= self.gaussian_probability(
    65. input_data[i], mean, stdev)
    66. return probabilities
    67. # 类别
    68. def predict(self, X_test):
    69. # {0.0: 2.9680340789325763e-27, 1.0: 3.5749783019849535e-26}
    70. label = sorted(
    71. self.calculate_probabilities(X_test).items(),
    72. key=lambda x: x[-1])[-1][0]
    73. return label
    74. def score(self, X_test, y_test):
    75. right = 0
    76. for X, y in zip(X_test, y_test):
    77. label = self.predict(X)
    78. if label == y:
    79. right += 1
    80. return right / float(len(X_test))
    81. model = NaiveBayes() #实例化朴素贝叶斯
    82. model.fit(X_train, y_train) #分类别求出数学期望和标准差
    83. print(model.predict([4.4, 3.2, 1.3, 0.2])) # 0.0
    84. model.score(X_test, y_test) #1.0

     2.2.1 @staticmethod静态方法

    (1条消息) python 理解@staticmethod静态方法_季布,的博客-CSDN博客_python @staticmethod原理

     2.2.2 几种概率统计量的编码

    1. # 数学期望
    2. @staticmethod #静态方法:不实例化类的情况下可以直接访问该方法
    3. def mean(X):
    4. return sum(X) / float(len(X))
    5. # 标准差(方差)
    6. def stdev(self, X):
    7. avg = self.mean(X)
    8. return math.sqrt(sum([pow(x - avg, 2) for x in X]) / float(len(X)))
    9. # 概率密度函数
    10. def gaussian_probability(self, x, mean, stdev):
    11. exponent = math.exp(-(math.pow(x - mean, 2) /
    12. (2 * math.pow(stdev, 2))))
    13. return (1 / (math.sqrt(2 * math.pi) * stdev)) * exponent
    14. # 处理X_train
    15. def summarize(self, train_data):
    16. summaries = [(self.mean(i), self.stdev(i)) for i in zip(*train_data)]
    17. return summaries
    18. # 分类别求出数学期望和标准差
    19. def fit(self, X, y):
    20. labels = list(set(y))
    21. data = {label: [] for label in labels}
    22. for f, label in zip(X, y):
    23. data[label].append(f)
    24. self.model = {
    25. label: self.summarize(value)
    26. for label, value in data.items()
    27. }
    28. return 'gaussianNB train done!'
    29. # 计算概率
    30. def calculate_probabilities(self, input_data):
    31. # summaries:{0.0: [(5.0, 0.37),(3.42, 0.40)], 1.0: [(5.8, 0.449),(2.7, 0.27)]}
    32. # input_data:[1.1, 2.2]
    33. probabilities = {}
    34. for label, value in self.model.items():
    35. probabilities[label] = 1
    36. for i in range(len(value)):
    37. mean, stdev = value[i]
    38. probabilities[label] *= self.gaussian_probability(
    39. input_data[i], mean, stdev)
    40. return probabilities

    2.3 scikit-learn 高斯贝叶斯实例 

    from sklearn.naive_bayes import GaussianNB

     主要代码如下:

    1. from sklearn.naive_bayes import GaussianNB
    2. clf = GaussianNB() # 实例化高斯贝叶斯模型
    3. clf.fit(X_train, y_train) #分类别求出数学期望和标准差
    4. print(clf.score(X_test, y_test)) #类别
    5. print(clf.predict([[4.4, 3.2, 1.3, 0.2]])) # 0.0
    1. from sklearn.naive_bayes import GaussianNB
    2. import numpy as np
    3. import pandas as pd
    4. import matplotlib.pyplot as plt
    5. from sklearn.datasets import load_iris #数据集提供包
    6. from sklearn.model_selection import train_test_split #数据集划分包
    7. from collections import Counter
    8. import math
    9. # 加载数据,并做预处理
    10. def create_data():
    11. iris = load_iris() # 加载数据集
    12. df = pd.DataFrame(iris.data, columns=iris.feature_names)
    13. df['label'] = iris.target
    14. df.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'label']
    15. data = np.array(df.iloc[:100, :])
    16. print("查看data的数据详情:",data)
    17. return data[:,:-1], data[:,-1]
    18. #将调用create_data()的返回值data[:,:-1], data[:,-1],分别传给X,y
    19. #Tips: data[:,:-1]---> 表示取最后一列以外的全部数据(作为训练数据)
    20. # data[:,-1]----> 表示取最后一列(通常用作标签)
    21. X, y = create_data()
    22. # 将所有训练数据X以及所有标签y,按test_size=0.3的比例分为训练集和测试集
    23. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
    24. print("查看第一个测试集的训练数据和标签数据:",X_test[0], y_test[0])
    25. clf = GaussianNB() # 实例化高斯贝叶斯模型
    26. clf.fit(X_train, y_train) #分类别求出数学期望和标准差
    27. print(clf.score(X_test, y_test)) #类别
    28. print(clf.predict([[4.4, 3.2, 1.3, 0.2]])) # 0.0

    2.4 贝叶斯的伯努利模型和多项式模型

    from sklearn.naive_bayes import BernoulliNB, MultinomialNB # 伯努利模型和多项式模型

    参考代码:https://github.com/wzyonggege/statistical-learning-method

    本文代码更新地址:https://github.com/fengdu78/lihang-code

    中文注释制作:机器学习初学者公众号:ID:ai-start-com

     3. 意犹未尽

    如下大佬文章来满足:

    scikit-learn 朴素贝叶斯类库使用小结 - 刘建平Pinard - 博客园 (cnblogs.com)

    (1条消息) 朴素贝叶斯分类算法[sklearn.naive_bayes/GaussianNB/MultinomialNB/BernoulliNB]_Doris_H_n_q的博客-CSDN博客

    一文搞懂Python库中的5种贝叶斯算法 - 知乎 (zhihu.com)
    超参数调优总结,贝叶斯优化Python代码示例 - 知乎 (zhihu.com)

    贝叶斯超参数寻优(附Python代码,scikit-optimize) - 知乎 (zhihu.com)

  • 相关阅读:
    python初学
    【C++基于多设计模式下的同步&异步日志系统】
    JS实用小计
    睡眠管理
    GLIP,FLIP论文阅读
    sqli-labs(3)
    Vue源码之数据响应式
    java后端分页的多种操作你必须要知道
    HTML5七夕情人节表白网页制作【花瓣图片表白】HTML+CSS+JavaScript html生日快乐祝福网页制作
    R语言RSTAN MCMC:NUTS采样算法用LASSO 构建贝叶斯线性回归模型分析职业声望数据...
  • 原文地址:https://blog.csdn.net/m0_55196097/article/details/127411958