前面一節我們已經介紹了決策樹的原理已經在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