【Python機器學習】102:如何使用Scikit-Learn預測器完成 ...

文章推薦指數: 80 %
投票人數:10人

上一篇簡單介紹機器學習後,這一篇要教大家使用Python強大的Scikit-Learn,它是一個單純而且有效率的資料探勘(data mining)和資料分析(data analysis) ... GetunlimitedaccessOpeninappHomeNotificationsListsStoriesWritePublishedin展開數據人生【Python機器學習】102:如何使用Scikit-Learn預測器完成數值預測UsingScikit-LearnpredictortocompletenumericalpredictionPhotobyJonathanRileyonUnsplash上一篇簡單介紹機器學習後,這一篇要教大家使用Python強大的Scikit-Learn,它是一個單純而且有效率的資料探勘(datamining)和資料分析(dataanalysis)的工具。

其中,Scikit-Learn在獲取資料:sklearn.datasets、掌握資料:sklearn.preprocessing和機器學習:sklearnEstimatorAPI三個面向提供支援。

獲取資料的方式有很多種(包含檔案、資料庫、網路爬蟲、KaggleDatasets等),其中最簡單的方式是從Sklearnimport內建的資料庫。

由於其特性隨手可得且不用下載,所以我們通常叫他玩具資料:keys‘‘filename’’先從datasets使用load_函數讀入一個像是dictionary的物件,像上圖中的load_boston就有5組key-value組合。

其中,‘filename’可以讓你去access這台電腦裡原始檔案的儲存位置,假如你想看一下它的原始檔案到底長什麼樣子,就可以把‘filename’秀出來。

掌握資料:Scikit-Learn表達資料的方式有分兩種:特徵矩陣(FeatureMatrix):m*n的ndarray目標向量(TargetVector):m*1或是(m,1)的ndarray這邊將用kaggle-GettingStarted競賽的兩組訓練資料(train.csv)來示範如何擷出特徵矩陣&目標向量:Titanic的目標向量為Survived,其餘變數為特徵矩陣HousePrices:AdvancedRegressionTechniques的目標向量為SalePrice,其餘變數為特徵矩陣把Titanic資料讀進來之後,我們先用pandas把它轉換成表格,並用head()瀏覽表格的內容。

題目告知Survived是目標向量後,我們要把這欄單獨切割出來,而表格中的其餘資料就是它的特徵矩陣。

由於目前的資料是pandas的DataFrame的型態,所以我可以直接擷取我要的欄位。

但是注意:我如果直接挑選欄位名稱,出來的資料型態會是Series。

所以我最後要再加.values把值單獨取出來,資料才會變成向量的型態,最後也別忘了要reshape成欄位為1的形式。

那剩下的資料就是我的特徵矩陣咯,所以我這邊使用drop()函數刪掉Survived欄位後一樣取values。

這邊要注意drop函數要記得給axis參數,因為它的預設參數是0,那他就會以row去看說有沒有一個row的index叫‘Survived’的,但我們這邊是要拿掉欄位,所以要記得給axis=1。

就這樣,簡單的特徵矩陣和目標向量就被我們手動切割出來啦。

根據監督式學習(SupervisedLearning)的定義:使用標籤資料(labelleddata)訓練模型,再對無標籤資料(unlabelleddata)預測所以我們可以使用train.csv做訓練,然後對test.csv做預測對吧?是,也不是。

為什麼答案是不一定呢?因為像是Kaggle的GettingStarted競賽允許一天上傳多次對答案。

但在生活中的專案可沒有那麼多次機會讓你嘗試,你只能訓練模型,最後一直到testing_data出來了才能去做預測,那時候才知道自己的模型做的好不好(例如:A/BTest的實驗設計)。

因此,我們因此通常會將train.csv再切分成為訓練資料與驗證資料兩個部分:訓練(training)是標籤資料(labelleddata)驗證(validation)是偽裝成無標籤資料(unlabelleddata)的標籤資料(labelleddata)picturefromhttps://datascience.stackexchange.com/questions/61467/clarification-on-train-test-and-val-and-how-to-use-implement-itScikit-Learn這裏就提供了一個非常好用的函式:我們可以使用sklearn.model_selection中的train_test_split函數。

雖然說是train-testsplit,但實際上是train-validationsplit。

我們使用Housing資料來示範:我們可以看到原本在切割前的資料它是有1460筆,但是在呼叫train_test_split函數後,這筆資料就被我切割成978&482筆。

我們再用head()看一下切割出來的資料可以發現不管是trainingdata還是validationdata都是隨機切割的。

我們簡單解釋一下train_test_split函數到底做了哪些事情:首先test_size=0.33是指我1/3的資料先偽裝成validationdata,剩下的2/3當成trainingdata。

