python machine learning学习笔记

第二章 训练机器学习分类算法

感知机perceptron 自适应线性神经元adaptive linear neurons

对机器学习算法有直观了解

使用pandas, NumPy和matplotlib读入数据,处理数据和可视化数据

使用Python实现线性分类算法

感知机

感知机接受一个样本输入x,然后将其和权重w结合,计算网络输入z。接着传递给激活函数,产生一个二分类输出-1或1作为预测的样本类别。输出用于计算预测错误率和更新权重参数。

实现。

iris数据集

散点图可视化

是否收敛

找到分界线

自适应神经元

最小化损失函数

不像感知机那样每次用一个训练样本来更新权重参数,Adaline基于整个训练集的梯度来更新 权重。 注意,X.T.dot(errors)是一个矩阵和向量的乘法。

特征标准化有利于收敛。

只需要做部分修改就能得到随机梯度下降法求 解Adaline。第一个修改是fit方法内用每一个训练样本更新权重参数 ,第二个修改是增加 partial_fit方法,第三个修改是增加shuffle方法打乱训练集顺序。

平均损失(average cost)下降的非常快,在第15次迭代后决策界和使用梯度下 降的Adaline决策界非常相似。

第三章 使用Scikit-learn进行分类器之旅

训练一个机器学习算法通常的5大步骤:

特征选择

选择性能评价指标

选择分类器和优化算法

评估模型的性能

模型调参

调用train_tset_split方法我们将数据集随机分为两部分,测试集占30%(45个样本),训练 集占70%(105个样本)

直接调用sklearn中的StandardScaler来对特征进 行标准化

sklearn中训练模型的接口和我们在第二章实现的一样,从linear_model模型读取Perceptron 类,然后初始化得到ppn,接着使用fit方法训练一个模型。

Sklearn中包含了许多评价指标,这些指标都位于metrics模块

感知机对于不能够线性可分的数据,算法永远不会收敛,这也是为什 么我们不推荐大家实际使用感知机的原因。

逻辑斯蒂回归(以下简称逻辑回归)是一个分类模型,它易于实现,并且对于线性可分的类别数 据性能良好。她是工业界最常用的分类模型之一。

使用正则化解决过拟

正则化背后的原理是引入额外的信息(偏 差)来惩罚过大的权重参数。

[图片上传失败...(image-9cf3a9-1521510597061)]

支持向量机svm

SVM可以看 做是感知机的扩展。在感知机算法中,我们最小化错误分类误差。在SVM中,我们的优化目 标是最大化间隔(margin)。间隔定义为两个分隔超平面(决策界)的距离,那些最靠近超平面的 训练样本也被称为支持向量。

SVM之所以受欢迎度这么高,另一个重要的原因是它很容易核化(kernelized),能够解决非线 性分类问题。

核(kernel)可以被解释为两个样本之间的相似形函数。高斯核中e的指数范围<=0, 因此高斯核值域范围 ,特别地,当两个样本完全一样时,值为1,两个样本完全不同时,值 为0.

其中参数gamma可以被理解为高斯球面的阶段参数,如果我们增大gamma值,会产生更加柔 软的决策界。

决策树

训练决策树模型时,我们从根节点出发,使用信息增益(information gain, IG)最大的特征对数 据分割。然后迭代此过程。显然,决策树的生成是一个递归过程,在决策树基本算法中,有 三种情形会导致递归返回:

(1)当前节点包含的样本全属于同一类别,无需划分;

(2)当前 属性集为空,或是所有样本在所有属性上取值相同,无法划分;

(3)当前节点包含的样本集 合为空,不能划分。 每一个节点的样本都属于同一个类,同时这也可能导致树的深度很大,节点很多,很容易引 起过拟合。因此,剪枝操作是必不可少的,来控制树深度。

常用的度量I包括基尼指数(Gini index, )、熵(Entropy, )和分类错误(classification error, )。通常,熵和基尼系数的结果相似,分类误差更建议在剪枝时使用。

可以利用GraphViz程序将tree.dot转为PNG图片。

随机森林

