放进时光蛋里。

Google 机器学习中文教程笔记

2018.01.04

前言

    机器学习人工智能的一个分支。人工智能的研究历史有着一条从以“推理”为重点,到以“知识”为重点,再到以“学习”为重点的自然、清晰的脉络。显然,机器学习是实现人工智能的一个途径,即以机器学习为手段解决人工智能中的问题。机器学习在近30多年已发展为一门多领域交叉学科,涉及概率论统计学逼近论凸分析计算复杂性理论等多门学科。机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。机器学习算法是一类从数据中自动分析获得规律,并利用规律对未知数据进行预测的算法。因为学习算法中涉及了大量的统计学理论,机器学习与推断统计学联系尤为密切,也被称为统计学习理论。算法设计方面,机器学习理论关注可以实现的,行之有效的学习算法。很多推论问题属于无程序可循难度,所以部分的机器学习研究是开发容易处理的近似算法。

    机器学习已广泛应用于数据挖掘计算机视觉自然语言处理生物特征识别搜索引擎医学诊断、检测信用卡欺诈证券市场分析、DNA序列测序、语音手写识别、战略游戏机器人等领域。

—— Wiki 机器学习

正文

Pandas 简介

pandas 的两个结构:

  • DataFrame:表格(关系)
  • Series:列
from __future__ import print_function

import pandas as pd

// 创建 DataFrame
city_names = pd.Series(['San Francisco', 'San Jose', 'Sacramento'])
population = pd.Series([852469, 1015785, 485199])

pd.DataFrame({ 'City name': city_names, 'Population': population })
pd.describe()

// 访问数据
cities = pd.DataFrame({ 'City name': city_names, 'Population': population })
print(type(cities['City name']))
cities['City name']

// 操作数据
population / 1000 // Python 基本运算指令

机器学习基础概念

(监督式)机器学习定义:机器学习系统通过学习如何组合输入信息来对从未见过的数据做出有用的预测。

特征:用于描述数据的输入变量。ex: 用户态度

标签:我们所需要预测的真实事物。ex: 喜欢/不喜欢

样本

  • 无标签样本:可用于推断
  • 有标签样本:可用于训练

模型:执行预测的工具

  • 回归模型:可预测连续值
  • 分类模型:可预测离散值

深入了解机器学习

线性回归

机器学习中的线性回归比较不同,其一般形式:

$$y’ = b + w_1 * x_1 + w_2 * x_2 + w_3 * x_3 + …$$

其中 :

  • $w_i$ 指的是特征 $i$ 的权重(表现在图像中是斜率)

  • $x_i$ 指的是特征

最后得出的 $y’$ 是标签(输出值)

训练

训练指的是检查多个样本并尝试找出可最大限度减少损失的模型,该过程也叫做经验风险最小化

损失

均方误差(MSE):

$$MSE = \frac{1}{N} \sum_{(x,y)\in D} (y - prediction(x))^2$$

是常用的机器学习损失函数。

降低损失的方法

迭代方法

中止条件:总体损失不再变化或者变化极为缓慢,此时称该模型已收敛

梯度下降法

原理:运用迭代法寻找收敛函数时,损失与权重总会有且是唯一一个最低点

img

以初值为基础,反复寻找使得梯度下降的下一个点,以达到寻找收敛函数的目的。

概念:学习速率:即寻找下一个点的步长的函数,设定恰当的学习速率,可以让机器学习更加的高效。而不恰当的学习速率会使得梯度下降法永远无法达到收敛函数。

随机梯度下降法

概念:批量:用于在单次迭代中计算梯度的样本总量。在样本量较大时单次迭代的计算量非常的大,所以随机选取一部分进行计算。我们分别称之为小批量与全批量。

令人惊奇的是,小批量甚至只包含一个样本的随机梯度下降法的效率通常比全批量的效率要高,而且成本也低。

开始使用 TensorFlow

img

越高级越抽象,所需代码量越少,易于使用,但是不直观;越基层的越直观,更加的灵活,但是使用起来会困难一些。

在这篇教程中使用的是 tf.estimator API ,与 scikit-learn API 兼容,该 API 是 Python 开源的机器学习库。下述是一个使用线性回归的例子:

import tensorflow as tf

# Set up a linear classifier.
classifier = tf.estimator.LinearClassifier()

# Train the model on some example data.
classifier.train(input_fn=train_input_fn, steps=2000)

# Use it to predict.
predictions = classifier.predict(input_fn=predict_input_fn)

在我们加载完成数据之后一般都会进行随机化处理,确保不会出现病态排序结果(这种病态排序可能会损害随机梯度下降法的效果)