剛才有提到train_test_split這個函數是隨機切割資料的,也就是說我每次跑出來的validationdata跟trainingdata都不一樣。

那設定random_state=42可以確保我每次跑出來的validationdata和trainingdata就都會一樣(效果很像numpy.random中的seed)。

完整的train_test_split函數可以輸入X與y,並且分別回傳4個分割資料:X_train、X_validation、y_train、y_validation我們這次就用用看最一開始提到的玩具資料來跑跑看:平時在切割資料時是不會設定random_state參數的,這邊只是存粹為了方便。

由於隨機排序的關係,訓練與驗證資料的分割會影響模型的評估指標。

把random_state參數拿掉跑跑看得到的模型評估指標都不一樣,有好有壞所以機器學習通常會用一個叫交叉驗證(Cross-Validation)的方式,讓所有資料都當一次驗證資料試試看。

photofromhttp://ethen8181.github.io/machine-learning/model_selection/model_selection.htmlExample:5-foldcrossvalidation,在k=5的設定下,我們將會把資料依據4:1的比例分割為訓練與驗證,就迭代5次且每一次都會算出一個MSE。

使用sklearn.model_selection中的KFold()函數:如上圖:kfold函數會產生把資料平均切割成5份的index,第一次的fold:validation的index:(0-291),剩下的4份就當training,下一次fold的validation就會從index(292)開始,以此類推。

使用Kfold()函數獲得index之後在split的時候就不需要再使用train_test_split了,直接用kfold給我們的index去切割就可以了。

但是由於KFold()函數得到的只是分隔的索引值依據,CV的MSE還是得自己算,這時候可以再進階使用sklearn.model_selection的cross_val_score()函數:在使用這個函數時要注意它的評估指標不是常見的mean_squared_error,而是negative_mean_squared_error,是負的!!。

更精密的交叉驗證函數:ShuffleSplit():在KFold()的基礎下加入隨機排序StratifiedKFold():在KFold()的基礎下加入考慮類別的分層(適用於分類問題)StratifiedShuffleSplit():在StratifiedKFold()的基礎下加入隨機排序改用ShuffleSplit(n_splits=5,test_size=0.2,random_state=0)各算一次mses與CV的mse改用cross_val_score()各算一次mses與CV的mse得到的結果相同接下來我們來簡介Scikit-Learn機器學習的EstimatorAPI,那什麼是Estimator呢?以大方向來講分成兩個小類別,一個叫Predictorex:LinearRegression,LogisticRegression;另一類型叫Transformer。

完整步驟:選擇一個Estimator:Predictor或Transformer初始化:預設或設定參數準備特徵矩陣與目標向量使用Estimator.fit()訓練使用Predictor.predict()預測/Transformer.transform()轉換選擇Estimator(使用範例:Predictor)初始化準備特徵矩陣與目標向量使用Predictor.fit()訓練使用Predictor.predict()預測其中,Transformer在幾次Scikit-Learn改版之後不需要像Predictor一樣要先呼叫fit,他可以直接呼叫fit_transform。

我們使用housing資料並將GrLvArea作為特徵矩陣、SalePrice作為目標向量給大家示範:範例中的Estimator我們選擇使用sklearn.linear_model中的LinearRegression這個Predictor。

初始化完成之後就可以將我們的X_train和y_trainfit到我們的Predictor。

fit完成之後我們就有了一些屬性可以檢查,像是看截距項&係數。

這邊要注意intercept和coef物件在呼叫的時候最後要加一個_。

最後,再使用訓練出來的linearregression針對X_validation做預測會得到y_pred,與原本的y_validation對比,就可以算誤差值(MSE)的大小,就可以得知此模型的好壞。

感謝你閱讀完這篇文章,如果你覺得這些文章對你有幫助請在底下幫我拍個手(長按最多可以拍50下手)。

上一章:【Python機器學習】101:機器學習簡介下一章:【Python機器學習】103:使用正規方程式解決線性&非線性回歸模型Morefrom展開數據人生這是一個帶你從零到一,認識資料科學&機器學習的專欄,對於想成為資料科學家的你,這裡是起步的好地方。

Readmorefrom展開數據人生AboutHelpTermsPrivacyGettheMediumappGetstarted張育晟EasonChang299Followers在不斷變動中努力思索自己的定位,想做的事情很多,但最希望的是不要變成無趣的人。

Linkedin:https://www.linkedin.com/in/stareason1997FollowMorefromMediumBrandonLopezBehindEnemyLines:AGreatMigrationinTimesofWarNatanVidraSettingUpPySyftCryptospyteamWhatIsaRugpull,Exactly?HowtoStayAwayFromThemThepostman24FourwaysyoucandesignsocialmediapoststocombathealthmisinformationHelpStatusWritersBlogCareersPrivacyTermsAboutKnowable



請為這篇文章評分?