使用 scikit-learn 的 train_test_split() 拆分數據集(使用驅動器u盤之前需要格式化)
目錄
數據拆分的重要性
訓練、驗證和測試集
欠擬合和過擬合
使用 train_test_split() 的先決條件
train_test_split() 的應用
使用 train_test_split() 監督機器學習
線性回歸的極簡示例
回歸示例
分類示例
其他驗證功能
結論
監督機器學習的關鍵方面之一是模型評估和驗證。當您評估模型的預測性能時,過程必須保持公正。使用train_test_split()數據科學庫scikit-learn,您可以將數據集拆分為子集,從而最大限度地減少評估和驗證過程中出現偏差的可能性。
在本教程中,您將學習:
為什么需要在監督機器學習中拆分數據集
其子集,你需要的數據集,為您的模型的公正的評價
如何使用train_test_split()拆分數據
如何train_test_split()與預測方法結合
此外,您將從 獲得有關相關工具的信息sklearn.model_selection。
數據拆分的重要性
有監督的機器學習是關于創建將給定輸入(自變量或預測變量)精確映射到給定輸出(因變量或響應)的模型。
您如何衡量模型的精度取決于您要解決的問題的類型。在回歸分析中,您通常使用決定系數、均方根誤差、平均絕對誤差或類似的量。對于分類問題,您通常會應用準確度、精確度、召回率、F1 分數和相關指標。
測量精度的可接受數值因字段而異。您可以在Statistics By Jim、Quora和許多其他資源中找到詳細說明。
要了解的最重要的一點是,您通常需要無偏見的評估才能正確使用這些度量、評估模型的預測性能并驗證模型。
這意味著您無法使用用于訓練的相同數據評估模型的預測性能。您需要使用模型之前未見過的新數據來評估模型。您可以通過在使用之前拆分數據集來實現這一點。
訓練、驗證和測試集
拆分數據集對于無偏見地評估預測性能至關重要。在大多數情況下,將數據集隨機分成三個子集就足夠了:
訓練集用于訓練或擬合您的模型。例如,您使用訓練集來查找線性回歸、邏輯回歸或神經網絡的最佳權重或系數。
驗證集用于在超參數調整期間進行無偏模型評估。例如,當您想找到神經網絡中的最佳神經元數量或支持向量機的最佳內核時,您可以嘗試不同的值。對于每個考慮的超參數設置,您將模型與訓練集進行擬合,并使用驗證集評估其性能。
需要測試集來對最終模型進行無偏見的評估。您不應將其用于擬合或驗證。
在不太復雜的情況下,當您不必調整超參數時,可以只使用訓練集和測試集。
欠擬合和過擬合
拆分數據集對于檢測您的模型是否存在兩個非常常見的問題之一(稱為欠擬合和過擬合)可能也很重要:
欠擬合通常是模型無法封裝數據之間關系的結果。例如,當嘗試用線性模型表示非線性關系時可能會發生這種情況。欠擬合的模型在訓練集和測試集上的表現都可能很差。
當模型具有過于復雜的結構并且學習數據和噪聲之間的現有關系時,通常會發生過度擬合。此類模型通常具有較差的泛化能力。盡管它們在訓練數據上運行良好,但在處理看不見的(測試)數據時通常會產生較差的性能。
您可以在 Python中的線性回歸中找到關于欠擬合和過擬合的更詳細說明。
使用先決條件?train_test_split()
現在您了解了拆分數據集以執行無偏模型評估并識別欠擬合或過擬合的必要性,您已準備好學習如何拆分自己的數據集。
您將使用scikit-learn 的0.23.1 版,或sklearn.?它有許多用于數據科學和機器學習的包,但在本教程中,您將重點關注model_selection包,特別是函數train_test_split()。
您可以安裝sklearn使用pip install:
$ python -m pip install -U "scikit-learn==0.23.1"
如果您使用Anaconda,那么您可能已經安裝了它。但是,如果您想使用全新環境,請確保您擁有指定的版本,或者使用Miniconda,那么您可以使用以下命令sklearn從 Anaconda Cloud安裝conda install:
$ conda install -c anaconda scikit-learn=0.23
您還需要NumPy,但您不必單獨安裝它。sklearn如果你還沒有安裝它,你應該得到它。如果您想刷新您的 NumPy 知識,請查看官方文檔或查看Look Ma, No For-Loops: Array Programming With NumPy。
應用?train_test_split()
您需要導入?train_test_split()和 NumPy 才能使用它們,因此您可以從以下import語句開始:
>>>
>>> import numpy as np >>> from sklearn.model_selection import train_test_split
現在您已導入,您可以使用它們將數據拆分為訓練集和測試集。您將通過單個函數調用同時拆分輸入和輸出。
使用train_test_split(),您需要提供要拆分的序列以及任何可選參數。它返回一個列表的NumPy的陣列,其它序列,或SciPy的稀疏矩陣如果合適的話:
sklearn.model_selection.train_test_split(*arrays, **options) -> list
arrays是list、NumPy 數組、pandas DataFrames或類似數組的對象的序列,這些對象包含要拆分的數據。所有這些對象一起構成了數據集,并且必須具有相同的長度。
在受監督的機器學習應用程序中,您通常會使用兩個這樣的序列:
具有輸入 (?x)的二維數組
具有輸出 (?y) 的一維數組
options?是可用于獲得所需行為的可選關鍵字參數:
train_size是定義訓練集大小的數字。如果您提供float,則它必須介于0.0和之間,1.0并且將定義用于測試的數據集的份額。如果您提供int,則它將代表訓練樣本的總數。默認值為None。
test_size是定義測試集大小的數字。它非常類似于train_size.?您應該提供train_size或test_size。如果兩者都沒有給出,則用于測試的數據集的默認份額為0.25,或 25%。
random_state是在分裂期間控制隨機化的對象。它可以是 的一個int或一個實例RandomState。默認值為None。
shuffle是布爾對象(True默認情況下),用于確定在應用拆分之前是否對數據集進行混洗。
stratify是一個類似數組的對象,如果不是None,則確定如何使用分層拆分。
現在是時候嘗試數據拆分了!您將首先創建一個要使用的簡單數據集。數據集將包含二維數組中的輸入x和一維數組中的輸出y:
>>>
>>> x = np.arange(1, 25).reshape(12, 2) >>> y = np.array([0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0]) >>> x array([[ 1, 2], [ 3, 4], [ 5, 6], [ 7, 8], [ 9, 10], [11, 12], [13, 14], [15, 16], [17, 18], [19, 20], [21, 22], [23, 24]]) >>> y array([0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0])
要獲取數據,請使用arange(),這對于基于數值范圍生成數組非常方便。您還可以.reshape()用來修改由 返回的數組的形狀arange()并獲得二維數據結構。
您可以使用單個函數調用拆分輸入和輸出數據集:
>>>
>>> x_train, x_test, y_train, y_test = train_test_split(x, y) >>> x_train array([[15, 16], [21, 22], [11, 12], [17, 18], [13, 14], [ 9, 10], [ 1, 2], [ 3, 4], [19, 20]]) >>> x_test array([[ 5, 6], [ 7, 8], [23, 24]]) >>> y_train array([1, 1, 0, 1, 0, 1, 0, 1, 0]) >>> y_test array([1, 0, 0])
給定兩個序列,例如x和yhere,train_test_split()執行拆分并按以下順序返回四個序列(在本例中為 NumPy 數組):
x_train:第一個序列的訓練部分 (?x)
x_test:第一個序列的測試部分 (?x)
y_train:第二個序列的訓練部分 (?y)
y_test:第二個序列的測試部分 (?y)
您可能會得到與您在此處看到的結果不同的結果。這是因為數據集拆分默認是隨機的。每次運行該函數時結果都不同。但是,這通常不是您想要的。
有時,為了使您的測試具有可重復性,您需要對每個函數調用使用相同的輸出進行隨機拆分。你可以用參數來做到這一點random_state。的值random_state并不重要——它可以是任何非負整數。您可以使用一個實例來numpy.random.RandomState代替,但這是一種更復雜的方法。
在前面的示例中,您使用了一個包含 12 個觀測值(行)的數據集,并獲得了一個包含 9 行的訓練樣本和一個包含三行的測試樣本。那是因為您沒有指定所需的訓練和測試集大小。默認情況下,將 25% 的樣本分配給測試集。對于許多應用程序來說,這個比率通常是合適的,但它并不總是您所需要的。
通常,您需要明確定義測試(或訓練)集的大小,有時您甚至想嘗試不同的值。您可以使用參數train_size或test_size.
修改代碼,以便您可以選擇測試集的大小并獲得可重現的結果:
>>>
>>> x_train, x_test, y_train, y_test = train_test_split( ... x, y, test_size=4, random_state=4 ... ) >>> x_train array([[17, 18], [ 5, 6], [23, 24], [ 1, 2], [ 3, 4], [11, 12], [15, 16], [21, 22]]) >>> x_test array([[ 7, 8], [ 9, 10], [13, 14], [19, 20]]) >>> y_train array([1, 1, 0, 0, 1, 0, 1, 1]) >>> y_test array([0, 1, 0, 0])
通過此更改,您將獲得與之前不同的結果。之前,您有一個包含 9 個項目的訓練集和包含三個項目的測試集。現在,由于參數test_size=4,訓練集有八個項目,測試集有四個項目。你會得到相同的結果,test_size=0.33因為 12 的 33% 大約是 4。
最后兩個示例之間還有一個非常重要的區別:現在每次運行該函數時都會得到相同的結果。這是因為您已使用random_state=4.
下圖顯示了調用時發生的情況train_test_split():
數據集的樣本被隨機打亂,然后根據你定義的大小分成訓練集和測試集。
你可以看到它y有六個零和六個一。但是,測試集的四個項目中有三個零。如果您想(大約)y通過訓練和測試集保持值的比例,則通過stratify=y.?這將啟用分層拆分:
>>>
>>> x_train, x_test, y_train, y_test = train_test_split( ... x, y, test_size=0.33, random_state=4, stratify=y ... ) >>> x_train array([[21, 22], [ 1, 2], [15, 16], [13, 14], [17, 18], [19, 20], [23, 24], [ 3, 4]]) >>> x_test array([[11, 12], [ 7, 8], [ 5, 6], [ 9, 10]]) >>> y_train array([1, 0, 1, 0, 1, 0, 0, 1]) >>> y_test array([0, 0, 1, 1])
現在y_train并y_test具有與原始y數組相同的零和一比率。
在某些情況下,分層拆分是可取的,例如當您對不平衡數據集進行分類時,屬于不同類別的樣本數量存在顯著差異的數據集。
最后,您可以使用以下命令關閉數據混洗和隨機拆分shuffle=False:
>>>
>>> x_train, x_test, y_train, y_test = train_test_split( ... x, y, test_size=0.33, shuffle=False ... ) >>> x_train array([[ 1, 2], [ 3, 4], [ 5, 6], [ 7, 8], [ 9, 10], [11, 12], [13, 14], [15, 16]]) >>> x_test array([[17, 18], [19, 20], [21, 22], [23, 24]]) >>> y_train array([0, 1, 1, 0, 1, 0, 0, 1]) >>> y_test array([1, 0, 1, 0])
現在您有一個拆分,其中原始x和y數組中的前三分之二樣本分配給訓練集,最后三分之一分配給測試集。沒有洗牌。沒有隨機性。
監督機器學習?train_test_split()
現在是時候看看train_test_split()解決監督學習問題時的實際情況了。在研究更大的問題之前,您將從一個可以用線性回歸解決的小回歸問題開始。您還將看到您也可以train_test_split()用于分類。
線性回歸的極簡示例
在此示例中,您將應用迄今為止學到的知識來解決一個小的回歸問題。您將學習如何創建數據集,將它們拆分為訓練和測試子集,并將它們用于線性回歸。
與往常一樣,您將從導入必要的包、函數或類開始。您將需要 NumPy?LinearRegression、 和train_test_split():
>>>
>>> import numpy as np >>> from sklearn.linear_model import LinearRegression >>> from sklearn.model_selection import train_test_split
現在您已經導入了您需要的所有內容,您可以創建兩個小數組x和y, 來表示觀察結果,然后像以前一樣將它們拆分為訓練集和測試集:
>>>
>>> x = np.arange(20).reshape(-1, 1) >>> y = np.array([5, 12, 11, 19, 30, 29, 23, 40, 51, 54, 74, ... 62, 68, 73, 89, 84, 89, 101, 99, 106]) >>> x array([[ 0], [ 1], [ 2], [ 3], [ 4], [ 5], [ 6], [ 7], [ 8], [ 9], [10], [11], [12], [13], [14], [15], [16], [17], [18], [19]]) >>> y array([ 5, 12, 11, 19, 30, 29, 23, 40, 51, 54, 74, 62, 68, 73, 89, 84, 89, 101, 99, 106]) >>> x_train, x_test, y_train, y_test = train_test_split( ... x, y, test_size=8, random_state=0 ... )
您的數據集有 20 個觀察值,或x-y對。您指定參數test_size=8,因此數據集被劃分為包含 12 個觀測值的訓練集和包含 8 個觀測值的測試集。
現在您可以使用訓練集來擬合模型:
>>>
>>> model = LinearRegression().fit(x_train, y_train) >>> model.intercept_ 3.1617195496417523 >>> model.coef_ array([5.53121801])
LinearRegression創建代表模型的對象,同時.fit()訓練或擬合模型并返回它。對于線性回歸,擬合模型意味著確定回歸線的最佳截距 (?model.intercept_) 和斜率 (?model.coef_) 值。
盡管您可以使用x_train和y_train檢查擬合優度,但這不是最佳實踐。對模型預測性能的無偏估計基于測試數據:
>>>
>>> model.score(x_train, y_train) 0.9868175024574795 >>> model.score(x_test, y_test) 0.9465896927715023
.score()返回判定系數,或- [R?2,用于傳遞的數據。其最大值為1。越高[R?2價值,更好的配合。在這種情況下,訓練數據會產生稍高的系數。然而,[R與試驗數據計算2是模型的預測性能可以客觀地衡量。
這是它在圖表上的樣子:
綠點代表用于訓練的x-y對。黑線稱為估計回歸線,由模型擬合的結果定義:截距和斜率。因此,它僅反映綠點的位置。
白點代表測試集。您可以使用它們來估計模型(回歸線)的性能以及未用于訓練的數據。
回歸示例
現在您已準備好拆分更大的數據集來解決回歸問題。您將使用著名的波士頓房價數據集,該數據集包含在sklearn.?該數據集有 506 個樣本、13 個輸入變量和作為輸出的房屋價值。您可以使用 檢索它load_boston()。
首先,導入train_test_split()和load_boston():
>>>
>>> from sklearn.datasets import load_boston >>> from sklearn.model_selection import train_test_split
現在您已經導入了這兩個函數,您可以獲取要使用的數據:
>>>
>>> x, y = load_boston(return_X_y=True)
如您所見,load_boston()參數return_X_y=True返回一個包含兩個 NumPy 數組的元組:
具有輸入的二維數組
具有輸出的一維數組
下一步是像以前一樣拆分數據:
>>>
>>> x_train, x_test, y_train, y_test = train_test_split( ... x, y, test_size=0.4, random_state=0 ... )
現在你有了訓練集和測試集。訓練數據包含在x_train和y_train,而測試的數據是x_test和y_test。
當您處理較大的數據集時,通常將訓練或測試大小作為比率傳遞更方便。test_size=0.4意味著大約 40% 的樣本將分配給測試數據,其余 60% 將分配給訓練數據。
最后,您可以使用訓練集 (?x_trainand?y_train) 擬合模型和測試集 (?x_testand?y_test) 以對模型進行無偏評估。在此示例中,您將應用三種眾所周知的回歸算法來創建適合您的數據的模型:
線性回歸?LinearRegression()
梯度推進與GradientBoostingRegressor()
隨機森林帶RandomForestRegressor()
該過程與前面的示例幾乎相同:
導入您需要的類。
使用這些類創建模型實例。
.fit()使用訓練集擬合模型實例。
.score()使用測試集評估模型。
以下是針對所有三種回歸算法執行上述步驟的代碼:
>>>
>>> from sklearn.linear_model import LinearRegression >>> model = LinearRegression().fit(x_train, y_train) >>> model.score(x_train, y_train) 0.7668160223286261 >>> model.score(x_test, y_test) 0.6882607142538016 >>> from sklearn.ensemble import GradientBoostingRegressor >>> model = GradientBoostingRegressor(random_state=0).fit(x_train, y_train) >>> model.score(x_train, y_train) 0.9859065238883613 >>> model.score(x_test, y_test) 0.8530127436482149 >>> from sklearn.ensemble import RandomForestRegressor >>> model = RandomForestRegressor(random_state=0).fit(x_train, y_train) >>> model.score(x_train, y_train) 0.9811695664860354 >>> model.score(x_test, y_test) 0.8325867908704008
您已經使用訓練和測試數據集擬合了三個模型并評估了它們的性能。獲得的準確度的度量.score()是確定系數。它可以用訓練集或測試集計算。但是,正如您已經了解到的,使用測試集獲得的分數代表了對性能的無偏估計。
正如文件中所提到的,您可以提供可選的參數LinearRegression(),GradientBoostingRegressor()和RandomForestRegressor()。GradientBoostingRegressor()并出于同樣的原因RandomForestRegressor()使用該random_state參數train_test_split():處理算法中的隨機性并確保可重復性。
對于某些方法,您可能還需要特征縮放。在這種情況下,您應該使用訓練數據擬合縮放器,并使用它們來轉換測試數據。
分類示例
您可以使用train_test_split()與回歸分析相同的方式來解決分類問題。在機器學習中,分類問題涉及訓練模型以將標簽應用于輸入值或對輸入值進行分類并將數據集分類。
在教程Logistic Regression in Python 中,您將找到一個手寫識別任務的示例。該示例提供了將數據拆分為訓練集和測試集以避免評估過程中的偏差的另一個演示。
其他驗證功能
該軟件包sklearn.model_selection提供了許多與模型選擇和驗證相關的功能,包括:
交叉驗證
學習曲線
超參數調優
交叉驗證是一組技術,它結合了預測性能的度量以獲得更準確的模型估計。
廣泛使用的交叉驗證方法之一是k折交叉驗證。在其中,您將數據集劃分為k 個(通常是五個或十個)大小相同的子集或folds,然后執行k次訓練和測試程序。每次,您使用不同的折疊作為測試集,所有剩余的折疊作為訓練集。這提供了k個預測性能的度量,然后您可以分析它們的平均值和標準偏差。
您可以使用KFold、StratifiedKFold、LeaveOneOut和來自 的其他一些類和函數實現交叉驗證sklearn.model_selection。
一個學習曲線,有時也被稱為訓練曲線,表演的訓練和驗證集的預測分數是如何依賴于訓練樣本的數量。您可以使用learning_curve()獲取此依賴項,它可以幫助您找到訓練集的最佳大小、選擇超參數、比較模型等。
超參數調整,也稱為超參數優化,是確定用于定義機器學習模型的最佳超參數集的過程。sklearn.model_selection為您提供了幾個選項用于此目的,包括GridSearchCV,RandomizedSearchCV,validation_curve(),和其他人。拆分數據對于超參數調整也很重要。
結論
您現在知道為什么以及如何使用train_test_split()from?sklearn。您已經了解到,為了對機器學習模型的預測性能進行無偏估計,您應該使用尚未用于模型擬合的數據。這就是為什么您需要將數據集拆分為訓練、測試以及某些情況下的驗證子集。
在本教程中,您學習了如何:
使用train_test_split()得到的訓練和測試集
用參數控制子集的大小train_size和test_size
使用參數確定分割的隨機性random_state
使用參數獲取分層分割stratify
使用train_test_split()作為的一部分監督機器學習方法
您還看到,該sklearn.model_selection模塊提供了其他幾種模型驗證工具,包括交叉驗證、學習曲線和超參數調整。
如果您有任何問題或意見,請將它們放在下面的評論部分。
scikit-learn 機器學習 深度學習
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。