99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何在Python中劃分訓(xùn)練/測(cè)試集并進(jìn)行交叉驗(yàn)證

zhKF_jqr_AI ? 來(lái)源:未知 ? 作者:李倩 ? 2018-11-26 08:59 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

編者按:訓(xùn)練集/測(cè)試集劃分和交叉驗(yàn)證一直是數(shù)據(jù)科學(xué)和數(shù)據(jù)分析中的兩個(gè)相當(dāng)重要的概念,它們也是防止模型過(guò)擬合的常用工具。為了更好地掌握它們,在這篇文章中,我們會(huì)以統(tǒng)計(jì)模型為例,先從理論角度簡(jiǎn)要介紹相關(guān)術(shù)語(yǔ),然后給出一個(gè)Python實(shí)現(xiàn)的案例。

什么是模型過(guò)擬合/欠擬合

在統(tǒng)計(jì)學(xué)和機(jī)器學(xué)習(xí)中,通常我們會(huì)把數(shù)據(jù)分成兩個(gè)子集:訓(xùn)練數(shù)據(jù)和測(cè)試數(shù)據(jù)(有時(shí)也分為訓(xùn)練、驗(yàn)證、測(cè)試三個(gè)),然后用訓(xùn)練集訓(xùn)練模型,用測(cè)試集檢驗(yàn)?zāi)P偷膶W(xué)習(xí)效果。但當(dāng)我們這么做時(shí),模型可能會(huì)出現(xiàn)以下兩種情況:一是模型過(guò)度擬合數(shù)據(jù),二是模型不能很好地?cái)M合數(shù)據(jù)。常言道過(guò)猶不及,這兩種情況都是我們要極力規(guī)避的,因?yàn)樗鼈儠?huì)影響模型的預(yù)測(cè)性能——預(yù)測(cè)準(zhǔn)確率較低,或是泛化性太差,沒(méi)法把學(xué)到的經(jīng)驗(yàn)推廣到其他數(shù)據(jù)上(也就是沒(méi)法預(yù)測(cè)其他數(shù)據(jù))。

過(guò)擬合

模型過(guò)擬合意味著我們把模型“訓(xùn)練得太好了”,通過(guò)一遍又一遍的訓(xùn)練,它已經(jīng)把訓(xùn)練數(shù)據(jù)的特征都“死記硬背”了下來(lái)。這在模型過(guò)于復(fù)雜(和觀察樣本數(shù)相比,模型設(shè)置的特征/變量太多)時(shí)往往更容易發(fā)生。過(guò)擬合的缺點(diǎn)是模型只對(duì)訓(xùn)練數(shù)據(jù)非常準(zhǔn)確,但在未經(jīng)訓(xùn)練的數(shù)據(jù)或全新數(shù)據(jù)上非常不準(zhǔn)確,因?yàn)樗皇欠夯?,沒(méi)法推廣結(jié)果,對(duì)其他數(shù)據(jù)作出任何推斷。

更確切地說(shuō),過(guò)擬合的模型學(xué)習(xí)到的只是訓(xùn)練數(shù)據(jù)中的“噪聲”,而不是數(shù)據(jù)中變量之間的實(shí)際關(guān)系。顯然,這些“噪聲”是訓(xùn)練數(shù)據(jù)獨(dú)有的,這也決定了它不能準(zhǔn)確預(yù)測(cè)任何新數(shù)據(jù)集。

欠擬合

和過(guò)擬合相比,欠擬合是另一個(gè)極端,它意味著模型連擬合訓(xùn)練數(shù)據(jù)都做不到,沒(méi)能真正把握數(shù)據(jù)的趨勢(shì)。毫無(wú)疑問(wèn),一個(gè)欠擬合的模型也是不能被推廣到新數(shù)據(jù)的,它和過(guò)擬合恰恰相反,是模型過(guò)于簡(jiǎn)單(沒(méi)有足夠的預(yù)測(cè)變量/自變量)的結(jié)果。例如,當(dāng)我們用線性模型(比如線性回歸)擬合非線性數(shù)據(jù)時(shí),模型就很可能會(huì)欠擬合。

欠擬合、恰到好處和過(guò)擬合

值得注意的是,在實(shí)踐中,欠擬合遠(yuǎn)不像過(guò)擬合那么普遍。但我們還是要做到在數(shù)據(jù)分析中同時(shí)警惕這兩個(gè)問(wèn)題,找到它們的中間地帶。而解決問(wèn)題的首選方案就是劃分訓(xùn)練/測(cè)試數(shù)據(jù)和交叉驗(yàn)證。