一个随机森林模型就是多颗决策树的集成。集成学习(ensemble learning) 的观点是将多个弱分类器结合来构建一个强分类器,它的泛化误差小且不易过拟合。

步骤:

  1. bootstrap构建大小为n的训练集,重复抽样选择n个训练样例。
  2. 对训练集构建一棵决策树,对每个节点:不重复抽样选择d个特征;利用上面d个特征选择某种度量分割节点
  3. 重复1和2,k次
  4. 对每一个测试样例,对k颗决策树预测结果投票,票数最多为随机森林的预测结果。

随机森林中构建决策树的做法和原始决策树的区别是,在每次分割节点时,不是从所有特征 中选择而是在一个小特征集中选择特征。

树的数目(k)需要好好调参。一般,k越大,随机森林的性能越 好,当然计算成本也越高。

k近邻-KNN

机器学习算法可以被分为两大类:参数模型和变参模型。对于参数模型,在训练过程中我们 要学习一个函数,重点是估计函数的参数,然后对于新数据集,我们直接用学习到的函数对 齐分类。典型的参数模型包括感知机、逻辑斯蒂回归和线性SVM。与之相对的,变参模型中 的参数个数不是固定的,它的参数个数随着训练集增大而增多!很多书中变参 (nonparametric)被翻译为无参模型,一定要记住,不是没有参数,而是参数个数是变量!变 参模型的两个典型示例是决策树/随机森林和核SVM。

KNN算法本身非常简单,步骤如下: 1 确定k大小和距离度量。 2 对于测试集中的一个样本,找到训练集中和它最近的k个样本。 3 将这k个样本的投票结果作为测试样本的类别。

如果我们关注模型可解释性,决策树是很好的选择。

逻辑斯蒂回归不但可以在在线学习场景下大展拳脚还能预测概率。

虽然SVM能解决线性和非线性问题,但是它参数个数比较多,调参挺麻烦。

集成算法包括随机森林则不需要调节过多的参数,也不会像决策树一样容易过拟合,这使得它很受欢迎。

KNN通过懒惰学习进行分类,他不需要模型训练的过程但是在预测时的计算成本相对比较高。

然而,比选择合适的算法更重要的是训练集数据本身。如果数据的特征不够好,再好的算法 也没用。

第四章 构建一个好的训练集---数据预处理

移除数据集中的缺失值

将分类(category)数据转型,能够被机器学习算法处理

特征选择

虽然scikit-learn和NumPy数组结合的很方便,但是预处理时还是推荐使用pandas的 DataFrame格式而非NumPy数组。由DataFrame对象得到NumPy数组很方便,直接通过 values属性即可,然后就可以用sklearn中的算法了

如何处理无序离散特征?

常用的做法是独热编码(one-hot encoding)。独热编码会为 每个离散值创建一个哑特征(dummy feature)。什么是哑特征呢?举例来说,对于‘颜色’这一特 征中的‘蓝色’,我们将其编码为[蓝色=1,绿色=0,红色=0],同理,对于‘绿色’,我们将其编码 为[蓝色=0,绿色=1,红色=0],特点就是向量只有一个1,其余均为0,故称之为one-hot。

在初始化OneHotEncoder时,通过categorical_features参数设置要进行独热编码的列。还要 注意的是OneHotEncoder的transform方法默认返回稀疏矩阵,所以我们调用toarray()方法将 稀疏矩阵转为一般矩阵。我们还可以在初始化OneHotEncoder时通过参数sparse=False来设 置返回一般矩阵。

在分割数据集时,如果确定训练集和测试集的大小没有通用的做法,一般我们选择 60:40, 70:30或者80:20。对于大数据集,90:10甚至 99:1也是比较常见的。

虽然归一化方法简单,但相对来说,标准化对于大部分机器学习算法更实用。原因是大部分 线性模型比如逻辑斯蒂回归和线性SVM在初始化权重参数时,要么选择0要么选择一个接近0 的随机数。实用标准化,我们能将特征值缩放到以0为中心,标准差为1,换句话说,标准化 后的特征形式服从正态分布,这样学习权重参数更容易。此外,标准化后的数据保持了异常 值中的有用信息,使得算法对异常值不太敏感,这一点归一化就无法保证。

