新聞中心
我在SAS工作了5年多之后,決定走出舒適區(qū)。作為一名數(shù)據(jù)科學(xué)家,我在尋找其他好用的工具,幸運(yùn)的是,沒(méi)過(guò)多久,我發(fā)現(xiàn)了Python。

一直以來(lái),我喜歡敲代碼。事實(shí)證明,有了Python,敲代碼變得更為容易。
我花了一周時(shí)間來(lái)學(xué)習(xí)Python的基礎(chǔ)知識(shí),從那時(shí)起,我不僅深入鉆研Python,而且還幫助許多其他人學(xué)習(xí)這門(mén)語(yǔ)言。起初,Python是門(mén)通用語(yǔ)言,多年來(lái),隨著社區(qū)的大力支持,現(xiàn)在有了數(shù)據(jù)分析及預(yù)測(cè)建模庫(kù)。
由于缺少Python數(shù)據(jù)科學(xué)資源,我決定創(chuàng)建本教程,旨在幫助大家快速入門(mén)。在本教程中,我們將討論如何使用Python來(lái)進(jìn)行數(shù)據(jù)分析,在實(shí)踐中總結(jié)方法。
Python數(shù)據(jù)分析基礎(chǔ)
為什么要學(xué)習(xí)使用Python來(lái)進(jìn)行數(shù)據(jù)分析?
使用Python來(lái)進(jìn)行數(shù)據(jù)分析的原因有很多,過(guò)去一段時(shí)間通過(guò)對(duì)比SAS和R,有以下幾點(diǎn)理由:
- 開(kāi)源免費(fèi)
- 強(qiáng)大社區(qū)支持
- 易學(xué)
- 成為數(shù)據(jù)科學(xué)和web產(chǎn)品分析的通用語(yǔ)言
誠(chéng)然,它還有很多缺點(diǎn):
Python是一種解釋語(yǔ)言而不是編譯語(yǔ)言,因此占用更多的CPU時(shí)間。然而,由于節(jié)省了程序員時(shí)間(易學(xué)),Python仍然是一個(gè)不錯(cuò)的選擇。
Python 2.7與3.4版本的比較
這是Python中最受爭(zhēng)議的話(huà)題之一,作為初學(xué)者,你繞不開(kāi)這個(gè)問(wèn)題。其實(shí)選擇哪個(gè)版本都沒(méi)有對(duì)錯(cuò),完全取決于你的需要和實(shí)際使用場(chǎng)景。我會(huì)嘗試給大家一些指引,幫助大家做出明智的選擇。
為什么選擇Python 2.7?
社區(qū)支持,這是早期需要的,Python 2版本在2000年下半年發(fā)布,超過(guò)15年的使用了。
第三方庫(kù)支持,雖然許多庫(kù)提供3.X的支持,但仍然有大量庫(kù)只能在2.X版本上運(yùn)行。如果你打算將Python用于特定的場(chǎng)景,如網(wǎng)頁(yè)開(kāi)發(fā),高度依賴(lài)外部模塊,你可能選擇2.7版本會(huì)更好。
3.X版本的一些功能向后兼容,可以使用2.7版本。
為什么選擇Python 3.4?
簡(jiǎn)潔快速,Python開(kāi)發(fā)人員已經(jīng)修復(fù)了一些自身的Bug,為其發(fā)展打下更堅(jiān)實(shí)的基礎(chǔ)。最初這些可能與你不是很相關(guān),終將是很重要的。
未來(lái)趨勢(shì),2.7版本是2.X系列的最后一個(gè)版本,最終大家都必須轉(zhuǎn)到3.X版本。Python 3已經(jīng)發(fā)布了5年的穩(wěn)定版本,并將持續(xù)推進(jìn)。
沒(méi)有明確顯示到底誰(shuí)好,但我認(rèn)為最重要的是大家應(yīng)該專(zhuān)注于將Python當(dāng)作一門(mén)語(yǔ)言來(lái)學(xué)習(xí)。版本之間的轉(zhuǎn)換是一個(gè)時(shí)間的問(wèn)題。遲點(diǎn),繼續(xù)關(guān)注Python 2.X與3.X比較的文章。
如何安裝Python?
有兩種安裝Python的方法:
你可以直接在官網(wǎng)上下載Python,并安裝所需要的組件和庫(kù)。
或者,你可以下載安裝預(yù)裝庫(kù)的軟件包,我建議你下載Anaconda,另外可以是Canopy Express。
第二種方法免去安裝其他庫(kù)的麻煩,因此我會(huì)推薦給初學(xué)者。如果你對(duì)單個(gè)庫(kù)的最新版本感興趣,你必須等到整個(gè)軟件包的更新。除非你在做前沿的統(tǒng)計(jì)研究,否則應(yīng)該沒(méi)有什么影響。
選擇開(kāi)發(fā)環(huán)境
一旦安裝了Python,就有各種各樣的開(kāi)發(fā)環(huán)境,以下是常見(jiàn)的3種:
- Terminal / Shell
- IDLE (默認(rèn))
- iPython notebook(類(lèi)似R中的markdown)
正確的開(kāi)發(fā)環(huán)境取決于你的需要,我個(gè)人更喜歡iPython Notebook。它有很多好的功能,編寫(xiě)代碼時(shí)提供了文檔記錄功能,可以選擇運(yùn)行代碼塊(而不是逐行執(zhí)行)。
我們將使用iPython開(kāi)發(fā)環(huán)境完成本教程。
預(yù)熱:運(yùn)行你的第一個(gè)Python程序
你可以使用Python作為簡(jiǎn)單的計(jì)算器開(kāi)始
提醒幾點(diǎn)
你可以在terminal / cmd上輸入“ipython notebook”來(lái)啟動(dòng)iPython Notebook,這取決于你正在使用的操作系統(tǒng)。
可以通過(guò)點(diǎn)擊“UntitledO”來(lái)重命名。
界面顯示In [*]表示輸入,Out[*]表示輸出。
執(zhí)行當(dāng)前代碼塊按快捷鍵“Shift + Enter”,運(yùn)行當(dāng)前塊并插入額外的塊按快捷鍵“ALT + Enter”。
在深入解決問(wèn)題之前,讓我們回顧一下,了解Python的基礎(chǔ)知識(shí)。 我們知道數(shù)據(jù)結(jié)構(gòu)、迭代和條件結(jié)構(gòu)構(gòu)成任何語(yǔ)言的關(guān)鍵。 在Python中,這些包括列表,字符串,元組,字典,for循環(huán),while循環(huán),if-else等。我們來(lái)看看其中的一些。
Python庫(kù)及數(shù)據(jù)結(jié)構(gòu)
Python數(shù)據(jù)結(jié)構(gòu)
以下是一些在Python中使用的數(shù)據(jù)結(jié)構(gòu)。你應(yīng)該熟悉它們,以便適當(dāng)使用它們。
Lists – 列表是Python中最常用的數(shù)據(jù)結(jié)構(gòu)之一。 可以通過(guò)在方括號(hào)中寫(xiě)入逗號(hào)分隔值的序列來(lái)簡(jiǎn)單地定義列表。列表可以包含不同類(lèi)型的項(xiàng),但通常這些項(xiàng)都具有相同的類(lèi)型。 Python列表是可變的,可以更改列表的各個(gè)元素。
下面是一個(gè)快速定義一個(gè)列表然后訪(fǎng)問(wèn)它的例子:
Strings – 字符串可以簡(jiǎn)單地通過(guò)使用單個(gè)(’),雙(“)或三個(gè)(’’’)的逗號(hào)來(lái)定義。 用三引號(hào)(’’’)括起來(lái)的字符串允許跨行,并且在文檔字符串中經(jīng)常使用(Python的記錄函數(shù)的方法)。 “\”用作轉(zhuǎn)義字符。 請(qǐng)注意,Python字符串是不可變的,因此不能更改字符串的一部分。
Tuples – 一個(gè)元組用逗號(hào)分隔的值來(lái)表示。元組是不可變的,輸出被圓括號(hào)包圍,以便嵌套元組被正確處理。 此外,即使元組是不可變的,如果需要,可以保存可變數(shù)據(jù)。
由于元組是不可變的,不能改變,與列表相比,它的處理速度更快。 因此,如果你的列表不太可能更改,應(yīng)該使用元組,而不是列表。
Dictionary – 字典是一組無(wú)序的鍵:值對(duì),要求鍵是唯一的(在一個(gè)字典內(nèi))。一對(duì)大括號(hào)創(chuàng)建一個(gè)空字典:{}。
Python迭代和條件構(gòu)造
像大多數(shù)語(yǔ)言一樣,Python也有一個(gè)FOR循環(huán),它是最廣泛使用的迭代方法。它有一個(gè)簡(jiǎn)單的語(yǔ)法:
- for i in [Python Iterable]:
- expression(i)
這里“Python Iterable”可以是列表,元組或其他高級(jí)數(shù)據(jù)結(jié)構(gòu),我們將在后面的部分中討論。我們來(lái)看一個(gè)簡(jiǎn)單的例子,確定一個(gè)數(shù)字的階乘。
- fact = 1
- for i in range(1,N+1):
- fact *= i
根據(jù)條件語(yǔ)句,這些語(yǔ)句用于根據(jù)條件執(zhí)行代碼片段。最常用的結(jié)構(gòu)是if-else,具有以下語(yǔ)法:
- if [condition]:
- __execution if ture__
- else:
- __execution if false__
例如,如果我們要打印數(shù)字N是偶數(shù)還是奇數(shù):
- if N%2 == 0:
- print 'Even'
- else:
- print 'Odd'
現(xiàn)在,你已經(jīng)熟悉Python的基礎(chǔ)知識(shí)了,我們進(jìn)一步了解一下,如果必須執(zhí)行以下任務(wù),該怎么辦?
1.兩個(gè)矩陣相乘
2.找到二次方程的根
3.繪制條形圖和直方圖
4.網(wǎng)頁(yè)訪(fǎng)問(wèn)
如果你嘗試從頭開(kāi)始編寫(xiě)代碼,那將成為一場(chǎng)惡夢(mèng),你將在Python上不會(huì)堅(jiān)持超過(guò)2天!但是不用擔(dān)心, 幸運(yùn)的是,有許多預(yù)定義的庫(kù),我們可以直接導(dǎo)入到我們的代碼中,使我們的編程工作變得容易。
例如,考慮我們剛剛看到的階乘例子。完成只需一個(gè)步驟:
- math.factorial(N)
當(dāng)然,我們需要導(dǎo)入math庫(kù)。我們來(lái)研究一下各種庫(kù)。
Python庫(kù)
通過(guò)了解一些有用的庫(kù),將在我們學(xué)習(xí)Python的過(guò)程中領(lǐng)先一步。第一步顯然是學(xué)會(huì)將它們導(dǎo)入我們的環(huán)境中。在Python中有以下幾種方法:
- import math as m
- from math import *
在第一種方式中,我們定義了一個(gè)別名為m的math庫(kù)。現(xiàn)在我們可以使用別名m.factorial()引用它,從math庫(kù)(例如階乘)中使用各種函數(shù)。
第二種方式,導(dǎo)入了math庫(kù)的整個(gè)名稱(chēng)空間,即可以直接使用factorial()而不引用math。
提示:Google建議你使用第一種導(dǎo)入庫(kù)方式,因?yàn)槟銓⒅篮瘮?shù)來(lái)自哪里。
以下是庫(kù)列表,任何科學(xué)計(jì)算和數(shù)據(jù)分析會(huì)用到:
- NumPy:代表的是Numerical Python。NumPy最強(qiáng)大的功能是n維數(shù)組。該庫(kù)還包含基本的線(xiàn)性代數(shù)函數(shù),傅里葉變換,隨機(jī)數(shù)函數(shù)和與其他底層語(yǔ)言(如Fortran,C和C ++)集成的工具。
- SciPy:代表的是Scientific Python。SciPy建立在NumPy基礎(chǔ)上。它是離散傅里葉變換,線(xiàn)性代數(shù),優(yōu)化和稀疏矩陣等多種高級(jí)科學(xué)和工程模塊最有用的庫(kù)之一。
- Matplotlib:用于繪制各種各樣的圖形,從直方圖到線(xiàn)圖、熱力圖。你可以使用ipython notebook中的Pylab功能(ipython notebook -pylab = inline)在線(xiàn)使用這些繪圖功能。如果忽略?xún)?nèi)聯(lián)選項(xiàng),pylab將ipython環(huán)境轉(zhuǎn)換為與Matlab非常相似的環(huán)境。還可以使用Latex命令在圖像添加數(shù)學(xué)符號(hào)。
- Pandas:用于結(jié)構(gòu)化數(shù)據(jù)的運(yùn)算和操作。廣泛用于數(shù)據(jù)整理和預(yù)處理。相較而言,Pandas被添加到Python時(shí)間不久,其有助于提高Python在數(shù)據(jù)科學(xué)社區(qū)的使用。
- Scikit:用于機(jī)器學(xué)習(xí)。該庫(kù)建立在NumPy,SciPy和matplotlib基礎(chǔ)上,包含許多有效的機(jī)器學(xué)習(xí)和統(tǒng)計(jì)建模工具,例如分類(lèi),回歸,聚類(lèi)和降維。
- Statsmodels:用于統(tǒng)計(jì)建模。Statsmodels是一個(gè)Python中提供用戶(hù)探索數(shù)據(jù)、估計(jì)統(tǒng)計(jì)模型和執(zhí)行統(tǒng)計(jì)測(cè)試的模組??捎糜诓煌?lèi)型數(shù)據(jù)的描述性統(tǒng)計(jì),統(tǒng)計(jì)測(cè)試,繪圖功能和結(jié)果統(tǒng)計(jì)。
- Seaborn:用于數(shù)據(jù)可視化。Seaborn是一個(gè)用于在Python中制作有吸引力和翔實(shí)的統(tǒng)計(jì)圖形庫(kù)。它是基于matplotlib。Seaborn旨在使可視化成為探索和理解數(shù)據(jù)的核心組成。
- Bokeh:用于在現(xiàn)代網(wǎng)絡(luò)瀏覽器上創(chuàng)建交互式圖表,儀表盤(pán)和數(shù)據(jù)應(yīng)用程序。它賦予用戶(hù)以D3.js的風(fēng)格生成優(yōu)雅簡(jiǎn)潔的圖形。此外,它具有超大型或流式數(shù)據(jù)集的高性能交互能力。
- Blaze:將Numpy和Pandas的能力擴(kuò)展到分布式和流式傳輸數(shù)據(jù)集。它可以用于從眾多來(lái)源(包括Bcolz,MongoDB,SQLAlchemy,Apache Spark,PyTables等)訪(fǎng)問(wèn)數(shù)據(jù)。與Bokeh一起,Blaze可以作為在巨型數(shù)據(jù)塊上創(chuàng)建有效可視化和儀表盤(pán)的強(qiáng)大的工具。
- Scrapy:用于網(wǎng)絡(luò)爬蟲(chóng)。它是獲取特定模式數(shù)據(jù)的非常有用的框架。它從網(wǎng)站首頁(yè)url開(kāi)始,然后挖掘網(wǎng)站內(nèi)的網(wǎng)頁(yè)內(nèi)容來(lái)收集信息。
- SymPy:用于符號(hào)計(jì)算。它具有從基本算術(shù)符號(hào)到微積分,代數(shù),離散數(shù)學(xué)和量子物理學(xué)的廣泛能力。另一個(gè)有用的功能是將計(jì)算結(jié)果格式化為L(zhǎng)aTeX代碼。
- Requests:用于web訪(fǎng)問(wèn)。它類(lèi)似于標(biāo)準(zhǔn)python庫(kù)urllib2,但是代碼更容易。你會(huì)發(fā)現(xiàn)與urllib2的微妙差異,但是對(duì)于初學(xué)者來(lái)說(shuō),Requests可能更方便。
你可能需要的額外的庫(kù):
- os用于操作系統(tǒng)和文件操作
- networkx和igraph為基于圖的數(shù)據(jù)操作
- regular expressions用于在文本中查找特定模式的數(shù)據(jù)
- BeautifulSoup用于網(wǎng)絡(luò)爬蟲(chóng)。它不如Scrapy,因?yàn)樗皇菃蝹€(gè)網(wǎng)頁(yè)中提取信息。
既然我們熟悉Python基礎(chǔ)知識(shí)和庫(kù),那么我們可以通過(guò)Python深入解決問(wèn)題。做預(yù)測(cè)模型過(guò)程中,我們會(huì)使用到一些功能強(qiáng)大的庫(kù),也會(huì)遇到不同的數(shù)據(jù)結(jié)構(gòu)。我們將帶你進(jìn)入三個(gè)關(guān)鍵階段:
- 數(shù)據(jù)探索 – 詳細(xì)了解我們的數(shù)據(jù)
- 數(shù)據(jù)清洗 – 清理數(shù)據(jù),使其更適合統(tǒng)計(jì)建模
- 預(yù)測(cè)建模 – 運(yùn)行實(shí)際算法并獲得結(jié)果
使用pandas進(jìn)行數(shù)據(jù)探索
為了進(jìn)一步探索我們的數(shù)據(jù),給你介紹另一個(gè)動(dòng)物(好像Python還不夠!)- Pandas
Pandas是Python中最有好用的數(shù)據(jù)分析庫(kù)之一(我知道這些名字聽(tīng)起來(lái)很奇怪,先這樣!)促使越來(lái)越多數(shù)據(jù)科學(xué)界人士使用Python?,F(xiàn)在我們將使用pandas從Analytics Vidhya比賽中讀取數(shù)據(jù)集,進(jìn)行探索性分析,并構(gòu)建我們的第一個(gè)基礎(chǔ)分類(lèi)算法來(lái)解決這個(gè)問(wèn)題。
在數(shù)據(jù)加載之前,先了解Pandas中2個(gè)關(guān)鍵數(shù)據(jù)結(jié)構(gòu) – Series和DataFrames。
Series及DataFrame介紹
Series可以理解為1維標(biāo)簽/索引數(shù)組。你可以通過(guò)這些標(biāo)簽訪(fǎng)問(wèn)series的各個(gè)元素。
Dataframe類(lèi)似于Excel工作簿,列名稱(chēng)引用列,使用行號(hào)訪(fǎng)問(wèn)行。本質(zhì)區(qū)別在于dataframes中列名稱(chēng)和行號(hào)稱(chēng)為列和行索引。
Series和DataFrames構(gòu)成了Pandas在Python中的核心數(shù)據(jù)模型。數(shù)據(jù)集首先被讀入Dataframes,然后各種操作(例如分組、聚合等)可以非常容易地應(yīng)用于其列。
應(yīng)用案例 – 貸款預(yù)測(cè)問(wèn)題
以下是變量的描述:
| 變量 | 描述 |
| Loan_ID | 貸款I(lǐng)D |
| Gender | 男/女 |
| Married | 已婚(Y/N) |
| Dependents | 贍養(yǎng)人數(shù) |
| Education | 教育程度(Graduate/Under Graduate) |
| Self_Employed | 自雇人士(Y/N) |
| ApplicantIncome | 申報(bào)收入 |
| CoapplicantIncome | 綜合收入 |
| LoanAmount | 貸款金額 |
| Loan_Amount_Term | 貸款月數(shù) |
| Credit_History | 信用記錄 |
| Property_Area | 房產(chǎn)位置(Urban/Semi Urban/Rural) |
| Loan_Status | 貸款批準(zhǔn)狀態(tài)(Y/N) |
開(kāi)始數(shù)據(jù)探索
首先,在terminal/ Windows命令提示符下鍵入以下命令,以Inline Pylab模式啟動(dòng)iPython界面:
- ipython notebook --pylab=inline
這樣在pylab環(huán)境中打開(kāi)了iPython notebook,它已經(jīng)導(dǎo)入了一些有用的庫(kù)。此外,可以?xún)?nèi)聯(lián)繪制數(shù)據(jù),這使得它成為一個(gè)非常好的交互式數(shù)據(jù)分析環(huán)境。 你可以通過(guò)鍵入以下命令(并獲得如下圖所示的輸出)來(lái)檢查環(huán)境是否加載正確:
- plot(arange(5))
我當(dāng)前在Linux中工作,并將數(shù)據(jù)集存儲(chǔ)在以下位置: /home/kunal/Downloads/Loan_Prediction/train.csv
導(dǎo)入庫(kù)和數(shù)據(jù)集:
以下是我們將在本教程中使用的庫(kù):
- numpy
- matplotlib
- pandas
請(qǐng)注意,由于Pylab環(huán)境,你不需要導(dǎo)入matplotlib和numpy。我仍然將它們保留在代碼中,以便在不同的環(huán)境中使用代碼。
導(dǎo)入庫(kù)后,使用函數(shù)read_csv()讀取數(shù)據(jù)集。代碼如下:
- import pandas as pd
- import numpy as np
- import matplotlib as plt
- df = pd.read_csv("/home/kunal/Downloads/Loan_Prediction/train.csv") #使用Pandas讀入數(shù)據(jù)集轉(zhuǎn)換成dataframe
快速數(shù)據(jù)探索
讀取數(shù)據(jù)集后,可以使用head()函數(shù)查看前幾行
- df.head(10)
這樣輸出了10行,或者,也可以打印查看更多行數(shù)據(jù)集。
接下來(lái),可以使用describe()函數(shù)來(lái)查看數(shù)值字段的摘要
- df.describe()
describe()函數(shù)將在其輸出中提供計(jì)數(shù)、平均值、標(biāo)準(zhǔn)偏差(std)、最小值、四分位數(shù)和最大值。
這里有幾個(gè)發(fā)現(xiàn),你可以通過(guò)看看describe()函數(shù)的輸出來(lái)繪制:
1.LoanAmount有(614 – 592)22個(gè)缺失值。
2.Loan_Amount_Term有(614 – 600)14個(gè)缺失值。
3.Credit_History有(614 – 564)50個(gè)缺失值。
4.我們也可以看到,約84%的申請(qǐng)人有信用記錄,怎么樣?Credit_History字段的平均值為0.84(記住,Credit_History對(duì)于具有信用記錄的用戶(hù)而言為1,否則為0)
5.申請(qǐng)人收入分布似乎符合預(yù)期。與CoapplicantIncome相同。
請(qǐng)注意,我們可以通過(guò)比較平均值與中位數(shù)來(lái)了解數(shù)據(jù)中可能的偏差。
對(duì)于非數(shù)值(例如Property_Area,Credit_History等),我們可以查看頻率分布來(lái)了解它們是否有意義。頻率表可以通過(guò)以下命令打印輸出:
- df['Property_Area'].value_counts()
同樣,我們可以看看信用歷史的獨(dú)特價(jià)值。請(qǐng)注意,dfname [‘column_name’]是一種基本的索引方法來(lái)訪(fǎng)問(wèn)dataframe的特定列。它也可以是一個(gè)列名的列表。
分布分析
現(xiàn)在我們熟悉基本的數(shù)據(jù)特征,我們來(lái)研究各種變量的分布。從數(shù)字變量ApplicantIncome和LoanAmount開(kāi)始。
首先使用以下命令繪制ApplicantIncome的直方圖:
- df['ApplicantIncome'].hist(bins=50)
在這里我們觀察到很少極端值。這也是為什么需要50個(gè)箱子來(lái)明確分配分配的原因。
接下來(lái),我們來(lái)看一下箱線(xiàn)圖來(lái)了解分布。箱線(xiàn)圖可以通過(guò)以下方式繪制:
- df.boxplot(column='ApplicantIncome')
這證實(shí)了許多異常值/極端值的存在。這可歸因于社會(huì)的收入差距。部分原因可能是由于我們研究了不同教育水平的人。通過(guò)教育變量將其分離開(kāi):
- df.boxplot(column='ApplicantIncome', by = 'Education')
我們可以看到大學(xué)學(xué)歷和非大學(xué)學(xué)歷的平均收入之間沒(méi)有實(shí)質(zhì)性差異。但是,高學(xué)歷中高收入人數(shù)更多,這似乎是離群值。
現(xiàn)在,我們來(lái)看看變量LoanAmount的直方圖和boxplot,使用以下命令:
- df['LoanAmount'].hist(bins=50)
- df.boxplot(column='LoanAmount')
再次,有一些離群值。顯然,ApplicantIncome和LoanAmount都需要一定量的數(shù)據(jù)清洗。 LoanAmount有缺失值和離群值,同時(shí),ApplicantIncome有一些離群值,接下來(lái)我們將分幾個(gè)部分,做更深入的了解。
分類(lèi)變量的分析
現(xiàn)在我們了解ApplicantIncome和LoanIncome的分布,為了更詳細(xì)地理解分類(lèi)變量,我們將使用Excel的透視表和交叉表。例如,我們來(lái)看根據(jù)信用記錄獲得貸款的機(jī)會(huì),這可以在MS Excel中使用數(shù)據(jù)透視表來(lái)實(shí)現(xiàn):
注意:這里的貸款狀態(tài)重編碼了,1代表是,0代表否,平均值表示貸款的概率。
現(xiàn)在我們將看看使用Python生成類(lèi)似洞察所需的步驟。
- temp1 = df['Credit_History'].value_counts(ascending=True)
- temp2=df.pivot_table(values='Loan_Status',index=['Credit_History'],aggfunc=lambda x: x.map({'Y':1,'N':0}).mean())
- print 'Frequency Table for Credit History:'
- print temp1
- print '\nProbility of getting loan for each Credit History class:'
- print temp2
現(xiàn)在可以看到,我們得到一個(gè)類(lèi)似MS Excel一樣的透視表,這可以使用“matplotlib”庫(kù),用以下代碼畫(huà)條形圖:
- import matplotlib.pyplot as plt
- fig = plt.figure(figsize=(8,4))
- ax1 = fig.add_subplot(121)
- ax1.set_xlabel('Credit_History')
- ax1.set_ylabel('Count of Applicants')
- ax1.set_title("Applicants by Credit_History")
- temp1.plot(kind='bar')
- ax2 = fig.add_subplot(122)
- temp2.plot(kind = 'bar')
- ax2.set_xlabel('Credit_History')
- ax2.set_ylabel('Probability of getting loan')
- ax2.set_title("Probability of getting loan by credit history")
這表明如果申請(qǐng)人有有效的信用記錄,獲得貸款的機(jī)會(huì)是沒(méi)有有效信用記錄的8倍。你可以通過(guò)已婚,自雇,居住地區(qū)等繪制相似的圖表。
或者,這兩個(gè)圖也可以通過(guò)將它們組合在堆疊圖表中來(lái)進(jìn)行可視化:
- temp3 = pd.crosstab(df['Credit_History'], df['Loan_Status'])
- temp3.plot(kind='bar', stacked=True, color=['red','blue'], grid=False)
還可以添加性別(類(lèi)似于Excel中的數(shù)據(jù)透視表):
如果你還沒(méi)有意識(shí)到,我們?cè)谶@里創(chuàng)建了兩個(gè)基本的分類(lèi)算法,一個(gè)基于信用記錄,另一個(gè)基于2分類(lèi)變量(包括性別)。你可以快速編碼,以便在AV Datahacks上創(chuàng)建你的第一次提交版本。
我們看到如何在Python中使用pandas進(jìn)行探索性數(shù)據(jù)分析,希望你對(duì)pandas(熊貓)的愛(ài)將會(huì)增加,pandas庫(kù)為你的數(shù)據(jù)集分析提供一些幫助。
接下來(lái),我們進(jìn)一步探討ApplicantIncome和LoanStatus變量,執(zhí)行數(shù)據(jù)運(yùn)算并創(chuàng)建一個(gè)數(shù)據(jù)集以應(yīng)用各種建模技術(shù)。強(qiáng)烈建議再選擇一個(gè)數(shù)據(jù)集和問(wèn)題,閱讀一個(gè)獨(dú)立的例子,然后再做進(jìn)一步分析。
python數(shù)據(jù)清洗:Pandas
對(duì)于從事數(shù)據(jù)分析的人來(lái)說(shuō),下面這些是你必須要做的。
數(shù)據(jù)清洗 – 重構(gòu)數(shù)據(jù)
在數(shù)據(jù)探索時(shí),為了構(gòu)建一個(gè)好的模型,需要先解決掉數(shù)據(jù)集中發(fā)現(xiàn)了的一些問(wèn)題。這個(gè)過(guò)程通常稱(chēng)為“數(shù)據(jù)清洗”。針對(duì)以下問(wèn)題,我們看到:
1.變量缺失值。我們應(yīng)該根據(jù)缺失值的數(shù)量和變量的預(yù)期重要性明智地估計(jì)這些值。
2.在分析這些分布的同時(shí),我們看到變量ApplicantIncome和LoanAmount似乎都包含了離群值。雖然他們可能會(huì)有直觀的意義,但應(yīng)該得到適當(dāng)?shù)奶幚怼?/p>
除了這些數(shù)值型的數(shù)據(jù)問(wèn)題之外,我們還應(yīng)該關(guān)注非數(shù)值型數(shù)據(jù),如性別、區(qū)域、已婚、教育程度和贍養(yǎng)人數(shù),用以挖掘任何有用的信息。
檢查數(shù)據(jù)集中的缺失值
一起看看所有變量中的缺失值,因?yàn)榇蠖鄶?shù)模型不能使用含缺失值的數(shù)據(jù),缺失值填補(bǔ)很重要。所以,我們檢查數(shù)據(jù)集中的null / NaN的數(shù)量。
- df.apply(lambda x: sum(x.isnull()),axis=0)
如果值為null則isnull()返回1,那么該命令計(jì)算出每個(gè)列中缺失值的數(shù)量。
雖然缺失值數(shù)量不是很多,但是大多變量都有缺失值,需要估算并填補(bǔ)缺失值。
注意:缺失值可能并不總是NaN。例如,如果Loan_Amount_Term為0,那么是否有意義,或者是否是缺失值?我想你的答案是缺失值,你是對(duì)的。所以我們應(yīng)該檢查數(shù)據(jù)是否有實(shí)際意義。
如何填補(bǔ)LoanAmount中的缺失值?
有許多方法來(lái)填補(bǔ)貸款額度的缺失值,最簡(jiǎn)單的是用均值替換,可以通過(guò)以下代碼來(lái)完成:
- df['LoanAmount'].fillna(df['LoanAmount'].mean(), inplace=True)
另外也可以是建立一個(gè)監(jiān)督學(xué)習(xí)模型,以其他變量如年齡等為基礎(chǔ)預(yù)測(cè)貸款額度。
既然現(xiàn)在是數(shù)據(jù)清洗的步驟,我寧愿采取介于兩者之間的一種方法。一個(gè)關(guān)鍵的假設(shè)是,一個(gè)人教育程度或者個(gè)體經(jīng)營(yíng)戶(hù)與否,可以結(jié)合起來(lái)給出一個(gè)很好的貸款額度的估計(jì)。
首先,我們來(lái)看一下箱線(xiàn)圖,看看是否存在趨勢(shì)規(guī)律:
因此,我們看到每個(gè)組的貸款額中位數(shù)有一些變化,可以用來(lái)作估算值。但是,我們必須先確保Self_Employed和Education變量中的每一個(gè)都不應(yīng)該有缺少值。
如前所述,Self_Eployee有一些缺失的值。看看頻率表:
大約86%的值為“No”,將缺失值估計(jì)為“No”是安全的,因?yàn)檎_的概率會(huì)更高??梢允褂靡韵麓a完成:
- df['Self_Employed'].fillna('No',inplace=True)
現(xiàn)在,我們將創(chuàng)建一個(gè)數(shù)據(jù)透視表,它提供了貸款額度中位數(shù)按Self_Eployed和Education交叉分組。接下來(lái),我們定義一個(gè)函數(shù),它返回這些單元格的值并應(yīng)用它來(lái)填補(bǔ)貸款金額的缺失值:
- table = df.pivot_table(values='LoanAmount', index='Self_Employed' ,columns='Education', aggfunc=np.median)
- # Define function to return value of this pivot_table
- def fage(x):
- return table.loc[x['Self_Employed'],x['Education']]
- # Replace missing values
- df['LoanAmount'].fillna(df[df['LoanAmount'].isnull()].apply(fage, axis=1), inplace=True)
這樣為你提供一個(gè)很好的方式來(lái)估算貸款額度的缺失值。
如何處理LoanAmount和ApplicantIncome分布中的極端值?
我們首先分析LoanAmount。 極端值可能有實(shí)際意義的,有些人可能因?yàn)樘厥庑枰派暾?qǐng)高額貸款,所以不用把它們視為離群值,我們來(lái)嘗試用對(duì)數(shù)變換來(lái)消除它們的影響:
- df['LoanAmount_log'] = np.log(df['LoanAmount'])
- df['LoanAmount_log'].hist(bins=20)
再次查看直方圖:
現(xiàn)在分布看起來(lái)更加接近正態(tài)分布,極端值的影響已經(jīng)顯示減弱。
對(duì)于變量ApplicantIncome,一個(gè)可能的直覺(jué)是,一些申請(qǐng)人申報(bào)收入較低,但是綜合收入高也獲得支持。所以把申報(bào)收入作為總收入結(jié)合在一起是一個(gè)好主意,并采取同樣的對(duì)數(shù)變換。
- df['TotalIncome'] = df['ApplicantIncome'] + df['CoapplicantIncome']
- df['TotalIncome_log'] = np.log(df['TotalIncome'])
- df['LoanAmount_log'].hist(bins=20)
現(xiàn)在我們看到分布比以前好多了。我會(huì)把性別、已婚、贍養(yǎng)者、貸款月數(shù)、信用歷史等缺失值的估算留給大家完成。此外,我鼓勵(lì)大家考慮可能從數(shù)據(jù)中發(fā)掘附加信息,例如,創(chuàng)建列LoanAmount / TotalIncome可能是有道理的,因?yàn)樗o出了申請(qǐng)人如何適應(yīng)償還貸款的想法。
接下來(lái),我們將看看創(chuàng)建預(yù)測(cè)模型。
在Python中構(gòu)建一個(gè)預(yù)測(cè)模型
現(xiàn)在,我們已經(jīng)有對(duì)建模有用的數(shù)據(jù),現(xiàn)在我們來(lái)看看python代碼,在我們的數(shù)據(jù)集上創(chuàng)建一個(gè)預(yù)測(cè)模型。Skicit-Learn(sklearn)是Python中最常用的機(jī)器學(xué)習(xí)庫(kù),我們將會(huì)借助它來(lái)建模。
既然,sklearn要求所有輸入都是數(shù)字,所以我們應(yīng)該對(duì)類(lèi)別進(jìn)行編碼,將所有的分類(lèi)變量轉(zhuǎn)換為數(shù)值變量。這可以使用以下代碼完成:
- from sklearn.preprocessing import LabelEncoder
- var_mod = ['Gender','Married','Dependents','Education','Self_Employed','Property_Area','Loan_Status']
- le = LabelEncoder()
- for i in var_mod:
- df[i] = le.fit_transform(df[i])
- df.dtypes
接下來(lái),我們將導(dǎo)入所需的模塊。然后我們將定義一個(gè)通用分類(lèi)函數(shù),它將模型作為輸入,并確定準(zhǔn)確度和交叉驗(yàn)證得分。既然這是一個(gè)介紹性的文章,我將不再贅述編碼的細(xì)節(jié)。
- #Import models from scikit learn module:
- from sklearn.linear_model import LogisticRegression
- from sklearn.cross_validation import KFold #For K-fold cross validation
- from sklearn.ensemble import RandomForestClassifier
- from sklearn.tree import DecisionTreeClassifier, export_graphviz
- from sklearn import metrics
- #Generic function for making a classification model and accessing performance:
- def classification_model(model, data, predictors, outcome):
- #Fit the model:
- model.fit(data[predictors],data[outcome])
- #Make predictions on training set:
- predictions = model.predict(data[predictors])
- #Print accuracy
- accuracy = metrics.accuracy_score(predictions,data[outcome])
- print "Accuracy : %s" % "{0:.3%}".format(accuracy)
- #Perform k-fold cross-validation with 5 folds
- kf = KFold(data.shape[0], n_folds=5)
- error = []
- for train, test in kf:
- # Filter training data
- train_predictors = (data[predictors].iloc[train,:])
- # The target we're using to train the algorithm.
- train_target = data[outcome].iloc[train]
- # Training the algorithm using the predictors and target.
- model.fit(train_predictors, train_target)
- #Record error from each cross-validation run
- error.append(model.score(data[predictors].iloc[test,:],data[outcome].iloc[test]))
- print "Cross-Validation Score : %s" % "{0:.3%}".format(np.mean(error))
- #Fit the model again so that it can be refered outside the function:
- model.fit(data[predictors],data[outcome])
邏輯回歸
我們來(lái)做第一個(gè)邏輯回歸模型。一種方法是將所有變量都放入模型中,但這可能會(huì)導(dǎo)致過(guò)擬合。 簡(jiǎn)單來(lái)說(shuō),模型采用所有變量,有可能理解數(shù)據(jù)的特定的復(fù)雜關(guān)系,并不能很好地推廣。
我們可以很容易地做出一些直觀的假設(shè),獲得貸款的機(jī)會(huì)會(huì)更高:
1.具有信用記錄的申請(qǐng)人
2.具有較高申請(qǐng)收入和綜合收入的申請(qǐng)人
3.高等教育水平的申請(qǐng)人
4.具有高增長(zhǎng)前景的城市地產(chǎn)
我們用’Credit_History’做我們的第一個(gè)模型。
- outcome_var = 'Loan_Status'
- model = LogisticRegression()
- predictor_var = ['Credit_History']
- classification_model(model, df,predictor_var,outcome_var)
準(zhǔn)確度:80.945%,交叉驗(yàn)證得分:80.946%
- #We can try different combination of variables:
- predictor_var = ['Credit_History','Education','Married','Self_Employed','Property_Area']
- classification_model(model, df,predictor_var,outcome_var)
準(zhǔn)確度:80.945%交叉驗(yàn)證得分:80.946%
一般來(lái)說(shuō),我們期望通過(guò)增加變量數(shù)量來(lái)提高準(zhǔn)確度,但這是一個(gè)更具挑戰(zhàn)性的案例,準(zhǔn)確度和交叉驗(yàn)證得分不受重要性較小的變量的影響。信用歷史是主導(dǎo)模式。我們現(xiàn)在有兩個(gè)選擇:
1.特征工程:挖掘新信息,并嘗試預(yù)測(cè)。這個(gè)留給大家去發(fā)揮創(chuàng)造力。
2.更好的建模技術(shù)。接下來(lái)我們來(lái)探討一下。
決策樹(shù)
決策樹(shù)是構(gòu)建預(yù)測(cè)模型的另一種方法,通常比邏輯回歸模型具有更高的精度。
- model = DecisionTreeClassifier()
- predictor_var = ['Credit_History','Gender','Married','Education']
- classification_model(model, df,predictor_var,outcome_var)
準(zhǔn)確度:81.930%,交叉驗(yàn)證得分:76.656%
這里,基于分類(lèi)變量的模型不會(huì)受信用歷史產(chǎn)生影響。我們來(lái)嘗試幾個(gè)數(shù)值型變量:
- #We can try different combination of variables:
- predictor_var = ['Credit_History','Loan_Amount_Term','LoanAmount_log']
- classification_model(model, df,predictor_var,outcome_var)
準(zhǔn)確度:92.345%交叉驗(yàn)證得分:71.009%
在這里我們觀察到,添加變量后模型準(zhǔn)確度上升,交叉驗(yàn)證錯(cuò)誤率下降。這是模型數(shù)據(jù)過(guò)擬合的結(jié)果。我們嘗試一個(gè)更復(fù)雜的算法,看看是否有幫助。
隨機(jī)森林
隨機(jī)森林是解決分類(lèi)問(wèn)題的另一種算法。
隨機(jī)森林的一個(gè)優(yōu)點(diǎn)是我們可以將所有特征放在一起,并返回一個(gè)可用于選擇的特征重要性矩陣。
- model = RandomForestClassifier(n_estimators=100)
- predictor_var = ['Gender', 'Married', 'Dependents', 'Education',
- 'Self_Employed', 'Loan_Amount_Term', 'Credit_History', 'Property_Area',
- 'LoanAmount_log','TotalIncome_log']
- classification_model(model, df,predictor_var,outcome_var)
準(zhǔn)確度:100.000%交叉驗(yàn)證得分:78.179%
訓(xùn)練集的準(zhǔn)確度是100%,這是過(guò)擬合的最終結(jié)果,可以通過(guò)兩種方式解決:
1.減少預(yù)測(cè)數(shù)量
2.調(diào)整模型參數(shù)
我們來(lái)試試這兩種方法,首先我們看到特征重要性矩陣,我們將從中篩選最重要的特征變量。
- #Create a series with feature importances:
- featimp = pd.Series(model.feature_importances_, index=predictor_var).sort_values(ascending=False)
- print featimp
我們使用前5個(gè)變量來(lái)創(chuàng)建一個(gè)模型。另外,我們將修改一點(diǎn)點(diǎn)隨機(jī)森林模型的參數(shù):
- model = RandomForestClassifier(n_estimators=25, min_samples_split=25, max_depth=7, max_features=1)
- predictor_var = ['TotalIncome_log','LoanAmount_log','Credit_History','Dependents','Property_Area']
- classification_model(model, df,predictor_var,outcome_var)
準(zhǔn)確度:82.899%,交叉驗(yàn)證得分:81.461%
雖然準(zhǔn)確度降低,但交叉驗(yàn)證分?jǐn)?shù)在提高,表明該模型的適用性很好。記住,隨機(jī)森林模型不是完全可復(fù)用的。不同的變量運(yùn)行結(jié)果會(huì)有變化,但輸出盡量保持正確。
你會(huì)注意到,即使在對(duì)隨機(jī)森林進(jìn)行了一些基本的參數(shù)調(diào)整之后,我們交叉驗(yàn)證的精度只比原始邏輯回歸模型略好一些。這個(gè)案例給了我們一些非常有趣、特別的學(xué)習(xí)體驗(yàn):
1.使用更復(fù)雜的模型不能保證更好的預(yù)測(cè)結(jié)果。
2.避免使用復(fù)雜的建模技術(shù)作為黑盒子而不了解基本概念。這樣做會(huì)增加過(guò)擬合趨勢(shì),從而降低模型解釋力。
3.特征工程是成功的關(guān)鍵。大家可以使用Xgboost模型,但真正的藝術(shù)和創(chuàng)造力在于增強(qiáng)特征能力以更好地適應(yīng)模型。
你準(zhǔn)備好迎接挑戰(zhàn)嗎?借助貸款預(yù)測(cè)問(wèn)題開(kāi)始數(shù)據(jù)科學(xué)之旅。
結(jié)束教程
我希望本教程將幫助你在使用Python開(kāi)展數(shù)據(jù)科學(xué)分析時(shí)能最大限度地提高效率。我相信,這不僅給你提供一個(gè)基本的數(shù)據(jù)分析方法的引導(dǎo),而且還向你展示了如何實(shí)現(xiàn)一些更先進(jìn)的編程技術(shù)。
Python真的是一個(gè)強(qiáng)大的工具,并且日益成為數(shù)據(jù)科學(xué)家中流行的編程語(yǔ)言。原因在于Python很容易學(xué)習(xí),與其他數(shù)據(jù)庫(kù)和工具(如Spark和Hadoop)集成很好。最主要還是因?yàn)镻ython具有很強(qiáng)的計(jì)算能力和強(qiáng)大的數(shù)據(jù)分析庫(kù)。
學(xué)習(xí)利用Python來(lái)完成任何數(shù)據(jù)科學(xué)項(xiàng)目的完整過(guò)程包括閱讀、分析、可視化和結(jié)果預(yù)測(cè)。
當(dāng)前標(biāo)題:技術(shù)|使用Python來(lái)學(xué)習(xí)數(shù)據(jù)科學(xué)的完整教程
文章轉(zhuǎn)載:http://m.5511xx.com/article/dhjoioi.html


咨詢(xún)
建站咨詢(xún)
