Python_机器学习_算法_第1章_K-近邻算法

文章目录

  • Python_机器学习_算法_第1章_K-近邻算法
  • K-近邻算法
    • 学习目标
  • 1.1 K-近邻算法简介
    • 学习目标
    • 1 什么是K-近邻算法
      • 1.1 K-近邻算法(KNN)概念
      • 1.2 电影类型分析
      • 1.3 KNN算法流程总结
    • 2 小结
  • 1.2 k近邻算法api初步使用
    • 学习目标
    • 1 Scikit-learn工具介绍
      • 1.1 安装
      • 1.2 Scikit-learn包含的内容
    • 2 K-近邻算法API
    • 3 案例
      • 3.1 步骤分析
      • 3.2 代码过程
    • 4 小结
      • 问题
  • 1.3 距离度量
    • 学习目标
    • 1 距离公式的基本性质
    • 2 常见的距离公式
      • 2.1 欧式距离**(Euclidean Distance):**
      • 2.2 **曼哈顿距离(Manhattan Distance):**
      • 2.3 切比雪夫距离 (Chebyshev Distance):
      • 2.4 闵可夫斯基距离(Minkowski Distance):
    • 3 “连续属性”和“离散属性”的距离计算
    • 4 小结
  • 1.4 k值的选择
    • 学习目标
    • 1 K值选择说明
      • 举例说明:
    • 2 小结
  • 1.5 kd树
    • 学习目标
    • 1 kd树简介
      • 1.1 什么是kd树
      • 1.2 原理
        • image-20190213191654082
    • 2 构造方法
    • 3 案例分析
      • 3.1 树的建立
      • 3.2 最近领域的搜索
        • 3.2.1 查找点(2.1,3.1)
        • 3.2.2 查找点(2,4.5)
    • 4 总结
  • 1.6 案例:鸢尾花种类预测--数据集介绍
    • 学习目标
    • 1 案例:鸢尾花种类预测
    • 2 scikit-learn中数据集介绍
      • 2.1 scikit-learn数据集API介绍
        • 2.1.1 sklearn小数据集
        • 2.1.2 sklearn大数据集
      • 2.2 sklearn数据集返
      • 回值介 绍
      • 2.3 查看数据分布
      • 2.4 数据集的划分
    • 3 总结
  • 1.7 特征工程-特征预处理
    • 学习目标
    • 1 什么是特征预处理
      • 1.1 特征预处理定义
          • scikit-learn的解释
        • 为什么我们要进行归一化/标准化?
        • 举例:约会对象数据
      • 1.2 包含内容(数值型数据的无量纲化)
      • 1.3 特征预处理API
    • 2 归一化
      • 2.1 定义
      • 2.2 公式
      • 2.3 API
      • 2.4 数据计算
      • 2.5 归一化总结
    • 3 标准化
      • 3.1 定义
      • 3.2 公式
      • 3.3 API
      • 3.4 数据计算
      • 3.5 标准化总结
    • 4 总结
  • 1.8 案例:鸢尾花种类预测—流程实现
    • 学习目标
    • 1 再识K-近邻算法API
    • 2 案例:鸢尾花种类预测
      • 2.1 数据集介绍
      • 2.2 步骤分析
      • 2.3 代码过程
    • 3 案例小结
      • 在本案例中,具体完成内容有:
    • 4 总结
  • 1.9 KNN算法总结
    • k近邻算法优缺点汇总
    • 优点:
    • 缺点:
  • 1.10 交叉验证,网格搜索
    • 学习目标
    • 1 什么是交叉验证(cross validation)
      • 1.1 分析
      • 1.2 为什么需要交叉验证
        • **问题:这个只是让被评估的模型更加准确可信,那么怎么选择或者调优参数呢?**
    • 2 什么是网格搜索(Grid Search)
    • 3 交叉验证,网格搜索(模型选择与调优)API:
    • 4 鸢尾花案例增加K值调优
    • 5 总结
  • 1.11 案例2:预测facebook签到位置
    • 学习目标
    • 1 项目描述
    • 2 数据集介绍
    • 3 步骤分析
    • 4 代码实现

K-近邻算法

学习目标

  • 掌握K-近邻算法实现过程
  • 知道K-近邻算法的距离公式
  • 知道K-近邻算法的超参数K值以及取值问题
  • 知道kd树实现搜索的过程
  • 应用KNeighborsClassifier实现分类
  • 知道K-近邻算法的优缺点
  • 知道交叉验证实现过程
  • 知道超参数搜索过程
  • 应用GridSearchCV实现算法参数的调优

1.1 K-近邻算法简介

学习目标

  • 目标

    • 了解什么是KNN算法
    • 知道KNN算法求解过程

1 什么是K-近邻算法

  • 根据你的“邻居”来推断出你的类别

1.1 K-近邻算法(KNN)概念

K Nearest Neighbor算法又叫KNN算法,这个算法是机器学习里面一个比较经典的算法, 总体来说KNN算法是相对比较容易理解的算法

  • 定义

如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。

来源:KNN算法最早是由Cover和Hart提出的一种分类算法

  • 距离公式

两个样本的距离可以通过如下公式计算,又叫欧式距离 ,关于距离公式会在后面进行讨论

1.2 电影类型分析

假设我们现在有几部电影

其中? 9号电影不知道类别,如何去预测?我们可以利用K近邻算法的思想

分别计算每个电影和被预测电影的距离,然后求解

1.3 KNN算法流程总结

1)计算已知类别数据集中的点与当前点之间的距离

2)按距离递增次序排序

3)选取与当前点距离最小的k个点

4)统计前k个点所在的类别出现的频率

5)返回前k个点出现频率最高的类别作为当前点的预测分类

2 小结

  • K-近邻算法简介【了解】

    • 定义:就是通过你的"邻居"来判断你属于哪个类别
    • 如何计算你到你的"邻居"的距离:一般时候,都是使用欧氏距离

1.2 k近邻算法api初步使用

学习目标

  • 目标

    • 了解sklearn工具的优点和包含内容
    • 应用sklearn中的api实现KNN算法的简单使用

  • 机器学习流程复习:

  • 1.获取数据集
  • 2.数据基本处理
  • 3.特征工程
  • 4.机器学习
  • 5.模型评估

1 Scikit-learn工具介绍

  • Python语言的机器学习工具
  • Scikit-learn包括许多知名的机器学习算法的实现
  • Scikit-learn文档完善,容易上手,丰富的API
  • 目前稳定版本0.19.1

1.1 安装

pip install scikit-learn==0.19.1

安装好之后可以通过以下命令查看是否安装成功

import sklearn
  • 注:安装scikit-learn需要Numpy, Scipy等库

1.2 Scikit-learn包含的内容

  • 分类、聚类、回归
  • 特征工程
  • 模型选择、调优

2 K-近邻算法API

  • sklearn.neighbors.KNeighborsClassifier(n_neighbors=5)

    • n_neighbors:int,可选(默认= 5),k_neighbors查询默认使用的邻居数

3 案例

3.1 步骤分析

  • 1.获取数据集
  • 2.数据基本处理(该案例中省略)
  • 3.特征工程(该案例中省略)
  • 4.机器学习
  • 5.模型评估(该案例中省略)

3.2 代码过程

步骤一:导入模块

from sklearn.neighbors import KNeighborsClassifier

步骤二:构造数据集
数据集格式一:

x = [[0], [1], [2], [3]]
y = [0, 0, 1, 1]

数据集格式二:

x = [[39,0,31],[3,2,65],[2,3,55],[9,38,2],[8,34,17],[5,2,57],[21,17,5],[45,2,9]]
y = [0,1,2,2,2,2,1,1]

步骤三:机器学习 – 模型训练

# 实例化API
estimator = KNeighborsClassifier(n_neighbors=1)   # 创建k近邻算法
# 使用fit方法进行训练
estimator.fit(x, y)    #fit  训练模型estimator.predict([[1]])  #预测结果# 数据集格式二对应的测试数据
# estimator.predict([[23,3,17]])

完整代码:

# coding:utf-8from sklearn.neighbors import KNeighborsClassifier# 1.构造数据
x = [[1], [2], [3], [4]]
y = [0, 0, 1, 1]# 2.训练模型
# 2.1 实例化一个估计器对象
estimator = KNeighborsClassifier(n_neighbors=3)# 2.2 调用fit方法,进行训练
estimator.fit(x, y)# 3.数据预测
ret = estimator.predict([[2.51]])
print(ret)
# 可以这样理解, x是特征值, 是dataframe形式理解为二维的[[]],
# y表示的目标值, 可以表示为series, 表示为一维数组[]
ret1 = estimator.predict([[2.52]])
print(ret1)

4 小结

  • sklearn的优势:

    • 文档多,且规范
    • 包含的算法多
    • 实现起来容易
  • knn中的api
    • sklearn.neighbors.KNeighborsClassifier(n_neighbors=5)

问题

1.距离公式,除了欧式距离,还有哪些距离公式可以使用?

2.选取K值的大小?

3.api中其他参数的具体含义?

1.3 距离度量

学习目标

  • 目标

    • 了解距离公式的基本性质
    • 知道机器学习中常见的距离计算公式

1 距离公式的基本性质

在机器学习过程中,对于函数 dist(., .)dis**t(.,.),若它是一"距离度量" (distance measure),则需满足一些基本性质:

直递性常被直接称为“三角不等式”。

2 常见的距离公式

2.1 欧式距离**(Euclidean Distance):**

欧氏距离是最容易直观理解的距离度量方法,我们小学、初中和高中接触到的两个点在空间中的距离一般都是指欧氏距离。

举例:

X=[[1,1],[2,2],[3,3],[4,4]];
经计算得:
d = 1.4142    2.8284    4.2426    1.4142    2.8284    1.4142

2.2 曼哈顿距离(Manhattan Distance):

在曼哈顿街区要从一个十字路口开车到另一个十字路口,驾驶距离显然不是两点间的直线距离。这个实际驾驶距离就是“曼哈顿距离”。曼哈顿距离也称为“城市街区距离”(City Block distance)。

举例:

X=[[1,1],[2,2],[3,3],[4,4]];
经计算得:
d =   2     4     6     2     4     2

2.3 切比雪夫距离 (Chebyshev Distance):

国际象棋中,国王可以直行、横行、斜行,所以国王走一步可以移动到相邻8个方格中的任意一个。国王从格子(x1,y1)走到格子(x2,y2)最少需要多少步?这个距离就叫切比雪夫距离。

举例:

X=[[1,1],[2,2],[3,3],[4,4]];
经计算得:
d =   1     2     3     1     2     1

2.4 闵可夫斯基距离(Minkowski Distance):

闵氏距离不是一种距离,而是一组距离的定义,是对多个距离度量公式的概括性的表述。

两个n维变量a(x11,x12,…,x1n)与b(x21,x22,…,x2n)间的闵可夫斯基距离定义为:

其中p是一个变参数:

  • 当p=1时,就是曼哈顿距离;
  • 当p=2时,就是欧氏距离;
  • 当p→∞时,就是切比雪夫距离。

根据p的不同,闵氏距离可以表示某一类/种的距离。

小结:

1 闵氏距离,包括曼哈顿距离、欧氏距离和切比雪夫距离,都存在明显的缺点:

e.g. 二维样本(身高[单位:cm],体重[单位:kg]),现有三个样本:a(180,50),b(190,50),c(180,60)。

a与b的闵氏距离(无论是曼哈顿距离、欧氏距离或切比雪夫距离)等于a与c的闵氏距离。但实际上身高的10cm并不能和体重的10kg划等号。

2 闵氏距离的缺点:

(1)将各个分量的量纲(scale),也就是“单位”相同的看待了;

(2)未考虑各个分量的分布(期望,方差等)可能是不同的。


3 “连续属性”和“离散属性”的距离计算

我们常将属性划分为"连续属性" (continuous attribute)和"离散属性" (categorical attribute),前者在定义域上有无穷多个可能的取值,后者在定义域上是有限个取值.

  • 若属性值之间存在序关系,则可以将其转化为连续值,例如:身高属性“高”“中等”“矮”,可转化为{1, 0.5, 0}。

    • 闵可夫斯基距离可以用于有序属性。【将字段进行量化衡量】
  • 若属性值之间不存在序关系,则通常将其转化为向量的形式,例如:性别属性“男”“女”,可转化为{(1,0),(0,1)}。

4 小结

  • 1 距离公式的基本性质:非负性、统一性、对称性、直递性【了解】
  • 2 常见距离公式
    • 2.1 欧式距离(Euclidean Distance)【知道】:

      • 通过距离平方值进行计算
    • 2.曼哈顿距离(Manhattan Distance)【知道】:
      • 通过距离的绝对值进行计算
    • 3.切比雪夫距离 (Chebyshev Distance)【知道】:
      • 维度的最大值进行计算
    • 4.闵可夫斯基距离(Minkowski Distance)【知道】:
      • 当p=1时,就是曼哈顿距离;
      • 当p=2时,就是欧氏距离;
      • 当p→∞时,就是切比雪夫距离。
  • 3 属性【知道】
    • 连续属性
    • 离散属性,
      • 存在序关系,可以将其转化为连续值
      • 不存在序关系,通常将其转化为向量的形式

1.4 k值的选择

学习目标

  • 目标

    • 知道KNN中K值大小选择对模型的影响
    • 知道估计误差和近似误差

1 K值选择说明

  • 举例说明:

  • K值过小:

    • 容易受到异常点的影响
  • k值过大:

    • 受到样本均衡的问题

K值选择问题,李航博士的一书「统计学习方法」上所说:

    1. 选择较小的K值,就相当于用较小的领域中的训练实例进行预测,
    • “学习”近似误差会减小,只有与输入实例较近或相似的训练实例才会对预测结果起作用,与此同时带来的问题是“学习”的估计误差会增大,
    • 换句话说,K值的减小就意味着整体模型变得复杂,容易发生过拟合;
    1. 选择较大的K值,就相当于用较大领域中的训练实例进行预测,
    • 其优点是可以减少学习的估计误差,但缺点是学习的近似误差会增大。这时候,与输入实例较远(不相似的)训练实例也会对预测器作用,使预测发生错误。
    • 且K值的增大就意味着整体的模型变得简单。
    1. K=N(N为训练样本个数),则完全不足取,
    • 因为此时无论输入实例是什么,都只是简单的预测它属于在训练实例中最多的类,模型过于简单,忽略了训练实例中大量有用信息。
  • 实际应用中,K值一般取一个比较小的数值,例如采用交叉验证法(简单来说,就是把训练数据在分成两组:训练集和验证集)来选择最优的K值。

  • 近似误差:

    • 对现有训练集的训练误差,关注训练集
  • 如果近似误差过小可能会出现过拟合的现象,对现有的训练集能有很好的预测,但是对未知的测试样本将会出现较大偏差的预测。

    • 模型本身不是最接近最佳模型。
  • 估计误差:【估计误差好,才是真的好】

    • 可以理解为对测试集的测试误差,关注测试集
  • 估计误差小说明对未知数据的预测能力好,

    • 模型本身最接近最佳模型。

2 小结

  • KNN中K值大小选择对模型的影响【知道】

    • K值过小

      • 容易受到异常点的影响
      • 容易过拟合
    • k值过大:

      • 受到样本均衡的问题
      • 容易欠拟合
  • 误差

    • 近似误差
    • 估计误差

1.5 kd树

学习目标

  • 目标

    • 知道kd树构建和搜索过程

问题导入:

实现k近邻算法时,主要考虑的问题是如何对训练数据进行快速k近邻搜索。

这在特征空间的维数大及训练数据容量大时尤其必要。

**k近邻法最简单的实现是线性扫描(穷举搜索),即要计算输入实例与每一个训练实例的距离。计算并存储好以后,再查找K近邻。**当训练集很大时,计算非常耗时。

为了提高kNN搜索的效率,可以考虑使用特殊的结构存储训练数据,以减小计算距离的次数。


1 kd树简介

1.1 什么是kd树

根据KNN每次需要预测一个点时,我们都需要计算训练数据集里每个点到这个点的距离,然后选出距离最近的k个点进行投票。当数据集很大时,这个计算成本非常高,针对N个样本,D个特征的数据集,其算法复杂度为O(DN^2DN2)

kd树:为了避免每次都重新计算一遍距离,算法会把距离信息保存在一棵树里,这样在计算之前从树里查询距离信息,尽量避免重新计算。其基本原理是,如果A和B距离很远,B和C距离很近,那么A和C的距离也很远。有了这个信息,就可以在合适的时候跳过距离远的点。

这样优化后的算法复杂度可降低到O(DNlog(N))。感兴趣的读者可参阅论文:Bentley,J.L.,Communications of the ACM(1975)。

1989年,另外一种称为Ball Tree的算法,在kd Tree的基础上对性能进一步进行了优化。感兴趣的读者可以搜索Five balltree construction algorithms来了解详细的算法信息。

1.2 原理

黄色的点作为根节点,上面的点归左子树,下面的点归右子树,接下来再不断地划分,分割的那条线叫做分割超平面(splitting hyperplane),在一维中是一个点,二维中是线,三维的是面。

黄色节点就是Root节点,下一层是红色,再下一层是绿色,再下一层是蓝色。

1.树的建立;

2.最近邻域搜索(Nearest-Neighbor Lookup)

kd树(K-dimension tree)是**一种对k维空间中的实例点进行存储以便对其进行快速检索的树形数据结构。**kd树是一种二叉树,表示对k维空间的一个划分,构造kd树相当于不断地用垂直于坐标轴的超平面将K维空间切分,构成一系列的K维超矩形区域。kd树的每个结点对应于一个k维超矩形区域。利用kd树可以省去对大部分数据点的搜索,从而减少搜索的计算量。

类比“二分查找”:给出一组数据:[9 1 4 7 2 5 0 3 8],要查找8。如果挨个查找(线性扫描),那么将会把数据集都遍历一遍。而如果排一下序那数据集就变成了:[0 1 2 3 4 5 6 7 8 9],按前一种方式我们进行了很多没有必要的查找,现在如果我们以5为分界点,那么数据集就被划分为了左右两个“簇” [0 1 2 3 4]和[6 7 8 9]。

因此,根本就没有必要进入第一个簇,可以直接进入第二个簇进行查找。把二分查找中的数据点换成k维数据点,这样的划分就变成了用超平面对k维空间的划分。空间划分就是对数据点进行分类,“挨得近”的数据点就在一个空间里面。

2 构造方法

(1)构造根结点,使根结点对应于K维空间中包含所有实例点的超矩形区域;

(2)**通过递归的方法,不断地对k维空间进行切分,生成子结点。**在超矩形区域上选择一个坐标轴和在此坐标轴上的一个切分点,确定一个超平面,这个超平面通过选定的切分点并垂直于选定的坐标轴,将当前超矩形区域切分为左右两个子区域(子结点);这时,实例被分到两个子区域。

(3)上述过程直到子区域内没有实例时终止(终止时的结点为叶结点)。在此过程中,将实例保存在相应的结点上。

(4)通常,循环的选择坐标轴对空间切分,选择训练实例点在坐标轴上的中位数为切分点,这样得到的kd树是平衡的(平衡二叉树:它是一棵空树,或其左子树和右子树的深度之差的绝对值不超过1,且它的左子树和右子树都是平衡二叉树)。

KD树中每个节点是一个向量,和二叉树按照数的大小划分不同的是,KD树每层需要选定向量中的某一维,然后根据这一维按左小右大的方式划分数据。在构建KD树时,关键需要解决2个问题:

(1)选择向量的哪一维进行划分;

(2)如何划分数据;

第一个问题简单的解决方法可以是随机选择某一维或按顺序选择,但是更好的方法应该是在数据比较分散的那一维进行划分(分散的程度可以根据方差来衡量)

第二个问题中,好的划分方法可以使构建的树比较平衡,可以每次选择中位数来进行划分。

3 案例分析

3.1 树的建立

给定一个二维空间数据集:T={(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)},构造一个平衡kd树。

(1)思路引导:

根结点对应包含数据集T的矩形,选择x(1)轴,6个数据点的x(1)坐标中位数是6,这里选最接近的(7,2)点,以平面x(1)=7将空间分为左、右两个子矩形(子结点);接着左矩形以x(2)=4分为两个子矩形(左矩形中{(2,3),(5,4),(4,7)}点的x(2)坐标中位数正好为4),右矩形以x(2)=6分为两个子矩形,如此递归,最后得到如下图所示的特征空间划分和kd树。

3.2 最近领域的搜索

假设标记为星星的点是 test point, 绿色的点是找到的近似点,在回溯过程中,需要用到一个队列,存储需要回溯的点,在判断其他子节点空间中是否有可能有距离查询点更近的数据点时,做法是以查询点为圆心,以当前的最近距离为半径画圆,这个圆称为候选超球(candidate hypersphere),如果圆与回溯点的轴相交,则需要将轴另一边的节点都放到回溯队列里面来。

样本集{(2,3),(5,4), (9,6), (4,7), (8,1), (7,2)}

3.2.1 查找点(2.1,3.1)

在(7,2)点测试到达(5,4),在(5,4)点测试到达(2,3),然后search_path中的结点为<(7,2),(5,4), (2,3)>,从search_path中取出(2,3)作为当前最佳结点nearest, dist为0.141;

然后回溯至(5,4),以(2.1,3.1)为圆心,以dist=0.141为半径画一个圆,并不和超平面y=4相交,如上图,所以不必跳到结点(5,4)的右子空间去搜索,因为右子空间中不可能有更近样本点了。

于是再回溯至(7,2),同理,以(2.1,3.1)为圆心,以dist=0.141为半径画一个圆并不和超平面x=7相交,所以也不用跳到结点(7,2)的右子空间去搜索。

至此,search_path为空,结束整个搜索,返回nearest(2,3)作为(2.1,3.1)的最近邻点,最近距离为0.141。

3.2.2 查找点(2,4.5)

在(7,2)处测试到达(5,4),在(5,4)处测试到达(4,7)【优先选择在本域搜索】,然后search_path中的结点为<(7,2),(5,4), (4,7)>,从search_path中取出(4,7)作为当前最佳结点nearest, dist为3.202;

然后回溯至(5,4),以(2,4.5)为圆心,以dist=3.202为半径画一个圆与超平面y=4相交,所以需要跳到(5,4)的左子空间去搜索。所以要将(2,3)加入到search_path中,现在search_path中的结点为<(7,2),(2, 3)>;另外,(5,4)与(2,4.5)的距离为3.04 < dist = 3.202,所以将(5,4)赋给nearest,并且dist=3.04。

回溯至(2,3),(2,3)是叶子节点,直接平判断(2,3)是否离(2,4.5)更近,计算得到距离为1.5,所以nearest更新为(2,3),dist更新为(1.5)

回溯至(7,2),同理,以(2,4.5)为圆心,以dist=1.5为半径画一个圆并不和超平面x=7相交, 所以不用跳到结点(7,2)的右子空间去搜索。

至此,search_path为空,结束整个搜索,返回nearest(2,3)作为(2,4.5)的最近邻点,最近距离为1.5。

4 总结

  • kd树的构建过程【知道】

    • 1.构造根节点
    • 2.通过递归的方法,不断地对k维空间进行切分,生成子节点
    • 3.重复第二步骤,直到子区域中没有示例时终止
    • 需要关注细节:a.选择向量的哪一维进行划分;b.如何划分数据
  • kd树的搜索过程【知道】
    • 1**.二叉树搜索比较待查询节点和分裂节点的分裂维的值**,(小于等于就进入左子树分支,大于就进入右子树分支直到叶子结点)
    • 2.顺着“搜索路径”找到最近邻的近似点
    • 3.回溯搜索路径,并判断搜索路径上的结点的其他子结点空间中是否可能有距离查询点更近的数据点,如果有可能,则需要跳到其他子结点空间中去搜索
    • 4.重复这个过程直到搜索路径为空

1.6 案例:鸢尾花种类预测–数据集介绍

学习目标

  • 目标

    • 知道sklearn中获取数据集的方法
    • 知道sklearn中对数据集的划分方法

本实验介绍了使用Python进行机器学习的一些基本概念。 在本案例中,将使用K-Nearest Neighbor(KNN)算法对鸢尾花的种类进行分类,并测量花的特征。

本案例目的:

  1. 遵循并理解完整的机器学习过程
  2. 对机器学习原理和相关术语有基本的了解。
  3. 了解评估机器学习模型的基本过程。

1 案例:鸢尾花种类预测

Iris数据集是常用的分类实验数据集,由Fisher, 1936收集整理。Iris也称鸢尾花卉数据集,是一类多重变量分析的数据集。关于数据集的具体介绍:

2 scikit-learn中数据集介绍

2.1 scikit-learn数据集API介绍

  • sklearn.datasets

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

2.1.1 sklearn小数据集

  • sklearn.datasets.load_iris()

    加载并返回鸢尾花数据集

from sklearn.datasets import load_iris# 1.数据集获取
# 1.1 小数据集获取
iris = load_iris()
print("鸢尾花小数据集的返回值:\n", iris)

2.1.2 sklearn大数据集

  • sklearn.datasets.fetch_20newsgroups(data_home=None,subset=‘train’)

    【参数说明:data_home 表示路径 ;subset 下载的数据集的类型 】

    • subset:‘train’或者’test’,‘all’,可选,选择要加载的数据集。

      【train 表示训练数据集 test 表示测试数据集 all 两种数据集都要下载】

    • 训练集的“训练”,测试集的“测试”,两者的“全部”

from sklearn.datasets import load_iris, fetch_20newsgroups
#1.2大数据集合获取
news=fetch_20newsgroups()
print("鸢尾花大数据集的返回值:\n", news)

2.2 sklearn数据集返

回值介 绍

  • 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
# 获取鸢尾花数据集
iris = load_iris()
print("鸢尾花数据集的返回值:\n", iris)
# 返回值是一个继承自字典的Bench
print("鸢尾花的特征值:\n", iris["data"])
print("鸢尾花的目标值:\n", iris.target)
print("鸢尾花特征的名字:\n", iris.feature_names)
print("鸢尾花目标值的名字:\n", iris.target_names)
print("鸢尾花的描述:\n", iris.DESCR)

2.3 查看数据分布

通过创建一些图,以查看不同类别是如何通过特征来区分的。 在理想情况下,标签类将由一个或多个特征对完美分隔。 在现实世界中,这种理想情况很少会发生。

  • seaborn介绍

    • Seaborn 是基于 Matplotlib 核心库进行了更高级的 API 封装,可以让你轻松地画出更漂亮的图形。而 Seaborn 的漂亮主要体现在配色更加舒服、以及图形元素的样式更加细腻。
    • 安装 pip3 install seaborn
    • seaborn.lmplot() 是一个非常有用的方法,它会在绘制二维散点图时,自动完成回归拟合
      • sns.lmplot() 里的 x, y 分别代表横纵坐标的列名,
      • data= 是关联到数据集,
      • hue=*代表按照 species即花的类别分类显示,
      • fit_reg=是否进行线性拟合。【fit_reg = False,fit_reg = true】
    • 参考链接: api链接

初始数据获取:

import pandas as pd
from sklearn.datasets import load_iris, fetch_20newsgroups# 1.数据集获取
# 1.1 小数据集获取
iris = load_iris()
# iris["data"] 字段 'Sepal_Length', 'Sepal_Width', 'Petal_Length', 'Petal_Width'
iris_d = pd.DataFrame(iris['data'], columns = ['Sepal_Length', 'Sepal_Width', 'Petal_Length', 'Petal_Width'])iris_d['Species'] = iris.target   #  iris.target   print(iris_d)

初始数据获取运行测试:

图形绘制:

%matplotlib inline
# 内嵌绘图
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
# 数据可视化
# 把数据转换成dataframe的格式
//1.获取数据
iris = load_iris()
//2.将数据转换成dataframe的格式  【字段确定】
iris_d = pd.DataFrame(iris['data'], columns = ['Sepal_Length', 'Sepal_Width', 'Petal_Length', 'Petal_Width'])
iris_d['Species'] = iris.target   #目标值
//3.定义绘图函数
def plot_iris(data, col1, col2):sns.lmplot(x = col1, y = col2, data = data, hue = "Species", fit_reg = False)  # fit_reg = False关闭运行结果的直线plt.xlabel(col1)plt.ylabel(col2)plt.title('鸢尾花种类分布图')plt.show()// 4.进行绘图
plot_iris(iris_d, 'Petal_Width', 'Sepal_Length')

2.4 数据集的划分

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

  • 训练数据:用于训练,构建模型
  • 测试数据:在模型检验时使用,用于评估模型是否有效

划分比例:

  • 训练集:70% 80% 75%
  • 测试集:30% 20% 25%

数据集划分api

  • sklearn.model_selection.train_test_split(arrays, *options)

    • 参数:

      • x 数据集的特征值

      • y 数据集的标签值

      • test_size 测试集的大小,一般为float 【介于0.0-1.0 之间】

      • random_state 随机数种子,不同的种子会造成不同的随机采样结果。相同的种子采样结果相同。【随机参数】

        【随机参数相同,结果相同】

    • return【返回值】

      • x_train, x_test, y_train, y_test 【顺序固定,训练集特征值,测试集特征值,测试集目标值,训练集目标值】
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split   # 导入数据来源
# 1、获取鸢尾花数据集
iris = load_iris()
# 对鸢尾花数据集进行分割
# 训练集的特征值x_train 测试集的特征值x_test 训练集的目标值y_train 测试集的目标值y_test
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=22)
print("训练集特征值:\n", x_train)
print("测试集目标值:\n", y_train)
print("测试集特征值:\n", x_test)
print("训练集目标值:\n", y_test)
print("x_train:\n", x_train.shape)  #查看形状
# 随机数种子
x_train1, x_test1, y_train1, y_test1 = train_test_split(iris.data, iris.+, random_state=6)
x_train2, x_test2, y_train2, y_test2 = train_test_split(iris.data, iris.target, random_state=6)
print("如果随机数种子不一致:\n", x_train == x_train1)
print("如果随机数种子一致:\n", x_train1 == x_train2)

3 总结

  • 获取数据集【知道】

    • 小数据:

      • sklearn.datasets.load_*
    • 大数据集:
      • sklearn.datasets.fetch_*
  • 数据集返回值介绍【知道】
    • 返回值类型是bunch–是一个字典类型
    • 返回值的属性:
      • data:特征数据数组
      • target:标签(目标)数组
      • DESCR:数据描述
      • feature_names:特征名,
      • target_names:标签(目标值)名
  • 数据集的划分【掌握】
    • sklearn.model_selection.train_test_split(arrays, *options)
    • 参数:
      • x – 特征值
      • y – 目标值
      • test_size – 测试集大小
      • ramdom_state – 随机数种子
    • 返回值:
      • x_train, x_test, y_train, y_test

1.7 特征工程-特征预处理

学习目标

  • 目标

    • 了解什么是特征预处理
    • 知道归一化和标准化的原理及区别

1 什么是特征预处理

1.1 特征预处理定义

scikit-learn的解释

provides several common utility functions and transformer classes to change raw feature vectors into a representation that is more suitable for the downstream estimators.

翻译过来:通过一些转换函数将特征数据转换成更加适合算法模型的特征数据过程【降维打击–方便处理】

  • 为什么我们要进行归一化/标准化?

    • 特征的单位或者大小相差较大,或者某特征的方差相比其他的特征要大出几个数量级容易影响(支配)目标结果,使得一些算法无法学习到其它的特征
  • 举例:约会对象数据

我们需要用到一些方法进行无量纲化使不同规格的数据转换到同一规格

1.2 包含内容(数值型数据的无量纲化)

  • 归一化
  • 标准化

1.3 特征预处理API

sklearn.preprocessing

2 归一化

2.1 定义

通过对原始数据进行变换把数据映射到(默认为[0,1])之间 【同比例缩放到0-1之间 0最小值 1 最大值】

2.2 公式

作用于每一列,max为一列的最大值,min为一列的最小值,那么X’’为最终结果,mx,mi分别为指定区间值默认mx为1,mi为0

那么怎么理解这个过程呢?我们通过一个例子

2.3 API

  • sklearn.preprocessing.MinMaxScaler (feature_range=(0,1)… ) #【参数说明:feature_range 转换后范围 默认在0~1之间】

    • MinMaxScalar.fit_transform(X) 【】

      • X:numpy array格式的数据[n_samples,n_features]
    • 返回值:转换后的形状相同的array

2.4 数据计算

我们对以下数据进行运算,在dating.txt中。保存的就是之前的约会对象数据

milage,Liters,Consumtime,target  #【特征预处理 只对特征值进行处理  milage,Liters,Consumtime 目标值 target 不需要进行处理  】
40920,8.326976,0.953952,3
14488,7.153469,1.673904,2
26052,1.441871,0.805124,1
75136,13.147394,0.428964,1
38344,1.669788,0.134296,1
  • 分析 【数据缩放处理过程】

1、实例化MinMaxScalar 【第一步;】

2、通过fit_transform转换 【第二步】

import pandas as pd
from sklearn.preprocessing import MinMaxScalerdef minmax_demo():"""归一化演示:return: None"""data = pd.read_csv("./data/dating.txt")print(data)    #   【缩放之前数据】# 1、实例化一个转换器类transfer = MinMaxScaler(feature_range=(2, 3))     # 2、调用fit_transformdata = transfer.fit_transform(data[['milage','Liters','Consumtime']])   #注意:只取特征值 目标值不取print("最小值最大值归一化处理的结果:\n", data)   # 【缩放之后的数据】return None

返回结果:

     milage     Liters  Consumtime  target
0     40920   8.326976    0.953952       3
1     14488   7.153469    1.673904       2
2     26052   1.441871    0.805124       1
3     75136  13.147394    0.428964       1
..      ...        ...         ...     ...
998   48111   9.134528    0.728045       3
999   43757   7.882601    1.332446       3[1000 rows x 4 columns]
最小值最大值归一化处理的结果:[[ 2.44832535  2.39805139  2.56233353][ 2.15873259  2.34195467  2.98724416][ 2.28542943  2.06892523  2.47449629]..., [ 2.29115949  2.50910294  2.51079493][ 2.52711097  2.43665451  2.4290048 ][ 2.47940793  2.3768091   2.78571804]]

问题:如果数据中异常点较多,会有什么影响?

2.5 归一化总结

注意最大值最小值是变化的,另外,最大值与最小值非常容易受异常点影响,所以这种方法鲁棒性较差,只适合传统精确小数据场景。

怎么办?

3 标准化

3.1 定义

通过对原始数据进行变换把数据变换到均值为0,标准差为1范围内

3.2 公式

作用于每一列,mean为平均值,σ为标准差 【当前减去平均值后除以标准差】

所以回到刚才异常点的地方,我们再来看看标准化

  • 对于归一化来说:如果出现异常点,影响了最大值和最小值,那么结果显然会发生改变
  • 对于标准化来说:如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小。

3.3 API

  • sklearn.preprocessing.StandardScaler( )

    • 处理之后每列来说所有数据都聚集在均值0附近标准差差为1
    • StandardScaler.fit_transform(X)
      • X:numpy array格式的数据[n_samples,n_features]
    • 返回值:转换后的形状相同的array

3.4 数据计算

同样对上面的数据进行处理

  • 分析

1、实例化StandardScaler

2、通过fit_transform转换

import pandas as pd
from sklearn.preprocessing import StandardScalerdef stand_demo():"""标准化演示:return: None"""data = pd.read_csv("dating.txt")print(data)    #  【标准化之前的数据】# 1、实例化一个转换器类transfer = StandardScaler()# 2、调用fit_transformdata = transfer.fit_transform(data[['milage','Liters','Consumtime']])     print("标准化的结果:\n", data)   # 【标准化之后的数据】print("每一列特征的平均值:\n", transfer.mean_)print("每一列特征的方差:\n", transfer.var_)return None

返回结果:

     milage     Liters  Consumtime  target
0     40920   8.326976    0.953952       3
1     14488   7.153469    1.673904       2
2     26052   1.441871    0.805124       1
..      ...        ...         ...     ...
997   26575  10.650102    0.866627       3
998   48111   9.134528    0.728045       3
999   43757   7.882601    1.332446       3[1000 rows x 4 columns]
标准化的结果:[[ 0.33193158  0.41660188  0.24523407][-0.87247784  0.13992897  1.69385734][-0.34554872 -1.20667094 -0.05422437]..., [-0.32171752  0.96431572  0.06952649][ 0.65959911  0.60699509 -0.20931587][ 0.46120328  0.31183342  1.00680598]]
每一列特征的平均值:[  3.36354210e+04   6.55996083e+00   8.32072997e-01]
每一列特征的方差:[  4.81628039e+08   1.79902874e+01   2.46999554e-01]

3.5 标准化总结

在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景。

4 总结

  • 什么是特征工程【知道】

    • 定义

      • 通过一些转换函数将特征数据转换成更加适合算法模型的特征数据过程
    • 包含内容:
      • 归一化
      • 标准化
  • 归一化【知道】
    • 定义:

      • 对原始数据进行变换把数据映射到(默认为[0,1])之间
    • api:
      • sklearn.preprocessing.MinMaxScaler (feature_range=(0,1)… )
      • 参数:feature_range – 自己指定范围,默认0-1
    • 总结:
      • 鲁棒性比较差(容易受到异常点的影响)
      • 只适合传统精确小数据场景(以后不会用你了)
  • 标准化【掌握】
    • 定义:

      • 对原始数据进行变换把数据变换到均值为0,标准差为1范围内
    • api:
      • sklearn.preprocessing.StandardScaler( )
    • 总结:
      • 异常值对我影响小
      • 适合现代嘈杂大数据场景(以后就是用你了)

1.8 案例:鸢尾花种类预测—流程实现

学习目标

  • 目标

    • 知道KNeighborsClassifier的用法

1 再识K-近邻算法API

  • sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm=‘auto’)

    • n_neighbors:

      • int,可选(默认= 5),k_neighbors查询默认使用的邻居数
    • algorithm:{‘auto’,‘ball_tree’,‘kd_tree’,‘brute’}
      • 快速k近邻搜索算法,默认参数为auto,可以理解为算法自己决定合适的搜索算法。除此之外,用户也可以自己指定搜索算法ball_tree、kd_tree、brute方法进行搜索,

        • brute是蛮力搜索,也就是线性扫描,当训练集很大时,计算非常耗时。
        • kd_tree,构造kd树存储数据以便对其进行快速检索的树形数据结构,kd树也就是数据结构中的二叉树。以中值切分构造的树,每个结点是一个超矩形,在维数小于20时效率高。
        • ball tree是为了克服kd树高维失效而发明的,其构造过程是以质心C和半径r分割样本空间,每个节点是一个超球体。

2 案例:鸢尾花种类预测

2.1 数据集介绍

Iris数据集是常用的分类实验数据集,由Fisher, 1936收集整理。Iris也称鸢尾花卉数据集,是一类多重变量分析的数据集。关于数据集的具体介绍:

2.2 步骤分析

  • 1.获取数据集
  • 2.数据基本处理
  • 3.特征工程
  • 4.机器学习(模型训练)
  • 5.模型评估

2.3 代码过程

  • 导入模块
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
  • 先从sklearn当中获取数据集,然后进行数据集的分割
# 1.获取数据集
iris = load_iris()# 2.数据基本处理
# x_train,x_test,y_train,y_test为训练集特征值、测试集特征值、训练集目标值、测试集目标值
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=22)
  • 进行数据标准化

    • 特征值的标准化
# 3、特征工程:标准化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
  • 模型进行训练预测
# 4、机器学习(模型训练)
estimator = KNeighborsClassifier(n_neighbors=9)
estimator.fit(x_train, y_train)
# 5、模型评估
# 方法1:比对真实值和预测值
y_predict = estimator.predict(x_test)
print("预测结果为:\n", y_predict)
print("比对真实值和预测值:\n", y_predict == y_test)
# 方法2:直接计算准确率
score = estimator.score(x_test, y_test)
print("准确率为:\n", score)

完整代码:

# coding:utf-8from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier# 1.获取数据
iris = load_iris()# 2.数据基本处理
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=22)# 3.特征工程 - 特征预处理
transfer = StandardScaler()   #创建标准化对象
x_train = transfer.fit_transform(x_train)   #标准化处理
x_test = transfer.transform(x_test)      #、?????# 4.机器学习-KNN
# 4.1 实例化一个估计器
estimator = KNeighborsClassifier(n_neighbors=5)
# 4.2 模型训练
estimator.fit(x_train, y_train)# 5.模型评估
# 5.1 预测值结果输出
y_pre = estimator.predict(x_test)
print("预测值是:\n", y_pre)
print("预测值和真实值的对比是:\n", y_pre==y_test)  #判断预测值与真实值是否相等# 5.2 准确率计算
score = estimator.score(x_test, y_test)
print("准确率为:\n", score)

3 案例小结

在本案例中,具体完成内容有:

  • 使用可视化加载和探索数据,以确定特征是否能将不同类别分开。
  • 通过标准化数字特征并随机抽样到训练集和测试集来准备数据。
  • 通过统计学,精确度度量进行构建和评估机器学习模型。

同学之间讨论刚才完成的机器学习代码,并且确保在自己的电脑运行成功

4 总结

  • KNeighborsClassifier的使用【知道】

    • sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm=‘auto’)

      • algorithm(auto,ball_tree, kd_tree, brute) – 选择什么样的算法进行计算

1.9 KNN算法总结

k近邻算法优缺点汇总

  • 优点:

    • 简单有效
    • 重新训练的代价低
    • 适合类域交叉样本
      • KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合。
    • 适合大样本自动分类
      • 该算法比较适用于样本容量比较大的类域的自动分类,而那些样本容量较小的类域采用这种算法比较容易产生误分

  • 缺点:

    • 惰性学习

      • KNN算法是懒散学习方法(lazy learning,基本上不学习),一些积极学习的算法要快很多
    • 类别评分不是规格化
      • 不像一些通过概率评分的分类
    • 输出可解释性不强
      • 例如决策树的输出可解释性就较强
    • 对不均衡的样本不擅长
      • 当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数。该算法只计算“最近的”邻居样本,某一类的样本数量很大,那么或者这类样本并不接近目标样本,或者这类样本很靠近目标样本。无论怎样,数量并不能影响运行结果。可以采用权值的方法(和该样本距离小的邻居权值大)来改进。
    • 计算量较大
      • 目前常用的解决方法是事先对已知样本点进行剪辑,事先去除对分类作用不大的样本。

1.10 交叉验证,网格搜索

学习目标

  • 目标

    • 知道交叉验证、网格搜索的概念
    • 会使用交叉验证、网格搜索优化训练模型

1 什么是交叉验证(cross validation)

交叉验证:将拿到的训练数据,分为训练和验证集。以下图为例:将数据分成4份,其中一份作为验证集。然后经过4次(组)的测试,每次都更换不同的验证集。即得到4组模型的结果,取平均值作为最终结果。又称4折交叉验证。

1.1 分析

我们之前知道数据分为训练集和测试集,但是**为了让从训练得到模型结果更加准确。**做以下处理

  • 训练集:训练集+验证集
  • 测试集:测试集

1.2 为什么需要交叉验证

交叉验证目的:为了让被评估的模型更加准确可信

问题:这个只是让被评估的模型更加准确可信,那么怎么选择或者调优参数呢?

2 什么是网格搜索(Grid Search)

通常情况下,有很多参数是需要手动指定的(如k-近邻算法中的K值),这种叫超参数。但是手动过程繁杂,所以需要对模型预设几种超参数组合。每组超参数都采用交叉验证来进行评估。最后选出最优参数组合建立模型。【k多取几次自动测试,选择最优】

3 交叉验证,网格搜索(模型选择与调优)API:

  • sklearn.model_selection.GridSearchCV(estimator, param_grid=None,cv=None)

    • 对估计器的指定参数值进行详尽搜索
    • estimator:估计器对象
    • param_grid:估计器参数(dict){“n_neighbors”:[1,3,5]} 【k】
    • cv:指定几折交叉验证
    • fit:输入训练数据
    • score:准确率
    • 结果分析:
      • bestscore__:在交叉验证中验证的最好结果
      • bestestimator:最好的参数模型
      • cvresults:每次交叉验证后的验证集准确率结果和训练集准确率结果

4 鸢尾花案例增加K值调优

  • 使用GridSearchCV构建估计器
