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

兩種數(shù)據(jù)科學(xué)編程中的思維模式(附代碼)

2018-10-16    來源:raincent

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

數(shù)據(jù)科學(xué)的完整流程一般包含以下幾個(gè)組成部分:

♦ 數(shù)據(jù)收集

♦ 數(shù)據(jù)清洗

♦ 數(shù)據(jù)探索和可視化

♦ 統(tǒng)計(jì)或預(yù)測(cè)建模

雖然這些組成部分有助于我們理解數(shù)據(jù)科學(xué)的不同階段,但對(duì)于編程工作流并無(wú)助益。

通常而言,在同一個(gè)文件中覆蓋完整的流程將會(huì)導(dǎo)致Jupyter Notebook、腳本變成一團(tuán)亂麻。此外,大多數(shù)的數(shù)據(jù)科學(xué)問題都要求我們?cè)跀?shù)據(jù)收集、數(shù)據(jù)清洗、數(shù)據(jù)探索、數(shù)據(jù)可視化和統(tǒng)計(jì)/預(yù)測(cè)建模中切換。

但是還存在更好的方法來組織我們的代碼!在這篇博客中,我將介紹大多數(shù)人在做數(shù)據(jù)科學(xué)編程工作的時(shí)候切換的兩套思維模式:原型思維模式和生產(chǎn)流思維模式。

 

 

我個(gè)人使用JupyteLab來進(jìn)行整個(gè)流程的操作(包括寫原型代碼和生產(chǎn)流代碼)。我建議至少使用JupyteLab來寫原型代碼:

JupyteLab:

http://jupyterlab.readthedocs.io/en/stable/getting_started/installation.html

借貸俱樂部數(shù)據(jù)

為了更好地理解原型和生產(chǎn)流兩種思維模式,我們來處理一些真實(shí)的數(shù)據(jù)。我們將使用個(gè)人對(duì)個(gè)人的借貸網(wǎng)站——借貸俱樂部上面的借貸數(shù)據(jù)。跟銀行不同,借貸俱樂部自身并不借錢,而是為貸款人提供一個(gè)市場(chǎng)以貸款給因不同的原因(比如維修、婚禮)需要借款的個(gè)人。

借貸俱樂部網(wǎng)站:

https://www.dataquest.io/blog/programming-best-practices-for-data-science/www.lendingclub.com

我們可以使用這個(gè)數(shù)據(jù)來建立一個(gè)模型,判斷一個(gè)給定的貸款申請(qǐng)是否會(huì)成功。這篇博客中,我們不會(huì)深入到建立機(jī)器學(xué)習(xí)模型工作流。

借貸俱樂部提供關(guān)于成功的貸款(被借貸俱樂部和聯(lián)合貸款人通過的貸款)和失敗的貸款(被借貸俱樂部和聯(lián)合貸款人拒絕的貸款,款項(xiàng)并沒有轉(zhuǎn)手)的詳盡歷史數(shù)據(jù)。打開他們的數(shù)據(jù)下載頁(yè),選擇2007-2011年,并下載數(shù)據(jù):

數(shù)據(jù)下載頁(yè):

https://www.lendingclub.com/info/download-data.action

 

 

原型思維模式

在原型思維模式中,我們比較關(guān)心快速迭代,并嘗試了解數(shù)據(jù)中包含的特征和事實(shí)。創(chuàng)建一個(gè)Jupyter Notebook,并增加一個(gè)Cell來解釋:

♦ 你為了更好地了解借貸俱樂部而做的所有調(diào)查

♦ 有關(guān)你下載的數(shù)據(jù)集的所有信息

首先,讓我們將csv文件讀入pandas:

import pandas as pd
loans_2007 = pd.read_csv('LoanStats3a.csv')
loans_2007.head(2)

我們得到兩部分輸出,首先是一條警告信息:

/home/srinify/anaconda3/envs/dq2/lib/python3.6/site-packages/IPython/core/interactiveshell.py:2785: DtypeWarning: Columns (0,1,2,3,4,7,13,18,24,25,27,28,29,30,31,32,34,36,37,38,39,40,41,42,43,44,46,47,49,50,51,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,123,124,125,126,127,128,129,130,131,132,133,134,135,136,142,143,144) have mixed types. Specify dtype option on import or set low_memory=False.

interactivity=interactivity, compiler=compiler, result=result)

然后是數(shù)據(jù)框的前5行,這里我們就不展示了(太長(zhǎng)了)。

警告信息讓我們了解到如果我們?cè)谑褂胮andas.read_csv()的時(shí)候?qū)ow_memory參數(shù)設(shè)為False的話,數(shù)據(jù)框里的每一列的類型將會(huì)被更好地記錄。

