中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

手把手:如何方便地使用Python和Pandas來匿名信息

2018-09-30    來源:raincent

容器云強(qiáng)勢上線!快速搭建集群,上萬Linux鏡像隨意使用

最近,我收到了一個數(shù)據(jù)集,其中包含有關(guān)客戶的敏感信息,這些信息在任何情況下都不應(yīng)公開。數(shù)據(jù)集位于我們的一臺服務(wù)器上,一個相當(dāng)安全的地方。

但我想將數(shù)據(jù)復(fù)制到我的本地磁盤上,以便更方便地處理數(shù)據(jù),同時又不希望擔(dān)心數(shù)據(jù)不安全。于是,我寫了一個改變數(shù)據(jù)的小腳本,同時仍然保留了一些關(guān)鍵信息。我將詳細(xì)介紹我所采取的所有步驟,并重點(diǎn)介紹一些方便的技巧。

任務(wù)

我們的任務(wù)是準(zhǔn)備一個數(shù)據(jù)集,以便以后能用于機(jī)器學(xué)習(xí)(例如分類,回歸,聚類)而且不包含任何敏感信息。最終的數(shù)據(jù)集不應(yīng)與原始數(shù)據(jù)集有太大差異,且應(yīng)該反映原始數(shù)據(jù)集的分布。

動手開始吧!

我使用Jupyter notebook作為編程環(huán)境。首先,讓我們引入所有必須的庫。

 

 

我假設(shè)您已熟悉此處使用的大多數(shù)庫。我只想強(qiáng)調(diào)三件事。sklearn_pandas是一個方便的庫,減少了使用兩個包之間的差距。

sklearn_pandas:

https://github.com/scikit-learn-contrib/sklearn-pandas

它提供了一個DataFrameMapper類,使得處理pandas.DataFrame更容易,因為它可以在更少的代碼行中完成變量的編碼轉(zhuǎn)換。

我利用IPython.core.interactiveshell ...更改了Jupyter Notebook默認(rèn)配置,用來顯示多個輸出。這里有一篇很好的博文介紹了其他關(guān)于Jupyter的實用小技巧。

最后,我們將一些代碼放入一個名為utils.py的文件中,我們把這個文件放在Notebook代碼文件旁邊。

Jupyter的實用小技巧:

https://www.dataquest.io/blog/jupyter-notebook-tips-tricks-shortcuts/

 

 

我們的分析采用Titanic Dataset的訓(xùn)練數(shù)據(jù)集。

數(shù)據(jù)集鏈接:

https://www.kaggle.com/c/titanic

 

 

 

 

現(xiàn)在我們已經(jīng)加載了數(shù)據(jù),后面將刪除所有可識別個人身份的信息。列[“PassengerId”,“Name”]包含此類信息。請注意,[“PassengerId”,“Name”]對于每一行都是唯一的,因此如果構(gòu)建機(jī)器學(xué)習(xí)模型,無論如何都需要在后續(xù)刪除它們。

同樣對[“Ticket”,“Cabin”]列也進(jìn)行類似的操作,因為這兩列對于每一行幾乎都是唯一的。

出于演示方便,我們不會處理缺失值。我們只是忽略所有包含缺失值的觀察結(jié)果。

 

 

結(jié)果看起來像這樣。

 

 

 

 

接下來,為了剔除更多信息,并作為后續(xù)步驟的預(yù)處理,我們將對“Sexed”和“Embarked”進(jìn)行數(shù)值編碼轉(zhuǎn)換。

“Sex”被編碼為“0,1”,“Embarked”被編碼為“0,1,2”。LabelEncoder()類為我們完成了大部分工作。

 

 

DataFrameMapper來自sklearn_pandas包,接收元組(tuple)列表作為參數(shù),其中元組的第一項是列名,第二項是轉(zhuǎn)換器。

我們在這里使用LabelEncoder(),但也可以使用其它轉(zhuǎn)換器(MinMaxScaler(),StandardScaler(),F(xiàn)unctionTransfomer())。

