构建数据科学档案:机器学习项目
原文:Building a data science portfolio: Machine learning project
作者:Vik Paruchuri,開發(fā)者,數據科學家,Dataquest.io創(chuàng)始人
翻譯:Alvin 校審:KK4SBB
責編:周建丁(zhoujd@csdn.net)
下文僅是一系列關于如何建立數據科學檔案(Data Science Portfolio)的文章的一部分。如果你喜歡此篇文章,并且想得到該系列最新的連載文章,可以在頁面的底部選擇訂閱。
大數據企業(yè)在評估新員工的時候會越來越重視他們的檔案。原因之一就是檔案是判斷某人在現實世界的技能的最佳方式。但好的消息是此檔案完全在你的的掌控范圍內,如果你做了一定的工作,你將得到一份企業(yè)青睞的好檔案。
建立優(yōu)質數據檔案的第一步是確定需要展示哪些技能。如下是企業(yè)想在你的數據檔案里看到的一些基本技能:
- 溝通的能力。
- 與他人合作的能力。
- 技術的程度。
- 解釋能力的相關數據。
- 動力和主觀能動性。
任何一個優(yōu)秀的檔案是由多個項目組成,每個項目至少包括上述的一到兩點。此文是一系列關于如何建立數據科學檔案的文章的一部分。在文章中將會講述到如何在你的數據檔案中添加第二個項目,而且將會闡述如何構建一個端對端的機器學習項目。在文章最后,你將會擁有一個通過數據展現你的水平和技術能力的項目。如果你感興趣一定不能錯過此篇文章。
端對端的項目
作為一個數據科學的科學家,有時候你會被要求得出一個數據集并且要描述他。在這種情況下,良好的交流過程和連貫的思路變得很重要。比如一些工具例如“Jupyter 記事本”(Jupyter notebook),這個工具在我們這之前的文章中使用過,對我們的幫助很大。這里想說的是,我們期待的成果是一個能總結你的發(fā)現成果的演示或者文檔。
然而有些時候,你會被要求創(chuàng)建一個具有操作價值的項目。這個具有操作價值的項目直接影響公司的日常運作,并且使用的時間和操作的人數都會很大。這樣的任務可能是用來“創(chuàng)建一個算法來預測我們的客戶的流失率”或者“創(chuàng)建一個可以自動標識我們的文章的模型”。在這只能過情況下,敘述故事跟技術能力相比,就顯得不是那么重要了。你需要構建并且了解一個數據集,然后創(chuàng)建一組可以處理數據的腳本程序。重要的是這些腳本運行要很快并且盡可能少的使用例如內存的系統資源。常見的是這些腳本程序將運行不止一次,所以需要交付的是實實在在的程序代碼而不是一個流程演示。同時這些交付項目往往是需要納入業(yè)務流程的范疇,甚至可能是面向用戶的。
構建端對端項目的主要要素如下:
- 理解上下文。
- 研究數據并找出其中細微的差別。
- 創(chuàng)建一個結構良好的項目,所以此項目才能輕松地集成到操作流程里。
- 編寫高性能的,運行速度快的,并使用最少系統資源的代碼。
- 記錄你的程序安裝和使用情況,好的記錄會反應你的代碼質量的好壞,從而方便代碼的復用。
為了有效創(chuàng)建這種類型的項目,我們需要操作多個文件。使用文本編輯器比如Atom,或者集成開發(fā)環(huán)境比如強烈推薦PyCharm。這些工具可以方便你在文件之間切換并且編輯不同類型的文件,比如markdown文件,Python文件,csv文件等等。還有構建你的項目,所以版本控制變得非常容易操作,同時可以上傳到可協作編碼工具例如Github。
在這篇文章中,我們將使用我們的編輯工具,比如Pandas和scikit-learn。我們將廣泛的利用Pandas的數據框,它可以很容易地閱讀和操作Python上的數據表格。
尋找優(yōu)秀的數據集
一個好的端對端數據集項目是很難找到。這就要求數據量需要足夠的大,這樣才能使得存儲器和系統性能發(fā)揮作用。它還可能需要在操作上非常有用,例如,在這個數據集中包含錄取標準,畢業(yè)率數據,并且畢業(yè)后的未來收益對于一個美國大學都是將是一個值得稱贊的巨大數據檔案。但是,當你在考慮這個數據集時,你會清楚地發(fā)現它沒有足夠的差別以建立一個良好的端對端項目。例如,你可以告訴別人他的潛在的未來收益,如果他們去了一個特殊的大學,但是這將沒有足夠的差別來快速表明其技術水平。你也可以判別是否具有較高入學標準的院校會擁有更多薪資的畢業(yè)生,這將比運營更具有故事性。
當你擁有比千兆字節(jié)還要多的數據時,這些內存和性能的限制往往會發(fā)揮作用,同時當你需要預測一些事情的時候,其中涉及的運行算法是要超過數據集本身的。
良好的操作數據使你能夠創(chuàng)建一組轉換數據的腳本程序,并且即時地回答問題。一個很好的例子就是關于股票價格的數據集。你將能夠預測第二天的價格,并將最新的數據反饋給后臺作為交易的結果。這將有利于你進行交易甚至可能從中盈利。這不僅僅是講述一個故事,而是從中獲利。
這里有一些能夠找到這樣的數據集的好地方:
- /r/datasets,一個擁有數百個有趣的數據集的版塊。
- Google Public Datasets,可以通過谷歌的BigQuery得到的公共數據集。
- Awesome datasets,一個托管在Github上的數據集列表。
在查看這些數據集的時候,想想有人會問到跟此數據集相關的問題,并且如果這些問題都是一次性的(“住房價格和標準普爾500指數有什么關聯?”)或者是(“你能預測股市嗎?”)。這里的關鍵是找到正在進行的,并需要相同的代碼在多次運行的問題中輸入不同的數據。
對于這篇文章的目的而言,我們將看看Fannie Mae貸款數據,Fannie Mae是美國政府贊助的企業(yè),用來從其他貸款人手中購買按揭貸款。然后,它捆綁了這些貸款作為抵押貸款放入證券和轉售他人。這使得貸款人有更多的按揭貸款,并且在市場上創(chuàng)造更多的流動性。這在理論上會產生更多的購房交易和更好地貸款條件。雖然從借款人的角度來看,事情保持大致相同。
Fannie Mae發(fā)布了兩種類型的數據,一種是獲得貸款的數據另一種是貸款表現的數據。在理想情況下,有人從貸款人借錢,然后償還貸款,直到余額為零。然而,一些借貸人錯過了多次付款的機會,這可能會導致他們喪失抵押品的贖回權。當抵押品的贖回權喪失的時候,房子就會被銀行沒收,因為他們無法按時還款。Fannie Mae錯過了對支付貸款的跟蹤和哪些貸款被取消了贖回權。此數據每季度出版一次,并且落后當前數據一年,在撰寫本文時所用的最新的數據集止于2015年第一季度。
這些由Fannie Mae出版的采集數據,包含借貸人的信息,比如,信用分數,貸款和家庭的信息,收入信息。當貸款放出后,每季度公布這些信息,包括借款人的取消抵押品贖回權的狀態(tài)和任何的支付信息。這些貸款可能會包含十幾行的情況數據。好消息是這些收獲的數據告訴你Fannie Mae 目前正在控制貸款,并且這些數據包含了一系列貸款狀態(tài)的最新信息。其中一個最新的狀態(tài)可能告訴我們貸款在一些季度會取消抵押品贖回權。
選擇一個角度
這里有幾個我們可以探索的Fannie Mae的數據:
- 嘗試在其抵債之后再預測房子的銷售價格。
- 預測借款人的付款記錄。
- 弄清楚在數據采集期間每筆貸款的得分。
重要的是要堅持一個角度,如果試圖把重點放在太多的事情上將很難一下子做出一個高效的項目,而且選擇那些有足夠差別的角度也同樣重要。這里有幾個沒有過多差別的角度的例子:
- 哪些銀行向Fannie Mae出售貸款的止贖是最多的。
- 搞清楚借款人的信用分數的趨勢。
- 探索哪些類型的房屋經常性的止贖。
- 探索貸款金額和取消抵押品贖回權的銷售價格之間的關系。
以上的所有角度都是有意義的,如果我們都集中在敘述環(huán)節(jié)將會是很大的任務,但并沒有為此任務做出相應的配合。
隨著Fannie Mae的數據集,我們將嘗試預測是否貸款將被止贖僅使用被收購的貸款信息。實際上,我們將創(chuàng)建任何抵押貸款,這將告訴我們如果Fannie Mae應當買它還是不能買。這將為我們提供一個很好的基礎來構建,并且也是一塊很大的檔案。
了解數據
讓我們來簡單看一下一個原始的數據文件,下面是從2012年第一季度所采集的數據的前幾行:
100000853384|R|OTHER|4.625|280000|360|02/2012|04/2012|31|31|1|23|801|N|C|SF|1|I|CA|945||FRM| 100003735682|R|SUNTRUST MORTGAGE INC.|3.99|466000|360|01/2012|03/2012|80|80|2|30|794|N|P|SF|1|P|MD|208||FRM|788 100006367485|C|PHH MORTGAGE CORPORATION|4|229000|360|02/2012|04/2012|67|67|2|36|802|N|R|SF|1|P|CA|959||FRM|794下面是2012年第一季度業(yè)績數據的前幾行:
100000853384|03/01/2012|OTHER|4.625||0|360|359|03/2042|41860|0|N|||||||||||||||| 100000853384|04/01/2012||4.625||1|359|358|03/2042|41860|0|N|||||||||||||||| 100000853384|05/01/2012||4.625||2|358|357|03/2042|41860|0|N||||||||||||||||在早早開始編碼之前,有些時候這些都是很重要的,而且需要真正理解數據。這是在業(yè)務項目中更重要的,因為我們無法交互式的探索數據,它可以是很難察覺到的細微差別,除非我們能找到它們的上一層。在這種情況下,第一個步驟就是讀取Fannie Mae網站上的資源:
- 概括
- 有用的術語表
- 常見問題解答
- 收購事項及性能文件
- 數據采集文件的樣品
- 性能采集文件的樣品
在瀏覽這些文件之后,我們知道了一些有助于我們的關鍵事實:
- 這里有從從2000年至今獲取文件和每個季度業(yè)績的文件,數據有一年的延遲,所以寫這篇文章的數據引用自最新的2015年的數據。
- 該文件是文本格式,用附號(|) 作為分隔符。
- 該文件沒有標題,但我們有表格知道每一列代表的是什么。
- 總之,該文件包含2200萬個貸款數據。
- 因為性能文件包含以前的年度獲得的貸款數據,所以前幾年的貸款收購將有更多的性能數據(即在2015年獲得的貸款將不會有太大的歷史業(yè)績記錄)。
當我們弄清楚如何構建我們的項目和處理的數據信息時,這些小細節(jié)會為我們節(jié)約大量的時間。
構建項目
在我們下載和探索數據之前,有必要思考如何構建項目的結構。當構建端對端的項目時,我們的主要目標是:
- 創(chuàng)建一個可行的解決方案。
- 使用一個能快速運行并且使用最少資源的解決方案。
- 讓他人能輕松的在你的成果基礎上進行擴展。
- 讓別人能夠容易理解你的代碼。
- 盡可能的精簡代碼。
為了實現這些目標,我們需要調整我們的項目。一個結構良好的項目擁有如下幾點原則:
- 隔離數據文件和代碼文件。
- 隔離生成的數據和原始數據。
- 擁有一個README.md文件能告訴用戶部署和使用項目。
- 擁有一個requirements.txt文件列出了運行項目所需的所有包。
- 擁有一個settings.py文件包含在其他文件中使用的設置信息,
- 例如,如果你正在多個Python腳本中閱讀相同的文件,把他們全部導入設置并集中得到它們的名字是非常有用的。
- 擁有一個.gitignore文件能防止大型或機密的文件被竊取。
- 將任務的每個步驟可單獨執(zhí)行的文件,
- 例如,我們可以讓一個文件擁有創(chuàng)建功能,另一個文件用來進行預測讀數。
- 存儲中間值。
- 例如,一個腳本輸出的文件可以被下一個腳本讀取。這使得我們能夠在數據處理流程中無需重新計算。
我們的文件結構是這樣的:
loan-prediction ├── data ├── processed ├── .gitignore ├── README.md ├── requirements.txt ├── settings.py創(chuàng)建初始文件
首先,我們需要建立一個貸款預測的文件夾。在這個文件夾里,我們需要做一個數據文件夾和進程文件夾,前一個將存儲我們的原始數據,而后一個將存儲任何的中間計算值。
接下來,我們將創(chuàng)建一個.gitignore文件,此文件用來確認某些文件被忽略的git信息,而不會上傳到Github上。此類文件的一個很好的例子是由OSX的每個文件夾中創(chuàng)建的.DS_Store文件。在這里對于.gitignore文件是一個很好的開端。我們還需要忽略數據文件,因為它們是非常大的,而且Fannie Mae的條款禁止我們重新分配數據,所以我們需要在文件的末尾添加兩行:
data processed這里有此項目的一個.gitignore文件的示例。
接下來,我們需要創(chuàng)建README.md文件,這將幫助人們了解這個項目。.MD表示給文件是markdown格式。Markdown格式能讓你編寫純文本,而且即使你想添加一些花哨的格式也可以支持。這里有markdown格式的指南。如果你上傳了一個名為README.md的文件到Github,Github將自動處理markdown格式,并展示給任何對此項目感興趣的人。下面是一個例子。
現在,我們只需要把一個簡單的描述添加到README.md文件里:
Loan Prediction -----------------------Predict whether or not loans acquired by Fannie Mae will go into foreclosure. Fannie Mae acquires loans from other lenders as a way of inducing them to lend more. Fannie Mae releases data on the loans it has acquired and their performance afterwards [here](http://www.fanniemae.com/portal/funding-the-market/data/loan-performance-data.html).現在,我們可以創(chuàng)建一個名叫equirements.txt的文件,這個文件會幫助其他人容易的部署我們的項目。我們還不知道將會使用哪些庫,這里還有一個很好的開頭:
pandas matplotlib scikit-learn numpy ipython scipy以上的庫中最常用的Python數據分析任務,其基本預測我們會用到其中大多數的庫。下面是該項目的例子要求的文件。
在創(chuàng)建requirements.txt文件之后,你應當安裝軟件包。在這篇文章中,我們將使用Python3,如果您尚未安裝Python,您應該考慮使用Python,以上列出Python的安裝程序以及還會安裝的所有軟件包。
最后,我們可以只是創(chuàng)建一個空白的settings.py文件,因為我們沒有為項目做任何設置。
獲取數據
一旦有了項目的原始框架,我們就可以得到原始的數據。
Fannie Mae在采集數據方面有一些限制,所以你需要注冊一個賬戶,你可以在這里找到下載頁面。創(chuàng)建賬戶后,你就可以根據需要下載盡可能少或盡可能多的貸款數據文件了。該文件是zip格式,解壓后體積會相當大。
對于這個帖子的目的在于,我們已經下載了從2012年第一季度到2015年第一季度的數據。然后,我們將需要解壓所有的文件,解壓文件或,刪除原來的.zip文件。最后,貸款預測文件夾應該是這個樣子的:
loan-prediction ├── data │ ├── Acquisition_2012Q1.txt │ ├── Acquisition_2012Q2.txt │ ├── Performance_2012Q1.txt │ ├── Performance_2012Q2.txt │ └── ... ├── processed ├── .gitignore ├── README.md ├── requirements.txt ├── settings.py下載數據后,就可以使用頭部和尾部的shell命令來查看文件中的行信息了。你將不需要列明查看信息,這樣做有助于生成pdf格式。
在數據中進行讀取
這里有兩個問題,是我們的數據難以正確使用:
- 此收購和性能的數據涵蓋多個獨立的文件。
- 每個文件都丟失了頭信息。
在我們開始用數據工作之前,我們需要得到如下步驟,我們有一個文件用來獲取數據,一個文件用來獲取性能數據。每個文件都只需要包含我們關心的列信息和適當的標題。這里的一個問題是性能數據相當大,所以我們嘗試削減一些列。
第一步是在settings.py中添加一些變量,這其中將包含我們的原始數據和處理的數據。我們還將添加一些其他的設置,這對后面是有益的:
DATA_DIR = "data" PROCESSED_DIR = "processed" MINIMUM_TRACKING_QUARTERS = 4 TARGET = "foreclosure_status" NON_PREDICTORS = [TARGET, "id"] CV_FOLDS = 3把路徑存入settings.py文件將會把他們放在一個集中的地方,使他們能夠容易的更改。當多個文件指向的是相同的變量時,它更容易吧它們放在一個集中的地方,當你想改變他們的時候可以在每個文件夾中進行編輯。下面是一個settings.py文件的示例。
第二步是創(chuàng)建一個名為assemble.py的文件用來聚集所有成果到兩個文件中。當我們運行Python的assemble.py文件時,我們將會處理兩個目錄里的數據文件。
然后,我們將開始在assemble.py文件中編寫代碼。我們首先需要定義每個文件的頭信息,所以我們需要查看pdf中的列名和創(chuàng)建每次采集和性能的文件中的列信息:
HEADERS = {"Acquisition": ["id","channel","seller","interest_rate","balance","loan_term","origination_date","first_payment_date","ltv","cltv","borrower_count","dti","borrower_credit_score","first_time_homebuyer","loan_purpose","property_type","unit_count","occupancy_status","property_state","zip","insurance_percentage","product_type","co_borrower_credit_score"],"Performance": ["id","reporting_period","servicer_name","interest_rate","balance","loan_age","months_to_maturity","maturity_date","msa","delinquency_status","modification_flag","zero_balance_code","zero_balance_date","last_paid_installment_date","foreclosure_date","disposition_date","foreclosure_costs","property_repair_costs","recovery_costs","misc_costs","tax_costs","sale_proceeds","credit_enhancement_proceeds","repurchase_proceeds","other_foreclosure_proceeds","non_interest_bearing_balance","principal_forgiveness_balance"] }下一步是定義我們希望保留的列。由于所以我們關于貸款的信息在現有基礎上衡量其跟以往的關系,我們可以拋棄很多的性能數據列。我們需要所以采集數據的列,不過因為我們要最大限度地提高被收購貸款的有關信息(畢竟,我們預測如果貸款將永遠自安倍取消贖回權或不使用的情況下收購)。丟棄列將幫助我們節(jié)省硬盤空間和內存,同時還加快了我們的代碼。
SELECT = {"Acquisition": HEADERS["Acquisition"],"Performance": ["id","foreclosure_date"] }下一步,我們將編寫一個用來連接數據集的函數。代碼如下:
- 導入一些需要的庫包括設置。
- 定義一個函數串連,
- 即獲取數據目錄中所有文件的名稱;
- 循環(huán)每個文件;
- 比如如果該文件不是正確的類型則忽略(不是我們想要的前綴開頭),
- 將文件讀入到DataFrame通過使用Pandas read_csv方法;
- 設置分隔符“|”使得所有的字段被正確讀入;
- 該數據沒有標題行,所以設置頭為空來表明這一點;
- 從HEADERS字典中獲取正確的值來設置名稱,這些都將是我們的數據框的列名;
- 在DataFrame中僅選擇我們添加到select里的列名;
- 將所有的數據幀串聯在一起;寫入級聯數據幀返回一個文件。
import os import settings import pandas as pddef concatenate(prefix="Acquisition"):files = os.listdir(settings.DATA_DIR)full = []for f in files:if not f.startswith(prefix):continuedata = pd.read_csv(os.path.join(settings.DATA_DIR, f), sep="|", header=None, names=HEADERS[prefix], index_col=False)data = data[SELECT[prefix]]full.append(data)full = pd.concat(full, axis=0)full.to_csv(os.path.join(settings.PROCESSED_DIR, "{}.txt".format(prefix)), sep="|", header=SELECT[prefix], index=False)
我們可以調用上述的方法兩次通過參數采集和性能來連接所有的獲得和性能文件在一起。代碼如下:
- 只有當腳本是通過命令行調用執(zhí)行Python的assemble.py文件。
串聯所有的文件,并生成兩個文件
- processed/Acquisition.txt
- processed/Performance.txt
我們現在已經有了一個良好的,劃分的assemble.py文件,易于執(zhí)行,而且容易創(chuàng)建。通過分解問題轉化為這樣的結果,我們可以很容易的建立我們的項目。而不是一個凌亂的腳本,我們定義腳本之間的傳遞,使他們有相互完全獨立的數據。當你在操作較大的項目時,這是一個很好的主意,因為這使得它更容易改變各個部分,而無需對項目不重要部分得到意想不到的結果。
一旦我們完成了assemble.py腳本,我們就可以運行Python的assemble.py文件了,在這里你可以找到完整的assemble.py文件。
這會在處理目錄中生成兩個文件:
在性能數據中計算值
下一步我們將從processed/Performance.txt文件中計算一些數值。所有我們想做的是預測財產是否被法拍。為了搞清楚這一點,我們只需要檢查與貸款相關的性能數據中是否曾經有一個foreclosure_date。如果沒有foreclosure_date,則該屬性從未被法拍。為了避免在我們的樣本中,包含很少有表現的歷史貸款,我們還需要在每筆貸款的高性能文件中存儲許多行計數。這將讓我們從訓練數據中篩選出沒有太多表現的歷史貸款。
思考貸款數據和性能數據的一個方法:
image here正如你在上面看到的,在獲取數據的每一行可以和性能數據的多行有聯系。在性能數據上,foreclosure_date將出現在當止贖發(fā)生四分之一的時候,因此它應該在這段時間之前是空白的。一些貸款從未拍賣,所以所有的性能數據和與它們相關的行具有foreclosure_date空白。
我們需要計算foreclosure_status,這是一個布爾值,表示一個特定貸款的id是否曾經封死,并且performance_count是行中每個貸款ID的性能數據的數目。
有幾種方法可以計算出我們想要的總量:
我們可以讀取所有的性能數據,然后在數據幀上使用Pandas的groupby方法來計算出與每個貸款ID相關聯的行的數目,并且如果foreclosure_date是從不為空的id。
- 這種方法的好處是,它很容易從語法的角度來實現。
- 缺點是,閱讀所有129236094線路中的數據會占用大量的內存,并極其緩慢。
我們可以讀出素有毒性能數據,然后對采集框應用中找到每個id的計數。
- 好處是,該數據集不需要被加載到內存中,所以它是非常快速和高效的存儲器。
- 不足之處是,它會增長概念的落實,而且我們需要手動去解析行數據。
加載所有的數據需要相當多的存儲空間,所以讓我們選上面的第三個選擇。所有我們需要做的是通過性能數據所有行的迭代,同時將每個貸款id的字典計數。在字典中,仿佛foreclosure_date是有史以來不是沒有,沃爾瑪·我們會繼續(xù)跟蹤出現在性能數據里的id。這將為我們提供foreclosure_status和performance_count。
我們將創(chuàng)建一個名為annotate.py的新文件,并添加代碼,使我們能夠計算這些值。在下面代碼中,我們將:
- 導入所需的庫
- 定義一個名為count_performance_rows的方法。
- Open processed/Performance.txt文件,這并不讀取文件到內存中,而是打開一個可用于按行文件中的行讀取文件處理程序。
- 在文件中的每一行進行循環(huán),使用拆分行分隔符“|”,檢查貸款id如果不在計數字典里,如果不是添加其到計數,對于給定的貸款id我們是在一個包含它的行遞增性能計數器里,如果日期不為空,那么我們知道貸款被法拍,所以設置止贖狀態(tài)正確。
獲取值
一旦我們創(chuàng)建了計數字典,我們可以做一個功能,將來自貸款id和一個關鍵的字典值提取出來:
def get_performance_summary_value(loan_id, key, counts):value = counts.get(loan_id, {"foreclosure_status": False,"performance_count": 0})return value[key]上述功能將從計數字典中返回適當的值,并且將使我們能夠分配foreclosure_status值和performance_count值到獲取數據的每一行。在字典的get方法返回,如果沒有找到鍵的默認值,因此這有利于我們,如果密鑰沒有在字典中的計數不存在則返回合理的默認值。
注釋數據
我們已經增加了一些功能在annotate.py中,但現在我們可以進入文件內部。我們需要將采集的數據轉換成可以在一個機器學習算法使用的訓練數據集。這涉及到幾件事情:
- 將所有的列變?yōu)閿底?/li>
- 填寫任何遺漏的值
- 指定performance_count和foreclosure_status到每一行
- 刪除那些沒有很多表現的歷史的行(性能計數很低)
我們幾個列是字符串,其不給機器學習算法是有用的。但是,他們實際上是分類變量,在這里有幾個不同的類別代碼,例如R,S等。我們可以通過分配一個編號以每個類別標注這些列轉換為數字:
image here轉換列這種方式將使我們能夠在我們的機器學習算法中使用它們。某些列還包含日期(第一次付款日期和起始日期)。我們可以拆分這些日期到每2列:
image here在下面的代碼中,我們改變了收購數據。我們將定義一個函數:
- 創(chuàng)建一個foreclosure_status列從數據字典中獲取收購止贖狀態(tài)。
- 創(chuàng)建一個performance_count列從數據字典中獲取收購的業(yè)績。
- 從以下各字符串列轉換成整數列:
- channel
- seller
- first_time_homebuyer
- loan_purpose
- property_type
- occupancy_status
- property_state
- product_type
- 轉換first_payment_date和origination_date。
- 以分隔符拆分列
- 分配分割列表一個月列的第一部分
- 分配分割列表一年列的第二部分
- 刪除這一列
- 最終,我們擁有first_payment_month,first_payment_year,origination_month和origination_year。
- 任何收購缺省值填充-1.
聚合所有的事情
我們差不多準備拉都在一起,我們只需要多一點的代碼添加到annotate.py。在下面的代碼中,我們:
- 定義一個函數在采集數據的讀取。
- 定義一個函數來寫入處理的數據到處理/ train.csv
- 如果該文件是在命令行中,像蟒蛇annotate.py叫:
- 閱讀在采集數據。
- 計算計數的性能數據,并將它們分配給計數。
- 注釋采集數據幀。
- 寫在收購數據幀到train.csv。
一旦你完成更新文件,一定要與蟒蛇annotate.py運行它,生成train.csv文件。你可以在這里找到完整的annotate.py文件。
該文件夾現在應該是這樣的:
loan-prediction ├── data │ ├── Acquisition_2012Q1.txt │ ├── Acquisition_2012Q2.txt │ ├── Performance_2012Q1.txt │ ├── Performance_2012Q2.txt │ └── ... ├── processed │ ├── Acquisition.txt │ ├── Performance.txt │ ├── train.csv ├── .gitignore ├── annotate.py ├── assemble.py ├── README.md ├── requirements.txt ├── settings.py發(fā)現錯誤度量標準
我們正在與我們的生成訓練數據集,而現在我們只需要做的最后一步,生成預測完成。我們需要找出一個錯誤的指標,以及我們如何要評估我們的數據。在這種情況下,有更多的貸款未比都封死了,所以典型精度措施并沒有太大的意義。
如果我們在訓練中讀取數據,并檢查計數的foreclosure_status列,這里就是我們得到:
import pandas as pd import settingstrain = pd.read_csv(os.path.join(settings.PROCESSED_DIR, "train.csv")) train["foreclosure_status"].value_counts()False 4635982 True 1585 Name: foreclosure_status, dtype: int64既然這么幾個貸款的抵債了,只需檢查中正確預測將意味著我們可以作出這樣的預測為False每一行,仍然得到了非常高精度的機器學習模型標簽的百分比。相反,我們將要使用的度量,是以類不平衡考慮,并確保我們準確預測喪失抵押品贖回權。我們不希望太多假陽性,在那里我們作出預測,一個貸款將封死上,即使它不會,或過多的假陰性,在那里我們預測貸款不會被封死,但它是。這兩個,假陰性是房利美更昂貴,因為他們購買的貸款他們可能無法收回投資的地方。
我們將定義假陰性率,其中模型預測沒有喪失抵押品贖回權,但貸款數量的貸款實際上是法拍,通過實際上取消抵押品贖回權的貸款總額數除以。這是典型的“未接”實際取消抵押品贖回權的比例。這里有一個圖:
image here在上面的圖中,1該筆貸款預測為沒有被封死,但它實際上是。如果我們把這個由實際上的,2抵債貸款的數量,我們得到的假陰性率,50%。我們將以此作為我們的誤差度量,因此,我們可以評估我們的模型的性能。
設置機器學習的分類
我們將使用交叉驗證做出預測。將我們的數據分成3組。然后,我們將做到以下幾點:
- 訓練組1和2的模型,并使用該模型,使為3組的預測。
- 訓練組1和3中的模型,并使用該模型,使2組的預測。
- 訓練2和3組模型,并利用該模型,使第1組的預測。
它拆分成組這種方式意味著我們使用我們正在做的預測為相同的數據永遠不會訓練模式。這就避免了過度擬合。如果我們過度擬合,我們會得到一個錯誤的低假陰性率,這使得它很難提高我們的算法還是在現實世界中使用它。
Scikit-learn有一個名為cross_val_predict函數,將可以很容易進行交叉驗證。
我們還需要選擇一個要使用的算法進行預測。我們需要一個分類,可以做二分類。目標變量,foreclosure_status只有兩個值,真假。
我們將使用logistic回歸,因為它可以很好地用于二分類,運行速度非常快,并且使用較少的內存。這是由于算法如何工作 - 而非建造幾十棵,像一個隨機森林,或做昂貴的轉換,如支持向量機,回歸有涉及較少的矩陣運算少得多的步驟。
我們可以使用在實施logistic回歸分類算法Scikit-learn。我們需要關注的唯一事情就是每個類的權重。如果我們同樣加權類,算法將預測假的每一行,因為它試圖最大限度地減少錯誤。然而,我們關心更多關于取消抵押品贖回權比我們有關未止贖貸款。因此,我們將通過均衡的邏輯回歸類的class_weight關鍵字參數,以獲得算法,加權取消抵押品贖回權更多地考慮在每個類的計數差異。這將確保該算法不適合每一行預測假,而是針對預測或者類犯錯誤同樣處罰。
預測
現在,我們有預賽出的方式,我們已經準備好做出預測。我們將創(chuàng)建一個新的文件名為predict.py將使用我們在上一步中創(chuàng)建的文件train.csv。以下的代碼:
- 導入所需的庫。
- 創(chuàng)建一個名為cross_validate該函數:
- 創(chuàng)建一個邏輯回歸分類用正確的關鍵字參數。
- 創(chuàng)建一個我們要用來訓練模型,刪除ID和foreclosure_status列的列表。
- 在整個運行列車數據幀交叉驗證。
- 返回預測。
import os
import settings
import pandas as pd
from sklearn import cross_validation
from sklearn.linear_model import LogisticRegression
from sklearn import metrics
預知錯誤
現在,我們只需要編寫一些函數來計算錯誤。代碼如下:
創(chuàng)建一個名為compute_error的函數:
- 使用scikit-learn 來計算一個簡單的精確度得分(預測百分比與實際foreclosure_status的值相匹配)。
創(chuàng)建一個調用compute_false_negatives的函數:
為方便起見,在數據框架里結合目標值和預測值。
發(fā)現假陰性率。
發(fā)現在模型預測中未取消抵押品贖回權的貸款數量。
將不取消抵押品贖回權的貸款總數進行劃分。
把這些全部放在一起
現在,我們只要把這些函數一起放進predict.py里。下面的代碼將會:
- 讀取數據集。
- 計算交叉驗證預測。
- 計算上述3項誤差指標。
- 打印錯誤指標。
一旦你添加了代碼,你就可以運行Python predict.py生成預測結果。一切運行都表明,我們的假陰性率是0.26,這意味我們錯過了他們預測的26%的贖回貸款。這是一個良好的開端,但這用了大量的改進!
你可以在這里找到完整的predict.py文件。
您的文件樹現在看起來應該是這樣的:
loan-prediction ├── data │ ├── Acquisition_2012Q1.txt │ ├── Acquisition_2012Q2.txt │ ├── Performance_2012Q1.txt │ ├── Performance_2012Q2.txt │ └── ... ├── processed │ ├── Acquisition.txt │ ├── Performance.txt │ ├── train.csv ├── .gitignore ├── annotate.py ├── assemble.py ├── predict.py ├── README.md ├── requirements.txt ├── settings.py寫一個README文件
現在,我們已經完成了我們的端對端項目,我們只需要編寫一個README.md文件,以便其他人知道我們做了什么,以及如何復制它。一個典型的README.md項目文件應該包括以下幾個部分:
該項目的高度概括,以及目標是什么。
哪里可以下載到任何需要的數據或資料。
安裝說明。
- 如何安裝的要求。
使用說明。
如何運行項目。
每個步驟結束后,你會看到什么樣的結果。
如何為項目做出貢獻。
- 接下來用于擴展該項目的好的步驟:
這里是該項目的一個樣本README.md文件。
接下來要做的事
恭喜,你已經完成了端對端的機器學習項目!你可以在這里找到一個完整的項目實例。將你完成的項目上傳至Github是個好主意,這樣其他人就可以看到這是你個人文件夾的一部分。
這個數據仍然還有相當多的角度可以去探索。從廣義上講,我們可以將它們分割成3類 -擴展項目,并使其更加準確,尋找其他欄目進行預測,并探索數據。以下是一些建議:
往annotate.py 里添加更多特性。
在predict.py里轉換算法。
比我們在這篇文章中更多的嘗試使用來自Fannie Ma的數據。
在未來數據的預測里添加一個方法。我們寫的代碼在添加更多的數據后仍然是可以工作的,因此我們可以添加更多的過去或未來的數據。
如果銀行應出具的原貸款發(fā)生了問題, 嘗試看是否可以預測(或者如果Fannie Mae已經獲得了貸款)。
從train中 刪除任何銀行在那是不知道的貸款條款。
- 當Fannie Mae購買貸款時會知道一些條款,但不是在此之前。
作出預測。
探索看看是否能預測除了foreclosure_status之外更多的欄目。
- 你可以預測上市時間時物品的價值是多少嗎?
探索性能更新之間的細微差別。
你可以預測借款人將有多少次推遲支付嗎?
你能映射出典型貸款的生命周期嗎?
按洲到洲或者郵編到郵編的方式映射數據。
- 你能發(fā)現其他有趣的模式嗎?
CCAI 2016中國人工智能大會將于8月26-27日在京舉行,AAAI主席,多位院士,MIT、微軟、大疆、百度、滴滴專家領銜全球技術領袖和產業(yè)先鋒打造國內人工智能前沿平臺,6+重磅大主題報告,4大專題論壇,1000+高質量參會嘉賓,探討人機交互、機器學習、模式識別及產業(yè)實戰(zhàn)。門票限時六折優(yōu)倒計時第二天。
總結
以上是生活随笔為你收集整理的构建数据科学档案:机器学习项目的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 「精益企业」支持原则,价值观,思维方式,
- 下一篇: c++ primer plus 第 17