Applied Machine Learning in Python

introduction

手工编写程序和一系列的规则并不能有效的解决所有我问题。例如精确的将人类对话转换成文本。
手写规则识别音频信号的一部分并决定那些单词出现在信号中是一项庞大的任务,识别不同语音时显得不够灵活和稳定。
如果我们要识别新的单词和特征,需要编写新的规则。
机器学习可以通过打标签的训练数据集自动学习复杂的规则,比起手动编写规则更加精确和灵活。
机器学习主要的目标是正确的预测或识别新的不在训练集中的对象。
搜索引擎利用机器学习对你的输入进行自动补全,还可以对查询结果进行排序。搜索引擎还通过你点击的页面和在页面停留的时间改善查询结果。
电影推荐系统使用机器学习和你过去的观看历史预测你的喜好以及和你喜好相似的其他人群。
图像和语音识别由于机器学习获得了巨大的发展。目前的识别技术已经足够可靠和快速,广泛的应用在语音控制等方面。
其他的应用还有,邮件分类、自动驾驶、医学应用等。

Key Concepts in Machine Learning

机器学习可以分为两种类型。
第一种是监督学习,目标是预测和输入相关的输出变量。
如果输出是有限的可能,例如语音信号对应的单词,我们称这种监督学习为分类。
如果输出是实数,例如预测一辆车从0km/h加速到100km/h所需要的时间,我们称为回归。
监督学习需要打标的对象作为训练集,而通常标签是人工判断。
第二种是非监督学习,将数据分为集群或组。例如购物网站将用户分组,可以向不同组的用户推荐不同的商品,使得用户获得更好的体验。
另外一种重要的非监督学习类型是异常值检测,例如检测出对网站的攻击。
使用分类有三个基本步骤,第一步是将数据表示为计算机可以理解的东西(特征值表示)和选择分类方法。例如将图片表示为像素数组。第二步是确定评估方法,用来比较不同分类方法对特定问题的表现。第三步是迭代的选择参数并执行分类,使用评估方法寻找最优解。

Python Tools for Machine Learning

Scikit-learn是我们用于机器学习最主要的库,它基于另外两个Python科学计算库,分别为Scipy和Numpy。
Scipy包含分布统计,方法优化,线性代数和数学方法。我们将使用Scipy的稀疏矩阵储存包含大量0的表。
Numpy包含许多基础数据结构,例如多维矩阵。
Pandas用于数据操作和分析,我们将使用DateFrame,不像Numpy一样,它的每一列可以是不同的数据类型。
Matplotlib是二维绘图工具。

An Example Machine Learning Problem

我们准备构建一个简单的水果识别系统。
首先加载数据集

%matplotlib notebook
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.model_selection import train_test_split

fruits = pd.read_csv('fruit_data_with_colors.txt', sep='\t')

将数据集分成训练集和测试集,Scikit-learn提供了一个简单方法去分割数据集,这个方法随机挑选一定比例的数据子集作为训练集,75-25%是比较好的分割标准。

x = fruits[['mass', 'width', 'height']]
y = fruits[['fruit_label']]
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=0)

不同的random_state值会分割成不同的随机数据集。

Examining the Data

在训练之前,根据可视化的图例,我们可以知道每个特征值的取值范围,并发现异常值。通过观察不同类型对象在特征值空间表现的聚合和分离程度,我们可以大体了解机器学习预测的准确性。

下面我们将使用特征对图例的可视化工具,画出所有特征对的散点图,显示特征值的相关性。沿对角线的直方图显示特征值的分布。

from matplotlib import cm
cmap = cm.get_cmap('gnuplot')
scatter = pd.plotting.scatter_matrix(x_train, c=y_train.fruit_label, marker='o', s=40, hist_kwds={'bins':15}, figsize=(12, 12))

我们可以构建三维空间的特征值散点图

from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x_train['width'], x_train['height'], x_train['mass'], c=y_train.fruit_label, marker='o', s=100)
ax.set_xlabel('width')
ax.set_ylabel('height')
ax.set_zlabel('mass')
plt.show()

K-Nearest Neighbors Classification

又称为为K-NN,查找和预测对象距离最近的训练集中K个元素。更具一定规则决定预测对象的label。
k=1,过拟合。
k=N(the number of points),所有新对象的预测结果都是训练集中数量最多的类型。

创建分类器对象

from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=5)

lookup_fruit_name = dict(zip(fruits.fruit_label, fruits.fruit_name))

使用分类器fit方法训练数据集。

knn.fit(x_train, y_train.fruit_label)

在测试集上计算精确度,使用score方法

knn.score(x_test, y_test.fruit_label)

使用训练后的k-NN分类器模型去分类新的对象

fruit_prediction = knn.predict([[20, 4.3, 5.5]])
lookup_fruit_name[fruit_prediction[0]]

画出K-NN分类器的决策边界

plot_fruit_knn(x_train, y_train.fruit_label, 5, 'uniform')

可以改变K值观察k对决策边界的影响。’uniform’参数,代表平等的对待所有的邻近结点,可以使用’distance’或者自定义方法。