劃分訓(xùn)練/測(cè)試數(shù)據(jù)

正如之前提到的,我們使用的數(shù)據(jù)通常會(huì)被劃分為訓(xùn)練集和測(cè)試集。其中訓(xùn)練集包含輸入的對(duì)應(yīng)已知輸出,通過(guò)在上面進(jìn)行訓(xùn)練,模型可以把學(xué)到的特征關(guān)系推廣到其他數(shù)據(jù)上,而測(cè)試集就是模型性能的試金石。

那么在Python中,我們能怎么執(zhí)行這個(gè)操作呢?這里我們介紹一種用Scikit-Learn庫(kù),特別是traintestsplit的方法。讓我們先從導(dǎo)入庫(kù)開(kāi)始:

import pandas as pd

from sklearn import datasets, linear_model

from sklearn.model_selection import train_test_split

from matplotlib import pyplot as plt

在上述代碼中:

第一行作用是把數(shù)據(jù)導(dǎo)入到pandas數(shù)據(jù)框架中,然后再進(jìn)行分析;

第二行表示既然已經(jīng)導(dǎo)入了數(shù)據(jù)集模塊,所以我們可以加載一個(gè)樣本數(shù)據(jù)集和linear_model來(lái)做線性回歸;

第三行表示已經(jīng)導(dǎo)入了traintestsplit,所以可以把數(shù)據(jù)集分成訓(xùn)練集和測(cè)試集;

第四行意味著導(dǎo)入pyplot以繪制數(shù)據(jù)圖。

下面我們以糖尿病數(shù)據(jù)集為例,從實(shí)踐中看看怎么把它導(dǎo)入數(shù)據(jù)框架,并定義各列的名稱。

數(shù)據(jù)集地址:scikit-learn.org/stable/modules/generated/sklearn.datasets.load_diabetes.html

# Load the Diabetes Housing dataset

columns =“age sex bmi map tc ldl hdl tch ltg glu”.split()# Declare the columns names

diabetes = datasets.load_diabetes()# Call the diabetes dataset from sklearn

df = pd.DataFrame(diabetes.data, columns=columns)# load the dataset as a pandas data frame

y = diabetes.target # define the target variable (dependent variable) as y

現(xiàn)在我們可以用traintestsplit函數(shù)劃分?jǐn)?shù)據(jù)集。test_size = 0.2表示測(cè)試數(shù)據(jù)在數(shù)據(jù)集中的占比,一般情況下,訓(xùn)練集和測(cè)試集的比例應(yīng)該是80/20或70/30。

# create training and testing vars

X_train, X_test, y_train, y_test = train_test_split(df, y, test_size=0.2)

print X_train.shape, y_train.shape

print X_test.shape, y_test.shape

(353,10)(353,)

(89,10)(89,)

將模型擬合到訓(xùn)練數(shù)據(jù)上:

# fit a model

lm = linear_model.LinearRegression()

model = lm.fit(X_train, y_train)

predictions = lm.predict(X_test)

把模型放到測(cè)試數(shù)據(jù)上:

predictions[0:5]

array([205.68012533, 64.58785513,175.12880278,169.95993301,

128.92035866])

注:預(yù)測(cè)后面那個(gè)[0:5]表示只顯示前五個(gè)預(yù)測(cè)值,如果把它刪掉,模型會(huì)輸出所有預(yù)測(cè)值。

然后是繪制模型結(jié)果:

## The line / model

plt.scatter(y_test, predictions)

plt.xlabel(“TrueValues”)

plt.ylabel(“Predictions”)

最后輸出模型準(zhǔn)確度分?jǐn)?shù):

print“Score:”, model.score(X_test, y_test)

Score:0.485829586737

到這里,劃分訓(xùn)練集/測(cè)試集就完成了,如果總結(jié)整個(gè)過(guò)程,它可以被概括為先加載數(shù)據(jù),將其分成訓(xùn)練集和測(cè)試集,用回歸模型擬合訓(xùn)練數(shù)據(jù),基于訓(xùn)練數(shù)據(jù)進(jìn)行預(yù)測(cè)并在測(cè)試集上預(yù)測(cè)測(cè)試數(shù)據(jù)的結(jié)果。一切都好像很完美吧?其實(shí)不然,劃分?jǐn)?shù)據(jù)集也有很多講究——如果我們劃分時(shí)沒(méi)有做到嚴(yán)格意義上的隨機(jī)呢?如果數(shù)據(jù)集本身存在明顯偏差,其中大部分?jǐn)?shù)據(jù)都來(lái)自某省、某個(gè)收入水平的員工、某個(gè)特定性別的員工或只有特定年齡的人,該怎么辦?