在训练集中表现好得多于测试集,过拟合。此时模型高方差。

常用于减小泛化误差:

收集更多训练集数据

正则化,引入模型复杂度的惩罚项

选择简单、参数少的模型

降低数据维度

L2正则项是权重参数的平方和,而L1正则项是权重参数的绝对值和。L1正则项趋向于得到稀疏特征向量。

特征选择算法的原理是自动选择一个特征子集,子集中的特征都是和问题最相关的特征,这 样能够提高计算效率并且由于溢出了不相干特征和噪音也降低了模型的泛化误差。 一个经典的序列特征选择算法是序列后向选择(sequential backward selection, SBS),它能够降 低原始特征维度提高计算效率,在某些情况下,如果模型过拟合,使用SBS后甚至能提高模 型的预测能力。

所以,SBS算法有以下4个步骤: 1 初始化k=d,其中d是原始特征维度。 2 确定那个评价函数最大的特征 。 3 从 中移除特征 , k=k-1。 4 如果k等于事先确定的阈值则终止;否则回到步骤2。

另 一种从数据集中选择相关特征的方法是利用随机森林。 随机森林能够度量每个特征的重要性,我们可以依据这个重要性指标进而选择最重要的特 征。sklearn中已经实现了用随机森林评估特征重要性,在训练好随机森林模型后,直接调用 feature_importances属性就能得到每个特征的重要性。

本章最开始我们介绍了如何处理缺失值。在训练模型之前,我们必须保证已经正确处理分类 数据。 此外,我们简单讨论了L1正则,它可以帮助我们降低模型复杂度来避免过拟合。另一种移除 不相关特征的方法是使用序列特征选择算法来选择有意义的特征。

第五章 通过降维压缩数据

特征选择,特征抽取。

主成分分析(principal component analysis, PCA), 用于无监督数据压缩

线性判别分析(linear discriminant analysis, LDA), 用于监督降维作为一种监督降维

通过核PCA进行非线性降维

pca

1 将d维度原始数据标准化。

2 构建协方差矩阵。

3 求解协方差矩阵的特征向量和特征值。

4 选择值最大的k个特征值对应的特征向量,k就是新特征空间的维度,k<

5 利用k特征向量构建映射矩阵。

6 将原始d维度的数据集X,通过映射矩阵W转换到k维度的特征子空间。

LDA(linear discriminant analysis, 线性判别分析)是另一种用于特征抽取的技术,它可以提高

计算效率,对于非正则模型也能减小过拟合。

虽然LDA的很多概念和PCA很像,但他俩的目标不同,PCA目标是找到正交的主成分同时保持数据集的最大方差,LDA的目标是为每个类单独优化,得到各个类的最优特征子集。PCA和LDA都是线性转换技术,用于数据压缩,前者是无监算法,后者是监督算法。看到监督两个字,可能你会认为对于分类任务,LDA要比PCA效果好,但实际却不是这样,在某些分类任务情境下,用PCA预处理数据得到的结果要比LDA好。

核PCA

三种基本的用于特征抽取的降维方法:标准PCA、LDA和核PCA。

使用PCA,我们将数据映射到一个低维度的子空间并且最大化正交特征轴的方差,PCA不考虑类别信息。LDA是一种监督降维方法,意味着他要考虑训练集的类别信息,目标是将类别最大化地可分。最后,你学习了核PCA,它能够将非线性数据集映射到低维特征空间,然后数据变成线性可分了。

第六章 模型评估和参数评优

sklearn还实现了一个直接得到交叉验证评估结果的方法cross_val_score

机器学习算法中有两类参数:从训练集中学习到的参数,比如逻辑斯蒂回归中的权重参数,另一类是模型的超参数,也就是需要人工设定的参数,比如正则项系数或者决策树的深度。

前一节,我们使用验证曲线来提高模型的性能,实际上就是找最优参数。这一节我们学习另一种常用的超参数寻优算法:网格搜索(grid search)。

不同的性能评价指标:准确率(accuracy)、查准率(precision)、查全率(recall)和F1值(F1-score)

第七章 集成学习

你可能感兴趣的:(python machine learning学习笔记)