第二個(gè)輸出的問題就更大了,因?yàn)閿?shù)據(jù)框記錄數(shù)據(jù)的方式存在著問題。JupyterLab有一個(gè)內(nèi)建的終端,所以我們可以打開終端并使用bash命令head來查看原始文件的頭兩行數(shù)據(jù)。

head -2 LoanStats3a.csv

原始的csv文件第二行包含了我們所期望的列名,看起來像是第一行數(shù)據(jù)導(dǎo)致了數(shù)據(jù)框的格式問題:

Notes offered by Prospectus

https://www.lendingclub.com/info/prospectus.action

增加一個(gè)Cell來說明你的觀察,并增加一個(gè)code cell來處理觀察到的問題。

import pandas as pd

loans_2007 = pd.read_csv('LoanStats3a.csv', skiprows=1, low_memory=False)

在借貸俱樂部下載頁(yè)查看數(shù)據(jù)字典以了解哪些列沒有包含對(duì)特征有用的信息。Desc和url列很明顯就沒有太大的用處。

loans_2007 = loans_2007.drop(['desc', 'url'],axis=1)

然后就是將超過一半以上都缺失值的列去掉,使用一個(gè)cell來探索哪一列符合這個(gè)標(biāo)準(zhǔn),再使用另一個(gè)cell來刪除這些列。

loans_2007.isnull().sum()/len(loans_2007)
loans_2007 = loans_2007.dropna(thresh=half_count, axis=1)

因?yàn)槲覀兪褂肑upyter Notebook來記錄我們的想法和代碼,所以實(shí)際上我們是依賴于環(huán)境(通過IPython內(nèi)核)來記錄狀態(tài)的變化。這讓我們能夠自由地移動(dòng)cell,重復(fù)運(yùn)行同一段代碼,等等。

通常而言,原型思維模式專注于:

可理解性:

♦ 使用Markdown cell來記錄我們的觀察和假設(shè)

♦ 使用一小段代碼來進(jìn)行真實(shí)的邏輯操作

♦ 使用大量的可視化和計(jì)數(shù)

抽象最小化:

♦ 大部分的代碼都不在函數(shù)中(更為面向?qū)ο?

我們會(huì)花時(shí)間來探索數(shù)據(jù)并且寫下我們采取哪些步驟來清洗數(shù)據(jù),然后就切換到工作流模式,并且將代碼寫得更強(qiáng)壯一些。

生產(chǎn)流模式

在生產(chǎn)流模式,我們會(huì)專注于寫代碼來統(tǒng)一處理更多的情況。比如,我們想要可以清洗來自借貸俱樂部的所有數(shù)據(jù)集的代碼,那么最好的辦法就是概括我們的代碼,并且將它轉(zhuǎn)化為數(shù)據(jù)管道。數(shù)據(jù)管道是采用函數(shù)式編程的原則來設(shè)計(jì)的,數(shù)據(jù)在函數(shù)中被修改,并在不同的函數(shù)之間傳遞:

函數(shù)式編程教程:

https://www.dataquest.io/blog/introduction-functional-programming-python/

這里是數(shù)據(jù)管道的第一個(gè)版本,使用一個(gè)單獨(dú)的函數(shù)來封裝數(shù)據(jù)清洗代碼。

import pandas as pd
def import_clean(file_list):
frames
= []
for file in file_list:
loans = pd.read_csv(file, skiprows=1, low_memory=False)
loans = loans.drop(['desc', 'url'], axis=1)
half_count = len(loans)/2
loans = loans.dropna(thresh=half_count, axis=1)
loans = loans.drop_duplicates()
# Drop first group of features
loans = loans.drop(["funded_amnt", "funded_amnt_inv", "grade", "sub_grade", "emp_title", "issue_d"], axis=1)
# Drop second group of features
loans = loans.drop(["zip_code", "out_prncp", "out_prncp_inv", "total_pymnt", "total_pymnt_inv", "total_rec_prncp"], axis=1)
# Drop third group of features
loans = loans.drop(["total_rec_int", "total_rec_late_fee", "recoveries", "collection_recovery_fee", "last_pymnt_d", "last_pymnt_amnt"], axis=1)
frames.append(loans)
return frames
frames = import_clean(['LoanStats3a.csv'])

在上面的代碼中,我們將之前的代碼抽象為一個(gè)函數(shù)。函數(shù)的輸入是一個(gè)文件名的列表,輸出是一個(gè)數(shù)據(jù)框的列表。

普遍來說,生產(chǎn)流思維模式專注于:

適合的抽象程度

♦ 代碼應(yīng)該被泛化以匹配的類似的數(shù)據(jù)源

