文章目录

  • 1、逻辑斯蒂回归
  • 2、朴素贝叶斯
  • 3、三种分类算法的比较

上回说到,sklearn中的k近邻算法解决多分类问题。k近邻的基本步骤是:收集数据、创建分类器、训练、预测、评估性能、调参(参数就是k的值,也就是邻居的个数)。

分类问题,我们说过,是监督学习的一大类问题,包括二分类和多分类。接下来的几篇博文都说的是分类问题,包括逻辑斯蒂回归、朴素贝叶斯、支持向量机、k-决策树以及随机森林。而且主要以手写数字识别为案例,数据集和测试集都是一样的。我们的机器学习重点在于用现有框架解决实际问题,这对于初学者是很有帮助的。当现有的库用得滚瓜烂熟时,再一步步深入研究这些算法的本质。

1、逻辑斯蒂回归

逻辑斯蒂回归(Logistic Regression),虽然带有“回归”二字,但它不是真正的回归算法,而是一个多分类算法。它是回归算法在离散数据方面的推广。另外一种类似的东西叫做支持向量机(SVM),但它只适用于解决二分类问题,解决多分类时需要特殊技巧来转化。

和k近邻一样,逻辑斯蒂回归在sklearn中也有现成的函数,只不过用法和k近邻大相径庭。逻辑斯蒂回归的原理比较复杂,涉及到非常艰深的概率论和线性代数知识,大致就是梯度下降算子什么的,这里就不细讲了。我们的目的,在于比较各种分类算法的效率和准确度。

逻辑斯蒂回归使用的基本步骤如下:

1、数据集收集和标准化(这个标准化是今天的全新内容)

2、创建逻辑斯蒂分类器(分类器有一个参数,叫做正则化度,用大写C表示,默认为1.0)

3、训练

4、检测训练集的训练效果

5、预测

6、检测预测准确度

首先数据集收集和上一节讲的完全相同。不会的回去看。

接着就是创建分类器。逻辑斯蒂分类器也是一个类对象,每调用一次创建函数就创建一个新的分类器。逻辑斯蒂回归分类器在sklearn.linear_model包中,记得import哦。代码和上一节的k近邻基本相同:

lrg = sklearn.linear_model.LogisticRegression(C=1.0)

其中C是刚才说的“正则化度”。C越大,则正则化度越弱(注意看清楚,这里是负相关的哦),实际使用的特征数量越多。我们稍后运行成功后,将手动调整它,看看不同的C对训练效果的影响。

训练和测试也是一样的。

lrg.fit(x_train_std, y_train)
lrg_result = lrg.predict(x_test_std)

然后是今天的重点之一:标准化。我们可以做一个实验,看看没有标准化的数据是什么效果。下面的代码:

import os
import sklearn.linear_modeldef walk_files(directory, x, y):for root, dirs, files in os.walk(directory):for filename in files:vector = ""fp = open(directory + "\\" + filename, "r")line = fp.readline()while line:vector += line.strip("\n\r")line = fp.readline()fp.close()x.append(list(vector))y.append(int(filename[0]))train_dir = "trainingDigits"
test_dir = "testDigits"
x_train = []
y_train = []
x_test = []
y_test = []walk_files(train_dir, x_train, y_train)
walk_files(test_dir, x_test, y_test)
lrg = sklearn.linear_model.LogisticRegression() # 创建分类器
lrg.fit(x_train, y_train) # 训练
lrg_result = lrg.predict(x_test) # 预测

运行,提示

Traceback (most recent call last):File "D:/Program Files/JetBrains/PyCharm 2018.3.3/projects/py2/main.py", line 53, in <module>lrg_result = lrg.predict(x_test)File "D:\Program Files\Python36\lib\site-packages\sklearn\linear_model\base.py", line 281, in predictscores = self.decision_function(X)File "D:\Program Files\Python36\lib\site-packages\sklearn\linear_model\base.py", line 265, in decision_functiondense_output=True) + self.intercept_File "D:\Program Files\Python36\lib\site-packages\sklearn\utils\extmath.py", line 173, in safe_sparse_dotreturn np.dot(a, b)
TypeError: Cannot cast array data from dtype('float64') to dtype('<U32') according to the rule 'safe'

我们看到,用原始数据对逻辑斯蒂分类器进行分类和预测是行不通的,会出现类型冲突(TypeError),这属于严重错误,甚至都通不过编译。所以,就引出了今天的标准化问题。

我们刚才传入fit函数和predict函数中的数据x_train和x_test,不能直接用于预测和训练。必须先用StandardScaler进行标准化。这个东西叫做标准化器,位于sklearn.preprocessing包中。它也是一个类对象,先创建后使用。创建方法如下:

ss = sklearn.preprocessing.StandardScaler() # ss就是一个标准化器

然后,用这个ss中的fit_transform函数对我们刚才收集到的x_train和x_test进行标准化。它们的返回值就是标准化后的数据。注意,只需要对数据(x_train)标准化,不需要对训练目标(y_train)标准化,因为训练目标(也就是类别)只能是整数或枚举,标准化是没有意义的。代码如下:

x_train_std = ss.fit_transform(x_train)
x_test_std = ss.fit_transform(x_test)

这样就得到标准化训练集x_train_std和标准化测试集x_test_std。接下来的事情就简单了,用这两个数据集进行训练和预测即可。代码:

lrg.fit(x_train_std, y_train)
lrg_result = lrg.predict(x_test_std)

这还不够,还需要评估训练效果和预测准确度。训练效果评估有现成的函数,也就是计算训练偏差系数R^2。在分类问题中,偏差系数就等于训练集上预测正确率。预测准确度当然是测试集上的预测正确率:

print("logistic R^2: %.3f" % (lrg.score(x_train_std, y_train)))
# lrg.score是专门计算训练效果的函数。是不是很方便啊
print("logistic score: %.3f" % (pandas.np.mean(lrg_result == y_test)))
# pd.np.mean(lrg_result == y_test)是计算两个列表对应位置相等的频率。也就是和我们上一节手写的那个评估是等价的。使用这个函数,需要import pandas

运行一下,结果为:

logistic R^2: 1.000
logistic score: 0.945

在训练集上,做到完美训练(即回归测试中没有错误数据)。测试集上没有k近邻表现好,昨天的k近邻准确度大约为98.7%。但是94.5%是可以接受的。

好了,现在我们来试试,改变正则化度C,对分类效果的影响。下面是一个表格:

正则化度C 运行时间 /s 训练集正确率 测试集正确率
0.01 3.41 0.986 0.936
0.02 4.48 0.995 0.943
0.05 4.51 1.000 0.944
0.1 5.25 1.000 0.944
1.0 6.71 1.000 0.945
2.0 6.71 1.000 0.945
5.0 7.10 1.000 0.943
10.0 7.11 1.000 0.941
100.0 7.34 1.000 0.939

注:运行时间指的是训练和预测的时间,也就是fit和predict的运行时间。

可见,随着正则化度提高,运行时间逐渐拉长,训练集正确率趋向于1。但测试集正确率是上凸形,在C=1.0~2.0之间达到峰值。这表明,正则化度低的时候,存在欠拟合,高的时候存在过拟合。最优的C是1.0左右。

2、朴素贝叶斯

朴素贝叶斯也是一种分类器。它基于概率论中的“贝叶斯公式”(也就是推广的条件概率公式)的算法。它的效率非常高,运行速度比k近邻和逻辑斯蒂等算法快2个数量级。在第三目中,我们将对比三种分类算法,来看看它们在效率和准确率方面的差异。

sklearn中,不出所料,朴素贝叶斯也是封装好的。使用朴素贝叶斯的步骤如下:

1、数据收集和归一化(归一化和逻辑斯蒂中的标准化差不多,是对数据进行预处理)

2、创建朴素贝叶斯分类器

3、训练

4、检测训练集的训练效果

5、预测

6、检测预测准确度

我们先说一下朴素贝叶斯分类器。朴素贝叶斯分类器又三种,高斯模型,多项式模型和伯努利模型。高斯模型假设样本概率呈正态分布,也就是连续数据。伯努利模型假设样本概率呈01分布。多项式模型则适用于多分类问题。对这三种模型感兴趣的童鞋自行百度。由于我们这里属于多分类问题,所以选择多项式模型。

然后,归一化的操作非常简单,和逻辑斯蒂中的标准化一样,调用一个MinMaxScaler函数,位于sklearn.preprocessing包中。

ss = sklearn.preprocessing.MinMaxScaler()
x_train_std = ss.fit_transform(x_train)
x_test_std = ss.fit_transform(x_test)

接下来就是创建、训练和测试。照猫画虎就行了。创建分类器时有一个参数alpha,是用于控制模型复杂度的,即所谓“平滑化”程度。它对模型性能影响不大,所以我们不用管它,按照默认的1.0到2.0之间即可。注意import sklearn.naive_bayes

nb = sklearn.naive_bayes.MultinomialNB(alpha=1.0)
nb.fit(x_train_std, y_train)
nb_result = nb.predict(x_test_std)
nb_relevant = nb.predict(x_train_std)
print("naive_bayes relevant: %.3f" % (pandas.np.mean(nb_relevant == y_train)))
print("naive_bayes score: %.3f" % (pandas.np.mean(nb_result == y_test)))

运行结果如下:

Bayes time: 0.013847
naive_bayes relevant: 0.928
naive_bayes score: 0.925

贝叶斯的运行时间只有0.01秒,比k近邻和逻辑斯蒂少2个数量级。但是,训练效果只有92.5%,明显不如前两者。这说明,训练效果和训练速度是一对矛盾。和人类学习一样,欲速则不达(滑稽~)

3、三种分类算法的比较

到目前为止我们已经了解了k近邻分类、逻辑斯蒂回归和朴素贝叶斯三种分类算法。三种分类算法各有优缺点,比如k近邻的优点是训练效果好,但缺点是时间复杂度高;而朴素贝叶斯刚好相反。下面我们来列一下各种算法在训练效果最好的情况:

分类器 运行时间/s 训练集正确率 测试集正确率
k近邻 5.77 0.986 0.987
逻辑斯蒂回归 6.74 1.000 0.945
朴素贝叶斯 0.02 0.928 0.925

所以说无法直接说那种算法孰优孰劣,只能根据实际问题的规模和性质来决定使用哪种算法。对训练速度要求高的采用朴素贝叶斯,比如手写输入法(当然仅限于拉丁字母和数字);对训练效果要求高的采用k近邻,比如手写扫描仪。

当然,这几种算法比较简单,无法兼顾分类的效率与正确性,所以接下来我们将借助决策树、随机森林等办法来提高。

机器学习(二)--sklearn之逻辑斯蒂回归和朴素贝叶斯相关推荐

  1. 细讲逻辑斯蒂回归与朴素贝叶斯、最大熵原理的爱恨交织(长文)

    好早之前就发现逻辑斯蒂回归好像和朴素贝叶斯里面的后验概率公式还有最大似然.信息熵.交叉熵.伯努利分布.回归分析.几率(odds)等等有着千丝万缕CZFZ(错综复杂).PSML(扑朔迷离)的关系.一直感 ...

  2. 细讲逻辑斯蒂回归与朴素贝叶斯、最大熵原理的爱恨交织(五)

    第五节:分类器中的天真小弟 -- 朴素贝叶斯 朴素贝叶斯文本分类模型 考虑如下文本分类模型:P(yi,di)P(y_i, d_i)P(yi​,di​) 表示一篇文章以及它的 label 的联合概率.d ...

  3. 逻辑斯蒂回归、朴素贝叶斯

    逻辑斯蒂回归 逻辑斯蒂分布(增长分布):F(X) = P(X<=x) = 1/(1+e^(-(X-u)/γ)) 该分布曲线以(u,1/2)作为中心对称点 sigmod函数(亦称作Logistic ...

  4. 细讲逻辑斯蒂回归与朴素贝叶斯、最大熵原理的爱恨交织(一)

    好早之前就发现逻辑斯蒂回归好像和朴素贝叶斯里面的后验概率公式还有最大似然.信息熵.交叉熵.伯努利分布.回归分析.几率(odds)等等有着千丝万缕CZFZ(错综复杂).PSML(扑朔迷离)的关系.一直感 ...

  5. sklearn分类算法(逻辑回归、朴素贝叶斯、K近邻、支持向量机 、决策树、随机森林 )的使用

    scikit-learn机器学习的分类算法包括逻辑回归.朴素贝叶斯.KNN.支持向量机.决策树和随机森林等.这些模块的调用形式基本一致,训练用fit方法,预测用predict方法.用joblib.du ...

  6. 逻辑回归与朴素贝叶斯的战争

    0 一起走过的 首先,小夕带领大家回顾一下文章<逻辑回归>.<Sigmoid与Softmax>.<朴素贝叶斯>中的几点内容,这几点内容也是本文的前置知识: 1. 逻 ...

  7. Python3《机器学习实战》学习笔记(五):朴素贝叶斯实战篇之新浪新闻分类

    转载请注明作者和出处:http://blog.csdn.net/c406495762 Github代码获取:https://github.com/Jack-Cherish/Machine-Learni ...

  8. 《机器学习实战》学习笔记之第四章朴素贝叶斯进行文档分类

    朴素贝叶斯有两个假设: 1."朴素":特征之间相互独立,单词出现的概率相同,当然这个假设不合理 2."权重相同":每个特征等同重要,这个假设也不太合理 尽管如此 ...

  9. 【阿旭机器学习实战】【10】朴素贝叶斯模型原理及3种贝叶斯模型对比:高斯分布朴素贝叶斯、多项式分布朴素贝叶斯、伯努利分布朴素贝叶斯

    [阿旭机器学习实战]系列文章主要介绍机器学习的各种算法模型及其实战案例,欢迎点赞,关注共同学习交流. 本文介绍了机器学习中的朴素贝叶斯的基本原理,并对3种贝叶斯模型根据鸢尾花实例进行了比较. 目录 朴 ...

最新文章

  1. python中raise stoplteration_推导表达式迭代器生成器模块和包 | 编程电脑技术交流...
  2. 到底什么时候用指针或是引用
  3. spring mvc事务没有生效的原因
  4. golang 基于Mac os 构建镜像
  5. 多阶段构建Docker镜像
  6. 小学接触web的我是如何拿下蚂蚁实习 Offer的
  7. [react] React中怎么操作虚拟DOM的Class属性
  8. java驱动pl sql优点_用PL/SQL和Java开发Oracle8i应用程序
  9. 计算机的硬盘 内存在哪查到,电脑硬盘内存怎么查看
  10. python opencv最小外接矩形中心点_Opencv绘制最小外接矩形、最小外接圆
  11. 可视化分析:洞见数据的秘诀
  12. Ubuntu 16.04之标题栏实时显示上下行网速、CPU及内存使用率
  13. 20161212 输出1到n之间所有的奇(单)数(n30000) 。
  14. Cmailserver和outlook配置
  15. CAD2020软件安装教程【搬运】
  16. html全局背景代码,html背景代码
  17. uefi启动服务器系统安装win7系统教程,uefi引导gpt安装win7教程
  18. 初中数学抽象教学的案例_初中数学数形结合思想教学研究与案例分析
  19. 大视角、大方向、大问题、大架构:(结局)解决问题的出发点
  20. Linux文件打包与解压缩

热门文章

  1. 笔记:TRULY_SPINACH(优酷播单:和我一起用Unity3D玩游戏)
  2. 鸿蒙osvalue mysql_终于有人把鸿蒙OS讲明白了,大佬讲解!快收藏
  3. 电子台账之自定义财务报表模板
  4. webRTC基础入门
  5. 网络与信息安全笔记(更完)
  6. 《权威指南》笔记 - 9.1-9.2 类和原型、构造函数
  7. 糟了,上网记录被 Python 扒下来了!
  8. 【人脸表情识别】稀疏表示人脸表情识别【含GUI Matlab源码 786期】
  9. 基于随机游走Random Walk的图节点Node表示
  10. 2021年安全员-A证考试题库及安全员-A证报名考试