机器学习笔记 监督学习算法小结(一) - Go语言中文社区

机器学习笔记 监督学习算法小结(一)


如有转载,请申明:
转载至 http://blog.csdn.net/qq_35064774/article/details/54862260


前言

坚持写博客半年多了,但感觉自己没有写技术博客的天赋,写出来的东西深度和广度都欠缺,也不容易理解。事实上大部分技术博客都存在这些问题,但即便写得不好,也会起到一定作用,所以我还是决定坚持写下去。

接触机器学习有一段时间了,感觉还是挺有意思的,趁着对理论概念还没忘记的时候,把知识点总结下来。这系列文章是学习笔记,更适合用来复习。

监督学习算法

  • 朴素贝叶斯(Naive Bayes)
  • 决策树(Decision trees)
  • 支持向量机(SVM)

朴素贝叶斯

贝叶斯公式

朴素贝叶斯思想

  1. 有若干特征属性集合 x = {a1, a2, a3,…, am}
  2. 有若干类别集合 C = {y1, y2, …, yn}
  3. 且 x 中的所有属性相互条件独立
  4. 则会有 n 个先验概率 p(y1|x), p(y2|x),…, p(yn|x)
  5. 其中对于一个值固定的 x 来说,存在一个最大概率的类别 yi,则这个 x 就属于该类别。

总结:对于每一个特征属性,我们猜测它可能属于很多类别,可能是类别 yi、yj,朴素贝叶斯思想认为,概率最大的那个类别就是它实际所属类别。

先验概率估算后验概率

想了很久,难以写出满意的总结,先空着

但举一个的简单例子:

假设患癌症概率为 1%。对人群进行某项检测,在癌症患者中,检验呈阳性的比例为 90%,而非癌症患者检测呈阴性的比例为 90%,求某人检测呈阳性时,患有癌症的概率。

解析:
1. 用 c 代表患癌症,-c 表示无癌症,p 表示阳性,-p 表示阴性。
2. 则可以用式子表示: P(c)=0.01 , P(-c)=0.99 , P(p|c)=0.9 , P(-p|-c)=0.9 , P(-p|c)=1-P(p|c)=0.1 , P(p|-c)=1-P(-p|-c)=0.1,要求的是 P(c|p)
3. 所以可以计算出 P(c, p) 和 P(-c, p)
P(c, p)=P(c)*P(p|c)=0.01*0.9=0.009
P(-c, p)=P(-c)*P(p|-c)=0.99*0.1=0.099
4. P(p)=P(c, p)+P(-c, p)=0.009+0.099=0.108
5. P(c|p) = P(c, p) / P(p) = 0.009/0.108=0.0833

朴素贝叶斯分类器应用

这里使用的是基于 python 的 sklearn 库

from sklearn import datasets
iris = datasets.load_iris()
from sklearn.naive_bayes import GaussianNB # 导入朴素贝叶斯分类器
gnb = GaussianNB() # 创建分类器
y_pred = gnb.fit(iris.data, iris.target).predict(iris.data) # 监督学习 和 测试
print("Number of mislabeled points out of a total %d points : %d"
...       % (iris.data.shape[0],(iris.target != y_pred).sum()))

Number of mislabeled points out of a total 150 points : 6

基本步骤是

  1. 导入朴素贝叶斯分类器 from sklearn.naive_bayes import GaussianNB
  2. 创建分类器 gnb = GaussianNB()
  3. 监督学习 gnb.fit(iris.data, iris.target)
  4. 测试 gnb.predict(iris.data)

决策树

决策树分类器

分类树(决策树)是一种十分常用的分类方法。他是一种监管学习,所谓监管学习就是给定一堆样本,每个样本都有一组属性和一个类别,这些类别是事先确定的,那么通过学习得到一个分类器,这个分类器能够对新出现的对象给出正确的分类。

决策树例子

就拿当前很火的无人车来说,汽车在平地和崎岖的坑地行驶速度不一样,在平路和斜坡上的速度也不一样,那么给定平滑度和坡度,汽车该怎么决定当前的行驶速度呢?

算法可能有很多,而决策树是这样来决定的。

你可以马上有疑问,对于一个决策,可能存在多个影响的因素,那么该优先选择那个属性进行决策,这个时候就要引入“信息增益”这个概念,下面是两个常见算法。

决策树 ID3 算法

熵(entropy)

对某属性的熵

某属性的信息增益

优先选择信息增益大的进行决策,直到所有属性都用完为止。

决策树 C4.5 算法

对某属性的熵

某属性的信息增益

和 ID3 算法类似,优先选择增益率大的。

决策树应用

在实际应用中,我们完全不需要自己去实现这些算法,只需要了解相应的参数。

from sklearn.tree import DecisionTreeClassifier # 导入分类器
X = [[0, 0], [2, 2]]
y = [0.5, 2.5]
clf = DecisionTreeClassifier() # 创建分类器
clf = clf.fit(X, Y) # 监督训练
clf.predict([[1, 1]]) # 测试

我们可以通过改变分类器的参数来提高准确率,比如:

min_samples_split # 表示最小分割的样品数量,当某一区域样品数量小于这个数值时,决策树不会考虑。也就是这个数值越小,划分的程度越细腻,学习时间越长,但容易导致过拟合。

支持向量机

SVM 作用

SVM 可以通过松弛变量和核技巧,把线性不可分问题转变成线性可分。

SVM 例子

线性可分的情况

线性不可分

这个时候引入第三维变量 z = |x|,则 x,z 的图像变为线性可分的

SVM 应用

事实上我们不需要自己去编写这样的核函数

import numpy as np
X = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]])
y = np.array([1, 1, 2, 2])
from sklearn.svm import SVC # 导入分类器
clf = SVC() # 创建分类器
clf.fit(X, y) # 监督学习
#SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
    decision_function_shape=None, degree=3, gamma='auto', kernel='rbf',
    max_iter=-1, probability=False, random_state=None, shrinking=True,
    tol=0.001, verbose=False)
print(clf.predict([[-0.8, -1]])) # 测试

[1] # 测试结果

应用 SVM 需要根据情况调节参数,比如:

kernel: 可选项 ‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’ , 代表不同的核函数

C: 错误项的惩罚参数,越大时,学习越精细,准确率也越高,但泛化能力弱。
相反,值越小,则表示容错能力越强。
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_35064774/article/details/54862260
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-06-27 22:58:14
  • 阅读 ( 1289 )
  • 分类:算法

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