正则化防止过拟合
Logistic Regression原理以及应用
逻辑回归算法是一个很有用的分类算法,这篇文章总结一下逻辑回归算法的相关内容。数据使用scikit-learn自带的Iris
数据集。
Iris dataset
Iris数据集,里面包含3种鸢尾花品种的4各属性,这个分类问题可以描述成使用鸢尾花的属性,来判断这个品种倒地属于哪个品种类别。为了简单,这里使用两个类别:Setosa
和Versicolor
,两个属性:Length
和Width
1 | from sklearn import datasets |
可以看出来,两个品种可以被区分开,接下来要使用一种算法,让计算机把这两个类别区分开。可以想象,可以使用线性回归,也就是画一条线来把两个类别分开,但是这种分割很粗暴,准确性也不高,所以接下来要使用的算法要使用概率的方法区分两个类别,比如,算法返回0.9,那么代表属于类别A的概率是90%
单变量线性回归
1月份的时候,参加了Coursera上面Andrew Ng的Machine Learning课程,课程断断续续的学,没有透彻的理解、推导,再加上作业使用Octave完成,并且还是有模版的,不是从头到尾做出来的,所以效果很差,虽然拿到了完成证书,但是过后即忘。我觉得是时候从头学习一遍,并且用Python实现所有的作业内容了。
这里写个系列,就当作为这门课程的课程笔记。
利用Spark进行单词计数
这里就不再介绍Spark了,这篇文章主要记录一下关于Spark的核心RDD
的相关操作以及以单词计数这个简单的例子,描述一下Spark的处理流程。
Spark RDD
Spark是以RDD概念为中心运行的。RDD是一个容错的、可以被并行操作的元素集合。创建一个RDD有两个方法:在你的驱动程序中并行化一个已经存在的集合;从外部存储系统中引用一个数据集,这个存储系统可以是一个共享文件系统,比如HDFS、HBase或任意提供了Hadoop输入格式的数据来源。
RDD支持两类操作:
- 转换(Transform)
- 动作(Action)
还是不翻译的好,下面都用英文描述。Transform
:用于从已有的数据集转换产生新的数据集,Transform的操作是Lazy Evaluation
的,也就是说这条语句过后,转换并没有发生,而是在下一个Action
调用的时候才会返回结果。Action
:用于计算结果并向驱动程序返回结果。
朴素贝叶斯算法的一些细节和小技巧
某特征属性的条件概率为0
当特征属性为离散值时,只要统计训练样本中各个划分在每个类别中出现的频率即可用来估计P(a|y),若某一特征值的概率为0则会使整个概率乘积变为0,这会让分类器的准确性大幅下降。
这时候使用Laplace校准:即假定训练数据库很大,以至于对每个计数加1造成的估计概率的变化忽略不计。
连续分布假定值服从高斯分布(正态分布)
当特征属性为连续值时,通常假定其值服从高斯分布,即:
$$p\left( x_{i}|y\right) =\dfrac {1} {\sqrt {2\pi \sigma_{y}^{2}}}exp\left( -\dfrac {\left( x_{i}-\mu_{y}\right) ^{2}} {2\sigma_{y}^{2}}\right)$$
所以,对于连续分布的样本特征的训练就是计算其均值和方差
小数连续相乘
实际项目中,概率P往往是值很小的小数,连续的微小小数相乘容易造成下溢出使乘积为0或者得不到正确答案。一种解决办法就是对乘积取自然对数,将连乘变为连加,$\ln \left( AB\right) =\ln A+\ln B$。采用自然对数处理不会带来任何损失,可以避免下溢出或者浮点数舍入导致的错误。