[TOC]
1. 什么是机器学习
2. 基础概念
2.1 数据
- 数据整体称为数据集,是一个矩阵
- 萼片长度、花瓣宽度等都是样本的一个特征,鸢尾花有三个种类,分别用缩写se、ve、vi表示
- 最后一列整体称为标记(等价于种类),是一个向量,第i个标记用小写字母yi表示;图中y2=ve(1)
- 每一行称为一个样本,所有样本即数据集是一个矩阵,第i(行)个样本用X(i)表示,第 i 个样本的第 j 个特征用X(i)j表示;图中X(3)1=6.3
-
特征空间是指特征在空间几何中的表示,下图横轴是萼片长度,竖轴是萼片宽度,判断鸢尾花种类的本质就是判断鸢尾花在红色线的上方还是下方;实际情况经常是高维的,切分线也并不是直线
20191119002327.png
-
特征在机器学习中经常是很抽象的,和识别目的可能并没有关系,如图像识别中每个像素点都是特征
2.2 机器学习的主要任务
- 分类任务,二分类(猫狗分类,垃圾邮件,股票涨跌),多分类(数字识别,图像识别,信用评级),很多复杂的问题可以转换为分类任务(2048游戏,围棋),多标签分类
- 回归任务,结果是一个连续数字的值,而非一个类别(房屋价格,市场销售分析,学生成绩,股票价格),回归任务有时可以简化为分类任务(学生成绩任务转换为评级任务)
2.2 机器学习方法的分类
-
监督学习:给机器的训练数据拥有“标记”或者“答案”;如给机器的猫狗照片是有标记类别的
- 银行已经积累了一定客户信息和他们信用卡的信用情况
- 医院已经积累了一定病人信息和他们的患病情况
- 市场已经积累了房屋的基本信息和成交价格
- 非监督学习:对没有“标记”的数据进行分类,聚类分析,特征提取、特征压缩
- 半监督学习:一部分数据有“标记”或“答案”,另一部分数据没有;如照片有的有标记“自拍”,有的则没有
- 增强学习:根据周围环境的情况,采取行动,根据采取行动的结果,改进行动方式;如alpha go,无人驾驶
2.3 机器学习的其他分类
-
批量学习:简单,训练模型完成后,只需要输入样例,即可输出结果,模型不会更新;缺点是无法适应环境变化,可以定时重新批量学习
20191119011823.png - 在线学习:及时反映新的环境变化,输出结果会对比正确结果,并重新加入到训练集中,更新优化模型;缺点是错误数据会带来错误的学习,需要加强对数据的监控
20191119011715.png - 参数学习:为了得到一个函数的参数,一旦学到了参数,就不再需要原有的数据集
- 非参数学习:不对模型进行过多假设,非参数不等于没参数
2.4 数据与算法
2001年微软论文揭示,不同的算法,在输入数据数量提高时,所有算法的准确率都在提高,当数据量大到一定程度时,不同算法的准确率非常接近,所以在机器学习中数据极其重要。
现阶段机器学习处理的很多任务都是数据驱动的,高度依赖数据的质量。所以现实任务中重要的是收集更多的数据,提高数据质量,提高数据的代表性,研究数据中更重要的特征
AlphaGo Zero是从零开始,人类没有提供任何数据,所有数据都是靠算法产生的,这个突破告诉我们算法仍然非常重要
如何选择机器学习算法?
- 奥卡姆剃刀:简单的就是好的
- 无免费午餐定理:不同的问题,需要不同的算法,面对具体问题,尝试多种算法进行对比
3. 机器学习基础工具的使用(Jupyter Notebook, numpy和matplotlib)
3.1 搭建 Jupyter Notebook环境
Anaconda指的是一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项。
下载 Anaconda 并安装,anaconda中包含Python环境,所以注意安装环境中最好不要预安装python。
使用最新的PyCharm,旧版本的PyCharm会出现调用numpy包运行错误。
启动anaconda,运行Jupyter Notebook,会在本地启动一个web服务,并在浏览器中打开Jupyter,地址为http://localhost:8891/tree
,用户可以在浏览器中操作Jupyter。
3.2 Jupyter Notebook 基础
运行代码
- 点击
New
创建 Python3,会在响应文件夹生成*.ipynb文件,即 Jupyter Notebook文件 - 输入代码,点击
Cell-Run Cells
运行代码 20191119041154.png -
Help-Keyboard ShortCuts
查看快捷键,View-Toggle Line Numbers
显示代码行号等
魔法命令
-
%run
py脚本:加载并运行py脚本,脚本中的方法可以在Jupyter中直接调用 -
20191120204446.pngimport
模块:加载该模块至内存,后面可直接调用该模块
-
%timeit
统计函数运行时间,%%timeit 测试代码段的运行时间,注意%%命令必须在第一行 -
20191125194840.png%time
统计CPU时间、总时间
-
%lsmagic
列出所有魔法命令 -
%run?
查看魔法命令%run的文档
常用快捷键Help-Keyboard ShortCuts
Jupyter快捷键分为两种模式:命令行模式和编辑模式,与vim类似
Shift-Enter: 运行代码块, 选择下面的代码块
Ctrl-Enter: 运行选中的代码块
Alt-Enter: 运行代码块并且插入下面
Enter: 进入编辑模式
A: 在上面插入代码块
B: 在下面插入代码块
X: 剪切选择的代码块
C: 复制选择的代码块
Shift-V: 粘贴到上面
V: 粘贴到下面
Z: 撤销删除
撤销删除操作
-
先按esc进入命令模式,即左侧线为蓝色(为绿色时是编辑模式),按z键即可恢复
-
如果是运行过的代码,直接运行输入命令 history
-
功能栏 edit -> undo delete cell
3.3 Numpy 数据基础
3.4 创建Numpy数组和矩阵
生成固定数组或矩阵
20191119221048.png生成等差数组或矩阵
20191119221639.png生成随机数组或矩阵
20191119222126.png帮助命令,查看函数文档与参数介绍
20191119222344.png3.5 Numpy数组(和矩阵)的基本操作
3.6 Numpy数组(和矩阵)的合并与分割
Numpy.array的基本操作:数据访问、Reshape、合并、分割
20191120002456.png 20191120010249.png 20191120004850.png 20191120010053.png20191120010130.png
3.7 Numpy中的矩阵运算
3.8 Numpy中的聚合运算
3.9 Numpy中的arg运算
3.10 Numpy中的比较和Fancy Indexing
3.11 Matplotlib数据可视化基础
Matplotlib 是 Python 的绘图库。 它可与 NumPy 一起使用,提供了一种有效的 MatLab 开源替代方案。
Matplotlib API在线文档可以查看更多的Matplotlib API。
3.12 数据加载和简单的数据探索
4 分类算法-k近邻算法 kNN
4.1 什么是kNN算法?
k近邻算法(k-Nearest Neighbor,简称KNN)是一种常用的监督学习算法,其工作机制非常简单:给定测试样本,找出训练数据集中与其最靠近的 k 个训练样本,然后基于这 k 个邻居的信息来进行预测样本,可以解决分类问题。
利用KNN来预测绿色样本的分类如上图所示,当k=3时,测试样本(绿点)距离最近的三个训练样本,然后根据统计这三个训练样本中标记良性(红色)、恶性肿瘤(蓝色)的数量,得出恶性肿瘤数量最多,所以测试样本大概率是恶性肿瘤。
在具体计算中,首先求出绿点和所有点的欧拉距离,然后排序得出距离最近的三个点,最后统计三个点的标记值,取最大值即可
kNN算法的python实现
import numpy as np
from math import sqrt
from collections import Counter
from .metrics import accuracy_score
class KNNClassifier:
# 创建分类器, 设置k
def __init__(self, k):
"""初始化kNN分类器"""
assert k >= 1, "k must be valid"
self.k = k
self._X_train = None
self._y_train = None
# 利用特征集和标记集拟合函数
def fit(self, X_train, y_train):
"""根据训练数据集X_train和y_train训练kNN分类器"""
assert X_train.shape[0] == y_train.shape[0], \
"the size of X_train must equal to the size of y_train"
assert X_train.shape[0] >= self.k, \
"the size of X_train must be as least k"
self._X_train = X_train
self._y_train = y_train
return self
# 传入测试样本矩阵X_sample, 预测结果
def predict(self, X_sample):
assert self._X_train is not None and self._y_train is not None, \
"must fit before predict1"
assert X_sample.shape[1] == self._X_train.shape[1], \
"the feature number of X_sample must be equal to X_train"
y_predict = [self._predict(x) for x in X_sample]
return np.array(y_predict)
# 对单个测试样本x, 返回预测结果
def _predict(self, x):
assert self._X_train.shape[1] == x.shape[0], \
"the feature number of x must be equal to X_train"
# 计算测试样本与每个训练样本的欧拉距离, 如果需要加入权重, 可以使用距离的倒数
distances = [ sqrt(np.sum((x - x_train)**2))
for x_train in self._X_train ]
nearest = np.argsort(distances)
topK_y = [self._y_train[i] for i in nearest[:self.k]]
votes = Counter(topK_y)
return votes.most_common(1)[0][0]
def score(self, X_test, y_test):
"""根据测试数据集X_test和y_test确定当前模型的准确度"""
y_predict = self.predict(X_test)
return accuracy_score(y_test, y_predict)
# 类似java的toString
def __repr__(self):
return "KNN(k=%d)" % self.k
4.2 使用sklearn中的kNN
20191120234354.png4.3 训练集测试集切割
4.4 计算预测准确率
4.5 超参数
超参数:运行机器学习算法之前需要制定的参数,如kNN中k参数,调参指的就是超参数
模型参数:算法过程中学习的参数
4.6 网格搜索获取最优超参数
4.7 数据归一化
肿瘤大小(cm) | 发现时间(天) | |
---|---|---|
样本1 | 1 | 200天 = 0.55年 |
样本2 | 5 | 100天 = 0.27年 |
表格中两个样本的距离:
((5-1)2 + (200-100)2)1/2 = 100
((5-1)2 + (0.55-0.27)2)1/2 = 4
发现时间采用天为单位,影响距离的因素几乎只与发现时间有关,发现时间采用天年单位,影响距离的因素几乎只与肿瘤大小有关。
因此,需要进行数据归一化,将所有的数据映射到同一尺度。典型的方法就是
- 最值归一化(normalization),把所有数据映射到0-1之间,适用于数据分布有明显边界,没有极端数据值的情况。如学生成绩范围为0-100;
最值归一化距离计算公式:
=
表示单个样本数据, 表示所有数据中最小的值, 表示所有数据中最大的值,这样所有的数据都在 (0, 1] 之间,实现了最值归一化。
- 均值方差归一化(standardization) 把所有数据归一到均值为 0 方差为 1 的分布中,数据分布没有明显的边界,可以存在极端数据值。如人群的收入,大多数人的收入都在2k-2W,但是存在极端值1kW,使用最值归一化效果并不好,假如收入100W的人我们使用上面的最值归一化公式进行计算,发现距离低收入人群比较近,然而这明显与事实不符
均值方差归一化距离计算公式:
=
表示样本数据, 表示所有数据平均值, 表示所有数据的标准差,这样所有的数据都在 (0, 1] 之间,实现了均值归一化。均值方差归一化的特点是,可以将数据归一化到均值为0方差为1的分布中,不容易受到异常值(outlier)影响。
注意:
- 归一化处理针对的是特征集,与标记没有关系
- 测试特征集进行均值方差归一化需要使用训练特征集的平均值和方差
- 均值方差归一化整体优于最值归一化,推荐使用
4.8 Sklearn 中的归一化处理
4.9 kNN 算法的一些思考
kNN算法是解决分类问题的算法,并且天然可以解决多分类问题,算法思路简单,效果强大,而且可以解决回归问题。
kNN算法的缺点:
- 效率低下,如果训练集有m个样本,n个特征,则预测每一个新的数据,需要O(m*n)。因为需要计算新的样本与m个样本的距离,而距离又由n个特征间的距离构成。
- 高度数据相关,如果使用k-3的近邻算法,测试点的周围只有两个错误值,也会导致预测结果错误,哪怕测试点周围有大量的正确的样本。
- 预测结果不具有可解释性
- 维数灾难(解决方法是PCA),随着维度的增加,“看似相近”的两个点之间的距离越来越大,如下图所示
20191122012020.png
机器学习流程:
- 数据集切分,分为训练数据集合测试数据集(train_test_split)
- 训练集数据归一化,利用训练集得到均值和方差(StandardScaler.fit()),实现数据归一化standardScaler.transform()
- 训练模型,使用kNN算法,使用2得到的归一化训练集,得到模型(KNeighborsClassifier.fit())
- 测试集数据归一化,利用训练集得到均值和方差(StandardScaler.fit()),实现数据归一化standardScaler.transform()
- 预测结果,利用3训练的模型,对4得到的归一化测试集进行预测(kNN_classifier.predict()),与测试集的标记进行比较,得到准确率(kNN_classifier.score())
-
使用网格搜索(GridSearchCV)最好的超参数,k、weights、p
20191122013510.png
5 线性回归算法
线性回归算法(linear regression)用于解决回归问题,思想简单,实现容易,是许多强大的非线性模型的基础,多项式回归、逻辑回归SVM都可以理解成线性回归算法的扩展,最重要的是结果具有很好的可解释性,通过对数据的分析和模型的建立,可以学到真实世界真正的知识,正是因为如此,很多研究中,都会先尝试线性回归算法。
线性回归算法就是寻找一条直线,最大程度的“拟合”样本特征和样本输出标记之间的关系,下图中横轴代表数据特征,纵轴代表数据标记,因为回归问题中标记是一个具体的数值,这个数值在连续的空间中。
20191122014135.png
5.1 简单的线性回归
只有一个特征的回归算法,我们称之为简单线性回归。
20191122020224.png
简单线性回归的目标就是找到下图公式中的 a 和 b,其他参数是已知的,训练集有 m 个样本,第 i 个样本的特征为 x ,标记为 y 。
20191122020552.png
参数学习算法的基本思路:
20191122020941.png几乎所有的参数学习算法的思路都是这样的套路,即求解参数,使得损失函数最小;如线性回归、多项式回归、逻辑回归、SVM、神经网络,正是大部分机器学习算法都是这样的思路,所有有一门学科最优化原理。
5.2 最小二乘法
5.3 简单线性回归的实现
class SimpleLinearRegression2:
def __init__(self):
"""初始化简单线性回归Simple Linear Regression 模型"""
self.a_ = None
self.b_ = None
# 对比kNN,模型不需要保存训练数据集,训练数据集的作用就是训练我们模型的参数,也就是a和b
def fit(self, x_train, y_train):
"""根据训练数据集x_train, y_train训练Simple Linear Regression 模型"""
assert x_train.ndim == 1, \
"Simple Linear Regressor can only solve single feature training data."
assert len(x_train) == len(y_train), \
"the size of x_train must be equal to the size of y_train"
x_mean = np.mean(x_train)
y_mean = np.mean(y_train)
num = (x_train - x_mean).dot(y_train - y_mean)
d = (x_train - x_mean).dot(x_train - x_mean)
self.a_ = num / d
self.b_ = y_mean - (self.a_ * x_mean)
return self
def predict(self, x_predict):
"""给定待预测数据集x_predict,返回表示x_predict的结果向量"""
assert x_predict.ndim == 1, \
"Simple Linear Regressor can only solve single feature training data."
assert self.a_ is not None and self.b_ is not None, \
"must fit before predict!"
return np.array( [self._predict(x) for x in x_predict] )
# 预测时只需要使用模型的参数即可
def _predict(self, x_single):
"""对给定的单个测试数据x_single, 返回x_single的预测结果值"""
return self.a_ * x_single + self.b_
def __repr__(self):
return "SimpleLinearRegression2()"
5.6 衡量线性回归的最好指标 R Square
MSE, RMSE, MAE本质都是线性回归模型的损失函数,都是用来计算该模型相比实际值的误差
使用 RMSE、MAE可以判断同一问题下不同线性模型的缺点,但无法判断不同问题下线性模型的准确度,如预测房价的MAE是10W,预测成绩的MAE是10,我们无法判断到底哪个预测的准确度更高。
下图公式中分子代表我们的模型预测产生的错误,分母代表使用 y= 预测产生的错误, y= 是一个平行于 X 轴的直线
- R2 = 1 说明分母等于0,预测值 i 等于 y i ,R2 越大越好
- R2 < 0 说明分子大于分母,预测值的误差比使用平均值还要大,可能数据不存在任何线性关系
20191122160408.png
5.7 多元线性回归
image20191124074223.png
20191124074118.png
5.10 线性回归的可解释性和更多思考
20191122230635.png线性回归算法总结
-
典型的参数学习
思路就是找到相应的参数,使得损失函数最小,上图中就是找到参数 θ 向量。
对比kNN:典型的非参数学习(注意这里的参数与超参数不同)
-
拟合
就是求线性函数的系数
对比kNN:拟合是保存所有训练集
-
只能解决回归问题
虽然很多分类方法中使用线性回归的思想(逻辑回归)
对比kNN:既可以解决分类问题,又可以解决回归问题
-
对数据有假设:线性关系
对比kNN:对数据没有假设
-
优点:对数据具有可解释性,白盒算法
可以学到现实中的知识,如预测波士顿房价建立线性模型,可以学到房价与房间个数,是否为河景房正相关,与一氧化氮浓度,距离工作区的距离负相关
-
缺点:时间复杂度高
使用多元线性回归的正规方程解求线性模型的参数,涉及到三个矩阵的点乘,时间复杂度为 O( n3 )
这个问题可以使用梯度下降法解决,是机器学习中求解最优模型中通用的方法
前提是数据具有线性关系,该问题可以通过多项式回归解决
6 梯度下降法
什么是梯度下降法 ?
- 不是一个机器学习算法
- 是一种基于搜索的最优化方法
- 作用是最小化一个损失函数
- 最大化一个效用函数使用梯度上升法
- 是参数学习思路的重要组成部分
在上一章线性回归中我们使用对损失函数求导的方式,获得损失函数导函数等于 0 的方程,即损失函数产生极小值的方程,最后求出参数 θ 向量
实际情况中,有的损失函数可能无法求导,或者求导效率太低,这时我们可以采用搜索的方法,也就是一个一个试的方法(过程参考下图):
-
指定一个值 θ ,代入损失函数的导函数 J',在 x = θ 时斜率为 J'(θ),
-
如果斜率 J'(θ) > 0,那就继续减小参数 θ 的值,使得损失函数的斜率下降,
-
依次循环第 2 步,直至找出损失函数斜率 J'(θ) = 0 的极值点 θ ,就是我们线性回归方程中参数的最优解。
20191123034702.png在二维空间中,使得斜率下降,搜索出线性回归方程参数的最优解,在多维空间中,我们使得梯度下降,故称为梯度下降法
由上图可知,第 2 步参数 θ (theta) 每次增加(减少)的值为 ,由于斜率 越来越接近于 0 ,所以 theta 每次增加的值都越来越小,这样才能求得更加精确的极值点 θ ,另外 η 的值也非常关键:
- η 被称为学习率(learning rate)
- η 的取值影响最优解的速度
- η 取值不合适,甚至得不到最优解
- η 是梯度下降法的一个超参数
上面梯度下降法举的例子损失函数是二次函数,具有唯一的极值点,然而,并不是所有的函数都有唯一的极值点,所以上面的求解过程得到的可能只是局部最优解,而不是全局最优解,这个问题的解决办法如下:
- 随机化初始点,多次运行
- 梯度下降法的初始点也是一个超参数
6.3 线性回归中的梯度下降法
学习该章节前请复习5-7多远线性回归和正规方程解
6.5 梯度下降法的向量化与数据标准化
20191124081052.png6.6 随机梯度下降法
20191125120621.png7 主成分分析PCA
主成分分析法(Principal Component Analysis)
- 非监督的机器学习算法
- 主要用于数据的降维,降低运算时间,用降维后的数据作为其他算法的训练集(如kNN)
- 通过降维,可以发现更便于人类理解的特征
- 其他应用:可视化;去燥
-
将样本数据降维映射到目标轴(红轴),找到映射后样本间间距最大的轴,所谓间距最大,就是最稀疏,我们使用方差来描述稀疏程度。如下图所示,使所有样本映射到这个轴后(即黑色点),方差最大
20191201022253.png -
将样例的均值归为 0 (demean),样本每个特征的均值都为0,将样本变为下图所示,公式中x i 指的是样本在红轴上的映射点,Var(x) 表示求样本的方差,由于进行过demean处理,均值 为0,公式简化如下
20191201014534.png -
求红轴方向向量 w(w1, w2),样本x映射到红轴 w 后为 xproject ,有 xproject 的方差最大,即样本映射后最稀疏。如下图所示,将求映射点的方差最大值转换为求样本(这里指demean后的样本)与目标轴 w 点乘的最大值
20191201021700.png -
使用梯度上升法求样本(这里指demean后的样本)与目标轴 w 点乘的最大值,其导函数如下图所示
20191201023253.png
8 多项式回归
20191205054916.png交叉验证
20191205060304.png 20191205073403.png对比线性回归拟合2次幂数据,可以发现数据偏离在拟合曲线一侧,这样偏差较大,属于欠拟合
对比100次幂多项式回归拟合2次幂数据,可以发现存在拟合数值距离实际数值非常远,即方差较大,属于过拟合
非参数学习通常都是高方差算法,因为不对数据进行任何假设,如kNN
参数学习通常都是高偏差算法,因为对数据具有极强的假设,如线性回归
9 逻辑回归
10 评价分类结果
准确度陷阱: 一个癌症预测系统,预测准确度是99.9%,如果癌症产生概率只有0.01%,我们系统预测所有人都是健康的,即可达到99.99%的概率。所以对于极度偏斜(Skewed Data)的数据,需要使用精准率和召回率进行评价
混淆矩阵: 0表示阴性,1表示阳性,TN+FP=真实0数,TN+FN=预测0数
精准率 = 预测为1且准确的数 / 所有预测为1的数;如癌症预测关注的是预测患病的人是够真实患病
召回率 = 预测为1且准确的数 / 所有真实为1的数;如癌症患者被预测患病的概率
模型的精准率和召回率哪个更重要一些呢?
这个需要根据实际情况而定,比如股票预测,股票上涨为1,那么我们更关心精准率,即预测上涨的股票最好都上涨,否则会导致亏损,而召回率并不关心,因为上涨的股票可能有很多个,我们并不需要找到全部上涨的股票。
比如病人诊断,我们更关心召回率,即尽可能诊断出所有的患者,否则会导致误诊延误病情,而精准率并不关心,因为将未患病诊断为患病,只需要做进一步检查验证即可
10.4 调和平均值F1 Score
如果使用精准率和召回率的平均值来评价模型,如果精准率非常高,召回率非常低,也能得到不错的平均值,而使用F1则能更好的协调精准率和召回率
20191220065541.png
当精准率为1,召回率为1,F1=1,表示模型最好;
当精准率为0,召回率为0,记F1=0,表示模型最坏
10.5 精准率和召回率的平衡
由下图可知,精准率和召回率是存在矛盾关系的,同一个模型中,当精准率提高的同时,必然会导致召回率降低
20191220074944.png
10.7 ROC曲线
ROC描述TPR与FPR之间的关系,TPR等于召回率,表示预测为1且准确的数占所有真实为1的数的比例;FPR表示预测为1且错误的数占所有真实为0的数的比例。
20191220091908.png
11 支撑向量机
逻辑回归中,我们是找到一个决策边界,但是决策边界不是唯一的,逻辑回归中使用概率函数sigmod确定损失函数,最后确定决策边界,即当概率等于0.5时就是决策边界
高斯核函数的本质是将数据升维,让原本线性不可分的数据变得线性可分
12 决策树
生活中的决策树:
20191224082003.png
决策树:
- 非参数学习算法
- 可以决策分类问题
- 天然支持解决多分类问题
- 也可以解决回归问题,使用叶子节点平均值作为回归值
上图中展示的决策树的分类过程,我们需要解决两个问题:
- 求解节点在哪个维度上划分,即第一个判断中的特征维度是x还是y
- 某个维度在哪个值上做划分,即第一个判断中x的取值范围,如何确定是2.4
信息熵: 随机变量不确定性的度量,熵越大,数据不确定性越高
下图中有两组数据,代表样本中三个类别占比,明显右边数据不确定性较小,大概率是第三种,所以熵更小,当样本中只有一个类别时,数据100%为第一个类别,不确定性极小,此时熵为0
20191224035856.png
决策树原理: 遍历所有特征、样本,寻找划分(二分)后使得信息熵最低的维度和值,如x<2.4,维度为x,即第0个特征,划分区间为2.4,在x<2.4的范围内,样本的信息熵极小,即样本都是同一个类别A的鸢尾花;在x>2.4的范围内,样本的信息熵较大,即样本有多个类别的鸢尾花,我们继续寻找划分后使得信息熵最低的维度和值,如y<1.8,维度为y,即第1个特征,划分区间为1.8,此时信息熵较小,即样本基本都是同一个类别B的鸢尾花,此时就得到了一个深度为2的决策树
基尼系数: 在决策树中的作用于信息熵相同,都是为了描述数据的不确定性,并且计算速度比信息熵更快,因为信息熵中使用了log函数
决策树解决回归问题: 使用分类结果的平均值作为回归预测结果
决策树的局限性:
- 划分边界只能是横平竖直,对于实际边界是斜线的问题很难处理
- 对数据敏感,非参数学习的通病,需要进行调参
13 集成学习和随机森林
生活中的集成学习:看电影找别人推荐,如果7个人说好,3个人说不好,则我们会倾向去电影院看这部电影。简而言之,就是少数服从多数
集成学习的思路:
- Voting
- Bagging
- Bosting
- Stacking
少数服从多数典型的就是 VotingClassifier
投票分类器,它可以集成多个子模型(KNN、逻辑回归、SVM、决策树等),然后票多者胜(hard);还可以给根据每个子模型预测分类结果的概率(soft)预测最终结果,
虽然有很多的机器学习算法,但是从投票的角度看,仍然不够多。为此我们需要创建更多的子模型,集成更多偶读子模型的意见,因为一致的子模型数量多也无法提高准确率(每个模型都一样,预测结果也一样,投票也一致,显然无法提升准确率),所以子模型之间要有差异性
如何创建差异性?
每个子模型只看样本数据的一部分(Bagging Pasting),例如一共有500个样本,每个子模型只取随机100个样本训练,这样我们就能有非常多的子模型。
由于每个模型只取100个样本训练,所以模型准确率并不高,但是集成学习中每个子模型不需要太高的准确率
如果每个子模型只有60%的准确率:
- 1个子模型,整体准确率 60%
- 3个子模型,整体准确率 65%
- 500个子模型,整体准确率99.9%
取样方式:
- 放回取样Bagging,能创建更多的子模型
- 不放回取样Pasting,500个样本,每次取100个,最多创建5个子模型
使用差异性的集成学习模型 BaggingClassifier
取样分类器,使用bootstrap设置取样方式
放回取样Bagging是随机取样,所以有的样本是不会被取到的,这些没被取到的样本我们可以用来做测试数据集
随机森林
取样方式为随机取样(放回取样Bagging),决策模型使用决策树,由于有多个子模型(决策树),所以我们称之为随机森林
20191225050946.png20191225051612.png
14 学习Scikit-Learn文档
scikit-learn官网 有 API 可以查看scikit-learn中所有类、方法的说明和 Demo,在以后的学习工作中遇到问题可以进行参考;User Guide用户指南是一本机器学习教材,囊括了非常多的机器学习模型的原理与使用Demo,建议通读一遍
参考文档
- Python3入门机器学习 经典算法与应用 - 视频教程
- Python3 入门机器学习 - 代码仓库
- Matplotlib API 官方文档\
- Scikit-learn API 官方文档
- Numpy - 菜鸟教程
网友评论