今天解決最後一道題👉:把數據集隨機劃分爲訓練集和測試集,按8:2的比例。(本來應該週六就更新的,因爲臨時接了朋友一個自動下單程序的需求就耽擱了😂)
一般情況都會用傳統定比隨機劃分(掌櫃自己取得名字。。。也有人叫留出法?)法,即使用sklearn庫裏面的model_selection模塊的train_test_split方法。這裏掌櫃就直接拿官方的鳶尾花數據集示例來演示一下:
這👆也正是此題的考點。到這裏就把之前面試的Python數據分析題全部解答完畢😁。
------------------------------------我是一條無感情的分割線-------------------------------------------
下面掌櫃開始拓展一下 。上面的隨機劃分法若後面進行機器學習模型調參的話,就會存在一定的缺點,即測試集上面仍有 過擬合 情況的發生。 於是掌櫃去看官方文檔後發現,爲了解決這種風險的發生,引入了驗證集的方法,即先把訓練後的模型放在驗證集上面進行評估,若評估實驗是成功的,再放入測試集上面進行最後的模型評估。
但是這個方法還是有弊端,因爲它減小了模型訓練集的樣本量,這就會導致最後的結果是依賴子集(驗證集、測試集)的隨機選擇。
所以爲了解決這個問題,下面就引出第二種劃分數據集的方法-- 交叉驗證法👈。那麼問題來了,什麼是交叉驗證? 通俗的講就是一種驗證分類模型準確率的方法。作用是爲了解決數據集不多的情況下的過擬合問題。
在交叉驗證法中最基本的就是K折交叉驗證法(即 k-fold CV),這裏簡單說一下K折交叉驗證法的過程:
- 首先把訓練集分爲K個等份;
- 接着對每一份子集進行再劃分,其中把K-1份當作此份子集的訓練集;
- 而剩餘的那份數據則被拿來驗證前面訓練子集的結果(比如模型的準確率);
- 然後經過上面的K次循環,再把得到的K份數據結果求平均。
- 最後得到的這個均值就可以作爲該數據集的性能指標;
後面就是通過該指標和 Grid Search 方法來找到最優參數,再放到測試集上做最後的模型預測和性能評估。
可以看下面這兩圖更易理解上面的整個過程:
(上圖👆是K折交叉驗證圖發生的過程)
(此圖則是模型訓練中的交叉驗證流程圖👆)
K折交叉驗證法的優點:
- 當樣本數據集數量較少(如處理逆向推斷問題時)是一個極大的優勢,因爲數據不會被浪費很多(正如它固定了任意驗證集);
- 在一定程度上減少了過擬合。
缺點:
此方法計算成本很大,即費時!所以數據量很大的時候並不會常用此方法。
那麼K折交叉驗證法適用場景也在👆的優點裏面,通常K值選的是10。
最後來看如何使用交叉驗證,最簡單的方法就是調用 cross_val_score 輔助函數。可以看官方這個示例,這裏用的K值是5:
from sklearn.model_selection import cross_val_score
clf = svm.SVC(kernel='linear', C=1)
scores = cross_val_score(clf, X, y, cv=5)
scores
>>> array([0.96..., 1. ..., 0.96..., 0.96..., 1. ])
參考資料:sklearn官方文檔