即便我們一再避免,模型最后還是會(huì)過(guò)擬合,而這就是交叉驗(yàn)證可以發(fā)揮作用的地方。

交叉驗(yàn)證

為了避免因數(shù)據(jù)集偏差、劃分?jǐn)?shù)據(jù)集不當(dāng)引起模型過(guò)擬合,我們可以使用交叉驗(yàn)證,它和劃分訓(xùn)練集/測(cè)試集非常相似,但適用于數(shù)量上更多的子集。它的工作原理是先把數(shù)據(jù)分成k個(gè)子集,并從中挑選k-1個(gè)子集,在每個(gè)自己上訓(xùn)練模型,最后再用剩下的最后一個(gè)子集進(jìn)行測(cè)試。

劃分訓(xùn)練集/測(cè)試集和交叉驗(yàn)證

交叉驗(yàn)證的方法有很多,這里我們只討論其中兩個(gè):第一個(gè)是k-折交叉驗(yàn)證,第二個(gè)是Leave One Out交叉驗(yàn)證(LOOCV)。

k-折交叉驗(yàn)證

在k-折交叉驗(yàn)證中,我們將數(shù)據(jù)分成k個(gè)不同的子集(分成k折),并在k-1個(gè)子集上分別訓(xùn)練單獨(dú)模型,最后用第k個(gè)子集作為測(cè)試數(shù)據(jù)。

以下是k-折交叉驗(yàn)證的Sklearn文檔中的一個(gè)簡(jiǎn)單示例:

from sklearn.model_selection importKFold# import KFold

X = np.array([[1,2],[3,4],[1,2],[3,4]])# create an array

y = np.array([1,2,3,4])# Create another array

kf =KFold(n_splits=2)# Define the split - into 2 folds

kf.get_n_splits(X)# returns the number of splitting iterations in the cross-validator

print(kf)

KFold(n_splits=2, random_state=None, shuffle=False)

它的結(jié)果是:

for train_index, test_index in kf.split(X):

print(“TRAIN:”, train_index,“TEST:”, test_index)

X_train, X_test = X[train_index], X[test_index]

y_train, y_test = y[train_index], y[test_index]

('TRAIN:', array([2,3]),'TEST:', array([0,1]))

('TRAIN:', array([0,1]),'TEST:', array([2,3]))

如你所見(jiàn),這個(gè)函數(shù)將原始數(shù)據(jù)拆分為不同的數(shù)據(jù)子集。

LOOCV

LOOCV(留一驗(yàn)證)是本文要介紹的第二種交叉驗(yàn)證方法,它的思路和k-折交叉驗(yàn)證其實(shí)有相似之處,但不同的是,它只從原數(shù)據(jù)集中抽取一個(gè)樣本作為測(cè)試數(shù)據(jù),剩余的全是訓(xùn)練數(shù)據(jù),整個(gè)過(guò)程一直持續(xù)到每個(gè)樣本都被當(dāng)做一次測(cè)試數(shù)據(jù),最后再用平均值構(gòu)建最終的模型。可以想見(jiàn),這種方法勢(shì)必會(huì)得到大量的訓(xùn)練集(等于樣本數(shù)),所以它的計(jì)算量會(huì)很大,更適合被用于小型數(shù)據(jù)集。

讓讓我們看一下它在Sklearn里的例子:

from sklearn.model_selection importLeaveOneOut

X = np.array([[1,2],[3,4]])

y = np.array([1,2])

loo =LeaveOneOut()

loo.get_n_splits(X)

for train_index, test_index in loo.split(X):

print("TRAIN:", train_index,"TEST:", test_index)

X_train, X_test = X[train_index], X[test_index]

y_train, y_test = y[train_index], y[test_index]

print(X_train, X_test, y_train, y_test)

它的輸出是:

('TRAIN:', array([1]),'TEST:', array([0]))

(array([[3,4]]), array([[1,2]]), array([2]), array([1]))

('TRAIN:', array([0]),'TEST:', array([1]))

(array([[1,2]]), array([[3,4]]), array([1]), array([2]))

