机器学习

第二章——算法



前言

本章内容为机器学习系列第二章,主要为机器学习的一些算法基础,查看第一章内容请转到>>>零基础学机器学习(基于Python Scikit-learn) 第一章


五、机器学习概述

5.1机器学习开发流程

在这里插入图片描述
机器学习模型是什么?

  • 通过一种映射关系将输入值到输出值

5.2机器学习算法分类

5.2.1监督学习和无监督学习

  • 监督学习
    分类: k-近邻算法、贝叶斯分类、决策树与随机森林、逻辑回归、神经网络
    回归: 线性回归、岭回归
    标注: 隐马尔可夫模型
  • 无监督学习
    聚类: k-means
    在这里插入图片描述
    监督学习(Supervised learning),可以由输入数据中学到或建立一个模型,并依此模式推测新的结果。输入数据是由输入特征值和目标值所组成。函数的输出可以是一个连续的值(称为回归),或是输出是有限个离散值(称作分类)。
    无监督学习(Supervised learning),可以由输入数据中学到或建立一个模型,并依此模式推测新的结果。输入数据是由输入特征值所组成。

5.2.2分类问题

概念: 分类是监督学习的一个核心问题,在监督学习中,当输出变量取有限个离散值时,预测问题变成为分类问题。最基础的便是二分类问题,即判断是非,从两个类别中选择一个作为预测结果;

分类在于根据其特性将数据“分门别类”,所以在许多领域都有广泛的应用

  • 在银行业务中,构建一个客户分类模型,按客户按照贷款风险的大小进行分类
  • 图像处理中,分类可以用来检测图像中是否有人脸出现,动物类别等
  • 手写识别中,分类可以用于识别手写的数字
  • 文本分类,这里的文本可以是新闻报道、网页、电子邮件、学术论文

5.2.3回归问题

概念: 回归是监督学习的另一个重要问题。回归用于预测输入变量和输出变量之间的关系,输出是连续型的值。

回归在多领域也有广泛的应用

  • 房价预测,根据某地历史房价数据,进行一个预测
  • 金融信息,每日股票走向

- - - >>>返回目录<<< - - -

六、数据集与估计器

6.1数据集划分

机器学习一般的数据集会划分为两个部分:

  • 训练数据:用于训练,构建模型
  • 测试数据:在模型检验时使用,用于评估模型是否有效
  • 一般训练集:测试集=7:3或8:2

6.2sklearn数据集接口

sklearn数据集划分API: sklearn.model_selection.train_test_split

scikit-learn数据集API语法:

  • sklearn.datasets
    加载获取流行数据集
  • datasets.load_*()
    获取小规模数据集,数据包含在datasets里
  • datasets.fetch_*(data_home=None)
    获取大规模数据集,需要从网络上下载,函数的第一个参数是data_home,表示数据集下载的目录,默认是~/scikit_learn_data/

获取数据集返回的类型:

  • load和fetch返回的数据类型datasets.base.Bunch(字典格式)
  • data:特征数据数组,是 [n_samples * n_features] 的二维numpy.ndarray 数组
  • target:标签数组,是 n_samples 的一维 numpy.ndarray 数组
  • DESCR:数据描述
  • feature_names:特征名,新闻数据,手写数字、回归数据集没有
  • target_names:标签名,回归数据集没有

示例代码:

from sklearn.datasets import load_iris #鸢尾花数据集
li = load_iris()
print("获取特征值")
print(li.data)
print("目标值")
print(li.target)
print(li.DESCR)

6.3sklearn分类、回归数据集

数据集进行分割:

  • sklearn.model_selection.train_test_split(*arrays, **options)
    x 数据集的特征值
    y 数据集的标签值
  • test_size 测试集的大小,一般为float
  • random_state 随机数种子,不同的种子会造成不同的随机采样结果。相同的种子采样结果相同。
  • return 训练集特征值,测试集特征值,训练标签,测试标签(默认随机取)

用于分类的大数据集:

  • sklearn.datasets.fetch_20newsgroups(data_home=None,subset=‘train’)
  • subset: ‘train’或者’test’,‘all’,可选,选择要加载的数据集训练集的“训练”,测试集的“测试”,两者的“全部”
  • datasets.clear_data_home(data_home=None)
    清除目录下的数据

sklearn回归数据集:

  • sklearn.datasets.load_boston()
    加载并返回波士顿房价数据集
  • sklearn.datasets.load_diabetes()
    加载和返回糖尿病数据集

6.4估计器

