Part 2 sklearn工具包简介:
前面介绍了一大堆的思路,要展开这一系列的流程,还要从sklearn包的使用开始,现对此作一些介绍。先分如下几个方面介绍:
2-0.学习文档
2-1.转换器,估计器及流水线
2-2.数据预处理
2-3.特征抽取、选择
2-4.模型调用
2-5.模型评估
2-6.交叉验证/参数优化
2-0 学习文档
工具包学习的最好教材就是其文档,请看这里。
这可是英文的哟,但是现在没必要啃英文文档啦~此处,隆重推荐一个网站:
scikit-learn 0.19.0 中文文档(http://sklearn.apachecn.org/cn/0.19.0/documentation.html).
这是一大堆人辛辛苦苦将其英文文档翻译出来的,鄙人也做了一点微小的工作。文档可以看这几部分:
快速入门及教程,快速入门简要介绍调用模型解决一个简单的问题,教程中介绍了更多具体的例子;
用户指南,是对sklearn包的较为详细的描述,当你想去调用工具包而不知道有没有这样的包,不会用,不知道怎么用时,可以参考这一部分,当然这一官方文档并不详细,对许多算法的具体参数设置等没有介绍,还需在其他学习材料中积累经验。
比如第一个算法, 广义线性模型:
sklearn包内容可谓十分丰富,基本可以满足我们对算法调用的需求,初学者可以通过文档学习,相信会有不错,文档并不全面,只有逐渐使用后才会对常用算法大致了解。
最后,API和流程图也是十分不错的资源,对新手很友好,老司机也需要查询API啊~
2-1. 介绍一些概念,转换器和估计器,为什么这么介绍呢,因为我们调包的函数主要分为这两类,他们方法相差无几,故统一介绍。
转换器(transformer)用于数据预处理和数据转换,均实现这几个方法:
- fit():训练算法,设置内部参数。
- transform():数据转换。
- fit_transform():合并fit和transform两个方法。
- inverse_transform():转换方法的逆操作
转换器属性一般各不相同,且不太重要,亲自使用时慢慢了解即可。
估计器(estimator),也就是我们所说的模型,实现这三个方法:
- fit():训练算法,设置内部参数。接收训练集和类别两个参数。
- predict():预测测试集类别,参数为测试集。
- score():模型分数,但是一般我们用2-5介绍的函数来评分。
估计器属性也各不相同,他们的属性名称末尾带有‘_’,调用时末尾没有括号和参数,比如线性模型会有coef_、intercept_ 可以看模型的参数(而不是超参数);SVM有support_vectors_、support_ 、n_support_ 获取支持向量的信息;随机森林有feature_importances_与特征筛选相关。各个估计器的内容还是要亲自使用亲自了解。
sklearn.pipeline ,将整个工作流程各个步骤封装,便于检查,也节省代码复杂程度。
使用方法:输入为一连串的步骤,其中最后一步必须是估计器,其他是转换器。输入的数据集经过转换器的处理后,输出的结果作为下一步的输入。最后,用位于流水线最后一步的估计器对数据进行分类。
看起来不错的流水线,其实我比赛是没用到,因为整个流水线并不大,两三步,分开几个模块进行,便于调整许多细节,所以貌似鸡肋一些。
2-2. 数据预处理
sklearn.preprocessing 包括两个部分:
标准化处理,共三个种类的工具:MinMaxScaler()/Normalizer()/StandardScaler()
编码工具,四种:LabelEncoder()/OneHotEncoder()/Binarizer()/MultiLabelBinarizer()
在此不一一介绍。
2-3. 特征抽取、选择
属于特征工程范畴的内容,十分复杂,此次比赛所用不多,还需多积累经验,简略罗列如下,特征工程一部分也不会过多介绍他们的使用,还需另有机会再学习。
sklearn.feature_extractuion,包括DictVectorizer/FeatureHasher等等(如下);
sklearn.feature_selection包括VarianceThreshold()/SelectKBest()/SelectPercentile()/chi2()等等;
降维decomposition也是一种特征提取的工具。
2-4. 模型调用
模型使用方法参考前面2-0的文档包括教程、指南等,以及对2-1估计器的介绍,大多数估计器的属性和方法相差无几,原理相似的算法他们的参数也相差无几,比如Lasso回归和Ridge回归很相似,随机森林、GBDT这些基于树的模型,其参数都是在决策树的基础上加入集成相关参数,应用起来也会相似。
模型的调用关注的重点一是选择合适的模型(根据问题、数据和特征),二是理解算法原理(并根据数据和特征)进行调参,而不是算法的具体实现。这一部分的内容显得十分泛泛,更多的是经验。
2-5. 模型评估
sklearn.metrics ,既然算法的实现不必关注,我们更关注的就是当前特征、当前参数下模型的性能表现,并据此调整特征、参数,模型分数的衡量可谓牵一发而动全身,需要格外关注。模型评估包含评分方法、性能度量、成对度量和距离计算,分四种:
分类结果度量
参数大多是y_true和y_pred。
- accuracy_score:分类准确度
- condusion_matrix :分类混淆矩阵
- classification_report:分类报告
- precision_recall_fscore_support:计算精确度、召回率、f、支持率
- jaccard_similarity_score:计算jcaard相似度
- hamming_loss:计算汉明损失
- zero_one_loss:0-1损失
- hinge_loss:计算hinge损失
- log_loss:计算log损失
其中,F1是以每个类别为基础进行定义的,包括两个概念:准确率(precision)和召回率(recall)。准确率是指预测结果属于某一类的个体,实际属于该类的比例。召回率是被正确预测为某类的个体,与数据集中该类个体总数的比例。F1是准确率和召回率的调和平均数。
回归结果度量
- explained_varicance_score:可解释方差的回归评分函数
- mean_absolute_error:平均绝对误差
- mean_squared_error:平均平方误差
多标签的度量
- coverage_error:涵盖误差
- label_ranking_average_precision_score:计算基于排名的平均误差Label ranking average precision (LRAP)
聚类的度量
- adjusted_mutual_info_score:调整的互信息评分
- silhouette_score:所有样本的轮廓系数的平均值
- silhouette_sample:所有样本的轮廓系数
2-6. 交叉验证/参数优化
有了模型性能的评估方法,一方面需要用到的是特征工程,另一方面就是模型超参数的优化。交叉验证的多种方式是衡量当前模型性能的必备策略,无论是2-5评分,还是2-6的调参都要用到CV验证。而验证曲线和学习曲线也都是必备工具,衡量模型参数的最优点及当前模型泛化性能等,
0.19.0版本已将sklearn.cross_validation的这些功能移到了sklearn.model_selection。
train_test_split 是最简单最常用的;
计算交叉验证的指标 cross_val_score/cross_val_predict/cross_validate
交叉验证迭代器 KFold/LeaveOneOut/LeavePOut/LeaveOneLabelOut/LeavePLabelOut
绘制验证曲线 validation_curve(estimator,X,y,param_name,param_range,cv,scoring,verbose,n_jobs,pre_dispatch),
其返回值为(train_scores,test_scores)的二维数组
绘制学习曲线 learning_curve(estimator,X,y,train_sizes,cv,scoring,exploit_incremental_learning,
verbose,n_jobs,pre_dispatch),其返回值为(train_size_abs,train_scores,test_scores)
在交叉验证中,还会遇到基于类别/标签的分层划分数据集并交叉验证的,以及对时间序列的交叉验证,sklearn都可实现。
-----------------------------------------------------------------------------------------------------------------
参数优化的网格搜索,sklearn.model_selection中介绍如下两个方法,通过对指定的参数名称在指定范围内搜索最优参数组合,得到最优的估计器,cv参数十分有用,指定cv,函数可以进行交叉验证寻到最优参数,这一工具其实就是多重循环的集合:
GridSearchCV(estimator,param_grid,scoring,fit_params,iid,cv,refit,verbose,n_jobs,pre_dispatch,error_score)
其属性有best_estimator/best_score_/best_params_等
RandomizedSearchCV(estimator,param_distributions,n_iter,scoring,fit_params,n_jobs,iid,refit,...)
我们可以调整的参数包括正则化系数alpha,C等连续值,也可以是kernel,solver等离散的字符串,初学还是要参考包括文档在内的一些资料,调参时指定目标度量,并允许为评分参数指定多个指标。
另外sklearn中还有暴力搜索的替代方案,文档3.2.4全部列出了,如
linear_model.LassoCV([eps, n_alphas, …]) Lasso linear model with iterative fitting along a regularization path,Lasso回归的CV验证版本,直接调用该函数即可实现;
ensemble.RandomForestClassifier([…]),随机森林等集成方法本身就具有防止过拟合,模型选择的效果。
个人认为2-6中的方法十分有用,我们作为调包君和调参侠,需要用好交叉验证和调参的相关函数方法。这里给出了几个函数的参数列表,但是函数的原型(也就是默认参数)也有必要记住,总之这部分多使用多查学习文档和相关资料。
学习的时候参考了许多这位大佬的总结,很不错:
作者:Cer_ml
链接:https://www.jianshu.com/p/516f009c0875
來源:简书
---------------------------分割线-----------------------------------
简要总结:
1、sklearn包功能强大,新手在掌握算法基本概念后到这一步仍然会懵,各种工具实用性强,多多实践,多参考文档;
2、系统学习一下文档,通过简单数据集实践一下,了解大致全貌,功能相似的转换器和模型,可以举一反三。
3、文档也不是万能的,确实并不详细,对某一函数使用深入后,还需寻找更多资料、深入学习(鄙人也在对一些函数深入学习中,并不容易)。
4、sklearn包也不是万能的啊,多认识一些其他工具也很必要~遇到有用的、经验性很强的博客多多学习。新手入门多积累经验吧~