【2】监督学习--1--分类-贝叶斯(naive_bayes)
朴素贝叶斯
朴素贝叶斯分类器是一个以贝叶斯定理为基础的多分类的分类器。 对于给定数据,首先基于特征的条件独立性假设,学习输入输出的联合概率分布,然后基于此模 型,对给定的输入x,利用贝叶斯定理求出后验概率最大的输出y。
sklearn中的朴素贝叶斯
在sklearn库中,实现了三个朴素贝叶斯分类器,如下表所示:
分类器 | 描述 |
---|---|
naive_bayes.GussianNB | 高斯朴素贝叶斯 |
naive_bayes.MultinomialNB | 针对多项式模型的朴素贝叶斯分类器 |
naive_bayes.BernoulliNB | 针对多元伯努利模型的朴素贝叶斯分类器 |
区别在于假设某一特征的所有属于某个类别的观测值符合特定分布,如,分 类问题的特征包括人的身高,身高符合高斯分布,这类问题适合高斯朴素贝叶斯
sklearn中的朴素贝叶斯
sklearn库中,可以使用sklearn.naive_bayes.GaussianNB创建一个高斯 朴素贝叶斯分类器,其参数有:
- priors :给定各个类别的先验概率。如果为空,则按训练数据的实际情况 进行统计;如果给定先验概率,则在训练过程中不能更改。
朴素贝叶斯的使用
例1:导入 numpy 库,并构造训练数据 X 和 y。
>>> import numpy as np
>>> X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
>>> Y = np.array([1, 1, 1, 2, 2, 2])
使用 import 语句导入朴素贝叶斯分类器。
from sklearn.naive_bayes import GaussianNB
使用默认参数,创建一个高斯朴素贝叶斯分类器,并将该分类器赋给变量 clf。
>>> clf = GaussianNB(priors=None)
类似的,使用 fit() 函数进行训练,并使用 predict() 函数进行预测,得到 预测结果为 1。(测试时可以构造二维数组达到同时预测多个样本的目的)
>>> clf.fit(X, Y)
>>> print(clf.predict([[-0.8, -1]]))
[1]
朴素贝叶斯是典型的生成学习方法,由训练数据学习联合概率分布,并求得 后验概率分布。 朴素贝叶斯一般在小规模数据上的表现很好,适合进行多分类任务。
算法流程
- 需要从特征文件和标签文件中将所有数据加载到内存中,由于存在缺失值,此步骤还需要进行简单的数据 预处理。
- 创建对应的分类器,并使用训练数据进行训练。
- 利用测试集预测,通过使用真实值和预测值的比对,
- 计算模型整体的准确率和召回率,来评测模型。
代码:
import pandas as pd
import numpy as np
from sklearn.preprocessing import Imputer
from sklearn.cross_validation import train_test_split
from sklearn.metrics import classification_report #导入预测结果评估模块classification_report
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.naive_bayes import GaussianNB
def load_datasets(feature_paths, label_paths):
feature = np.ndarray(shape=(0,41))
label = np.ndarray(shape=(0,1))
for file in feature_paths:
df = pd.read_table(file, delimiter=',', na_values='?', header=None)
imp = Imputer(missing_values='NaN', strategy='mean', axis=0)
imp.fit(df)
df = imp.transform(df)
feature = np.concatenate((feature, df))
for file in label_paths:
df = pd.read_table(file, header=None)
label = np.concatenate((label, df))
label = np.ravel(label)
return feature, label
if __name__ == '__main__':
''' 数据路径 '''
featurePaths = ['A/A.feature','B/B.feature','C/C.feature','D/D.feature','E/E.feature']
labelPaths = ['A/A.label','B/B.label','C/C.label','D/D.label','E/E.label']
''' 读入数据 '''
x_train,y_train = load_datasets(featurePaths[:4],labelPaths[:4])
x_test,y_test = load_datasets(featurePaths[4:],labelPaths[4:])
x_train, x_, y_train, y_ = train_test_split(x_train, y_train, test_size = 0.0)
print('Start training knn')
knn = KNeighborsClassifier().fit(x_train, y_train)
print('Training done')
answer_knn = knn.predict(x_test)
print('Prediction done')
print('Start training DT')
dt = DecisionTreeClassifier().fit(x_train, y_train)
print('Training done')
answer_dt = dt.predict(x_test)
print('Prediction done')
print('Start training Bayes')
gnb = GaussianNB().fit(x_train, y_train)
print('Training done')
answer_gnb = gnb.predict(x_test)
print('Prediction done')
print('\n\nThe classification report for knn:')
print(classification_report(y_test, answer_knn))
print('\n\nThe classification report for DT:')
print(classification_report(y_test, answer_dt))
print('\n\nThe classification report for Bayes:')
print(classification_report(y_test, answer_gnb))
- 在所有的特征数据中,可能存在缺失值或者冗余特征。如果将这些特征不加处 理地送入后续的计算,可能会导致模型准确度下降并且增大计算量。
- 在特征选择阶段,通常需要借助辅助软件(例如Weka)将数据进行可视化并进 行统计。
- 请大家可以通过课外学习思考如何筛选冗余特征,提高模型训练效率,也可以 尝试调用sklearn提供的其他分类器进行数据预测。
参考资料
- 北京理工大学 礼欣 www.python123.org
这里是一个广告位,,感兴趣的都可以发邮件聊聊:tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn