[机器学习实战] 机器学习基础

机器学习实战 系列参考于互联网资料与 人民邮电出版社 《机器学习实战》,编写目的在于学习交流,如有侵权,请联系删除

机器学习基础

  • 机器学习的主要任务就是分类
  • 为算法输入大量已分类的数据作为算法的训练集
    • 训练样本集必须确定知道目标的变量值
  • 目标变量是机器学习算法的预测结果,在分类算法中目标变量的类型通常是标称型的,而在回归算法中通常是连续性的
  • 机器学习的另一项任务是回归
    • 回归主要用来预测数值型数据
  • 分类和回归属于监督学习,之所以称之为监督学习,是因为这类算法必须知道预测什么,即目标变量的分类信息
  • 无监督学习,此时数据没有类别信息,也不会给定目标值
    • 将数据集合分成由类似的对象组成的多个类的过程被称为 聚类
    • 将寻找描述数据统计值的过程称为 密度估计
    • 无监督学习还可以减少数据特征的 维度

用于执行分类、回归、聚类和密度估计的机器学习算法

监督学习的用途
K-近邻算法 线性回归
朴素贝叶斯算法 局部加权线性回归
支持向量机 Ridge 回归
决策树 Lasso 最小回归系数估计
无监督学习的用途
k-均值 最大期望算法
DBSCAN Pazen 窗设计

如何选择合适的算法

  • 确定选择监督学习算法之后
    • 确定目标变量类型
      • 如果目标是离散型,如 是/否、1/2/3、A/B/C或者红/黄/黑 等,则可以选择 分类算法
      • 如果目标是连续性的数值,如 0.0 ~ 100.00、-999 ~ 999 或者 +∞ ~ -∞ 等,则需要选择 回归算法
  • 如果不想预测目标变量的值,则可以选择 无监督学习算法
    • 进一步分析是否需要将数据划分为离散的组
      • 如果这是唯一的要求,则可以使用 聚类算法
      • 如果还需要估计数据与每个分组的相似程度,则需要使用 密度估计算法

开发机器学习的步骤

  • 可遵循以下步骤
    1. 收集数据
    2. 准备输入数据 (Python List)
    3. 分析输入数据
      • 此步骤主要是人工分析以前得到的数据,这一步的主要作用是确保数据集中没有垃圾数据。如果信任数据来源,则可以跳过该步骤
    4. 训练算法
      • 机器学习到这一步才开始真正的学习,根据算法不同,第四第五步才是机器学习算法的核心。我们将前两步得到的格式化数据输入到算法,从中抽取知识或信息。这里得到的知识需要储存为计算机可以处理的格式,方便后步骤使用。
      • 如果使用无监督学习,由于不存在目标变量值,故而也不需要训练算法,所有与算法相关的内容都集中在第5步。
    5. 测试算法
      • 这一步实际使用第4步机器学习得到的知识信息,为了评估算法,必须测试算法的工作效果。对于监督学习,必须已知用于评估算法的目标变量值,对于无监督学习,也必须用其他的评测手段来检验算法的成功率。无论哪种情形,如果不满意算法的输出结果,则可以回到第4步,改正并加以测试。问题常常会跟数据的收集和准备有关,这时候就需要跳回到第1步重新开始
    6. 使用算法
      • 将机器学习算法转化为应用程序,执行实际任务,以检验上述步骤是否可以在实际环境中正常工作

NumPy 函数库基础

使用 NumPy 函数库,用到线性代数知识为了简化不同的数据点上执行的相同数学运算,将数据表示为矩阵形式,只需要执行简单的矩阵运算而不需要复杂的循环操作

NumPy 矩阵与数组的区别

NumPy 函数库中存在两种不同的数据类型(矩阵 Matrix 和 数组 Array),都可以用于处理行列表示的数字元素。虽然它们看起来很相似,但是在这两个数据类型上执行相同的数学运算可能得到不同的结果,其中 NumPy 函数库中的 Matrix 与 MATLAB 中 matrices 等价

  • 创建随机数组

    1
    2
    3
    4
    5
    6
    7
    from numpy import *
    random.rand(4, 4)
    Out[3]:
    array([[0.46880839, 0.38865008, 0.46341044, 0.93586798],
    [0.56242134, 0.31832366, 0.39307916, 0.44696472],
    [0.59154407, 0.2346013 , 0.04209256, 0.77825304],
    [0.32412555, 0.81823296, 0.81448981, 0.34377957]])
  • 数组转换为矩阵

    1
    2
    3
    4
    5
    6
    7
    randMat = mat(random.rand(4,4))
    randMat
    Out[5]:
    matrix([[0.87913486, 0.91821081, 0.61405468, 0.53269643],
    [0.64531481, 0.73184105, 0.85937512, 0.9317023 ],
    [0.55925988, 0.08606981, 0.18688197, 0.8968934 ],
    [0.70966041, 0.16658056, 0.87367586, 0.85180685]])
  • .I 操作符实现了矩阵的求逆运算

    1
    2
    3
    4
    5
    6
    randMat.I
    Out[6]:
    matrix([[ 1.7529709 , -2.51623098, 0.49223267, 1.13769528],
    [ 0.33172063, 1.30521815, -0.14074626, -1.48689431],
    [-0.48991452, 0.48614997, -1.47325116, 1.3258615 ],
    [-1.02282081, 1.34244994, 1.1285088 , -0.84298783]])
  • 执行矩阵的乘法,得到矩阵与其逆矩阵相乘的结果

    1
    2
    3
    4
    5
    6
    randMat * randMat.I
    Out[7]:
    matrix([[1.00000000e+00, 2.22044605e-16, 0.00000000e+00, 0.00000000e+00],
    [1.11022302e-16, 1.00000000e+00, 1.11022302e-16, 0.00000000e+00],
    [0.00000000e+00, 0.00000000e+00, 1.00000000e+00, 1.11022302e-16],
    [0.00000000e+00, 2.22044605e-16, 0.00000000e+00, 1.00000000e+00]])

    结果应该是除了对角线元素是 1, 4x4 矩阵的其他元素应该全是 0, 矩阵还留下了许多非常小的元素,这是计算机处理误差产生的结果,输入下面的命令,得到误差值

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    randMat * randMat.I - eye(4)
    Out[8]:
    matrix([[-2.22044605e-16, 2.22044605e-16, 0.00000000e+00,
    0.00000000e+00],
    [ 1.11022302e-16, 0.00000000e+00, 1.11022302e-16,
    0.00000000e+00],
    [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
    1.11022302e-16],
    [ 0.00000000e+00, 2.22044605e-16, 0.00000000e+00,
    0.00000000e+00]])

    函数 eye(4) 创建一个 4x4 单位矩阵 (对角线元素是 1. 其他元素全是 0),关于 eye 函数可参考 MathWorks


All articles in this blog adopt the CC BY-SA 4.0 agreement unless otherwise stated. Please indicate the source for reprinting!