朴素贝叶斯分类器

2018-12-02  本文已影响0人  章佳翳_PMO

朴素贝叶斯分类器


分类 vs 回归


贝叶斯定理

P(A|B) = \frac{P(B|A)P(A)}{P(B)}

用语言解释就是:
在 B 出现的前提下 A 出现的概率,
等于 A 和 B 都出现的概率除以 B 出现的概率。
换句话说就是后验概率和先验概率的关系。

朴素贝叶斯分类器(Naïve Bayes Classifier)

“朴素贝叶斯”(Naïve Bayes)既可以是一种算法——朴素贝叶斯算法,
也可以是一种模型——朴素贝叶斯分类模型(分类器)。

不再简单地将频率当作概率

通过该特征在数据样本中的分布来计算该特征的条件概率。

极大似然估计 (Maximum Likelihood Estimation, MLE)

似然(Likelihood):指某种事件发生的可能,和概率相似。
极大似然估计,就是去寻找让似然函数 L(θc,i) 的取值
达到最大的参数值的估计方法。


用代码实现朴素贝叶斯模型

import pandas as pd
    import numpy as np
    import time
    from sklearn.model_selection import train_test_split
    from sklearn.naive_bayes import GaussianNB

    # Importing dataset. 
    # Please refer to the 【Data】 part after the code for the data file.
    data = pd.read_csv("career_data.csv") 

    # Convert categorical variable to numeric
    data["985_cleaned"]=np.where(data["985"]=="Yes",1,0)
    data["education_cleaned"]=np.where(data["education"]=="bachlor",1,
                                      np.where(data["education"]=="master",2,
                                               np.where(data["education"]=="phd",3,4)
                                              )
                                     )
    data["skill_cleaned"]=np.where(data["skill"]=="c++",1,
                                      np.where(data["skill"]=="java",2,3
                                              )
                                     )
    data["enrolled_cleaned"]=np.where(data["enrolled"]=="Yes",1,0)

    # Split dataset in training and test datasets
    X_train, X_test = train_test_split(data, test_size=0.1, random_state=int(time.time()))

    # Instantiate the classifier
    gnb = GaussianNB()
    used_features =[
        "985_cleaned",
        "education_cleaned",
        "skill_cleaned"
    ]

    # Train classifier
    gnb.fit(
        X_train[used_features].values,
        X_train["enrolled_cleaned"]
    )
    y_pred = gnb.predict(X_test[used_features])

    # Print results
    print("Number of mislabeled points out of a total {} points : {}, performance {:05.2f}%"
          .format(
              X_test.shape[0],
              (X_test["enrolled_cleaned"] != y_pred).sum(),
              100*(1-(X_test["enrolled_cleaned"] != y_pred).sum()/X_test.shape[0])
    ))

上一篇下一篇

猜你喜欢

热点阅读