机器学习分类
监督学习
对未来事件进行预测
每个样本都有一个已知的输出项(类标label
)。通过使用有类标的训练training
构建模型,从而使用得到的模型进行预测。
两个子类:
- 分类
- 类标是离散的、无序的值,可以视为样本的组别信息
group membership
。分类可以分为二类别分类binary classification
和多类别分类multi-class classification
- 类标是离散的、无序的值,可以视为样本的组别信息
- 回归
- 类标(输出结果)是连续型的
强化学习
解决交互式问题
-
目的是构建一个系统
Agent
,在与环境environment
交互中提高系统的性能. -
环境的当前状态信息中通常包含一个反馈
reward
信号,这个反馈值不是确定的类标或连续类型的值,而是通过反馈函数产生的对当前系统行为的评价.
通过与环境的交互,Agent可以通过强化学习来得到一系列行为,通过探索性的试错或借助精心设计的激励系统使得正向反馈最大化。
例子:
象棋对弈
Agent 根据棋盘上的当前局态(环境)决定落子的位置,而游戏结束时胜负的判定可以作为激励信号。
无监督学习
发现数据本身潜在的结构
- 无监督学习将处理无类标数据或者是总体分布趋势不明朗的数据。
- 通过无监督学习,可以在没有已知输出变量(有别于监督学习)和反馈函数(有别于强化学习)指导的情况下,提取有效信息,从而探索数据的整体结构。
手段(或者说两个子领域):
1. 聚类(无监督分类)
获取数据结构信息,导出数据间有价值的关系
-
通过聚类发现数据的子群。
-
在没有先验信息的情况下,将数据划分为小的组别 ( 即簇
cluster
)。每个簇中的内部成员之间有一定的相似度,但和其他簇成员有较大不同。
2. 降维(无监督降维)
数据特征预处理时经常使用
- 可以清除数据中的噪声,能在最大程度保留相关信息的情况下将数据压缩到一个维度较小的子空间
- 但可能会降低某些算法在准确方面的性能
机器学习流程
- 数据预处理
- 特征抽取及缩放
- 特征选择
- 降维
- 抽样
- 选择预测模型类型并进行训练
- 模型选择
- 交叉验证
- 性能矩阵
- 超参优化
- 模型验证
- 使用未知参数进行预测
3. 简例:鸾尾花
3.1 数据读取
sklearn库中已经自带了一些数据集,这里以鸾尾花数据集为例。读取数据:
from sklearn import datasets
import numpy as np
iris = datasets.load_iris()
x = iris.data[:, [2, 3]]
y = iris.target
- 1
- 2
- 3
- 4
- 5
- iris中文指鸢尾植物,这里存储了其萼片和花瓣的长宽,一共4个属性,鸢尾植物又分三类。与之相对,iris里有两个属性data和target。
- iris.data是一个150×4的矩阵,每一列代表了萼片或花瓣的长宽,一共4列,每一行代表某个被测量的鸢尾植物,一共采样了150条记录。(这里作者只读取了第2、3列的数据)
- iris.target是一个长度为150×1的矩阵,存储了data中每条记录属于哪一类鸢尾植物,因为共有3类鸢尾植物,所以数组元素的值有3个。
3.2 数据集划分
接下来要将数据集划分为训练集和测试集。使用sklearn中cross_validation模块中的train_test_split 函数,按7:3的比例划分训练集和测试集:
from sklearn.cross_validation import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=0)
- 1
- 2
train_test_split函数用于将矩阵随机划分为训练子集和测试子集,并返回划分好的训练集测试集样本和训练集测试集标签。
格式:
X_train,X_test, y_train, y_test =cross_validation.train_test_split(train_data,train_target,test_size=0.3, random_state=0)
- 1
参数解释:
- train_data:被划分的样本特征集
- train_target:被划分的样本标签
- test_size:如果是浮点数,在0-1之间,表示样本占比;如果是整数的话就是样本的数量
- random_state:是随机数的种子。
train_text_split 参数解释
3.3 特征标准化
现使用sklearn中preprocessing模块中的StandardScaler类对特征进行标准化处理:
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
sc.fit(x_train)
x_train_std = sc.transform(x_train)
x_test_std = sc.transform(x_test)
- 1
- 2
- 3
- 4
- 5
- 6
- x_train_std即为经过标准化后的训练集特征
- x_test_std 即为经过标准化后的测试集特征
3.4 训练感知器模型
from sklearn.linear_model import Perceptron
ppn = Perceptron(n_iter=40, eta0=0.1, random_state=0)
ppn.fit(x_train_std, y_train)
- 1
- 2
- 3
- n_iter定义了迭代(遍历训练数据集)的次数
- eta0是学习速率
- 使用random_state参数在每次迭代后初始化重排训练数据集
3.5 对测试集进行预测
在测试集上使用predict方法:
>>> y_pred = ppn.predict(x_test_std)
>>> print ('出错个数为:%d'% (y_test!=y_pred).sum())
出错个数为:4
- 1
- 2
- 3
- 此处,y_test 是真是的类标,y_pred是预测得到的类标
- 可以看到,在感知器对45朵花的分类结果中,有4个是错误的。也就是说在测试集上的错误率约为8.9%
- 可以用sklearn自带的函数计算分类准确率:
>>> from sklearn.metrics import accuracy_score
>>> accuracy_score(y_pred, y_test)
0.91111111111111109