- Machine Learning in Python: scikit-learn,流行的机器学习库。
- 用户指南:http://scikit-learn.org/stable/user_guide.html
- 示例代码:amueller/introduction_to_ml_with_python
- 常用scikit-learn集成工具:① Anaconda,② Enthought Canopy,③ Python(x,y)
- scikit-learn相关的包:
1 依赖的包:NumPy、SciPy
2 相关的包:pandas、matplotlib
3 相关的工具: Jupyter Notebook、IPython
第一章 引言
机器学习和数据分析本质都是迭代过程。
依赖的包和相关包简介:
- NumPy:Python科学计算的基础包之一,包含多维数组、高级数学函数以及伪随机数生成器等。NumPy的核心功能是ndarray类,即n维数组。
- SciPy:Python用于科学计算的函数集合。具有线性代数高级程序、数学函数优化、信号处理、特殊数学函数和统计分布等多项功能。
- matplotlib:Python的科学绘图库。
- pandas:用于处理和分析数据的函数库。它基于DataFrame的数据结构,模仿R语言中的DataFrame,一个DataFrame就是一个包含schema的表格。
- Jupyter NoteBook:可以在浏览器中运行代码的交互式环境;
监督学习的核心步骤:
步骤1: 准备训练数据和测试数据
步骤2: 学习模型
步骤3: 测试模型
步骤4: 评估模型
第二章 监督学习
2.1 分类和回归
监督学习主要解决的两类问题:分类和回归。
分类问题的目标是预测类别,回归任务的目标是预测一个连续值。区分分类和回归的方法之一就是判断其输出的结果是否具有连续性,回归输出的结果具有连续性,而分类输出的结果不具有连续性。
2.2 泛化、过拟合和欠拟合
收集更多数据,适当构建更复杂的模型,对监督学习任务往往特别有用,这可能比对模型调参更为有效。永远不要低估更多数据的力量。
2.3 监督学习方法
算法1: k近邻
kNN算法既可以用于分类(二分类和多分类都可以),也可以用于回归。
参数:邻居个数以及数据点之间距离的度量方法(默认使用欧式距离);
优点:模型简单,容易理解,适合作为基准模型;
缺点:对于特征较多(几百或者更多)的数据集不太适用;对于稀疏数据集,即大多说取值都为0的数据集来说,该算法的预测效果较差。
总结:虽然kNN算法较容易理解,但是由于其预测速度慢且不能处理具有很多特征的数据集,所以实践中往往不会使用。
算法2:线性模型
线性模型是在实践中被广泛使用的一类模型。线性模型利用输入特征的线性函数进行预测。
线性回归模型
有许多不同的线性回归模型,这些模型之间的区别在于如何从训练数据中学习参数w和b,以及如何控制模型复杂度。
Ⅰ 线性回归模型(普通的最小二乘)
普通的最小二乘模型(Ordinary least squares, OLS)是回归问题最简单也是最经典的线性方法。线性回归寻找参数w和b,使得对训练集与真实的回归目标y之间的均方误差最小。均方误差(mean squared error)是预测值和真实值之差的平方和除以样本数。
普通的最小二乘模型总结:
参数:无参数,权重(斜率)w和偏移(截距)通过学习获取;
优点:模型简单,也是最简单的线性方法;
缺点:无法控制模型的复杂度。
总结:线性回归没有参数,这是一个优点,但是也因此无法控制模型的复杂度。对于一维的数据,线性模型常容易出现欠拟合,而对于多维得数据,线性模型容易出现过拟合。
Ⅱ 岭回归模型(Ridge regression)
线性模型的缺点就是无法控制模型的复杂度,岭回归模型通过引入L2正则化(Regularization),来约束模型的复杂度从而避免过拟合。岭回归模型中,参数w的选择不仅要在训练数据上得到好的预测结果,而且还要拟合附加约束,即w的所有元素都应接近于0。
岭回归模型总结:
参数:参数alpha(用户设定);权重(斜率)w、偏移(截距)b通过学习获取;
优点:引入L2正则化,可以克服线性模型过拟合的缺点,更不容易过拟合;
缺点:模型的训练性能(模型拟合的程度)变低。
总结:岭回归引入了参数alpha,用户可以通过指定不同的alpha,实现在模型简单性和训练性能之间做权衡。
当训练数据集足够大的时,线性回归出现过拟合的可能性会越来越小,此时线性回归和岭回归具有几乎相同的预测效果。所以,增大训练集,也是避免过拟合的有效方法。
Ⅲ lasso 回归
lasso回归也是一种正则化的线性回归。与岭回归相同,lasso也是约束系数,使其接近0,但用到的正则化方法不同。lasso使用的是L1正则化。L1正则化的结果使某些系数刚好为0,说明某些特征被直接忽略,因此其具有一定的稀疏性。L1正则化也可以看成是一种自动化的特征选择。
lasso 回归总结:
参数:参数alpha(用户设定)以及迭代次数iter;权重(斜率)w、偏移(截距)b通过学习获得;
优点:引入L1正则化,降低过拟合的可能性,同时,可以忽略某些特征,自动选择特征,具有一定的稀疏性,模型的可解释性也较好;
缺点:可能会忽略过多的特征,导致模型欠拟合。
总结:L1正则化的引入,使lasso回归具有了自动选择特征的功能。
在实践中,ridge regression和lasso regression一般首选ridge regression。如果特征很多,但只有其中几个是重要的,那么选择lasso可能更好。可以结合Ridge和Lasso的惩罚项,使用ElasticNet,结合L1正则化和L2正则化。这种结合的效果最好,但是要调节两个参数。
线性分类模型
Ⅰ Logistic Regression分类器
Ⅱ 线性支持向量机分类器
多分类为问题的解决方案:
- 一对多法解决多分类问题,若是n个分类,则需要训练n的二分类模型;
- 一对一分类器,首先对任意两类建立分类器,n个分类要建立n(n-1)/2个分类器,然后再对各个分类器预测的结果进行投票,确定最终所属的分类;
若训练集的性能和测试集的性能非常接近,则有可能出现了欠拟合,可以适当的提高模型的复杂度;若训练集的性能和测试集的性能相差较大,则有可能出现了过拟合,可以通过正则化限制模型的复杂度。
算法3:朴素贝叶斯分类器
朴素贝叶斯分类器与线性模型非常相似,但它的训练速度往往更快。这种高效率所付出的代价是,朴素贝叶斯的泛化能力要比线性分类器稍差。
朴素贝叶斯模型对高纬稀疏数据的效果很好,对参数的鲁棒性相对较好。
朴素贝叶斯模型是很好的基准模型,常用于非常大的数据集。
算法4: 决策树
决策树广泛用于分类和回归。它本质是从一层层的if/else问题中进行学习并得出结论。
构造决策树:学习决策树,就是学习一系列if/else问题,使我们能够以最快的速度得到正确答案。在机器学习中,这些问题叫作测试。为了构造决策树,算法遍历所有可能的测试,找出对目标变量来说信息量最大的那一个。每个测试仅仅关注一个特征。
控制决策树的复杂度。防止决策树过拟合的方法:① 及早停止树的生成,称为预剪枝(pre-prunning),② 先构造树,但随后删除或者折叠信息量很少的节点,称为后剪枝(post-pruning)或剪枝。预剪枝的方法使用较多。
预剪枝的限制条件:限制树的最大深度、限制叶节点的最大数目或者规定一个节点中数据点的最小数目来防止继续划分。
分析决策树:将决策树以可视化的形式展示出来,决策树的一大优点之一就是很容易可视化,方便解释模型。
树的特征重要性:它为每个特征对树的决策的重要性进行排序。
决策树总结:
参数:预剪枝参数,如max_depth、max_leaf_nodes、min_samples_leaf;
优点:模型很容易可视化;算法不受数据缩放的影响,不需要做特征处理;
缺点:即使做了预剪枝,也经常出现过拟合,泛化性能很差。
为解克服决策树的缺点,提出了基于集成的随机森林(Random forest)和梯度提升决策树(Gradient boosted decision tree)。集成(ensemble),是合并多个机器学习的模型来构建更强大模型的方法。已经证明随机森林和梯度提升决策树对大量分类和回归的数据集都是有效的。
随机森林总结:
参数:预剪枝参数,如max_depth、max_leaf_nodes、min_samples_leaf,随机树的个数n_estimators、随机选取的最大特征数max_feature;
优点:有决策树的所有优点,同时弥补了决策树容易出现过拟合的缺陷,通常不需要调节参数就可以给出很好的结果,也不需要对数据进行缩放;
缺点:对维度非常高的稀疏数据,随机森林的表现往往不好,训练过程中需要更大的内存。
梯度提升回归树,采用连续的方式构造树,每棵树都试图纠正前一棵树的错误。默认情况下,梯度提升回归树中没有随机化,而是用到了强预剪枝,通常采用深度较小的树(树深度范围1-5),占用内存少,预测速度快。
参数:随机树的个数n_estimators、学习率learning_rate以及max_depth或max_leaf_nodes;
优点:有决策树的所有优点,适用于二元特征与连续特征同时存在的数据集;
缺点:需要仔细调参,而且训练时间可能会比较长,与其他基于树的模型一样,通常不适合用于高纬稀疏数据集。
算法5:核支持向量机
核技巧:Kernel trick
高斯核函数,也称为RBF核函数,
学习的参数:C(惩罚项,正则化参数,限制每个点的重要性)和gamma(控制高斯核宽度的参数,它决定了点与点之间“靠近”是指多大距离)
核支持向量机总结:
参数:正则化参数C、核函数以及和核函数相关的参数;
优点:在低维数据和高纬数据上的表现都很好;适合小样本;
缺点:样本超过10000或者更大时,学习即耗内存又耗时间,不适合较大的样本;处理数据和调参需要特别小心;对数据缩放敏感,对参数选取敏感。
算法6:神经网络
多层感知机(Multilayer perceptron, MLP),MLP也被称为前馈神经网络,也简称为神经网络。如下图为单隐藏层的多层感知机:
在计算完每个隐藏单元的加权求和之后,对结果再应用一个非线性函数,通常是校正非线性(rectifying nonlinearity, 也叫校正性单元或relu)或正切双曲线(tangens hyperbolicus, tanh)。这两个函数的可视化如下图所示,relu截断小于0的值,而tanh在输入值较小时接近-1,在输入值较大时接近+1。有了这两种非线性函数,神经网络可以学习比线性模型复杂的多的函数。
神经网络在开始学习之前其权重时随机设置的,这种随机初始化会影响学习的模型。也就是说,相同的参数,学习的模型可能是不相同的。若网络比较大,并且复杂选择合理,初始随机值的设置不会对精度有太大影响,否则读预测精度可能会有较大的影响。
神经网络总结:
参数:隐藏层的层数、每个隐藏层的单元个数、激活函数、正则化参数等;
优点:能够获取大量数据中包含的信息,并构建无比复杂的模型;
缺点:过大的神经网络,通常需要较长的训练时间;与SVM类似,神经网络在“均匀”数据上的性能最好,对数据缩放敏感,对参数选取敏感;
神经网络调参的通用方法:首先创建一个达到足以过拟合的网络,确保这个网络可以对任务进行学习。知道训练数据可以被学习以后,要么缩小网络,要么增大alpha来增强正则化,从而提高模型的泛化能力。
面对新的数据集,通常最好先从简单模型开始,比如线性模型、朴素贝叶斯或最近邻分类器,看能得到什么样的结果。对数据有了进一步了解之后,可以考虑用于构建更复杂模型的算法,如随机森林、梯度提升决策树、SVM或神经网络等。
第三章 无监督学习和预处理
在无监督学习中,学习算法只有输入数据,并需要从这些数据中提取知识。
3.1 无监督学习的类型
无监督学习的类型:无监督变换(unsupervised transformation)和聚类(clustering algorithm)。
数据集合无监督变换(unsupervised transformation)是创建数据的表示的方法,与数据的原始表示相比,新的表示可能更容易被人或者机器学习算法所理解。无监督变换的一个常见应用是降维(dimensionality reduction)。另一个应用是找到“构成”数据的各个组成部分。
聚类算法(clustering algorithm)将数据划分成不同的组,每组包含相似的物项。
3.2 降维、特征提取与流形学习
主成分分析(principal component analysis, PCA)
主成分分析(principal component analysis, PCA),是一种旋转数据集的方法,旋转后的特征在统计上不相关。一般来说经过PCA获得的主成分个数和原始特征相同,我们正是通过选取部分主成分实现降维的。
PCA是一种无监督学习方法,在寻找旋转方向时,没有用到任何类别信息,只是观察数据中的相关性。PCA的缺点在于,不容易对新生成的主成分进行解释,因为主成分对应于原始数据中的方向,所以它们是原始特征的组合。
PCA的用途:降维和特征提取;特征提取背后的思想是找到一种数据表示,比给定的原始表示更适合于分析。
非负矩阵分解(non-negative matrix factorization, NMF)
非负矩阵分解(non-negative matrix factorization, NMF),是一种无监督学习算法,其目的在于提取有用的特征。它的工作原理类似PCA,也可以用于降维。与PCA相同,NMF也试图将每个数据点写成一些分量的加权求和,但PCA想要的是正交分量,并且能够解析尽可能多的数据方差,而NMF中,希望分量和系数均为非负。因此NMF只能应用于每个特征都是非负的数据。
t-SNE
流行学习算法(manifold learning algorithm),一类可视化的算法,它允许进行复杂的映射,通常可以给出更好的可视化。流行学习算法主要用于可视化。t-SNE就是一种有用的用于流行学习的算法,它可以计算训练数据的一种新的表示,但不允许变换数据,这意味着该算法不能用于测试集。流行学习对探索性数据分析是很有用的,但如果最终目标是监督学习,则很少使用。
t-SNE的思想就是找到数据的一个二维表示,尽可能的保持数据点之间的距离。它试图保持那些表示哪些点比较靠近的信息。
3.3 聚类
k均值聚类
k均值聚类是最简单也是最常用的聚类算法之一。它试图找到代表数据特定区域的簇中心(cluster center)。
k均值聚类的步骤如下:
- Ⅰ 首先设定k=3,并随机设置3个簇中心,如C1,C2,C3;
- Ⅱ 计算每个点到三个簇中心的距离,距离哪个簇中心近就将该点归为对应的类;
- Ⅲ 重新计算簇中心,给C1,C2,C3重新赋值。簇中心就是该类所有点的平均值;
- Ⅳ 重复Ⅱ和Ⅲ,直到簇中心不在发生变化为止。
由于每个簇都是由其中心定义,这意味着每个簇都是凸形,因此k均值只能找到相对简单的形状。k均值还假设所有族在某种程度上具有相同的“直径”,它总是将族之间的边界刚好画在簇中心的中间位置。
凝聚聚类(agglomerative clustering)
凝聚聚类值的是许多基于相同原则构建的聚类算法,这一原则是:算法首先声明每个点是自己的簇,然后合并两个相似的簇,知道满足某种停止准则为止。
最开始,每个点自成一簇。然后在每个步骤中,相距最近的两个簇被合并。
由上面凝聚聚类算法的工作原理可知,该算法不能对新数据点进行预测。
DBSCAN
DBSCAN(density-based spatial clustering of applications with noise),具有噪声的基于密度的空间聚类应用。DBSCAN的主要优点是不需要用户先验的设置簇的个数,可以划分具有复杂形状的簇,还可以找出不属于任何簇的点。DBSCAN比凝聚聚类和k均值计算速度稍慢,但是仍然可以扩展到相对较大的数据集。
DBSCAN的原理是识别特征空间的“拥挤”区域中的点,在这些区域中许多数据点靠近在一起。这些区域被称为特征空间中的密集区域。簇形成数据的密集区域并由相对较空的区域分隔开。DBSCAN不能对新的数据进行预测。
第四章 数据表示与特征工程
具有连续性的特征,称为连续特征(continuous feature),对于不具有连续性的特征称为分类特征或者离散特征(discrete feature)。
特征工程 feature engineering:其目的就是找到数据的最佳表示。
4.1 分类变量
One-Hot编码
通常使用One-Hot编码来表示分类变量。One-Hot编码也称为N取1编码(one-out-of-N encoding),或者虚拟变量(dummy variable),其思想是将一个分类变量替换为一个或者多个新特征,新特征取值为0和1。
数字可以编码分类变量
分类特征通常用数字进行编码,如0,1,2,...,8,此时不能将该特征当成一个连续的变量来建模。使用的技巧之一就是将数字转成字符串。
4.2 分箱、离散化、线性模型与树
数据的最佳表示方式,不仅取决于数据的语义,还取决于所使用的模型。
有一种方法可以让线性模型在连续数据上变的更强大,就是使用特征分箱(binning,也叫离散化 discretization),将其划分为多个特征,也就是将连续特征离散化为一个分类特征。通过分箱之后,线性模型变的更加灵活了,而决策树模型的灵活性则降低了。分箱对于基于树的模型通常不会产生很好的学习效果。分箱通常针对的是单个特征。
例如:对于只有一个连续特征的数据,可以使用决策树先学习分箱的边界,再使用决策树学习的到边界对连续的特征进行分箱,最后使用线性模型对分箱之后的数据进行学习。这种方式有效的结合了决策树和线性模型。
4.3 交互特征与多项式特征
要想丰富特征表示,特别是对于线性模型而言,另一种方法是添加原始数据的交互特征(interaction feature)和多项式特征(polynomial feature)。
例如:将通过分箱得到的离散特征和原始特征都作为训练特征。(我的风电功率预测的论文中,基于上升风和下降风的预测以及将风速分段划分的预测,都包含了分箱+交互特征的思想。)
分箱是扩展连续特征的一种方法,另一种方法是使用原始特征的多项式,进行特征扩展,假设给定特征x,可以考虑扩展特征,x^2, x^3, x^4等。将多项式特征与线性回归模型结合,可以得到经典的多项式回归(polynomial regression)模型。
4.4 单变量非线性变换
添加特征的平方或者立方可以改进线性回归模型。其他变换通常也对变换某些特征有用,如使用数学函数,log、exp、sin等。
4.5 自动化特征选择
上述几节内容主要描述如何进行特征扩展,本节主要描述如何选择有效的特征。如何判断特征的重要性呢?有三种基本策略:
- 单变量统计(univariate statistics),就是计算每个特征和目标指之间的关系是否存在统计显著特性,然后选择具有高置信度的特征。对于分类问题,这也被称为方差分析(analysis of variance, ANOVA)。
- 基于模型的选择(model-based selection)使用一个监督机器学习模型来判断每个特征的重要性,并且仅保留最重要的特征。如使用L1惩罚的线性模型选择重要特征。
- 迭代选择(iterative selection)。在迭代特征选择中,会构建一系列模型,每个模型都使用不同数量的特征。可以不断增加特征进行选择,也可以不断减少特征进行选择。
4.6 利用专家知识
虽然在许多情况下,机器学习的目的是避免创建一组专家设计的规则,但这并不意味着舍弃该应用或者该领域的知识。
第五章 模型评估和改进
5.1 交叉验证
交叉验证(cross-validation)是一种评估泛化性能的统计学方法,它比单次划分训练集和测试集的方法更加稳定、全面。
交叉验证指将训练样本分成n组,每次循环的选择n-1组作为训练样本,而剩下的一组作为测试样本,并用测试样本验证模型学习结果的泛化误差。一般m的取值为2到10之间的数,若m=10,表示10折交叉验证(10-fold cross-validation),最常用。
总结交叉验证精度的一种常用方法是计算平均值。交叉验证不是一种构建可以应用于新数据的模型的方法,它的主要用途只是评估给定算法在特定数据集上训练后的泛化能力。
k折交叉验证再一些特殊的情况下可能会失效,分层k折交叉验证(stratified k-fold cross-validation)划分数据,使每个折中类别之间的比例与整个数据集中的比例相同。
其他常用交叉验证方法,留一交叉验证(leave-one-out)、打乱划分交叉验证(shuffle-split cross-validation)、分组交叉验证。
5.2 网格搜索(grid search)
交叉验证可以评估一个模型的泛化能力,而通过调参可以提升模型的泛化性能。网格搜索就是一种最常用的寻找模型参数值的方法。
带交叉验证的网格搜索。
【后续继续完善...】