前面一节我们已经介绍了决策树的原理已经在sklearn中的应用。那么这里还有两个数据处理和sklearn应用中的小知识点我们尚未讲,可是在实践中却会常常要用到的,那就是交叉验证cross_validation和Pipeline。cross_validation是保证了我们的模型不受数据分布的影响,由于有些数据可能由于数据的分布很不平均,致使我们训练的模型虽然在我们的数据集里面的表现很好,可是在实际中却多是不同的状况,cross validation的做用是model checking,而不是model building,不管用哪一种方式validation,只是验证根据这些数据训练训练出来的模型能不能用而已,可不能够用这些数据来训练模型而已。而pipeline主要是为了能将模型的训练更加格式化而已,也能规范代码的格式,之后全部的的模型从定义到验证的过程都格式化了。接下来我们细细的来看看他们具体是个什么玩意儿。框架
在解释交叉验证以前,我先上一个图,以下所示dom
看上面的图,我们会将我们的整个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中如何应用它呢?麻烦你们直接看下面的代码,一句话解决ui
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的解释和具体应用过程。lua
我们前面花了不少的时间讲了feature engineering, 模型训练等等知识,我们能够看见data preprocess的过程仍是很复杂的,例若有missing value handling, categorical data encoding等等这些步骤,然而,每一个项目中的数据都是不同的,这就让我们的数据进行preprocess的时候会很是复杂,没换一个dataset,我们就得从新来一遍,很是不方便,这时候聪明的人类就想到了,能不能经过定义一部分参数,来实现把这些繁杂的过程格式化呢???这时候pipeline就出来了。我们如今先把代码贴出来,而后在一条一条的解释一下pipeline的步骤spa
#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就能够了。rest
上面已经展现的交叉验证cross_validation和pipeline的两个知识点的一些基本原理和应用。在这里cross_validation的形式和原理是重点,已经cross_validation的做用和缘由要理解,至于应用方面就很简单了,重点关注一下里面的一些参数设置就好了。pipeline可以大大的减小我们数据处理方面的工做量,至关于把数据的preprocessor打包了,而且结构化,具备很高的复用性,这里重点须要了解pipeline的应用的流程以及为何是这个流程,而后是每一个流程的做用。上面就是这一节补充的2个sklearn应用中的小知识点。code