构建模型的步骤:

  1. 配置特征及特征列:即从数据库提出我们需要用的特征那一列的标签,特征列指的是特征的数据类型

  2. 定义目标:即从数据库提出我们想要预测的特征的标签

  3. 配置回归模型:例如线性回归模型使用 Linear Regressor

    my_optimizer=tf.train.GradientDescentOptimizer(learning_rate=0.0000001)
    my_optimizer = tf.contrib.estimator.clip_gradients_by_norm(my_optimizer, 5.0)
    linear_regressor = tf.estimator.LinearRegressor(
        feature_columns = feature_columns,
        optimizer = my_optimizer
    )
    
  4. 定义输入函数:创建一个函数来处理数据(在每一次训练中)这一部分目前不是很清楚,参考教程说法

  5. 训练模型:使用上述配置的回归模型进行 train

  6. 评估模型:基于一次的训练结果进行预测,计算模型计算结果与实际结果的拟合程度(常常通过 MSE 或者 RMSE)

    • 拟合不足:模型复杂程度不够,虽然大体上有相应的规律,但整体上偏差还是很大
    • 过拟合:模型的复杂程度高于模型所需要的复杂程度,虽然训练数据产生损失比较少,但预测新数据的时候依然很糟糕

    机器学习模型越简单,良好的实证结果就越有可能不仅仅基于样本的特性。

    —— 奥卡姆剃刀定律在机器学习方面的应用

常用参数:

steps = 10; // 训练迭代总步数
batch_size = 100; // 单步的样本数量随机选择
periods = 1; // 方便变量的一种控制报告的粒度
// ex. 此时 periods = 1steps = 10 那么每 10 次输出一次损失值

成立:

$$total\ number\ of\ trained\ examples = batch\ size \times steps$$

$$number\ of\ training\ examples\ in\ each\ period = \frac{batch\ size \times steps}{periods}$$

合成特征:将多个特征处理成一个特征。ex. 地区人口量与地区面积合成为地区人口密度

离群值:顾名思义,在输入的数据中有少量的值与我们模型预测结果偏差较大(该偏差量由具体情况确定),这些数值被称为离群值,常常将其截取(移除)

泛化能力:是指机器学习算法对新鲜样本的适应能力,体现在

  • 模型的复杂程度
  • 模型在处理训练数据方面的表现

在此基础上诞生了训练集测试集的概念

  • 训练集 - 用于训练模型的子集
  • 测试集 - 用于测试训练后模型的子集

训练集使用绝大部分的数据,但这样会产生一个问题,多次重复执行测试集的指导会使我们不知不觉的拟合测试集特性,从而产生过拟合的情况,所以在上述两个集合之外我们再加上

  • 验证集 - 用于评估训练集的效果,原测试集效果

img

特征工程:将原始数据映射为特征矢量,在此过程中涉及到词汇表与权重等问题

  • 该向量的长度等于词汇表中的元素数。当只有一个值为 1 时,这种表示法称为独热编码

  • 当有多个值为 1 时,这种表示法称为多热编码

选取特征值一般有以下需求:

  • 避免很少使用的离散特征值:良好的特征值应该在数据集中出现大约 5 次以上,而不是唯一识别码
  • 最好有清晰明确含义:而不是唯一编号
  • 实际数据中不要掺和特殊值:个别时候数据集中使用 -1 来表示空值,这样会带来很多问题
  • 考虑上游不稳定性:良好的特征值可以选择城市名因为其不常发生变化,而不是城市编号这种可能在几年内变化的

在此同时我们把偏差值过大的数据截去。

对于不成线性关系的特征,我们常常使用分块的方式来代替使用浮点数(俗称分箱)。

特征组合:对于一些非线性问题,可以创建一个特征组合通过将两个及两个以上输入特征相乘来对特征空间中的非线性规律进行编码的合成特征(类似向量积)常常组合的对象就是独热矢量(详见上述描写)。这种情况类似上述过拟合的情况:组合过度。

正则化:在建立模型时以最小化损失与复杂度为目标,这种称为结构风险最小化:

$$minimize(Loss(Data|Model) + complexity(Model))$$

说明:左半部分为损失项,用于衡量模型与数据的拟合度;右半部分为正则化项,用于衡量模型的复杂度,常见方法有下述两种:

  • 将模型复杂度作为模型中所有特征的权重的函数
  • 将模型复杂度作为具有非零权重的特征总数的函数

$L_2$ 正则化公式来量化就是如下效果;

$$L_2\ regularization\ term = ||w||^2_2 = w^2_1+w^2_2+…+w^2_n$$

Problems

不够循序渐进,进度节奏有一些问题,接触过机器学习的同学有不少部分的概念都可以扫一眼而过(ex. 训练集与测试集)。对概念的理解不是很清楚,我是学数学的,习惯了每个概念有非常概括性的定义,适合边 Google 概念边学习内容。

发表评论