那么對(duì)于這兩種交叉驗(yàn)證方法,我們?cè)趯?shí)踐中該怎么取舍呢?事實(shí)上,子集越小、子集數(shù)量越多,模型的準(zhǔn)確率就越高,但相應(yīng)的,它的計(jì)算量也越多,對(duì)內(nèi)存的要求也越大。因此,如果是非常小的數(shù)據(jù)集,建議大家還是用LOOCV;如果數(shù)據(jù)集略大,可以采用k-折,比如k=3是一個(gè)比較常用的超參數(shù),當(dāng)然你也可以視情況選擇5、10等。

split函數(shù)劃分 VS 交叉驗(yàn)證

之前我們演示了用函數(shù)劃分糖尿病數(shù)據(jù)集的結(jié)果,這里我們嘗試對(duì)它做交叉驗(yàn)證,看看有什么不同。首先,我們可以用cross_val_predict函數(shù)返回測(cè)試子集中每個(gè)數(shù)據(jù)點(diǎn)的預(yù)測(cè)值。

# Necessary imports:

from sklearn.cross_validation import cross_val_score, cross_val_predict

from sklearn import metrics

既然我們已經(jīng)把數(shù)據(jù)集分成了測(cè)試集和訓(xùn)練集,這里我們?cè)僭谠谢A(chǔ)上進(jìn)行交叉驗(yàn)證,看看準(zhǔn)確率得分變化:

# Perform 6-fold cross validation

scores = cross_val_score(model, df, y, cv=6)

print“Cross-validated scores:”, scores

Cross-validated scores:[0.4554861 0.461385720.400940840.552207360.439427750.56923406]

得分從0.485提高到了0.569,雖然看起來(lái)不是很顯著,但不要心急,我們來(lái)繪制交叉驗(yàn)證后的圖像:

# Make cross validated predictions

predictions = cross_val_predict(model, df, y, cv=6)

plt.scatter(y, predictions)

很明顯,這幅圖里的數(shù)據(jù)點(diǎn)比之前的圖密集多了,因?yàn)槲覀內(nèi)v=6。

從本質(zhì)上來(lái)看,回歸模型就是用模型擬合數(shù)據(jù),這之中肯定存在誤差,而衡量這個(gè)誤差大小的標(biāo)尺是擬合優(yōu)度。在眾多標(biāo)準(zhǔn)中,R2是度量擬合優(yōu)度的一個(gè)常用統(tǒng)計(jì)量,這里我們計(jì)算一下模型的R2得分:

accuracy = metrics.r2_score(y, predictions)

print“Cross-PredictedAccuracy:”, accuracy

Cross-PredictedAccuracy:0.490806583864

以上就是文本想要介紹的全部?jī)?nèi)容,希望你能從中找到對(duì)自己有所幫助的東西!

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4827

    瀏覽量

    86811
  • 數(shù)據(jù)科學(xué)

    關(guān)注

    0

    文章

    168

    瀏覽量

    10491

原文標(biāo)題:如何在Python中劃分訓(xùn)練/測(cè)試集并進(jìn)行交叉驗(yàn)證

