数据科学系列:sklearn库主要模块功能简介
导读
作为一名数据分析师,当我初次接触数据分析三剑客(numpy、pandas、matplotlib)时,感觉每个库的功能都很多很杂,所以在差不多理清了各模块功能后便相继推出了各自教程(文末附链接);后来,当接触了机器学习库sklearn之后,才发现三剑客也不外如是,相比sklearn简直是小巫见大巫;再后来,又开始了pyspark的学习之旅,发现无论是模块体积还是功能细分,pyspark又都完爆sklearn;最近,逐渐入坑深度学习(TensorFlow框架),终于意识到python数据科学库没有最大,只有更大……
鉴于机器学习本身理论性很强,加之sklearn库功能强大API众多,自然不是总结一份教程所能涵盖的。所以这一次,仅对其中的各子模块进行梳理和介绍,以期通过本文能对sklearn迅速建立宏观框架。
01 sklearn简介
sklearn,全称scikit-learn,是python中的机器学习库,建立在numpy、scipy、matplotlib等数据科学包的基础之上,涵盖了机器学习中的样例数据、数据预处理、模型验证、特征选择、分类、回归、聚类、降维等几乎所有环节,功能十分强大,目前sklearn版本是0.23。与深度学习库存在pytorch、TensorFlow等多种框架可选不同,sklearn是python中传统机器学习的首选库,不存在其他竞争者。
本文将分别围绕下图中各大子模块进行分别介绍,不会面面俱到、但求提纲挈领。
sklearn常用模块一览
02 样例数据集
sklearn为初学者提供了一些经典数据集,通过这些数据集可快速搭建机器学习任务、对比模型性能。数据集主要围绕分类和回归两类经典任务,对于不同需求,常用数据集简介如下:
- load_breast_cancer:乳腺癌数据集,特征为连续数值变量,标签为0或1的二分类任务
- load_iris:经典鸢尾花数据集,特征为连续数值变量,标签为0/1/2的三分类任务,且各类样本数量均衡,均为50个
- load_wine:红酒数据集,与鸢尾花数据集特点类似,也是用于连续特征的3分类任务,不同之处在于各类样本数量轻微不均衡
- load_digits:小型手写数字数据集(之所以称为小型,是因为还有大型的手写数字数据集mnist),包含0-9共10种标签,各类样本均衡,与前面3个数据集最大不同在于特征也是离散数值0—16之间,例如在进行多项式朴素贝叶斯模型、ID3树模型时,可用该数据集
- load_boston:波士顿房价数据集,连续特征拟合房价,适用于回归任务
值得指出,sklearn除了load系列经典数据集外,还支持自定义数据集make系列和下载数据集fetch系列(load系列为安装sklearn库时自带,而fetch则需额外下载),这为更多的学习任务场景提供了便利。
03 数据预处理
sklearn中的各模型均有规范的数据输入输出格式,一般以np.array和pd.dataframe为标准格式,所以一些字符串的离散标签是不能直接用于模型训练的;同时为了加快模型训练速度和保证训练精度,往往还需对数据进行预处理,例如在以距离作为度量进行训练时则必须考虑去量纲化的问题。为此,sklearn提供了一些常用的数据预处理功能,常用的包括:
- MinMaxScaler:归一化去量纲处理,适用于数据有明显的上下限,不会存在严重的异常值,例如考试得分0-100之间的数据可首选归一化处理
- StandardScaler:标准化去量纲处理,适用于可能存在极大或极小的异常值,此时用MinMaxScaler时,可能因单个异常点而将其他数值变换的过于集中,而用标准正态分布去量纲则可有效避免这一问题
- Binarizer:二值化处理,适用于将连续变量离散化
- OneHotEncoder:独热编码,一种经典的编码方式,适用于离散标签间不存在明确的大小相对关系时。例如对于民族特征进行编码时,若将其编码为0-55的数值,则对于以距离作为度量的模型则意味着民族之间存在"大小"和"远近"关系,而用独热编码则将每个民族转换为一个由1个"1"和55个"0"组成的向量。弊端就是当分类标签过多时,容易带来维度灾难,而特征又过于稀疏
- Ordinary:数值编码,适用于某些标签编码为数值后不影响模型理解和训练时。例如,当民族为待分类标签时,则可将其简单编码为0-55之间的数字
04 特征选择
机器学习中有句经典的台词是:数据和特征决定学习上限,模型和算法只是逼近这个上限,可见特征工程在机器学习中的重要性。一般而言,传统机器学习中的特征工程主要包括两方面需求:
- 特征维度过多时,为加快模型训练速度,进行特征选择即过滤掉不重要的特征;
- 特征较少或模型训练性能不好时,可通过对问题的理解尝试构建特征提升维度。
这里简单介绍几种特征选择的方式:
- from_model:顾名思义,从模型选择特征,这是因为很多模型在训练后都提供了特征的重要性结果feature_importance,据此可作为特征选择的依据
- VarianceThreshold:根据方差阈值做特征选择,实际上当某一特征的方差越大时意味着该特征越能带来更好的分类区分度,否则由于特征取值比较集中,很难对应不同的分类效果
- SelectKBest:指定K个特征选择结果,具体也需依赖选择的标准
05 模型选择
模型选择是机器学习中的重要环节,涉及到的操作包括数据集切分、参数调整和验证等。对应常用函数包括:
- train_test_split:常用操作之一,切分数据集和测试集,可设置切分比例
- cross_val_score:交叉验证,默认K=5折,相当于把数据集平均切分为5份,并逐一选择其中一份作为测试集、其余作为训练集进行训练及评分,最后返回K个评分
- GridSearchCV:调参常用方法,通过字典类型设置一组候选参数,并制定度量标准,最后返回评分最高的参数
06 度量指标
不同的度量指标可以学到不同的最优模型。对于不同类型任务,sklearn提供了多种度量指标,包括:
- 分类任务:准确率,所有样本中分类正确样本所占比例;精准率和召回率,一对相互矛盾的指标,适用于分类样本数量不均衡时,此时为了保证既定目标,可只选其中一个指标;调和平均数F1,相当于兼顾了精准率和召回率两项指标
- 回归任务:常用的包括MSE、MAE,但R2_score实质上是更为公允和直观的评价指标,其意义是R2_Score = MSE / VAR,即预测分类和实际分类的均方差与实际分类方差的比值
- 聚类任务:聚类任务属于无监督学习,所以根据是否有先验标签信息,聚类结果的度量指标包括轮廓系数(无需先验标签,用组内距离与组外最近距离的比值度量)、调整兰德指数(基于真实分簇标签和聚类标签计算)