日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

13.Data Leakage

發(fā)布時(shí)間:2023/12/10 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 13.Data Leakage 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本教程是ML系列的一部分。在此步驟中,你將學(xué)習(xí)什么是data leakage及如何預(yù)防它。?

What is Data Leakage

數(shù)據(jù)泄漏是數(shù)據(jù)科學(xué)家需要理解的最重要問題之一。 如果您不知道如何防止它,則會頻繁出現(xiàn)泄漏,并且會以最微妙和危險(xiǎn)的方式破壞您的模型。 具體而言,泄漏會導(dǎo)致模型看起來準(zhǔn)確,當(dāng)您開始使用模型做出決策,模型則變得非常不準(zhǔn)確。 本教程將向您展示泄漏是什么以及如何避免泄漏。

泄漏有兩種主要類型:Leaky Predictors and a Leaky Validation Strategies

Leaky Predictors

當(dāng)您的預(yù)測因素包含無法使用的數(shù)據(jù)時(shí),就會發(fā)生這種情況。
例如,假設(shè)您想預(yù)測誰會患上肺炎。 原始數(shù)據(jù)的前幾行可能如下所示:

got_pneumoniaageweightmaletook_antibiotic_medicine...
False65100FalseFalse...
False72130TrueFalse...
True58100FalseTrue...

人們在患肺炎后服用抗生素藥物才能康復(fù)。 因此原始數(shù)據(jù)顯示了這些列之間的緊密關(guān)系。 但是,確定了got_pneumonia的值后,take_antibiotic_medicine經(jīng)常被改變。 這是目標(biāo)泄漏。

該模型將發(fā)現(xiàn),對于take_antibiotic_medicine而言,任何具有False值的人都沒有肺炎。 驗(yàn)證數(shù)據(jù)來自同一來源,因此模式將在驗(yàn)證中重復(fù),模型將具有很好的驗(yàn)證(或交叉驗(yàn)證)分?jǐn)?shù)。 但隨后在現(xiàn)實(shí)世界中部署時(shí),該模型將非常不準(zhǔn)確。

為防止此類數(shù)據(jù)泄漏,應(yīng)排除在目標(biāo)值實(shí)現(xiàn)后更新(或創(chuàng)建)的任何變量。 因?yàn)楫?dāng)我們使用此模型進(jìn)行新的預(yù)測時(shí),該數(shù)據(jù)將無法使用。

Leaky Validation Strategy

當(dāng)您不小心區(qū)分訓(xùn)練數(shù)據(jù)和驗(yàn)證數(shù)據(jù)時(shí),會發(fā)生不同類型的泄漏。 例如,如果在調(diào)用train_test_split之前運(yùn)行預(yù)處理(比如為缺失值擬合Imputer),就會發(fā)生這種情況。 驗(yàn)證旨在衡量模型對之前未考慮過的數(shù)據(jù)的影響。 如果驗(yàn)證數(shù)據(jù)影響預(yù)處理行為,您可以以微妙的方式破壞此過程。最終結(jié)果? 您的模型將獲得非常好的驗(yàn)證分?jǐn)?shù),讓您對它充滿信心,但在部署它以做出決策時(shí)表現(xiàn)不佳。

Preventing Leaky Predictors

沒有一種解決方案可以普遍地防止泄漏的預(yù)測因素。 它需要有關(guān)您的數(shù)據(jù),特定案例檢查和常識的知識。

然而,泄漏預(yù)測因素通常與目標(biāo)具有高度統(tǒng)計(jì)相關(guān)性。 所以要記住兩個策略:

  • ???? 要篩選可能的泄漏預(yù)測因素,請查找與目標(biāo)統(tǒng)計(jì)相關(guān)的列。
  • ???? 如果您構(gòu)建模型并發(fā)現(xiàn)它非常準(zhǔn)確,則可能存在泄漏問題。

Preventing Leaky Validation Strategies

如果您的驗(yàn)證基于簡單的train-test-split,則從任何類型的擬合中排除驗(yàn)證數(shù)據(jù),包括預(yù)處理步驟的擬合。 如果您使用scikit-learn Pipelines,這會更容易。 使用交叉驗(yàn)證時(shí),使用管道并在管道內(nèi)進(jìn)行預(yù)處理更為重要。

Example

我們將使用一個關(guān)于信用卡應(yīng)用程序的小數(shù)據(jù)集,我們將構(gòu)建一個模型來預(yù)測哪些應(yīng)用程序被接受(存儲在一個名為card的變量中)。 以下是數(shù)據(jù):

[1]

import pandas as pddata = pd.read_csv('../input/AER_credit_card_data.csv', true_values = ['yes'],false_values = ['no']) print(data.head()) card reports age income share expenditure owner selfemp \ 0 True 0 37.66667 4.5200 0.033270 124.983300 True False 1 True 0 33.25000 2.4200 0.005217 9.854167 False False 2 True 0 33.66667 4.5000 0.004156 15.000000 True False 3 True 0 30.50000 2.5400 0.065214 137.869200 False False 4 True 0 32.16667 9.7867 0.067051 546.503300 True False dependents months majorcards active 0 3 54 1 12 1 3 34 1 13 2 4 58 1 5 3 0 25 1 7 4 2 64 1 5

