机器学习- Sklearn (交叉验证和Pipeline)
前面一节咱们已经介绍了决策树的原理已经在sklearn中的应用。那么这里还有两个数据处理和sklearn应用中的小知识点咱们还没有讲,但是在实践中却会经常要用到的,那就是交叉验证cross_validation和Pipeline。cross_validation是保证了咱们的模型不受数据分布的影响,因为有些数据可能因为数据的分布很不平均,导致咱们训练的模型虽然在咱们的数据集里面的表现很好,但是在实际中却可能是不一样的情况,cross validation的作用是model checking,而不是model building,无论用哪种方式validation,只是验证根据这些数据训练训练出来的模型能不能用而已,可不可以用这些数据来训练模型而已。而pipeline主要是为了能将模型的训练更加格式化而已,也能规范代码的格式,以后所有的的模型从定义到验证的过程都格式化了。接下来咱们细细的来看看他们具体是个什么玩意儿。
- Cross_validation
在解释交叉验证之前,我先上一个图,如下所示
看上面的图,咱们会将咱们的整个dataset分割五次,分别依次将其中的20%的部分作为validation dataset,80%的部分作为training dataset。咱们可以看出咱们会分别训练五个模型,然后分别将各自的validation dataset拿去验证,计算他们的score,然后将这5个score返回装进list中,如果这些list中的元素都差不多的,并且大小都在合理范围之内的话,那么说明这个dataset是整个数据的分布是合理的,并且 可以用这些数据来训练的咱们的模型。记住前面的2个条件缺一不可,如果score的大小都差不多,但是score的数值都很大的话,则说明虽然这个dataset的分布合理,但是这些features并不适合咱们模型,那么咱们就得重新调整模型或者重新feature engineering。如果score的值都不大,在合理范围之内,但是score之间的差值很大,那么就说明咱们这个dataset的数据分布很不合理,训练的模型可能并不具备广发应用的条件,这种情况下咱们得重新permutate咱们的dataset。最后,如果通过cross_validation之后满足了所有的条件,那么咱们最后的最后会用整个dataset来训练咱们的最终模型。所以cross_validation的最终目的还是用来验证咱们的数据和模型的,并不是用来训练模型的。这一点对于刚刚接触交叉验证的同学经常容易混淆。上面像大家展示了什么是cross_validation,那么具体在sklearn中如何应用它呢?麻烦大家直接看下面的代码,一句话解决
from sklearn.model_selection import cross_val_score
scores = cross_val_score(estimator=my_pipeline, X=X, y=y, cv=5,scoring = "neg_mean_absolute_error")
这里我来简单解释一下里面的参数,首先它也是来自于sklearn.model_selection这个模块的,estimator代表的是咱们定义的模型(未训练过的),X,y分别代表着training dataset和labels, cv代表的是咱们将这个dataset分成几个部分,最后的scoring是咱们选择哪种计算方式。最后他会返回5个score,并且在scores这个list里面。上面的部分就是cross_validation的解释和具体应用过程。
- Pipeline
咱们前面花了很多的时间讲了feature engineering, 模型训练等等知识,咱们可以看见data preprocess的过程还是很复杂的,例如有missing value handling, categorical data encoding等等这些步骤,然而,每个项目中的数据都是不一样的,这就让咱们的数据进行preprocess的时候会非常复杂,没换一个dataset,咱们就得重新来一遍,非常不方便,这时候聪明的人类就想到了,能不能通过定义一部分参数,来实现把这些繁杂的过程格式化呢???这时候pipeline就出来了。咱们现在先把代码贴出来,然后在一条一条的解释一下pipeline的步骤
#Step1: data preparation
import pandas as pd
from sklearn.model_selection import train_test_split
melb_house_price = pd.read_csv("C:\\Users\\tangx\\OneDrive\\Desktop\\DATA\\melb_data.csv")
X = melb_house_price.drop(["Price"],axis = 1)
y = melb_house_price.Price
X_train_full, X_val_full,y_train,y_val = train_test_split(X,y,train_size=0.8,test_size=0.2,random_state=1) numerical_cols = [col for col in X_train_full.columns if X_train_full[col].dtype in ['int64','float64']]
categorical_cols = [col for col in X_train_full.columns if X_train_full[col].dtype == 'object' and X_train_full[col].nunique()<10]
my_cols = numerical_cols+categorical_cols X_train = X_train_full[my_cols].copy()
X_val = X_val_full[my_cols].copy() #Step2: define preprocess steps
from sklearn.impute import SimpleImputer
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import ColumnTransformer
from sklearn.metrics import mean_absolute_error
#2.1 define transformer of numerical data
numerical_transformer = SimpleImputer(strategy="mean") #missing value handling
#2.2 define transformer of categorical data #(Firstly handle the missing value and then secondly encoding the )
categorical_transformer = Pipeline(steps=[
("Imputer",SimpleImputer(strategy="most_frequent")),
("Onehot",OneHotEncoder(handle_unknown='ignore'))]
)
#2.3 data preprocessor
preprocessor = ColumnTransformer(
transformers = [
("num", numerical_transformer, numerical_cols),
("cat",categorical_transformer,categorical_cols)]
)
#step2.4: model selection and definition
from sklearn.ensemble import RandomForestRegressor
model = RandomForestRegressor(n_estimators = 100, random_state = 0)
#step2.5: bundle preprocessor and model
my_pipeline = Pipeline(
steps = [
('preprocessor', preprocessor),
('model',model)]
) #step3: fitting the model
my_pipeline.fit(X_train,y_train) #step4: predicts
predictions = my_pipeline.predict(X_val) #step5: evaluate the modle
print(mean_absolute_error(y_val,predictions))
根据上面的代码,咱们以后所有的代码几乎都可以用上面的框架,第一步肯定就是将training dataset和validation dataset分离出来;第二步就是咱们pipeline,这里也是咱们的重点,首先就是先定义咱们的transform,这里就是声明如何来处理missing value和categorical data,接下来就是声明这些transforms分别用于那些features,并且返回preprocessor;然后定义模型;最后实例化一个pipeline对象,并且将前面定义的模型和preprocessor传递给这个pipeline。接下来的步骤就是fitting,predict,evaluate啦和其他的都一样。所以咱们在这里的重点其实就是第二步,故而以后所有tabular data都可以用上面的结构来进行数据的处理,非常方便简单,不必一个个的单独处理了,只需要定义transforms和preprocessor就可以了。
- 总结
上面已经展示的交叉验证cross_validation和pipeline的两个知识点的一些基本原理和应用。在这里cross_validation的形式和原理是重点,已经cross_validation的作用和原因要理解,至于应用方面就很简单了,重点关注一下里面的一些参数设置就行了。pipeline能够大大的减少咱们数据处理方面的工作量,相当于把数据的preprocessor打包了,并且结构化,具有很高的复用性,这里重点需要了解pipeline的应用的流程以及为什么是这个流程,然后是每个流程的作用。上面就是这一节补充的2个sklearn应用中的小知识点。
机器学习- Sklearn (交叉验证和Pipeline)的更多相关文章
- sklearn交叉验证-【老鱼学sklearn】
交叉验证(Cross validation),有时亦称循环估计, 是一种统计学上将数据样本切割成较小子集的实用方法.于是可以先在一个子集上做分析, 而其它子集则用来做后续对此分析的确认及验证. 一开始 ...
- UDA机器学习基础—交叉验证
交叉验证的目的是为了有在训练集中有更多的数据点,以获得最佳的学习效果,同时也希望有跟多的测试集数据来获得最佳验证.交叉验证的要点是将训练数据平分到k个容器中,在k折交叉验证中,将运行k次单独的试验,每 ...
- 机器学习入门-交叉验证选择参数(数据切分)train_test_split(under_x, under_y, test_size, random_state), (交叉验证的数据切分)KFold, recall_score(召回率)
1. train_test_split(under_x, under_y, test_size=0.3, random_state=0) # under_x, under_y 表示输入数据, tes ...
- sklearn交叉验证2-【老鱼学sklearn】
过拟合 过拟合相当于一个人只会读书,却不知如何利用知识进行变通. 相当于他把考试题目背得滚瓜烂熟,但一旦环境稍微有些变化,就死得很惨. 从图形上看,类似下图的最右图: 从数学公式上来看,这个曲线应该是 ...
- sklearn交叉验证3-【老鱼学sklearn】
在上一个博文中,我们用learning_curve函数来确定应该拥有多少的训练集能够达到效果,就像一个人进行学习时需要做多少题目就能拥有较好的考试成绩了. 本次我们来看下如何调整学习中的参数,类似一个 ...
- sklearn,交叉验证中的分层抽样
StratifiedKFold用法类似Kfold,但是他是分层采样,确保训练集,测试集中各类别样本的比例与原始数据集中相同. 例子: import numpy as np from sklearn.m ...
- Spark2.0机器学习系列之2:基于Pipeline、交叉验证、ParamMap的模型选择和超参数调优
Spark中的CrossValidation Spark中采用是k折交叉验证 (k-fold cross validation).举个例子,例如10折交叉验证(10-fold cross valida ...
- 机器学习——交叉验证,GridSearchCV,岭回归
0.交叉验证 交叉验证的基本思想是把在某种意义下将原始数据(dataset)进行分组,一部分做为训练集(train set),另一部分做为验证集(validation set or test set) ...
- sklearn中的交叉验证(Cross-Validation)
这个repo 用来记录一些python技巧.书籍.学习链接等,欢迎stargithub地址sklearn是利用python进行机器学习中一个非常全面和好用的第三方库,用过的都说好.今天主要记录一下sk ...
随机推荐
- 51nod 1287加农炮
1287 加农炮 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 一个长度为M的正整数数组A,表示从左向右的地形高度.测试一种加农炮 ...
- 【NOIP模拟赛】【数学】完全平方数
问题描述 一个数如果是另一个整数的完全平方,那么我们就称这个数为完全平方数(Pefect Sqaure),也称平方数. 小A认为所有的平方数都是很perfect的~ 于是他给了小B一个任务:用任意个不 ...
- HDU6579 2019HDU多校训练赛第一场1002 (线性基)
HDU6579 2019HDU多校训练赛第一场1002 (线性基) 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6579 题意: 两种操作 1.在序列末 ...
- C++重载、覆盖与隐藏——转载
http://www.cnblogs.com/qlee/archive/2011/07/04/2097055.html 成员函数的重载.覆盖与隐藏成员函数的重载.覆盖(override)与隐藏很容易混 ...
- HBase的TTL介绍
1. 定义 TTL(Time to Live) 用于限定数据的超时时间. 2.原理 以Column Family的TTL为例介绍, hbase(main):001:0> desc 'wxy:te ...
- 模型正则化,dropout
正则化 在模型中加入正则项,防止训练过拟合,使测试集效果提升 Dropout 每次在网络中正向传播时,在每一层随机将一些神经元置零(相当于激活函数置零),一般在全连接层使用,在卷积层一般随机将整个通道 ...
- DEVOPS技术实践_06:sonar与Jenksin集成
代码质量管理平台 一.checkout和打包功能 1.1 gitlab在新建一个文件 后续在写入内容 1.2 Jenkins新建一个任务 两个参数 1.3 流水线配置 copy仓库地址: http:/ ...
- [LINQ2Dapper]最完整Dapper To Linq框架(八)---导航属性
目录 [LINQ2Dapper]最完整Dapper To Linq框架(一)---基础查询 [LINQ2Dapper]最完整Dapper To Linq框架(二)---动态化查询 [LINQ2Dapp ...
- 06_URL参数截取
1:如何获取URL传给子页面的参数: //获得参数(只对字母数字等有效,参数值为中文则不能传) function getQueryString(name) { var reg = new RegExp ...
- K8s生产架构
部分图片显示问题,特附上有道云笔记中的链接:http://note.youdao.com/noteshare?id=df78492d2c25383975c67f3eadf0bbd9&sub=4 ...