Scikit-learn是基于NumPy、SciPy和Matplotlib的开源Python机器学习包,它封装了一系列数据预处理、机器学习算法、模型选择等工具,是数据分析师首选的机器学习工具包。自2007年发布以来,scikit-learn已经成为Python重要的机器学习库了,scikit-learn简称sklearn,在Sklearn里面有六大任务模块:分别是分类、回归、聚类、降维、模型选择和预处理,此外还有一个数据引入模块。
Scikit-learn所需的依赖项:
Tips:Scikit-learn绘图功能,需要Matplotlib(>=1.5.1)。一些scikit-learn示例可能需要一个或多个额外依赖项:scikit-image(>=0.12.3)、panda(>=0.18.0)
如果电脑环境中已有合适的numpy和scipy版本,安装scikit-learn最简单的方法是使用pip
pipinstall-Uscikit-learn如果没有任何合适的依赖项,强烈建议使用conda安装。
condainstallscikit-learn当然也可以使用anaconda的交互界面进行安装。
升级scikit-learn:
condaupdatescikit-learn卸载scikit-learn:
condaremovescikit-learn3.数据引入sklearn的datasets中提供一些训练数据,我们可以使用这些数据来进行分类或者回归等等。其中包含以下几种获取数据的方式:
importnumpyasnpfromsklearnimportpreprocessing#标准化:将数据转换为均值为0,方差为1的数据,即标注正态分布的数据x=np.array([[1,-1,2],[2,0,0],[0,1,-1]])x_scale=preprocessing.scale(x)print(x_scale.mean(axis=0),x_scale.std(axis=0))std_scale=preprocessing.StandardScaler().fit(x)x_std=std_scale.transform(x)print(x_std.mean(axis=0),x_std.std(axis=0))#将数据缩放至给定范围(0-1)mm_scale=preprocessing.MinMaxScaler()x_mm=mm_scale.fit_transform(x)print(x_mm.mean(axis=0),x_mm.std(axis=0))#正则化nor_scale=preprocessing.Normalizer()x_nor=nor_scale.fit_transform(x)print(x_nor.mean(axis=0),x_nor.std(axis=0))#将分类特征或数据标签转换位独热编码ohe=preprocessing.OneHotEncoder()x1=([["大象"],["猴子"],["老虎"],["老鼠"]])x_ohe=ohe.fit(x1).transform([["老虎"]]).toarray()print(x_ohe)特征放缩的意义:
对于分类、回归、聚类、降维算法的选择,可以参照下图中的算法选择路径图:
从图中可以看到,按照是否为分类问题划分成了两大块,其中分类和聚类属于分类的问题(虽然聚类没有给定类别),回归和降维属于非分类的问题。同时,四类算法也可以按照数据是否有标签划分为监督学习(分类、回归)和无监督学习(聚类、降维)。
比如说,使用历年考试真题准备将来的考试,在历年考试真题取得好成绩(训练误差)并不能保证未来考试成绩好(泛化误差),我们训练模型的目的是希望训练好的模型泛化误差越低越好。
下图是机器学习实操的7个步骤:
那么为什么要分为那么多种数据集呢,首先我们知道训练模型的目的是使得模型的泛化能力越来越强,在训练集上,我们不断进行前向转播和反向传播更新参数使得在训练误差越来越小,但是这并不能代表这个模型泛化能力很强,因为它只是在拟合一个给定的数据集(就好比做数学题用背答案的办法,正确率很高,但并不代表你学到了东西),那么如何评判这个模型泛化能力强呢?就用到了测试数据集,测试数据集就像是期末考试,在模型最终训练完成后才会使用一次,在最终评估之前不能使用这个数据集(好比在考试前不能泄题一样)。判断模型泛化能力强弱的途径有了,但是我们知道在神经网络中有很多超参数也会对模型泛化能力造成影响,那么如何判断不同参数对模型的影响呢,毕竟测试集只能用一次,而参数调整需要很多次,而且也不能使用训练数据集,这样只会拟合训练数据集,无法证明其泛化能力提升,于是我们又划分出了一个数据集,验证数据集,我们的模型训练好之后用验证集来看看模型的表现如何,同时通过调整超参数,让模型处于最好的状态。用一个比喻来说:
我们可以使用交叉验证或其他划分数据集的方法对数据集多次划分,以得出模型平均的性能而不是偶然结果。sklearn有很多划分数据集的方法,它们都在model_selection里面,常用的有
以上方法除了留一法都有几个同样的参数:
以上的划分方法各有各的优点,留一法、K折交叉验证充分利用了数据,但开销比随机划分要高,随机划分方法可以较好的控制训练集与测试集的比例,(通过设置train_size参数)详细可查看官方文档。
GridSearchCV的名字其实可以拆分为两部分,GridSearch和CV,即网格搜索和交叉验证。这两个名字都非常好理解。网格搜索,搜索的是参数,即在指定的参数范围内,按步长依次调整参数,利用调整的参数训练学习器,从所有的参数中找到在验证集上精度最高的参数,这其实是一个训练和比较的过程。GridSearchCV可以保证在指定的参数范围内找到精度最高的参数,但是这也是网格搜索的缺陷所在,他要求遍历所有可能参数的组合,在面对大数据集和多参数的情况下,非常耗时。
estimator:所使用分类器
param_grid:值为字典或者列表,即需要最优化的参数的取值
scoring:准确度评价标准,默认为None,根据所选模型不同,评价准则不同
cv:交叉验证参数,默认None(三折交叉验证,即fold数量为3),也可以是训练/测试数据的生成器
refit:默认为True,即在搜索参数结束后,用最佳参数结果再次fit一遍全部数据集
iid:默认为True,即默认个个样本fold概率分布一直,误差估计为所有样本的和,而非各个fold的平均
verbose:日志冗长度,int:若冗长度为0,不输出训练过程;若冗长度为1,偶尔输出(一般设置为1);若冗长度>1,对每个子模型都输出
n_jobs:并行数,一般设置为-1
pre_dispatch:总共分发的并行任务数,当n_jobs大于1时,数据将在每个运行点进行复制,可能会导致OOM(内存溢出)。通过设置pre_dispatch参数,可以预先划分总共的job数量,使数据最多被复制pre_dispatch次
grid.fit():运行网格搜索
grid.score():运行网格搜索后模型得分
best_estimator_:最好的参数模型
best_params_:描述已取得最佳结果的参数的组合
best_score_:提供优化过程期间观察到的最好评分
cv_results_:每次交叉验证后的验证集和训练集的准确率结果
估计器(Estimator)其实就是模型,它用于对数据的预测或回归。基本上估计器都会有以下几个方法:
使用估计器的工作流:
转化器(Transformer)用于对数据的处理,例如标准化、降维以及特征选择等等。同与估计器的使用方法类似:
以上仅仅是简单的概括sklearn的函数的一些特点。sklearn绝大部分的函数的基本用法大概如此。但是不同的估计器会有自己不同的属性,例如随机森林会有Feature_importance来对衡量特征的重要性,而逻辑回归有coef_存放回归系数intercept_则存放截距等等。并且对于机器学习来说模型的好坏不仅取决于你选择的是哪种模型,很大程度上与你超参的设置有关。因此使用sklearn的时候一定要去看看官方文档,以便对超参进行调整。