常用机器学习算法汇总(中)

机器学习入门系列(2)–如何构建一个完整的机器学习项目,第八篇!

该系列的前七篇文章:

上一篇文章介绍了线性回归、逻辑回归、决策树和随机森林四种算法,本文会继续介绍四种算法–SVM、朴素贝叶斯、KNN 以及 kmean 算法,其中最后一种是无监督学习的聚类算法,前面三种也是非常常见的算法,特别是 SVM,在 2012 年 AlexNet 网络的成功之前,一直都是图像分类中非常常用的分类算法。


5. 支持向量机(SVM)

简述

定义:SVM 是一种二类分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,即支持向量机的学习策略便是间隔最大化,最终可转化为一个凸二次规划问题的求解。

或者简单的可以理解为就是在高维空间中寻找一个合理的超平面将数据点分隔开来,其中涉及到非线性数据到高维的映射以达到数据线性可分的目的。

训练数据线性可分时,通过硬间隔最大化,学习一个线性分类器,即线性可分支持向量机,又称为硬间隔支持向量机;训练数据近似线性可分时,通过软间隔最大化,也学习一个线性分类器,即线性支持向量机,也称为软间隔支持向量机;训练数据线性不可分时,通过使用核技巧和软间隔最大化,学习非线性支持向量机。

原始的 SVM 是一个二类分类器,但后续针对多类分类问题,也进行了拓展,有以下几种改进来实现多类分类问题:

1.直接法

直接在目标函数上进行修改,将多个分类面的参数求解合并到一个最优化问题中,通过求解该优化就可以实现多分类。

但是计算复杂度很高,实现起来较为困难。一般很少使用这种方法

2.间接法,间接法又分为以下几种:

  • 一对多:每次训练的时候设置其中某个类为一类,其余所有类为另一个类。

比如有 A,B,C,D 四个类,第一次 A 是一个类,B,C,D 是一个类,训练一个分类器,第二次 B 是一个类,然后 A,C,D 是一个类,训练一个分类器,依次类推。因此,如果总共有 n 个类,最终将训练 n 个分类器。

测试的时候,将测试样本都分别送入所有分类器中,取得到最大值的类别作为其分类结果。这是因为到分类面距离越大,分类越可信。

这种方法的优点是每个优化问题的规模比较小,而且分类速度很快,因为分类器数目和类别数目相同;但是,有时会出现这样两种情况:对一个测试样本,每个分类器都得到它属于分类器所在类别;或者都不属于任意一个分类器的类别。前者称为分类重叠现象,后者叫不可分类现象。前者可以任意选择一个结果或者就按照其到每个超平面的距离来分,哪个远选哪个类别;而后者只能分给新的第 n+1 个类别了。最大的缺点还是由于将 n-1 个类别作为一个类别,其数目会数倍于只有 1 个类的类别,这样会人为造成数据集偏斜的问题

  • 一对一:任意两个类都训练一个分类器,预测的时候通过投票选择最终结果。

这个方法同样会有分类重叠的现象,但不会有不可分类现象,因为不可能所有类别的票数都是 0。这种方法会比较高效,每次训练使用的样本其实就只有两类数据,而且预测会比较稳定,但是缺点是预测时间会很久

优缺点
优点
  1. 使用核函数可以向高维空间进行映射
  2. 使用核函数可以解决非线性的分类
  3. 分类思想很简单,就是将样本与决策面的间隔最大化
  4. 分类效果较好
缺点
  1. 对大规模数据训练比较困难
  2. 无法直接支持多分类,但是可以使用间接的方法来做
  3. 噪声也会影响SVM的性能,因为SVM主要是由少量的支持向量决定的。
代码实现

线性 SVM 的代码实现:

from sklearn import datasets
import numpy as np
from sklearn.cross_validation import train_test_split

iris = datasets.load_iris() # 由于Iris是很有名的数据集,scikit-learn已经原生自带了。
X = iris.data[:, [2, 3]]
y = iris.target # 标签已经转换成0,1,2了
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0) # 为了看模型在没有见过数据集上的表现,随机拿出数据集中30%的部分做测试

# 为了追求机器学习和最优化算法的最佳性能,我们将特征缩放
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
sc.fit(X_train) # 估算每个特征的平均值和标准差
sc.mean_ # 查看特征的平均值,由于Iris我们只用了两个特征,所以结果是array([ 3.82857143,  1.22666667])
sc.scale_ # 查看特征的标准差,这个结果是array([ 1.79595918,  0.77769705])
X_train_std = sc.transform(X_train)
# 注意:这里我们要用同样的参数来标准化测试集,使得测试集和训练集之间有可比性
X_test_std = sc.transform(X_test)
X_combined_std = np.vstack((X_train_std, X_test_std))
y_combined = np.hstack((y_train, y_test))

# 导入SVC
from sklearn.svm import SVC
svm = SVC(kernel='linear', C=1.0, random_state=0) # 用线性核,你也可以通过kernel参数指定其它的核。
svm.fit(X_train_std, y_train)
# 打印决策边界,这个函数是我自己写的,如果你想要的话,我发给你
plot_decision_regions(X_combined_std, y_combined, classifier=svm, test_idx=range(105,150))
plt.xlabel('petal length [standardized]')
plt.ylabel('petal width [standardized]')
plt.legend(loc='upper left')
plt.show()

接下来是使用非线性 SVM 的代码:

svm = SVC(kernel='rbf', random_state=0, gamma=x, C=1.0) # 令gamma参数中的x分别等于0.2和100.0
svm.fit(X_train_std, y_train) # 这两个参数和上面代码中的训练集一样
plot_decision_regions(X_combined_std, y_combined, classifier=svm, test_idx=range(105,150))
plt.xlabel('petal length [standardized]')
plt.ylabel('petal width [standardized]')
plt.legend(loc='upper left')
plt.show()

6. 朴素贝叶斯

简述

朴素贝叶斯是基于贝叶斯定理与特征条件独立假设的分类方法。

贝叶斯定理是基于条件概率来计算的,条件概率是在已知事件 B 发生的前提下,求解事件 A 发生的概率,即
P ( A ∣ B ) = P ( A B ) P ( B ) P(A|B)=\frac{P(AB)}{P(B)} P(AB)=P(B)P(AB)

所以贝叶斯定理如下所示:

P ( B ∣ A ) = P ( A ∣ B ) P ( B ) P ( A ) P(B|A) = \frac{P(A|B)P(B)}{P(A)} P(BA)=P(A)P(AB)P(B)

朴素贝叶斯分类器可表示为:

f

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

spearhead_cai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值