参考:https://github.com/apachecn/vt-cs4624-pyml-zh/blob/master/docs/12.md
概念:一种二分类方法。目的是将输入映射到sigmoid函数上,进行二分类。
原理:
β值是权重,x 值是变量输入。 该公式给出了输入属于 B 类的可能性P(B) 。
特点:与线性回归相比,不需要设置先验类别阈值。能给出预测准确的概率。
但是由于预测值是连续的,当prob~=0.5时,两个类别的预测概率相近。(class0:0.46 class1:0.54)
*tips:多分类情况,用多项式逻辑回归。逻辑回归实践代码
具体的fit过程底层实现还得学习
背景:将输入分类为某个预先存在的类。即已知输入属于已知类中的一种,预测它是哪类。
原理:
为什么是朴素bys:
先说什么是贝叶斯,学过概率论的都知道:
朴素就是A与B相互独立。
用于朴素贝叶斯分类的常见模型:
模型 | 适用数据类型 | 适用情况 |
高斯 | 连续 | 不需要计算特征频率且包含十进制值时 |
多项式 | 离散 | 需要计算频率 |
伯努利 | 离散 | 判断特征是否发生(出现) |
都是概念性描述,模型的调用都封装好了,缺乏底层实现的讲解。
背景:使我们能够根据先前的数据进行预测
原理:不多bb,直接上图,和创建决策树的代码
图1左边的是条件,右边的是结果。图2是预测过程。
个人估计,每个预测值后面还有次数和概率,如Supplies(H) 10Times —>No, 8times,80%; —>Yes,2times,20%。
特点:
创建原理:
通过称为归纳的拆分过程创建的,它决定何时拆分节点。使用贪婪算法,计算每次拆分的最低成本,确定拆分的最佳属性。
拆分成本由成本函数决定。对于只有答案没有值的决策树,使用基尼不纯度计算信息增益。
决策树节点修剪:
原因:是数据集过大,产生决策树的节点过多。可能导致节点可用性低 or 过拟合。
方法:修剪涉及计算每个结束子树(叶节点及其父节点)的信息增益(详见原文),然后删除信息增益最小的子树。
介绍:K近邻(KNN)是机器学习的基本分类器。分类器采用已标注的数据集,尝试将新数据点标记到已知数据的其中一类中。新数据与已知数据之间存在“距离关系”,距离比较近的可称为邻居。而多少算近,最远距离由K决定。在距离K内,其邻居多属哪类,就是新数据所属的类别。
距离计算模型:
小总结:
选择 k 的值将大大改变数据的分类方式。 较高的 k 值将忽略数据的异常值,而较低的 k 值将赋予它们更大的权重。 如果 k 值太高,将无法对数据进行分类,因此 k 需要相对较小。
实践代码
介绍:与K最近邻类似,也是找超平面。区别是:1、一个SVM分类器只有一个超平面,只分两类。2、不需要计算数据之间的距离,只需要计算数据落在超平面哪里一侧。
超平面:能将数据空间分割成两个断开部分的平面,维度取决于数据空间维度。1维空间的超平面是一个点,2维空间的超平面是一条线。但是能区分两类数据的超平面往往不止一个,如图1;SVM中,会选离两类数据都最远的超平面,称为最大边距,如图2。
图1
图2
最大边距:离超平面最近的数据点,是决定边距的关键,称为支持向量(support vector)。找到支持向量并最大化边距会涉及很多复杂的数学运算。 我们不会去讨论。原文建议,但我偏不哈哈哈
损失函数:从这个超级详细的宝藏博客学习到的
其中 f(x)= w*x,y=label。
当pred和label一样,则cost=0。否则cost = 1 - y*f(x)
梯度更新:
看完损失函数和svm代码的同学就会问了:为什么code里面的cost没有被用于w更新呢?
因为我们给cost加了正则化,求导后,直接用于更新w。
实际梯度更新公式如下:
代码实现如下:
w1 = w1 + alpha * (train_f1[count] * y_train[count] - 2 * 1 / epochs * w1) 其中t_f1*y_t就是cost的其中一部分。不过是求导后有变化。
*SVM分类忽略离群值,即粥里面的老鼠屎。
实践代码(need ):ctrl+F,搜索“Support Vector Machine(SVM) code in Python”跳转。
实践代码2(need ):超级底层实现
常用的三种类型的核:
svc = svm.SVC(kernel='linear', C=1,gamma=0)
实际测试中,C几乎没有影响
SVM 的优点:
与 SVM 的缺点:
*一个博客的结论
此外,可以明确的两个结论是:
结论1:样本数目少于特征维度并不一定会导致过拟合,这可以参考余凯老师的这句评论:
“这不是原因啊,呵呵。用RBF kernel, 系统的dimension实际上不超过样本数,与特征维数没有一个trivial的关系。”
结论2:RBF核应该可以得到与线性核相近的效果(按照理论,RBF核可以模拟线性核),可能好于线性核,也可能差于,但是,不应该相差太多。
当然,很多问题中,比如维度过高,或者样本海量的情况下,大家更倾向于用线性核,因为效果相当,但是在速度和模型大小方面,线性核会有更好的表现。
老师木还有一句评论,可以加深初学者对SVM的理解:
“须知rbf实际是记忆了若干样例,在sv中各维权重重要性等同。线性核学出的权重是feature weighting作用或特征选择 。”