如何快速成爲數據分析師?

本文首發在集智專欄python

本文較長,全是乾貨,建議收藏後做爲長期的學習指南。web


前段時間咱們分享過如何一步步經過Python成爲數據分析高手:戳這裏算法

不過這篇指南只是從宏觀上指引了你們的學習步驟以及經過哪些資源學習,咱們今天接着詳細談談怎樣依靠Python從零開始成爲一名數據分析師,期間會以一個借貸數據集爲例,分享利用Python進行數據分析所需的基礎知識和工具,相信能爲你藉助Python迅速成爲數據分析師提供一些幫助。express

內容目錄

1.用於數據分析的Python基本知識編程

  • 爲什麼學習Python用於數據分析?
  • 怎樣安裝Python?
  • 用Python作一些簡單的項目

2.Python庫和數據結構數組

  • Python數據結構
  • Python迭代和條件構造
  • 用於數據分析的Python庫

3.利用Python和Pandas進行探索性數據分析瀏覽器

  • Pandas的Series和Dataframe入門簡介
  • 以借貸數據集爲例完成數據分析項目

4.用Python的Pandas進行數據再加工bash

  • 如何推定缺失值
  • 如何應對極值

5.用Python建立預測模型,根據數據作預測網絡

  • 邏輯迴歸模型
  • 決策樹模型
  • 隨機森林模型

集智注:本文原做者爲數據科學家Kunal Jain,其畢業於印度最頂尖的IT院校印度理工學院,從事數據科學領域已逾10年,在英國和印度等多家大型跨國公司擔任資深數據分析師。數據結構

大概幾年前,在SAS領域工做了5年後,我(做者Kunal Jain——譯者注)決定走出個人溫馨區,勵志成爲一名數據科學家。在多方尋找能助我成爲數據科學家的學習工具後,我最終決定選擇Python。

我一直都很喜歡寫代碼,這是我心裏的熱愛。

我花了大概一週的時間學習了Python的基礎知識,而後不只我本身深刻掌握了這門語言,還幫助了其餘人也學習了Python。最初Python是一種通用語言,可是隨着這些年的發展和強大的社區支持,Python涌現了不少用於數據分析和預測建模的程序庫。

因爲不少人尚不知道如何將Python用於數據科學以及缺乏相關的資源,我決定寫這篇教程,幫更多人更快的學習Python。在教程中,我也會教你們如何用Python進行數據分析,最終熟練掌握,爲己所用。

1.Python用於數據分析的基本知識

爲什麼學習Python用於數據分析?

近年來,Python被不少人選擇用於數據分析,我將它和SAS、R語言作了一番比較,以爲如下是你學習Python用於數據分析的好處:

  • 開源——免費安裝和使用
  • 很強大的在線社區支持
  • 很是容易學習(沒任何編程基礎也能很快上手)
  • 能成爲數據科學和部署基於數據分析產品的通用語言

固然也存在一些缺點:

它是一門解釋性語言而非編譯語言,所以會花費更多的CPU時間。不過考慮到咱們能大幅節約編程學習時間(由於很容易學),二者相抵,這算不上是什麼大缺點。

怎樣安裝Python?

安裝Python有2種方法:

1.你能夠從Python的項目網站(https://www.python.org/download/releases/2.7/)直接下載,安裝你須要的各個組件和庫。

2.你也能夠下載和安裝程序包,裏面內置了預先安裝的庫。我建議下載Anaconda。另外一個選擇是Enthought Canopy Express。第二種方法提供無憂安裝,因此我建議初學者選這種方法。這種方法的缺點就是你必須等待整個包升級完畢,哪怕你只是對某個庫的最新版感興趣。

選擇開發環境

一旦安裝好Python,選擇開發環境時也有多種選項。這裏是3個最多見的選項:

  • 基於終端和Shell
  • IDLE(默認環境)
  • iPython notebook——至關於R語言中的Markdown

雖然應該根據本身的須要選擇正確的環境,但我我的更喜歡iPython notebook一些。 它提供了不少很好的功能供你在寫代碼時寫文檔,你還能夠選擇以代碼塊的方式運行代碼(而不是逐行運行)。

本文的整篇教程咱們都會使用iPython環境。

熱身:運行你的第一個Python項目

你能夠首先用Python寫一個簡單的計算器:

須要注意的一些事情:

  • 根據所用操做系統,你能夠在你的terminal/cmd上編寫「ipython notebook」啓動ipython notebook。
  • 你能夠在名稱上簡單點擊就能夠命名一個iPython notebook——例如上面截圖中的UntitledO。

  • 若是你想在後面插入一行額外行,能夠經過按「shift+Enter」或「ALT+Enter」執行代碼。

在咱們深刻解決問題前,前後退一步瞭解一下Python的基礎知識。咱們知道數據結構、迭代和條件結構是任何編程語言的關鍵。在Python中,這些信息包括列表,字符串,元組,字典,for循環,while循環,if-else等等。咱們看看其中一些。

2.Python 庫和數據結構

Python 數據結構

下面是Python中用到的一些數據結構。你應該對它們很是熟悉,以便後面能正確使用它們。

列表——列表是Python中最爲通用的數據結構之一。在方括號內寫一列常見的逗號分隔的值就能簡單定義一個列表。列表可能包含不一樣類型的數據項,但一般數據項都屬相同的類型。 Python列表是可變的,列表中的單個元素能夠改變。

下面是在Python中定義一個列表並獲取列表的示例:

字符串——使用單引號(‘),雙引號(「)或三引號(「 ‘)定義字符串。以三引號結尾的字符串能夠橫跨多個代碼行,在docstrings(Python中註釋函數的一種方法)中使用很是頻繁。\被用做轉義字符。注意Python字符串是不可變的,因此你不能更改字符串內容。

元組——元組由若干被逗號分隔的值表示。元組是不可變的,輸出被圓括號括起,所以要正確處理嵌套元組。此外,雖然元素是不可變的,若是有須要,它們也能包含可變數據。而因爲元組不可變的特色,它們在處理方面要快於列表。因此,若是你的列表沒法改變,就應該使用元組而非列表。

字典——字典是一種可變容器模型,且可存儲任意類型對象。 字典的每一個鍵值 key=>value 對用冒號 : 分割,每一個鍵值對之間用逗號 , 分割,整個字典包括在花括號 {} 中。一對花括號就能建立一個空字典:{}。

Python迭代和條件結構

和大多數語言同樣,Python也有for循環,是Python迭代中應用最普遍的一種方法。它的語法比較簡單:

for i in [Python Iterable]:
  expression(i)
複製代碼

這裏的「Python iterable」能夠是個列表,元組或其它高級的數據結構,咱們在下一部分會講到。咱們先看一個簡單的例子,肯定一個數字的階乘。

fact=1
for i in range(1,N+1):
  fact *= i
複製代碼

至於條件語句,它們是用於根據必定條件來執行代碼片斷。最經常使用的結構是if-else,語法以下:

if [condition]:
  __execution if true__
else:
  __execution if false__
複製代碼

例如,若是咱們想打印數字N是偶數仍是奇數,代碼這樣寫就能夠了:

if N%2 == 0:
  print 'Even'
else:
  print 'Odd'
複製代碼

如今你已經熟悉了Python的基本知識點,下面咱們更近一步。若是你有如下一些任務,該怎麼辦:

  • 相乘2個矩陣
  • 求解一元二次方程的根
  • 繪出條形圖和直方圖
  • 建立統計模型
  • 獲取網頁

若是你試圖從頭開始寫代碼完成它們,那這任務量簡直是噩夢通常的大,確定沒兩天你就堅持不下去了。不過不用太擔憂,幸虧有不少預約義的Python庫,咱們在代碼中能夠直接導入它們,讓咱們的任務更輕鬆容易。 例如,拿咱們上面所舉的階乘例子來講,咱們只需一步便可:

math.factorial(N)
複製代碼

固然咱們須要導入math庫來解決這個問題。咱們在下部分就講解一些程序庫。

Python庫

在這部分,咱們會認識一些實用的Python庫。很顯然第一步是學習怎麼將它們導入到咱們的環境中,有好幾種方法:

import math as m
複製代碼
from math import *
複製代碼

在第一種方法中,咱們爲庫math定義了一個別名m,咱們如今能夠經過用alias m.factorial()來引用math庫來使用它內部的多種函數(好比factorial)。

在第二種方法中,咱們導入了math中的整個名字空間,也就是說能夠無需引用math直接使用factorial()。

小提示:谷歌建議你們使用第一種導入庫的方法,由於這樣你能知道函數來自哪裏。

下面是一系列的程序庫,無論是你作任何數據分析工做都會用到它們,因此務必熟練掌握:

  • Numpy:Python語言的一個擴充程序庫。支持高級大量的維度數組與矩陣運算,此外也針對數組運算提供大量的數學函數庫。
  • SciPy:構建於NumPy之上,提供了一個用於在Python中進行科學計算的工具集,如數值計算的算法和一些功能函數,能夠方便的處理數據。
  • Matplotlib:一個 Python 的 2D繪圖庫,它以各類硬拷貝格式和跨平臺的交互式環境生成出版質量級別的圖形。經過 Matplotlib,開發者能夠僅須要幾行代碼,即可以生成繪圖,直方圖,功率譜,條形圖,錯誤圖,散點圖等。
  • Pandas:基於NumPy 的一種工具,該工具是爲了解決數據分析任務而建立的。Pandas 歸入了大量庫和一些標準的數據模型,提供了高效地操做大型數據集所需的工具。pandas提供了大量能使咱們快速便捷地處理數據的函數和方法。
  • Scikit Learn:用Python開發的機器學習庫,其中包含大量機器學習算法、數據集,是數據挖掘方便的工具。
  • Statsmodels:一個包含統計模型、統計測試和統計數據挖掘python模塊。對每個模型都會生成一個對應的統計結果。統計結果會和現有的統計包進行對比來保證其正確性。
  • Seaborn:用於統計數據可視化的一款Python可視化工具。依靠它,你能夠用Python繪出很是美觀、直觀和吸引人的圖形。是從事數據分析和挖掘工做的利器。
  • Bokeh:一款交互式可視化Python包,可以在瀏覽器上建立交互式圖形、數據面板和數據應用。
  • Blaze:可以擴展Numpy和Pandas處理分佈式和流媒體數據集的能力。能夠用於從包括Bcolz,MongoDB,SQLAIchemy,Apache Spark PyTables等多維數據源中獲取數據。和Bokeh一塊兒使用時,Blaze可以做爲一種很是強大數據,幫咱們繪製大量數據的可視化圖。
  • Scrapy:用於Python開發的一個快速、高層次的屏幕抓取和web抓取框架,用於抓取web站點並從頁面中提取結構化的數據。Scrapy用途普遍,能夠用於數據挖掘、監測和自動化測試。
  • SymPy:用於符號計算的Python庫,包括了積分,微分方程等各類數學運算方法,爲python提供了強大的數學運算支持。
  • Requests:是用Python語言編寫,基於 urllib,採用 Apache2 Licensed 開源協議的 HTTP 庫。它比 urllib 更加方便,能夠節約咱們大量的工做,徹底知足 HTTP 測試需求。

還有其餘一些可能會用到的庫:

  • os用於操做系統和文件操做
  • Networkx和igraph用於基於數據操做的圖形
  • Regular expressions用於發現文本數據中的模式
  • BeautifulSoup用於爬取網絡數據。

以上這些全部程序庫在學習初期沒必要所有掌握,視本身需求學習便可,可是像Numpy,Pandas這樣的數據挖掘和分析工具,必須熟悉使用。

到了這裏咱們已經學習了Python基礎知識和一些程序庫,下面咱們深刻了解一下如何用Python解決問題。沒錯,用Python建立預測模型!在這個過程當中,咱們會用到一些強大的程序庫,也會涉及更高層次的Python數據結構。主要有3個階段:

  • 數據探索——探索咱們手中數據的更多信息
  • 數據再加工——清洗數據,處理數據,讓數據更適合統計建模
  • 預測建模——運行算法,從數據中獲取有趣有意義的結果

3.使用Python和Pandas對數據進行探索性分析

爲了進一步挖掘咱們的數據,咱們要用到Pandas。

Pandas是Python中一款最實用的數據分析庫。下面咱們會用Pandas從Analytic Vidhya大賽數據中讀取數據集,對所得數據進行探索性分析,並建立簡單的分類算法解決這個問題。

在咱們加載數據以前,先理解Pandas中兩個關鍵的數據結構——Series和dataframes 。

Series和Dataframes簡介

Series能夠理解爲一個1維的標籤或索引數組,你能夠經過series中單個元素的標籤獲取它們。

Dataframe和Excel表很像,咱們有列名指代列,也有行,使用行號就能獲取它。不過在dataframe中,列名和行號都是列和行索引。

Series和dataframe組成了Python庫Pandas的核心數據模式。首先Pandas會將數據集讀取爲dataframe格式,而後就能很容易地應用各類各樣的操做,好比分組、彙集等等。

若是你對Pandas不是很熟悉,能夠查看這篇10分鐘Pandas入門教程: https://jizhi.im/blog/post/10min2pandas01

練習數據集——借貸預測問題

咱們從這裏下載數據,下面是變量描述:

咱們開始探索數據。

首先,在你的terminal或Windows命令行輸入如下內容,啓動Pylab模式下的iPython界面:

ipython notebook --pylab=inline
複製代碼

這會在Pylab環境中打開ipython notebook,其中內置了一些頗有用的庫。並且,你能在行內繪製數據,從而使其很是適合交互式數據分析。能夠輸入如下代碼,檢查環境是否正確加載:

plot(arange(5))
複製代碼

我當前在Linux上工做,已將數據保存在以下位置: /home/kunal/Downloads/Loan_Prediction/train.csv

導入程序庫和數據集:

咱們本教程會用到以下程序庫:

  • Numpy
  • Matplotlib
  • Pandas

請注意,由於使用Pylab環境,你無需導入matplotlib和Numpy。我將它們保留在了代碼中,以防你在其它環境下使用本代碼。

導入庫之後,咱們用函數read_csv()讀取數據集。到這個階段爲止代碼以下所示:

import pandas as pd
import numpy as np
import matplotlib as plt

df = pd.read_csv("/home/kunal/Downloads/Loan_Prediction/train.csv") #Reading the dataset in a dataframe using Pandas
複製代碼

快速數據探索

讀取數據集後,咱們就能夠用函數head()查看頂部幾行。

df.head(10)
複製代碼

應該會打印10行。你也能夠經過打印數據集查看更多行。接着,你經過使用describe()函數查看數值字段的總結。

df.describe()
複製代碼

describe()函數能夠在其輸出中展現計數、平均值、標準方差、最小值、最大值等。

經過查看describe()函數的輸出,咱們能夠發現以下信息:

LoanAmount有22個缺失值

Loan_Amount_Term有14個缺失值

Credit_History有50個缺失值

咱們還能夠看到84%的客戶有credit_history。

怎麼來的?

Credit_History字段的平均值爲0.84. Applicantlncome分佈彷佛和預期一致,Coapplicantlncome也是如此。

注意咱們經過將平均值和中位數比較,也能看到數據中可能出現了誤差。

對於非數字值(好比Property_Area,Credit_History等),咱們能夠查看頻率分佈以理解它們是否合理。能夠經過以下命令打印頻率表:

df['Property_Area'].value_counts()
複製代碼

一樣,咱們也能查看Credit_History的特殊值。

注意dfname[‘column_name’]是一個基本的索引技巧用以獲取dataframe的具體列。它也能夠是列的列表。

分佈分析:

如今咱們已經瞭解了基本的數據特徵,接着來學習多種變量的分佈。咱們先從數值變量開始,即Applicantlncome和LoanAmount。

咱們先用以下命令繪製Applicantlncome的直方圖:

df['ApplicantIncome'].hist(bins=50)
複製代碼

這裏咱們觀察到有少數極值,這也是爲什麼咱們須要用50個bins來清楚地描繪分佈狀況。

接着,咱們查看箱型圖來理解數據的分佈。用以下命令能夠繪製箱型圖:

df.boxplot(column='ApplicantIncome')
複製代碼

這確認了數據中有不少異常值,從中也反映出社會上收入差距很大,這或許是由於人們的受教育水平不一樣。咱們經過Education將他們進行分離:

df.boxplot(column='ApplicantIncome', by = 'Education')
複製代碼

咱們能夠看到受太高等教育的羣體和未受太高等教育的羣體的平均收入並未有顯著差別。但受太高等教育的羣體中高收入者更多,有些收入很是之高,成爲數據中的異常值。

如今,咱們用如下命令查看LoanAmount的直方圖和箱型圖:

df['LoanAmount'].hist(bins=50)
複製代碼

df.boxplot(column='LoanAmount')
複製代碼

咱們再次發現了一些極端值。很明顯,Applicantlncome和LoanAmount須要一些數據再加工。LoanAmount中包含缺失值和很多極值,而Applicantlncome中的極值要少一些,須要咱們更深刻的理解。咱們會在接下來的部分解決這個任務。

分類變量分析

如今咱們理解了Applicantlncome和Loanlncome的數據分佈,接着探索更詳細的分類變量信息。咱們會用到Excel類型的數據透視表和交叉表,例如,咱們能夠查看根據信用記錄獲取貸款的概率。使用透視表能夠獲取結果:

注意:這裏咱們將借貸狀態編寫爲1表示「是」,0表示「否」。因此平均值表示獲取貸款的機率。

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
複製代碼

如今咱們看看用Python生成相同數據洞察所需的步驟,咱們能夠觀察獲得的和Excel表同樣的pivot_table。咱們能夠用matplotlib庫以以下代碼繪製出條形圖:

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")
複製代碼

圖表顯示若是申請人具備正當有效的信用記錄,獲取貸款的概率會增長8倍。咱們也能夠按照Married(婚否),Self-Employed(是否受僱於他人),Property_Area(財產情況)等繪製類似的圖表。 另外,咱們也能夠將這兩個圖疊加在一塊兒:

temp3 = pd.crosstab(df['Credit_History'], df['Loan_Status'])
temp3.plot(kind='bar', stacked=True, color=['red','blue'], grid=False)
複製代碼

還能夠將性別因素添加進來:

若是你看得不是很明白,其實咱們這裏是建立了兩個基本的分類算法。一個基於信用記錄,另外一個基於兩個分類變量(包括性別)。

剛剛咱們展現瞭如何用Python和Pandas進行探索性數據分析。接着咱們進一步探索Applicantlncome和LoanStatus變量,進行數據再加工,並建立一個數據集應用多種多樣的建模技巧。強烈建議你應用另外一個數據集和相似問題,根據咱們剛纔的教程實際練習一番。

4.利用Pandas和Python進行數據再加工

到了這個進度,必定要認真學習了,準備好上手練習。

數據再加工——「需求翻新」

在咱們探索數據時,發現數據集中存在一些問題,須要加以解決以便後面用來搭建性能良好的模型。那麼解決有問題數據的任務就被稱爲「數據再加工」(data munging)。下面是咱們已經注意到的問題:

某些變量中存在缺失值,咱們應根據缺失值數量和變量的預期重要性明智地預估這些值。

在查看數據的分佈情況時,咱們發現ApplicantIncome和LoanAmount彷佛在兩邊都包含極值。雖然出現這些極端狀況也能說得通,可是咱們必須恰當地處理這些異常數據。

除了數值字段存在的這些問題外,咱們還應該查看非數值字段,也就是Gender,Property_Area,Married,Education和Dependents等等,看看它們是否包含有用信息。 若是對Pandas不是很熟悉,能夠看看這篇看法Pandas中一些技巧的文章: 戳這裏

檢查數據集中的缺失值

咱們查看全部變量中的缺失值,由於大部分模型沒法應對缺失值,即使它們可以應對,也幫不上忙。因此咱們檢查一下數據集中的空值。

df.apply(lambda x: sum(x.isnull()),axis=0) 
複製代碼

若是值爲空,這行命令應該能告訴咱們每列中的缺失值數量。

雖然缺失值的數量並非不少,可是不少變量中存在缺失值,那麼咱們應該將它們預估出來並進行相加。關於更多更詳細的缺失值推定方法,能夠查看這篇文章:戳這裏

注意:記住缺失值並不是一直都是空值。好比,若是Loan_Amount_Term爲0,你以爲說得通嗎?或者你會將它當作缺失值嗎?假設你就是這麼認爲,並且答案正確,那麼咱們應該檢查那些不切實際的值。

如何填補LoanAmount的缺失值?

填補缺失值有不少種方法,最簡單的一種就是用平均值取代,用以下代碼能夠實現:

df['LoanAmount'].fillna(df['LoanAmount'].mean(), inplace=True)
複製代碼

另外一種方式就是建立一個監督學習模型,根據其它變量預測LoanAmount的數量,而後再結合其它變量來預測缺失值。

因爲咱們這裏的目標是數據再加工的操做步驟,因此我會採起一種介乎這二者之間的方法。咱們須要作個重要的假設:無論申請人是否受過良好教育,或者是否受僱於人,都能預期得到較大數額的貸款。

首先,咱們查看箱型圖,看看是否存在必定的趨勢:

咱們看到每組申請人的貸款額度的中位數出現了一些變化,能夠用來推定缺失值。可是首先,咱們必須確保Self_Employed和Education特徵中全都沒有缺失值。

咱們以前說過,Self_Employed有一些缺失值,咱們看一下頻率表格:

因爲~86%的值爲「否」,所以推定缺失值也爲「否」要靠譜一些,用以下代碼能夠完成:

df['Self_Employed'].fillna('No',inplace=True)
複製代碼

如今,咱們會建立一個數據透視表,獲得Self_Employed和Education特徵下全部惟一值的中位數。接着,咱們定義一個函數,返回這些單元格的值,而後用函數來填充LoanAmount的缺失值:

table = df.pivot_table(values='LoanAmount', index='Self_Employed' ,columns='Education', aggfunc=np.median)
# 定義函數以返回 pivot_table的值
def fage(x):
 return table.loc[x['Self_Employed'],x['Education']]
# 替換缺失值
df['LoanAmount'].fillna(df[df['LoanAmount'].isnull()].apply(fage, axis=1), inplace=True)
複製代碼

以上就是咱們推定LoanAmount中缺失值的方法。

如何應對LoanAmount和Applicantlncome數據分佈中的極值?

我們首先分析LoanAmount。因爲極值在實際狀況中是可能存在的,也就是說有些人可能會因爲特定需求申請數額很是高的貸款,因此咱們不將它們看做異常值,而是嘗試對數轉換來抵消它們的影響:

df['LoanAmount_log'] = np.log(df['LoanAmount'])
df['LoanAmount_log'].hist(bins=20)
複製代碼

咱們再次查看直方圖:

如今數據的分佈看起來更接近正常狀況了,極值的影響力也被大幅減弱。

如今看Applicantlncome。直覺告訴咱們有些申請人會收入較低,但能做爲很合格的共同申請人,也就是兩個或兩個以上的人共同申請一筆貸款。因此將共同申請人的收入合併爲總收入,而後進行對數轉換,會是個不錯的方法。

df['TotalIncome'] = df['ApplicantIncome'] + df['CoapplicantIncome']
df['TotalIncome_log'] = np.log(df['TotalIncome'])
df['LoanAmount_log'].hist(bins=20) 
複製代碼

如今咱們看到數據的分佈情況比以前好多了。你能夠本身試着推定Gender,Married,Dependents,Loan_Amount_Term和Credit_History這些特徵下的缺失值。另外我也建議你們多考慮一下從數據中能夠挖掘出的其它一些信息。例如,能夠爲LoanAmount/Totallncome建立一個列,由於從中咱們能夠知道申請人有多大程度會歸還貸款。

下面咱們查看如何建立預測模型。

5.用Python建立預測模型

在通過一番努力,將數據預處理後,咱們如今用Python根據咱們的數據集建立一個預測模型。在Python中,Skicit-learn是最經常使用的建立預測模型的庫。若是你對Sklearn不是很熟悉,集智建議查看這份入門教程:

入門教程

因爲Sklearn須要全部的輸入必須爲數值型,因此咱們應將所有分類變量轉換爲數值變量。用以下代碼能夠完成:

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 
複製代碼

接着,咱們導入所需的模塊。而後咱們會定義一個通用分類函數,它會將模型做爲輸入,肯定準確率和交叉驗證率。因爲本文只是入門文章,這裏再也不深刻講解代碼,關於如何用經過交叉驗證來優化模型性能,能夠參考這篇文章

#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

#建立分類模型和獲取重要性的通用函數:
def classification_model(model, data, predictors, outcome):
  # 擬合模型:
  model.fit(data[predictors],data[outcome])
  
  # 用數據集作出預測:
  predictions = model.predict(data[predictors])
  
  # 打印準確度
  accuracy = metrics.accuracy_score(predictions,data[outcome])
  print "Accuracy : %s" % "{0:.3%}".format(accuracy)

  # 以5折執行K折交叉驗證
  kf = KFold(data.shape[0], n_folds=5)
  error = []
  for train, test in kf:
    # 過濾訓練數據
    train_predictors = (data[predictors].iloc[train,:])
    
    # 咱們用於訓練算法的目標值
    train_target = data[outcome].iloc[train]
    
    # 用目標值和預測因子訓練算法
    model.fit(train_predictors, train_target)
    
    #記錄每次運行交叉驗證的偏差值
    error.append(model.score(data[predictors].iloc[test,:], data[outcome].iloc[test]))
 
  print "Cross-Validation Score : %s" % "{0:.3%}".format(np.mean(error))

  # 再次擬合模型,以便被外部函數引用
  model.fit(data[predictors],data[outcome]) 
複製代碼

邏輯迴歸

咱們建立咱們的第一個邏輯迴歸模型。一種方法就是將全部變量輸入模型中,但這樣可能會形成過擬合,模型沒法很好泛化。

咱們能夠作出一些直觀的假設解決問題,若是是如下狀況,申請人獲取貸款的概率會更高:

  • 申請人有信用記錄(咱們前面解釋過這種狀況)
  • 申請人的收入很高,或做爲共同申請人時的收入很高
  • 申請人有較高的受教育程度
  • 在城區有固定資產且有較高的升值前景

咱們根據「Credit_History」建立咱們的第一個預測模型。

outcome_var = 'Loan_Status'
model = LogisticRegression()
predictor_var = ['Credit_History']
classification_model(model, df,predictor_var,outcome_var)
複製代碼

準確度:80.945% 交叉驗證得分: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)
複製代碼