在最后一行中,我們將編碼后的數(shù)據(jù)與其余數(shù)據(jù)連接起來。請注意,您也可以寫axis = 1,但是axis =“columns”可讀性更強(qiáng),我鼓勵大家使用后者。

 

 

 

 

 

 

 

 

通過從同一分布中抽樣來匿名化

上述代碼我打印了每列的唯一值的取值個數(shù)。我們假設(shè)具有少于20個取值個數(shù)的是名義變量或分類變量,具有大于等于20個取值個數(shù)的都是連續(xù)變量。

我們將名義/分類變量放在一個列表中,將其它變量放在另一個列表中。

 

 

for c in list(df): 迭代所有列。對于list(df),我們也可以寫成df.columns.tolist()。我還是喜歡list(df)。

以下是本文的核心思想:對于每個分類變量,我們將計算其每項取值出現(xiàn)的頻率,然后為每個取值創(chuàng)建具有相同頻率的離散概率分布。

對于每個連續(xù)變量,我們將從預(yù)定義的分布列表中確定最佳連續(xù)分布。我們怎么做呢?一旦確定了所有概率分布(離散和連續(xù)),我們就可以從這些分布中進(jìn)行采樣以創(chuàng)建新的數(shù)據(jù)集。

處理名義/分類變量

這是一個簡單的例子,只用三行代碼。

 

 

 

 

首先,我們確定變量中每個唯一值出現(xiàn)的頻率。然后我們使用這個經(jīng)驗概率函數(shù)并將其傳遞給np.random.choice()以創(chuàng)建一個具有相同概率函數(shù)的新隨機(jī)變量。

處理連續(xù)變量

幸運(yùn)的是,StackOverflow上有一個類似問題的討論。主要解決方案如下,對于每個連續(xù)變量做如下處理:

使用預(yù)定義數(shù)量的區(qū)間來創(chuàng)建直方圖

嘗試一系列連續(xù)函數(shù),讓每個函數(shù)都去擬合該直方圖,擬合過程中會產(chǎn)生函數(shù)的參數(shù)。

找到具有最小誤差(最小殘差平方和)的函數(shù),該函數(shù)與該直方圖將被我們用來模擬連續(xù)變量分布。

該解決方案的作者將所有內(nèi)容整齊地分為兩個函數(shù)。我創(chuàng)建了第三個函數(shù)并將所有內(nèi)容放在一個名為utils.py的文件中,后面將在Jupyter Notebook中使用utils.py中定義的函數(shù)。

 

 

Age的最佳分布是fisk,F(xiàn)are的最佳分布是halfcauchy,讓我們來看看結(jié)果。

 

 

 

 

 

 

還不錯哦。

把代碼整合到一個函數(shù)中

 

 

現(xiàn)在我們有了一個函數(shù),可以用它來創(chuàng)建100個新的觀測值。

 

 

 

 

作為后置處理步驟,還可以對連續(xù)變量進(jìn)行取舍。我選擇不這樣做。我所做的是刪除了所有列名,因為這也可能泄漏有關(guān)數(shù)據(jù)集的一些信息,簡單地用0,1,2…替換它們。

 

 

 

 

最后,大功告成。

 

 

總結(jié)

這種方法的一個缺點(diǎn)是變量之間的所有交互都丟失了。例如,假設(shè)在原始數(shù)據(jù)集中,女性(Sex= 1)存活的機(jī)會(Survived= 1)比男性(Sex= 0)高,而在生成的數(shù)據(jù)集中,這個信息丟失了,其它變量之間可能存在的關(guān)系也會丟失。

我希望你發(fā)現(xiàn)這篇文章有用,可以在文末留言區(qū)討論。

標(biāo)簽: 安全 代碼 服務(wù)器 腳本

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請與原作者聯(lián)系。

上一篇:Facebook遭黑客攻擊,5千萬用戶數(shù)據(jù)面臨風(fēng)險

下一篇:數(shù)據(jù)科學(xué)與大數(shù)據(jù)技術(shù)面試建議與技巧之危險信號