♦ 代碼不應(yīng)該太過泛化以至于難以理解

管道穩(wěn)定性

♦ 可依賴程度應(yīng)該和代碼運(yùn)行的頻率相匹配(每天?每周?每月?)

在不同的思維模式中切換

假設(shè)我們?cè)谶\(yùn)行函數(shù)處理所有來自借貸俱樂部的數(shù)據(jù)集的時(shí)候報(bào)錯(cuò)了,部分潛在的原因如下:

♦ 不同的文件當(dāng)中列名存在差異

♦ 超過50%缺失值的列存在差異

♦ 數(shù)據(jù)框讀入文件時(shí),列的類型存在差異

在這種情況下,我們就要切換回原型模式并且探索更多。如果我們確定我們的數(shù)據(jù)管道需要更為彈性化并且能夠處理數(shù)據(jù)特定的變體時(shí),我們可以將我們的探索和管道的邏輯再結(jié)合到一起。

以下是我們調(diào)整函數(shù)以適應(yīng)不同的刪除閾值的示例:

import pandas as pd
def import_clean(file_list, threshold=0.5):
frames
= []
for file in file_list:
loans = pd.read_csv(file, skiprows=1, low_memory=False)
loans = loans.drop(['desc', 'url'], axis=1)
threshold_count = len(loans)*threshold
loans = loans.dropna(thresh=half_count, axis=1)
loans = loans.drop_duplicates()
# Drop first group of features
loans = loans.drop(["funded_amnt", "funded_amnt_inv", "grade", "sub_grade", "emp_title", "issue_d"], axis=1)
# Drop second group of features
loans = loans.drop(["zip_code", "out_prncp", "out_prncp_inv", "total_pymnt", "total_pymnt_inv", "total_rec_prncp"], axis=1)
# Drop third group of features
loans = loans.drop(["total_rec_int", "total_rec_late_fee", "recoveries", "collection_recovery_fee", "last_pymnt_d", "last_pymnt_amnt"], axis=1)
frames.append(loans)
return frames
frames = import_clean(['LoanStats3a.csv'], threshold=0.7)

默認(rèn)值是0.5,如果需要的話,我們也可以改為0.7。

這是一些將管道改得更為彈性的方式,按推薦程度降序排列:

♦ 使用可選參數(shù)、位置參數(shù)和必需參數(shù)

♦ 在函數(shù)中使用if / then語(yǔ)句以及使用布爾輸入值作為函數(shù)的輸入

♦ 使用新的數(shù)據(jù)結(jié)構(gòu)(字典,列表等)來表示特定數(shù)據(jù)集的自定義操作

這個(gè)管道可以擴(kuò)展到數(shù)據(jù)科學(xué)工作流程的所有階段。這是一些偽代碼,可以總攬它的結(jié)構(gòu)。

import pandas as pd
def import_clean(file_list, threshold=0.5):
## Code
def visualize(df_list):
# Find the most important features and generate pairwise scatter plots
# Display visualizations and write to file.
plt.savefig("scatter_plots.png")
def combine(df_list):
# Combine dataframes and generate train and test sets
# Drop features all dataframes don't share
# Return both train and test dataframes
return train,test
def train(train_df):
# Train model
return model
def validate(train_df, test-df):
# K-fold cross validation
# Return metrics dictionary
return metrics_dict
frames
= import_clean(['LoanStats3a.csv', 'LoanStats2012.csv'], threshold=0.7)
visualize(frames)
train_df, test_df = combine(frames)
model = train(train_df)
metrics = test(train_df, test_df)
print(metrics)

下一步

如果你對(duì)加深理解和練習(xí)感興趣的話,我推薦:

♦ 了解如何將你的管道轉(zhuǎn)化為作為一個(gè)模塊或者從命令行中單獨(dú)運(yùn)行的腳本:

https://docs.python.org/3/library/main.html

♦ 了解如何使用Luigi來構(gòu)建更復(fù)雜的、能夠在云上面運(yùn)行的管道

https://marcobonzanini.com/2015/10/24/building-data-pipelines-with-python-and-luigi/

♦ 了解更多有關(guān)數(shù)據(jù)工程的信息:

https://www.dataquest.io/blog/tag/data-engineering/

相關(guān)報(bào)道

https://www.kdnuggets.com/2018/08/programming-best-practices-data-science.html

標(biāo)簽: isp 代碼 腳本

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

上一篇:時(shí)間序列大數(shù)據(jù)平臺(tái)建設(shè)經(jīng)驗(yàn)談

下一篇:英國(guó)薩里大學(xué)金耀初教授:看進(jìn)化計(jì)算在人工智能領(lǐng)域的未來發(fā)展