# 1、获取数据集
iris = load_iris()
# 2、数据基本处理 -- 划分数据集
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=22)
# 3、特征工程:标准化
# 实例化一个转换器类
transfer = StandardScaler()
# 调用fit_transform
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 4、KNN预估器流程
#  4.1 实例化预估器类
estimator = KNeighborsClassifier()# 4.2 模型选择与调优——网格搜索和交叉验证
# 准备要调的超参数
param_dict = {"n_neighbors": [1, 3, 5]}  #交叉验证
estimator = GridSearchCV(estimator, param_grid=param_dict, cv=3)
# 4.3 fit数据进行训练
estimator.fit(x_train, y_train)
# 5、评估模型效果
# 方法a:比对预测结果和真实值
y_predict = estimator.predict(x_test)
print("比对预测结果和真实值:\n", y_predict == y_test)
# 方法b:直接计算准确率
score = estimator.score(x_test, y_test)
print("直接计算准确率:\n", score)
  • 然后进行评估查看最终选择的结果和交叉验证的结果
print("在交叉验证中验证的最好结果:\n", estimator.best_score_)
print("最好的参数模型:\n", estimator.best_estimator_)
print("每次交叉验证后的准确率结果:\n", estimator.cv_results_)
  • 最终结果
比对预测结果和真实值:[ True  True  True  True  True  True  True False  True  True  True  TrueTrue  True  True  True  True  True False  True  True  True  True  TrueTrue  True  True  True  True  True  True  True  True  True  True  TrueTrue  True]
直接计算准确率:0.947368421053
在交叉验证中验证的最好结果:0.973214285714
最好的参数模型:KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',metric_params=None, n_jobs=1, n_neighbors=5, p=2,weights='uniform')
每次交叉验证后的准确率结果:{'mean_fit_time': array([ 0.00114751,  0.00027037,  0.00024462]), 'std_fit_time': array([  1.13901511e-03,   1.25300249e-05,   1.11011951e-05]), 'mean_score_time': array([ 0.00085751,  0.00048693,  0.00045625]), 'std_score_time': array([  3.52785082e-04,   2.87650037e-05,   5.29673344e-06]), 'param_n_neighbors': masked_array(data = [1 3 5],mask = [False False False],fill_value = ?)
, 'params': [{'n_neighbors': 1}, {'n_neighbors': 3}, {'n_neighbors': 5}], 'split0_test_score': array([ 0.97368421,  0.97368421,  0.97368421]), 'split1_test_score': array([ 0.97297297,  0.97297297,  0.97297297]), 'split2_test_score': array([ 0.94594595,  0.89189189,  0.97297297]), 'mean_test_score': array([ 0.96428571,  0.94642857,  0.97321429]), 'std_test_score': array([ 0.01288472,  0.03830641,  0.00033675]), 'rank_test_score': array([2, 3, 1], dtype=int32), 'split0_train_score': array([ 1.        ,  0.95945946,  0.97297297]), 'split1_train_score': array([ 1.        ,  0.96      ,  0.97333333]), 'split2_train_score': array([ 1.  ,  0.96,  0.96]), 'mean_train_score': array([ 1.        ,  0.95981982,  0.96876877]), 'std_train_score': array([ 0.        ,  0.00025481,  0.0062022 ])}

5 总结

  • 交叉验证【知道】

    • 定义:

      • 将拿到的训练数据,分为训练和验证集
      • *折交叉验证
    • 分割方式:
      • 训练集:训练集+验证集
      • 测试集:测试集
    • 为什么需要交叉验证
      • 为了让被评估的模型更加准确可信
      • 注意:交叉验证不能提高模型的准确率
  • 网格搜索【知道】
    • 超参数:

      • sklearn中,需要手动指定的参数,叫做超参数
    • 网格搜索就是把这些超参数的值,通过字典的形式传递进去,然后进行选择最优值
  • api【知道】
    • sklearn.model_selection.GridSearchCV(estimator, param_grid=None,cv=None)

      • estimator – 选择了哪个训练模型
      • param_grid – 需要传递的超参数
      • cv – 几折交叉验证

1.11 案例2:预测facebook签到位置

学习目标

  • 目标

    • 通过Facebook位置预测案例熟练掌握第一章学习内容

1 项目描述

本次比赛的目的是预测一个人将要签到的地方。 为了本次比赛,Facebook创建了一个虚拟世界,其中包括10公里*10公里共100平方公里的约10万个地方。 对于给定的坐标集,您的任务将根据用户的位置,准确性和时间戳等预测用户下一次的签到位置。 数据被制作成类似于来自移动设备的位置数据。 请注意:您只能使用提供的数据进行预测。

2 数据集介绍

数据介绍:

文件说明 train.csv, test.csvrow id:签入事件的idx y:坐标accuracy: 准确度,定位精度time: 时间戳place_id: 签到的位置,这也是你需要预测的内容

官网:https://www.kaggle.com/c/facebook-v-predicting-check-ins

3 步骤分析

  • 对于数据做一些基本处理(这里所做的一些处理不一定达到很好的效果,我们只是简单尝试,有些特征我们可以根据一些特征选择的方式去做处理)

    • 1 缩小数据集范围 DataFrame.query()
    • 2 选取有用的时间特征
    • 3 将签到位置少于n个用户的删除
  • 分割数据集
  • 标准化处理
  • k-近邻预测
具体步骤:
# 1.获取数据集
# 2.基本数据处理
# 2.1 缩小数据范围
# 2.2 选择时间特征
# 2.3 去掉签到较少的地方
# 2.4 确定特征值和目标值
# 2.5 分割数据集
# 3.特征工程 -- 特征预处理(标准化)
# 4.机器学习 -- knn+cv
# 5.模型评估

4 代码实现

  • 1.获取数据集
# 1、获取数据集
facebook = pd.read_csv("./data/FBlocation/train.csv")
  • 2.基本数据处理
# 2.基本数据处理
# 2.1 缩小数据范围
facebook_data = facebook.query("x>2.0 & x<2.5 & y>2.0 & y<2.5")
# 2.2 选择时间特征
time = pd.to_datetime(facebook_data["time"], unit="s")
time = pd.DatetimeIndex(time)
facebook_data["day"] = time.day
facebook_data["hour"] = time.hour
facebook_data["weekday"] = time.weekday
# 2.3 去掉签到较少的地方
place_count = facebook_data.groupby("place_id").count()
place_count = place_count[place_count["row_id"]>3]
facebook_data = facebook_data[facebook_data["place_id"].isin(place_count.index)]
# 2.4 确定特征值和目标值
x = facebook_data[["x", "y", "accuracy", "day", "hour", "weekday"]]
y = facebook_data["place_id"]
# 2.5 分割数据集
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=22)
  • 3.特征工程–特征预处理(标准化)
# 3.特征工程--特征预处理(标准化)
# 3.1 实例化一个转换器
transfer = StandardScaler()
# 3.2 调用fit_transform
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
  • 4.机器学习–knn+cv
# 4.机器学习--knn+cv
# 4.1 实例化一个估计器
estimator = KNeighborsClassifier()
# 4.2 调用gridsearchCV
param_grid = {"n_neighbors": [1, 3, 5, 7, 9]}
estimator = GridSearchCV(estimator, param_grid=param_grid, cv=5)
# 4.3 模型训练
estimator.fit(x_train, y_train)
  • 5.模型评估