準確度:80.945% 交叉驗證得分:80.946%

一般咱們預期增長變量後準確度能增長,但這頗有挑戰性。不夠重要的變量對準確度和交叉驗證得分影響並不大。Credit_History處於主導地位。如今咱們有兩個選擇:

  • 特徵工程:挖取新信息,嘗試預測。這一步就留給你作吧。
  • 選擇更好的建模方法。

決策樹

決策樹是另外一種建立預測模型的方法,並且衆所周知它能獲得比邏輯迴歸模型更高的準確度。

model = DecisionTreeClassifier()
predictor_var = ['Credit_History','Gender','Married','Education']
classification_model(model, df,predictor_var,outcome_var)
複製代碼

準確度:81.930% 交叉驗證得分:76.656%

這裏模型基於分類變量沒法產生影響,由於Credit_History處於主導地位。咱們嘗試一些數值變量。

# 咱們能夠嘗試不一樣的變量組合
predictor_var = ['Credit_History','Loan_Amount_Term','LoanAmount_log']
classification_model(model, df,predictor_var,outcome_var)
複製代碼

準確度:92.345% 交叉驗證得分:71.009%

這裏咱們觀察到雖然隨着變量增多準確度也增長了,但交叉驗證偏差也降低了。這是由於模型出現了過擬合的結果。咱們嘗試一種更復雜的算法,看看是否有幫助。