在sklearn中,估计器(estimator)是一个重要的角色,分类器和回归器都属于estimator,是一类实现了算法的API

1、用于分类的估计器:

  • sklearn.neighbors k-近邻算法
  • sklearn.naive_bayes 贝叶斯
  • sklearn.linear_model.LogisticRegression 逻辑回归

2、用于回归的估计器:

  • sklearn.linear_model.LinearRegression 线性回归
  • sklearn.linear_model.Ridge 岭回归

估计器的工作流程:
在这里插入图片描述
- - - >>>返回目录<<< - - -

七、K-近邻算法

分类算法-k近邻算法(KNN)
定义:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。
来源:KNN算法最早是由Cover和Hart提出的一种分类算法

计算距离公式:
两个样本的距离可以通过如下公式计算,又叫欧式距离
比如说,a(a1,a2,a3),b(b1,b2,b3)
在这里插入图片描述
sklearn k-近邻算法API: sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm=‘auto’)

  • n_neighbors:int,可选(默认= 5),k_neighbors查询默认使用的邻居数
  • algorithm:{‘auto’,‘ball_tree’,‘kd_tree’,‘brute’},可选用于计算最近邻居的算法:‘ball_tree’将会使用BallTree,‘kd_tree’将使用 KDTree。‘auto’将尝试根据传递给fit方法的值来决定最合适的算法。 (不同实现方式影响效率)
    k值取很小:容易受异常点影响
    k值取很大:容易受最近数据太多导致比例变化

k-近邻算法优缺点

优点:

  • 简单,易于理解,易于实现,无需估计参数,无需训练

缺点:

  • 懒惰算法,对测试样本分类时的计算量大,内存开销大
  • 必须指定K值,K值选择不当则分类精度不能保证

使用场景:

  • 小数据场景,几千~几万样本,具体场景具体业务去测试

- - - >>>返回目录<<< - - -

八、朴素贝叶斯算法

联合概率和条件概率:

  • 联合概率:包含多个条件,且所有条件同时成立的概率
    记作:𝑃(𝐴,𝐵)

  • 条件概率:就是事件A在另外一个事件B已经发生条件下的发生概率
    记作:𝑃(𝐴|𝐵)

特性:P(A1,A2|B) = P(A1|B)P(A2|B)
注意:此条件概率的成立,是由于A1,A2相互独立的结果

朴素贝叶斯-贝叶斯公式:
在这里插入图片描述
注:w为给定文档的特征值(频数统计,预测文档提供),c为文档类别

公式可以理解为:
在这里插入图片描述
其中c可以是不同类别

  • 𝑃(𝐶):每个文档类别的概率(某文档类别词数/总文档词数)
  • 𝑃(𝑊│𝐶):给定类别下特征(被预测文档中出现的词)的概率
    计算方法:𝑃(𝐹1│𝐶)=𝑁𝑖/𝑁 (训练文档中去计算)
    𝑁𝑖为该𝐹1词在C类别所有文档中出现的次数
    N为所属类别C下的文档所有词出现的次数和
  • 𝑃(𝐹1,𝐹2,…) 预测文档中每个词的概率

注: 如果词频列表里面
有很多出现次数都为0,很可能计算结果都为零
解决方法:拉普拉斯平滑系数
𝑃(𝐹1│𝐶)=(𝑁𝑖+𝛼)/(𝑁+𝛼𝑚)
𝛼为指定的系数一般为1,m为训练文档中统计出的特征词个数

sklearn朴素贝叶斯实现API: sklearn.naive_bayes.MultinomialNB

  • sklearn.naive_bayes.MultinomialNB(alpha = 1.0)
    朴素贝叶斯分类
    alpha:拉普拉斯平滑系数

朴素贝叶斯分类优缺点
优点:

  • 朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。
  • 对缺失数据不太敏感,算法也比较简单,常用于文本分类。
  • 分类准确度高,速度快

缺点:

  • 需要知道先验概率P(F1,F2,…|C),因此在某些时候会由于假设的先验模型的原因导致预测效果不佳。

- - - >>>返回目录<<< - - -

九、决策树和随机森林

决策树思想的来源非常朴素,程序设计中的条件分支结构就是if-then结构,最早的决策树就是利用这类结构分割数据的一种分类学习方法

信息熵
在这里插入图片描述
H的专业术语称之为信息熵,单位为比特。

决策树的划分依据之一-信息增益