文章出處:【微信號(hào):jqr_AI,微信公眾號(hào):論智】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    深度學(xué)習(xí)開(kāi)發(fā)測(cè)試的定義

    是使用 70% / 30% 的比例來(lái)隨機(jī)劃分訓(xùn)練測(cè)試。這種做法的確可行,但在越來(lái)越多的實(shí)際應(yīng)用
    發(fā)表于 11-30 16:58

    建立開(kāi)發(fā)測(cè)試(總結(jié))

    ? 被選擇作為開(kāi)發(fā)測(cè)試的數(shù)據(jù),應(yīng)當(dāng)與你未來(lái)計(jì)劃獲取并對(duì)其進(jìn)行良好處理的數(shù)據(jù)有著相同的分布,而不一定和訓(xùn)練
    發(fā)表于 12-14 10:56

    Python硬件驗(yàn)證——摘要

    - 為什么選擇 Python?如何使用 Python 進(jìn)行驗(yàn)證測(cè)試平臺(tái))? Cocotb -(CO-routine 和 CO-simul
    發(fā)表于 11-03 13:07

    何在 IIS 執(zhí)行 Python 腳本

    何在 IIS 執(zhí)行 Python 腳本 Python 是一種解釋腳本語(yǔ)言,概念類似 Microsoft Visual Basic Scripting Edition (VBSc
    發(fā)表于 02-23 15:13 ?1361次閱讀

    機(jī)器學(xué)習(xí)的三種交叉驗(yàn)證

    訓(xùn)練用來(lái)訓(xùn)練模型,驗(yàn)證用于模型的選擇,而測(cè)試
    的頭像 發(fā)表于 03-15 16:30 ?2662次閱讀

    如何避免在數(shù)據(jù)準(zhǔn)備過(guò)程的數(shù)據(jù)泄漏

    為了避免數(shù)據(jù)泄漏,我們需要謹(jǐn)慎使用數(shù)據(jù)準(zhǔn)備技術(shù), 同時(shí)也要根據(jù)所使用的模型評(píng)估方案靈活選擇,例如訓(xùn)練測(cè)試劃分或k折交叉
    的頭像 發(fā)表于 08-27 15:19 ?2029次閱讀
    如何避免在數(shù)據(jù)準(zhǔn)備過(guò)程<b class='flag-5'>中</b>的數(shù)據(jù)泄漏

    如何測(cè)試Python環(huán)境

    在編程測(cè)試是一項(xiàng)重要的工作,可以幫助我們驗(yàn)證代碼的正確性和穩(wěn)定性。在Python編程環(huán)境,同樣需要
    的頭像 發(fā)表于 04-14 12:14 ?5606次閱讀

    芯片的驗(yàn)證模塊劃分

    任何芯片都需要把芯片劃分成更便于管理的小模塊/特性進(jìn)行驗(yàn)證。
    的頭像 發(fā)表于 10-07 14:41 ?911次閱讀

    如何使用Python進(jìn)行圖像識(shí)別的自動(dòng)學(xué)習(xí)自動(dòng)訓(xùn)練?

    如何使用Python進(jìn)行圖像識(shí)別的自動(dòng)學(xué)習(xí)自動(dòng)訓(xùn)練? 使用Python進(jìn)行圖像識(shí)別的自動(dòng)學(xué)習(xí)和自動(dòng)訓(xùn)練
    的頭像 發(fā)表于 01-12 16:06 ?944次閱讀

    K折交叉驗(yàn)證算法與訓(xùn)練

    K折交叉驗(yàn)證算法與訓(xùn)練
    的頭像 發(fā)表于 05-15 09:26 ?1087次閱讀

    談?wù)?十折交叉驗(yàn)證訓(xùn)練模型

    談?wù)?十折交叉驗(yàn)證訓(xùn)練模型
    的頭像 發(fā)表于 05-15 09:30 ?1754次閱讀

    如何理解機(jī)器學(xué)習(xí)訓(xùn)練、驗(yàn)證測(cè)試

    理解機(jī)器學(xué)習(xí)訓(xùn)練驗(yàn)證測(cè)試,是掌握機(jī)器學(xué)
    的頭像 發(fā)表于 07-10 15:45 ?6881次閱讀

    機(jī)器學(xué)習(xí)交叉驗(yàn)證方法

    在機(jī)器學(xué)習(xí)交叉驗(yàn)證(Cross-Validation)是一種重要的評(píng)估方法,它通過(guò)將數(shù)據(jù)分割成多個(gè)部分來(lái)評(píng)估模型的性能,從而避免過(guò)擬合或欠擬合問(wèn)題,并幫助選擇最優(yōu)的超參數(shù)。本文將
    的頭像 發(fā)表于 07-10 16:08 ?2799次閱讀

    使用Python進(jìn)行Ping測(cè)試

    )請(qǐng)求包,然后等待目標(biāo)主機(jī)返回響應(yīng)包,從而測(cè)量網(wǎng)絡(luò)的延遲和丟包情況。隨著Python編程語(yǔ)言的廣泛應(yīng)用,越來(lái)越多的網(wǎng)絡(luò)工程師開(kāi)始使用Python進(jìn)行自動(dòng)化網(wǎng)絡(luò)測(cè)試和管理任務(wù)。本篇文章將
    的頭像 發(fā)表于 08-12 17:56 ?1017次閱讀
    使用<b class='flag-5'>Python</b><b class='flag-5'>進(jìn)行</b>Ping<b class='flag-5'>測(cè)試</b>

    使用BP神經(jīng)網(wǎng)絡(luò)進(jìn)行時(shí)間序列預(yù)測(cè)

    測(cè)試的時(shí)間序列數(shù)據(jù)。 確保數(shù)據(jù)具有良好的質(zhì)量,并進(jìn)行必要的預(yù)處理,如去除異常值、填充缺失值等。 數(shù)據(jù)劃分 : 將數(shù)據(jù)劃分
    的頭像 發(fā)表于 02-12 16:44 ?775次閱讀