隨機森林

隨機森林是另外一種解決分類問題的算法。詳細瞭解隨機森林能夠參看集智的這篇文章

隨機森林的一個優勢就是咱們可讓它處理全部特徵,它會返回一個特徵重要性矩陣,可以用於選擇特徵。

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)
複製代碼

準確度:100.00% 交叉驗證得分:78.179%

這裏咱們看到模型在訓練集上的準確度達到了100%,這種屬於過擬合的極端狀況,能夠經過如下兩種方法解決:

  • 減小預測因子的數量
  • 調試模型參數

這兩種方式咱們都嘗試一下。首先咱們看看特徵重要性矩陣,選出最重要的特徵。

用特徵重要性建立一個series:
Featimp = pd.Series(model.feature_importances_, index=predictor_var).sort_values(ascending=False)
print featimp
複製代碼

咱們使用重要性最高的5個變量建立模型。一樣,咱們也會略微調整隨機森林模型的參數:

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)
複製代碼

準確度:82.899% 交叉驗證得分:81.461%

注意,雖然準確度降低了,但交叉驗證得分也獲得了優化,顯示模型可以很好的泛化。記住隨機森林模型並不是可重複,因爲隨機性的緣故,每次運行獲得的結果會略有不一樣。可是輸出大致保持穩定。

