5个需要掌握的sklearn技能

虽然scikit-learn在机器学习领域很重要,但是很多人并不知道利用这个库中的一些强大的功能。本文将介绍scikit-learn中5个最有用的5个隐藏的瑰宝,充分利用这些秘密武器将有效提高你的机器学习处理的效率!

1、数据集生成器

Scikit-learn有很多数据集生成器,可以用来生成各种复杂度和维度的人工数据集。

例如,make_blobs函数可以创建包含很多数据样本、聚类中心、维度的“blobs”或数据聚类。可视化以后可以清晰看出样本的分布:

在这里插入图片描述

Scikit-learn其实提供了很多数据集创建函数:

在这里插入图片描述

  • make_moons(n_samples=100, noise=0.1)
  • make_circles(n_samples=100, noise=0.05)
  • make_regression(n_samples=100, n_features=1, noise=15)
  • make_classification(n_samples=100)

2、流水线/Pipeline

流水线可以将不同的方法组合为单一模型,在自然语言处理(NLP)应用中这一点非常重要。可以通过组合多个模型的方式来创建流水线,数据将依次流过聚合模型中的各环节。流水线有标准的拟合与预测能力,这使得训练过程得到很好的组织。

很多对象都可以整合进流水线:

  • 缺失值处理器/Imputers:如果你的数据中包含缺失的数据,可以试试Simple Imputer或KNN Imputer
  • 编码器/Encoders:如果你的数据不是二进制分类,你可能需要使用一个Label Encoder或者One-Hot Encoder
  • NLP矢量化处理器/NLP Vectorizers:如果你在处理NLP数据,那么可以使用Count Vectorizer、TD-IDF Vectorize或者Hash Vectorizer
  • 数值变换:可以尝试标准化处理器、min-max缩放等等

3、网格搜索/GridSearchCV

在机器学习中的一个常见任务就是找出模型的正确参数集。通常你可以基于对任务的理解猜测参数的取值,或者编程找出最优集合。sklearn内置了函数GridSearchCV可以自动找出最优参数集。

GridSearchCV对象需要两个参数:首先是要训练的模型对象,例如下面示例中的SVM分类器,第二个则是一个描述参数模型的字典,字典的每一个键对应模型的一个参数,键值则是可能取值的列表。

1from sklearn import svm, datasets 2from sklearn.model_selection import GridSearchCV 3 4iris = datasets.load_iris() 5parameters = {'kernel':('linear', 'rbf'), 'C':[1, 10]} 6svc = svm.SVC() 7 8clf = GridSearchCV(svc, parameters) 9clf.fit(iris.data, iris.target) 10clf.best_params_ #[Output]: {'C': 1, 'kernel': 'linear'}

网格搜索完成后,best_params属性中就记录了表现最好的模型参数。

4、验证曲线/validation_curve

要可视化一个参数对模型性能的影响,可以使用sklearn的validation_curve。这个函数需要一些参数 —— 模型、要调整的参数、参数的取值范围、运行的次数等。validation_curve类似于单变量的网格搜索,可以帮助你更好的可视化单个参数变化的效果。

1from sklearn.model_selection import validation_curve 2train_scores, valid_scores = validation_curve(model, 3 X, y, 4 "max_depth", #model parameter to be adjusted 5 range(2,7), #values of the parameter 6 cv=10) #number of folds for k-fold evaluation 7 8train_scores value: #Rows: number of parameter values (4), Columns: each of the values for the folds (10) 9array([[0.96296296, 0.95555556, 0.96296296, 0.97037037, 0.95555556, 10 0.95555556, 0.95555556, 0.96296296, 0.97037037, 0.96296296], 11 [0.97037037, 0.97037037, 0.97777778, 0.98518519, 0.97037037, 12 0.97037037, 0.97037037, 0.97037037, 0.97777778, 0.97777778], 13 [0.99259259, 0.99259259, 0.99259259, 1. , 0.99259259, 14 0.99259259, 0.99259259, 1. , 0.99259259, 0.99259259], 15 [1. , 1. , 1. , 1. , 1. , 16 1. , 1. , 1. , 0.99259259, 1. ], 17 [1. , 1. , 1. , 1. , 1. , 18 1. , 1. , 1. , 1. , 1. ]])

validation_curve输出的结构是一个元组 —— 一个表示训练得分,另一个表示测试得分。数组中的每个元素表示k次运行中的一个参数值。

当绘制结果后,参数和精确度之间的关系就很清晰了:

1import matplotlib.pyplot as plt 2import seaborn as sns 3 4sns.set_palette('RdYlGn') 5sns.set_style('whitegrid') 6 7params = range(2,10) 8for index,param in enumerate(train_scores): 9 sns.lineplot(range(10),param,label=params[index]) 10 11plt.title("Tree Depth Impact on Training Accuracy") 12plt.xlabel("CV-Fold") 13plt.ylabel("Training Accuracy") 14plt.show()

在这里插入图片描述

这让我们可以可视化树的深度对准确度的影响。从上图中可以看到树深度为5或6时,模型的性能相当好,但是再继续增加深度就会导致过拟合。

K折交叉验证

交叉验证是一种准确度高于train_test_split的方法,并且通常需要更少的代码。在传统的训练/测试集拆分中,数据样本被随机的分配到训练集和测试集,通常比例为7:3~8:2,在训练集上训练模型,然后在测试集上评估模型,以确保模型真正泛化而非单纯的记忆。

然而由于每次分割是随机的,分割10次将产生10个不同的测试结果。

为了解决这个问题,K折交叉验证将数据拆分为K类,在其中K-1个子集上训练模型,在剩下的1个子集上测试模型。重复这一过程直至测试子集最终覆盖完整的数据集,那么就得到了完整并且可信的准确度指标。这种方法更好的一点是,不需要跟踪x-train、x-test、y-train和y-test变量。交叉验证唯一的缺点是需要更多时间 —— 不过要得到更好的结果总是要多付出一点成本。


原文链接:scikit-learn中的5个隐藏的瑰宝 — 汇智网

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

swap空间的增减方法

(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap

皕杰报表(关于日期时间时分秒显示不出来)

在使用皕杰报表设计器时,数据据里面是日期型,但当你web预览时候,发现有日期时间类型的数据时分秒显示不出来,只有年月日能显示出来,时分秒显示为0:00:00。1.可以使用tochar解决,数据集用selecttochar(flowdate,"yyyyMMddHH:mm:ss")fromtablename2.也可以把数据库日期类型date改成timestamp