特征A对训练数据集D的信息增益g(D,A),定义为集合D的信息熵H(D)与特征A给定条件下D的信息条件熵H(D|A)之差,即公式为:
在这里插入图片描述
注:信息增益表示得知特征X的信息而使得类Y的信息的不确定性减少的程度

常见决策树使用的算法

  • ID3
    信息增益 最大的准则
  • C4.5
    信息增益比 最大的准则
  • CART
    回归树: 平方误差 最小
    分类树: 基尼系数 最小的准则 在sklearn中可以选择划分的原则

sklearn决策树API: class sklearn.tree.DecisionTreeClassifier(criterion=’gini’, max_depth=None,random_state=None)

决策树分类器

  • criterion:默认是’gini’系数,也可以选择信息增益的熵’entropy’
  • max_depth:树的深度大小
  • random_state:随机数种子
  • method:
  • decision_path:返回决策树的路径

决策树的结构、本地保存

1、sklearn.tree.export_graphviz() 该函数能够导出DOT格式
tree.export_graphviz(estimator,out_file='tree.dot’,feature_names=[‘’,’’])
2、工具:(能够将dot文件转换为pdf、png)
安装graphviz
ubuntu:sudo apt-get install graphviz Mac:brew install graphviz
3、运行命令
然后我们运行这个命令
$ dot -Tpng tree.dot -o tree.png

决策树的优缺点以及改进
优点:

  • 简单的理解和解释,树木可视化。
  • 需要很少的数据准备,其他技术通常需要数据归一化。

缺点:

  • 决策树学习者可以创建不能很好地推广数据的过于复杂的树,这被称为过拟合。
  • 决策树可能不稳定,因为数据的小变化可能会导致完全不同的树被生成

改进:

  • 减枝cart算法
  • 随机森林

什么是随机森林?

定义:在机器学习中,随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。

集成学习API:

  • class sklearn.ensemble.RandomForestClassifier(n_estimators=10,
    criterion=’gini’, max_depth=None, bootstrap=True, random_state=None)

随机森林分类器:

  • n_estimators:integer,optional(default = 10) 森林里的树木数量
  • criteria:string,可选(default =“gini”)分割特征的测量方法
  • max_depth:integer或None,可选(默认=无)树的最大深度
  • bootstrap:boolean,optional(default = True)是否在构建树时使用放回抽样

随机森林的优点:

  • 在当前所有算法中,具有极好的准确率
  • 能够有效地运行在大数据集上
  • 能够处理具有高维特征的输入样本,而且不需要降维
  • 能够评估各个特征在分类问题上的重要性
  • 对于缺省值问题也能够获得很好得结果

- - - >>>返回目录<<< - - -

十、线性回归

线性模型

试图学得一个通过属性的线性组合来进行预测的函数:
在这里插入图片描述
w为权重,b称为偏置项,可以理解为:𝑤_0×1

10.1线性回归

定义:线性回归通过一个或者多个自变量与因变量之间之间进行建模的回归分析。其中特点为一个或多个称为回归系数的模型参数的线性组合

一元线性回归:涉及到的变量只有一个
多元线性回归:涉及到的变量两个或两个以上

通用公式:
在这里插入图片描述
其中𝑤,𝑥为矩阵:
在这里插入图片描述
损失函数(误差大小)
𝑦_𝑖为第𝑖个训练样本的真实值

〖ℎ_𝑤 (𝑥〗_𝑖)为第𝑖个训练样本特征值组合预测函数

总损失定义:
在这里插入图片描述
又称最小二乘法

最小二乘法之梯度下降

我们以单变量中的w0,w1为例子
在这里插入图片描述
𝛼为学习速率,需要手动指定
在这里插入图片描述表示方向
理解:沿着这个函数下降的方向找,最后就能找到山谷的最低点,然后
更新W值
使用:面对训练数据规模十分庞大的任务

sklearn线性回归正规方程、梯度下降API

  • sklearn.linear_model.LinearRegression
    正规方程
  • sklearn.linear_model.SGDRegressor
    梯度下降

LinearRegression、SGDRegressor

  • sklearn.linear_model.LinearRegression()
    普通最小二乘线性回归
    coef_:回归系数
  • sklearn.linear_model.SGDRegressor( )
    通过使用SGD最小化线性模型
    coef_:回归系数

10.2过拟合与欠拟合

过拟合:一个假设在训练数据上能够获得比其他假设更好的拟合, 但是在训练数据外的数据集上却不能很好地拟合数据,此时认为这个假设出现了过拟合的现象。(模型过于复杂)

欠拟合:一个假设在训练数据上不能获得更好的拟合, 但是在训练数据外的数据集上也不能很好地拟合数据,此时认为这个假设出现了欠拟合的现象。(模型过于简单)

欠拟合原因以及解决办法
原因:

  • 学习到数据的特征过少

解决办法:

  • 增加数据的特征数量

过拟合原因以及解决办法

原因:

  • 原始特征过多,存在一些嘈杂特征,模型过于复杂是因为模型尝试去兼顾各个测试数据点

解决办法:

  • 进行特征选择,消除关联性大的特征(很难做)
  • 交叉验证(让所有数据都有过训练)
  • 正则化(了解)

L2正则化

作用:可以使得W的每个元素都很小,都接近于0
优点:越小的参数说明模型越简单,越简单的模型则越不
容易产生过拟合现象

10.3岭回归

带有正则化的线性回归-Ridge
sklearn.linear_model.Ridge
sklearn.linear_model.Ridge(alpha=1.0)

  • 具有l2正则化的线性最小二乘法
  • alpha:正则化力度
  • coef_:回归系数

10.4线性回归与岭回归对比

岭回归:回归得到的回归系数更符合实际,更可靠。另外,能让
估计参数的波动范围变小,变的更稳定。在存在病态数据偏多的研
究中有较大的实用价值

- - - >>>返回目录<<< - - -

十一、逻辑回归

逻辑回归公式
在这里插入图片描述
输出:[0,1]区间的概率值,默认0.5作为阀值
注:g(z)为sigmoid函数

逻辑回归的损失函数、优化(了解)

与线性回归原理相同,但由于是分类问题,损失函数不一样,只能通过梯度下降求解

对数似然损失函数
在这里插入图片描述
完整的损失函数
在这里插入图片描述
cost损失的值越小,那么预测的类别准确度更高

sklearn逻辑回归API

  • sklearn.linear_model.LogisticRegression

LogisticRegression

  • sklearn.linear_model.LogisticRegression(penalty=‘l2’, C = 1.0)
    Logistic回归分类器
    coef_:回归系数

LogisticRegression总结

应用:广告点击率预测、电商购物搭配推荐
优点:适合需要得到一个分类概率的场景
缺点:当特征空间很大时,逻辑回归的性能不是很好(看硬件能力)

- - - >>>返回目录<<< - - -

十二、k-means

k-means步骤

  1. 随机设置K个特征空间内的点作为初始的聚类中心
  2. 对于其他每个点计算到K个中心的距离,未知的点选择最近的一个聚类 中心点作为标记类别
  3. 接着对着标记的聚类中心之后,重新计算出每个聚类的新中心点(平 均值)
  4. 如果计算得出的新中心点与原中心点一样,那么结束,否则重新进行 第二步过程

k-means API: sklearn.cluster.KMeans

sklearn.cluster.KMeans(n_clusters=8,init=‘k-means++’)

  • k-means聚类
  • n_clusters:开始的聚类中心数量
  • init:初始化方法,默认为’k-means ++’
  • labels_:默认标记的类型,可以和真实值比较(不是值比较)

Kmeans性能评估指标
在这里插入图片描述
注:对于每个点𝑖 为已聚类数据中的样本 ,𝑏_𝑖 为𝑖 到其它族群的所有样本的平均距离,𝑎_𝑖 为𝑖 到本身簇的距离平均值

最终计算出所有的样本点的轮廓系数平均值
如果〖𝑠𝑐〗_𝑖 小于0,说明𝑎_𝑖 的平均距离大于最近的其他簇。
聚类效果不好
如果〖𝑠𝑐〗_𝑖 越大,说明𝑎_𝑖 的平均距离小于最近的其他簇。
聚类效果好
轮廓系数的值是介于 [-1,1] ,越趋近于1代表内聚度和分离度都相对较优

Kmeans性能评估指标API: sklearn.metrics.silhouette_score

sklearn.metrics.silhouette_score(X, labels)

  • 计算所有样本的平均轮廓系数
  • X:特征值
  • labels:被聚类标记的目标值

Kmeans总结

特点分析:

  • 采用迭代式算法,直观易懂并且非常实用

缺点:

  • 容易收敛到局部最优解(多次聚类)
  • 需要预先设定簇的数量(k-means++解决)

- - - >>>返回目录<<< - - -


附:

以上为个人机器学习学习笔记,未经授权禁止转载。 内容不全,懒得写了,有时间再补吧~当然也有可能不补了>_<
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