# 5.模型评估
# 5.1 基本评估方式
score = estimator.score(x_test, y_test)
print("最后预测的准确率为:\n", score)y_predict = estimator.predict(x_test)
print("最后的预测值为:\n", y_predict)
print("预测值和真实值的对比情况:\n", y_predict == y_test)# 5.2 使用交叉验证后的评估方式
print("在交叉验证中验证的最好结果:\n", estimator.best_score_)
print("最好的参数模型:\n", estimator.best_estimator_)
print("每次交叉验证后的验证集准确率结果和训练集准确率结果:\n",estimator.cv_results_)facebook_data["weekday"] = time.weekday
# 2.3 去掉签到较少的地方
place_count = facebook_data.groupby("place_id").count()
place_count = place_count[place_count["row_id"]>3]
facebook_data = facebook_data[facebook_data["place_id"].isin(place_count.index)]
# 2.4 确定特征值和目标值
x = facebook_data[["x", "y", "accuracy", "day", "hour", "weekday"]]
y = facebook_data["place_id"]
# 2.5 分割数据集
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=22)
  • 3.特征工程–特征预处理(标准化)
# 3.特征工程--特征预处理(标准化)
# 3.1 实例化一个转换器
transfer = StandardScaler()
# 3.2 调用fit_transform
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
  • 4.机器学习–knn+cv
# 4.机器学习--knn+cv
# 4.1 实例化一个估计器
estimator = KNeighborsClassifier()
# 4.2 调用gridsearchCV
param_grid = {"n_neighbors": [1, 3, 5, 7, 9]}
estimator = GridSearchCV(estimator, param_grid=param_grid, cv=5)
# 4.3 模型训练
estimator.fit(x_train, y_train)
  • 5.模型评估
# 5.模型评估
# 5.1 基本评估方式
score = estimator.score(x_test, y_test)
print("最后预测的准确率为:\n", score)y_predict = estimator.predict(x_test)
print("最后的预测值为:\n", y_predict)
print("预测值和真实值的对比情况:\n", y_predict == y_test)# 5.2 使用交叉验证后的评估方式
print("在交叉验证中验证的最好结果:\n", estimator.best_score_)
print("最好的参数模型:\n", estimator.best_estimator_)
print("每次交叉验证后的验证集准确率结果和训练集准确率结果:\n",estimator.cv_results_)

Python_机器学习_算法_第1章_K-近邻算法相关推荐

  1. knn算法python理解与预测_K近邻算法用作回归的使用介绍(使用Python代码)

    介绍 在我遇到的所有机器学习算法中,KNN是最容易上手的.尽管它很简单,但事实上它其实在某些任务中非常有效(正如你将在本文中看到的那样). 甚至它可以做的更好?它可以用于分类和回归问题!然而,它其实更 ...

  2. 机器学习入门笔记(三):K近邻算法

    文章目录 一.K近邻算法的基本概念 1.1 K近邻算法实现 二.K近邻分类三要素 2.1 距离度量 2.2 K值的选择 2.2.1 基于m-fold cross validation的 K值选择 2. ...

  3. 机器学习算法——系统性的学会使用 K近邻算法(KNN)

    目录 1.K-近邻算法简介 1.1 什么是K-近邻算法 1.2 K-近邻算法(KNN)概念 (1)定义: (2)距离公式: 1.3 电影类型分析 1.4 KNN算法流程总结 2.k近邻算法api初步使 ...

  4. 个性化推荐算法实战第01章个性化推荐算法综述

    文章目录 个性化推荐算法实战第01章个性化推荐算法综述 1.什么是推荐系统? 2.个性化推荐算法在系统中所起到的作用 3.如何衡量个性化推荐算法在产品中起到的作用 4.推荐算法介绍 5.评估指标: 个 ...

  5. 机器学习实战第二章K近邻算法照葫芦画瓢实践。

    分别实现了最基本的3个DEMO 1.给你若干个带有标签的二维点作为训练集,给定一系列的二维随机点,看其通过训练集,可以被分为哪一类 2.给你N个人的飞行里程数,玩游戏消耗时间百分比和每周消耗冰激凌的公 ...

  6. TensorFlow 2.0深度学习算法实战 第七章 反向传播算法

    第七章 反向传播算法 7.1 导数与梯度 7.2 导数常见性质 7.2.1 基本函数的导数 7.2.2 常用导数性质 7.2.3 导数求解实战 7.3 激活函数导数 7.3.1 Sigmoid 函数导 ...

  7. java实现k 近邻算法_K近邻算法哪家强?KDTree、Annoy、HNSW原理和使用方法介绍

    1.什么是K近邻算法 K近邻算法(KNN)是一种常用的分类和回归方法,它的基本思想是从训练集中寻找和输入样本最相似的k个样本,如果这k个样本中的大多数属于某一个类别,则输入的样本也属于这个类别. 关于 ...

  8. 《机器学习实战》萌新入门笔记 ① — — K近邻算法 趣味讲解和书本实例详细注释后代码

    开坑前言:大一在读新生开启了自己的机器学习之旅,从接触到现在已经有快两个月了,现在回过头为夯实基础,从开始看起<机器学习实战>这本书,即使是最简单的KNN算法,详细看过作者用python实 ...

  9. YbtOJ「基础算法」第1章 递推算法

    YbtOJ 大全 [例题1]错排问题 设 f [ n ] f[n] f[n] 表示 n n n 个数时的合法方案数.初始化 f [ 1 ] = 0 , f [ 2 ] = 1 f[1]=0,f[2] ...

  10. k近邻算法matlab实现_k近邻算法

    k 近邻法 (k-NN) 是一种基于实例的学习方法,无法转化为对参数空间的搜索问题(参数最优化 问题).它的特点是对特征空间进行搜索.除了k近邻法,本章还对以下几个问题进行较深入的讨 论: 切比雪夫距 ...

最新文章

  1. HTTP/3 来了 !HTTP/2 还没怎么用起来呢,先一起扫个盲吧!
  2. 中间画一条短竖线_许愿孔明灯怎么画,简约好看的孔明灯简笔画教程
  3. TOPSIS(逼近理想解)算法原理详解与代码实现
  4. Jenkins持续集成项目搭建与实践——基于Python Selenium自动化测试(自由风格)
  5. 学习笔记——微软的软件测试之道
  6. 开发工具 idea中出现Error:(1, 1) java: 非法字符: ‘\ufeff‘
  7. java调用vissim的com接口_VISSIM 高级应用COM接口开发初级入门
  8. 谷歌地图kml能透明吗_如何打开KML和KMZ文件并与卫星影像叠加
  9. 全站仪数据导入电脑_南方全站仪怎么连接电脑传输数据
  10. CIP4和JDF,您知道多少?(转)
  11. python算积分蒙特卡罗_python编程通过蒙特卡洛法计算定积分详解
  12. 360修复服务器漏洞,360安全漏洞不需要修复怎么设置
  13. 信庭嵌入式工作室-嵌入式Linux漫谈之Linux系统
  14. 网页设计之标题栏显示当前系统日期
  15. SAP中由于“己结算申请”未勾选原因导致无法查询到采购申请
  16. 基于单片机的太阳能热水器辅助控制系统
  17. 四个核心技术构成智能语音系统
  18. 《Java8实战》第11章 用 Optional 取代 null
  19. uniapp离线打包apk安装在android12上无法安装
  20. 微信小程序连接蓝牙ble教程(目录)

热门文章

  1. 【Android 逆向】x86 汇编 ( cmp 比较指令 | test 比较指令 )
  2. Python基础-配置文本编辑器
  3. 从“边界信任”到“零信任”,安全访问的“决胜局”正提前上演
  4. 2012-12互联网创意、创业项目整理
  5. about android source code
  6. /deep/ --------------- less深度作用域
  7. 怎么把人物图P到表情图并且做成动图~
  8. Xilinx ZYNQ 7000 HDMI
  9. 4g信号满2g无服务器,为什么有时候4G网络信号没2G信号强?这些通讯小知识你得知道...
  10. 使用Qt Designer开发