我們使用data.shape看到這是一個小數(shù)據(jù)集(1312行),所以我們應(yīng)該使用交叉驗(yàn)證來確保模型質(zhì)量的準(zhǔn)確精度。

[2]

data.shape(1319, 12)

[3]

from sklearn.pipeline import make_pipeline from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import cross_val_scorey = data.card X = data.drop(['card'], axis=1)# Since there was no preprocessing, we didn't need a pipeline here. Used anyway as best practice modeling_pipeline = make_pipeline(RandomForestClassifier()) cv_scores = cross_val_score(modeling_pipeline, X, y, scoring='accuracy') print("Cross-val accuracy: %f" %cv_scores.mean())Cross-val accuracy: 0.979528

根據(jù)經(jīng)驗(yàn),您會發(fā)現(xiàn)找到98%的精確模型是非常罕見的。它發(fā)生了,但我們應(yīng)該更仔細(xì)地檢查數(shù)據(jù)以確定它是否是目標(biāo)泄漏。

以下是數(shù)據(jù)摘要,您也可以在數(shù)據(jù)選項(xiàng)卡下找到它:

  • card: Dummy variable, 1 if application for credit card accepted, 0 if not
  • reports: Number of major derogatory reports
  • age: Age n years plus twelfths of a year
  • income: Yearly income (divided by 10,000)
  • share: Ratio of monthly credit card expenditure to yearly income
  • expenditure: Average monthly credit card expenditure
  • owner: 1 if owns their home, 0 if rent
  • selfempl: 1 if self employed, 0 if not.
  • dependents: 1 + number of dependents
  • months: Months living at current address
  • majorcards: Number of major credit cards held
  • active: Number of active credit accounts


一些變量看起來很可疑。例如,expenditure是指支付此卡還是在使用之前卡上的支出?

此時(shí),基本數(shù)據(jù)比較可能非常有用:

[4]

expenditures_cardholders = data.expenditure[data.card] expenditures_noncardholders = data.expenditure[~data.card]print('Fraction of those who received a card with no expenditures: %.2f' \%(( expenditures_cardholders == 0).mean())) print('Fraction of those who received a card with no expenditures: %.2f' \%((expenditures_noncardholders == 0).mean())) Fraction of those who received a card with no expenditures: 0.02 Fraction of those who received a card with no expenditures: 1.00

每個人(card == False)都沒有支出,而card== True的人中只有2%沒有支出。 我們的模型似乎具有高精度并不奇怪。 但這似乎是數(shù)據(jù)泄露,其中支出可能意味著*他們申請的卡上的支出。**。

由于share部分由支出決定,因此也應(yīng)予以排除。 變量active,majorcards有點(diǎn)不太清楚,但從描述中看,它們聽起來很有意義。 在大多數(shù)情況下,如果您無法追蹤創(chuàng)建數(shù)據(jù)的人員以了解更多信息,那么最好是安全而不是抱歉。

我們將運(yùn)行一個沒有泄漏的模型如下:

[5]

potential_leaks = ['expenditure', 'share', 'active', 'majorcards'] X2 = X.drop(potential_leaks, axis=1) cv_scores = cross_val_score(modeling_pipeline, X2, y, scoring='accuracy') print("Cross-val accuracy: %f" %cv_scores.mean())Cross-val accuracy: 0.806677

這種準(zhǔn)確性相當(dāng)?shù)?#xff0c;這一方面令人失望。 但是,我們可以預(yù)期在新應(yīng)用程序中使用它的時(shí)間大約為80%,而泄漏模型可能會比這更糟糕(即使它在交叉驗(yàn)證中的表觀得分更高)。

Conlusion

在許多數(shù)據(jù)科學(xué)應(yīng)用中,數(shù)據(jù)泄漏可能是數(shù)百萬美元的錯誤。 仔細(xì)分離訓(xùn)練和驗(yàn)證數(shù)據(jù)是第一步,管道可以幫助實(shí)現(xiàn)這種分離。 泄漏預(yù)測因素是一個更常見的問題,泄漏的預(yù)測因子更難以追蹤。 謹(jǐn)慎,常識和數(shù)據(jù)探索的組合可以幫助識別泄漏的預(yù)測變量,以便從模型中刪除它們。

Exercise


查看正在進(jìn)行的項(xiàng)目中的數(shù)據(jù)。 有沒有可能導(dǎo)致泄漏的預(yù)測因子? 作為提示,來自Kaggle比賽的大多數(shù)數(shù)據(jù)集都沒有這些變量。 一旦你通過那些精心策劃的數(shù)據(jù)集,這就成了一個常見的問題。

總結(jié)

以上是生活随笔為你收集整理的13.Data Leakage的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。