你可能也注意到,雖然調試了隨機森林模型中的基本函數,但咱們獲得的交叉驗證得分只是略微好於第一個邏輯迴歸模型的結果。從中咱們也能夠獲得一些有趣的發現:

  • 使用更復雜的模型並不能保證獲得更好的結果
  • 在沒有理解概念前,避免使用很是複雜的建模技巧。貿然使用會形成模型過擬合。
  • 特徵工程是解決問題的重要手段,每一個人均可以使用Xgboost模型,但仍是要依靠你可否加強特徵以更好的匹配模型。

結語

但願本文能幫你入門如何藉助從事數據科學工做,高效成長爲一名數據分析師。經過學習以上內容,不只能讓你瞭解基本的數據分析方法,也能學習如何應用其中一些複雜的方法。

Python真的是一種很棒的工具,由於易於學習,有大量的程序庫支持,故而成爲數據科學領域愈來愈受歡迎的編程語言。

因此建議學好Python,相信你最終能輕鬆應對任何數據科學項目,包括讀取、分析和可視化數據,並根據數據作出預測。

參考資料


0806期《人工智能-從零開始到精通》限時折扣中!

戳這裏看詳情

談笑風生 在線編程 瞭解一下?

(前25位同窗還可領取¥200優惠券哦)

相關文章
相關標籤/搜索