歡迎光臨
每天分享高質量文章

教程|Python語言做資料分析教程

引言

那是幾年前的事了。在SAS工作了5年多之後,我決定離開我的舒適區。作為一名資料科學家,我正在尋找其他有用的工具!幸運的是,我很快就決定了——Python是我的開胃菜。

我一直有編寫代碼的傾向。這是做我真正熱愛的事情的時候。代碼。事實證明,編寫代碼實際上非常簡單!

我在一周內學會了Python的基礎知識。從那時起,我不僅深入地探索了這門語言,而且幫助了很多人學習這門語言。Python是一種通用語言。但是,多年來,在強大的社區支持下,這種語言構建了用於資料分析和預測建模的專用庫。

由於缺乏Python用於資料科學的資源,我決定創建本教程來幫助其他人更快地學習python。在本教程中,我們將得到關於如何使用Python進行資料分析的詳細信息,併在我們熟悉之後再進行實踐。

你也可以瀏覽“資料科學概論”課程,這是一門全面介紹資料科學的課程。它包括關於Python的模塊、統計和預測建模,以及多個實際專案,讓您動手實踐。

目錄:

1. 用於資料分析的Python基礎知識為什麼要學習Python進行資料分析?Python 2.7 和 3.4為什麼Python 2.7 ?為什麼Python 3.4 ?如何安裝Python?選擇開發環境2. Python庫和資料結構Python迭代和條件構造Python庫3.使用pandas在Python中進行探索性分析Series and Dataframes介紹實踐資料集-貸款預測問題4. Python中的資料管理:使用pandas5. 用Python構建預測模型邏輯回歸模型決策樹隨機森林

1. 用於資料分析的Python基礎知識

為什麼要學習Python進行資料分析?

Python作為一種用於資料分析的語言,最近引起了廣泛的興趣。我以前學過Python的基礎知識。下麵是一些支持學習Python的原因:

  • 開源-免費安裝
  • 很棒的在線社區
  • 簡單易學
  • 可以成為資料科學和基於web的分析產品生成的通用語言

不用說,它也有一些缺點:

  • 它是一種解釋語言而不是編譯語言——因此可能會占用更多的CPU時間。但是,考慮到節省了程式員的時間(由於易於學習),它仍然是一個不錯的選擇。

Python 2.7 和 3.4

這是Python中最受爭議的話題之一。您一定會遇到它,特別是如果您是初學者的話。這裡沒有正確/錯誤的選擇。這完全取決於情況和你的需要。我會試著給你一些建議來幫助你做出明智的選擇。

為什麼Python 2.7 ?

  1. 很棒的社區支持!這是你早年需要的東西。Python 2於2000年末發佈,已經使用了超過15年。
  2. 過多的第三方庫!雖然許多庫都提供了3.x支持,但仍然有很多模塊只能在2.x版本上工作。如果您計劃將Python用於特定的應用程式,比如高度依賴外部模塊的web開發,那麼使用2.7可能會更好。
  3. 3.x版本的一些特性具有向後兼容性,可以與2.7版本兼容。

為什麼Python 3.4 ?

  1. 更清爽和更快速!Python開發人員已經修複了一些固有的小故障和小缺陷,以便為將來打下更堅實的基礎。這些最初可能不是很相關,但最終會很重要。
  2. 這就是未來!2.7是2.x家族的最後一個版本。最終每個人都要轉向3.x版本。Python3已經發佈了5年的穩定版本並將繼續發佈(新的穩定版本)。

沒有明確的贏家,但我認為底線是您應該把重點放在將Python作為一種語言的學習上。不同版本之間的切換應該只是時間問題。請在不久的將來!繼續關註關於Python2.x和3.x的專門文章。

如何安裝Python?

安裝Python有兩種方法:

  • 您可以直接從其專案站點下載Python,並安裝所需的各個組件和庫
  • 另外,您可以下載並安裝一個包,它附帶預安裝的庫。我建議下載Anaconda。另一個選擇是Enthought Canopy Express。

第二種方法提供了一種無麻煩的安裝,因此我將向初學者推薦這種方法。這種方法的局限之處在於,即使您對單個庫的最新版本感興趣,也必須等待整個包的升級。這應該無關緊要,直到除非,你在做前沿的統計研究。

選擇開發環境

一旦安裝了Python,就可以使用多種選項來選擇環境。以下是三個最常見的選擇:

  • 基於終端/Shell的
  • IDLE(預設環境)
  • iPython筆記本-類似於R中的標記

雖然合適的環境取決於您的需要,但我個人非常喜歡iPython筆記本。它提供了很多很好的功能,可以在編寫代碼時進行記錄,您可以選擇以塊的形式運行代碼(而不是逐行執行)

在本教程中,我們將使用iPython環境。

熱身:運行您的第一個Python程式

你可以使用Python作為一個簡單的計算器開始:

一些需要註意的事情

  • 您可以通過在終端/ cmd上編寫“iPython notebook”來啟動iPython notebook,這取決於您正在使用的操作系統。
  • 您可以通過單擊上面屏幕截圖中的名字- UntitledO來命名iPython筆記本。
  • 輸入顯示In[],輸出顯示Out[]。
  • 如果想在後面插入額外的行,可以按“Shift + Enter”或“ALT + Enter”來執行代碼。

在我們深入探討問題解決之前,讓我們後退一步,瞭解Python的基礎知識。眾所周知,資料結構、迭代和條件結構構成了任何語言的關鍵。在Python中,這包括串列、字串、元組、字典、for-loop、while-loop、if-else等。讓我們來看看其中的一些。

2. Python庫和資料結構

Python資料結構

下麵是一些在Python中使用的資料結構。您應該熟悉它們,以便適當地使用它們。

串列——串列是Python中最通用的資料結構之一。串列可以簡單地通過在方括號中編寫逗號分隔值串列來定義。串列可能包含不同型別的項,但通常這些項都具有相同的型別。Python串列是可變的,可以更改串列的單個元素。

這裡有一個快速的例子來定義一個串列,然後使用它:

字串——字串可以簡單地通過使用單(‘)、雙(“)或三(”’)引號來定義。字串使用三引號括起來的字串可以跨多行,經常用於docstring (Python記錄函式的方式)。\用作轉義字符。請註意Python字串是不可變的,所以您不能更改字串的一部分。

元組——一個元組由許多用逗號分隔的值表示。元組是不可變的,輸出被括號包圍,以便正確處理嵌套的元組。此外,即使元組是不可變的,如果需要,它們也可以儲存可變資料。

由於元組是不可變的,並且不能更改,因此與串列相比,它們的處理速度更快。因此,如果串列不太可能更改,應該使用元組而不是串列。

Dictionary——是一組無序的鍵:值對,要求鍵是惟一的(在一個字典中)。一對大括號創建一個空字典:{}。

Python迭代和條件構造

和大多數語言一樣,Python也有for迴圈,這是最廣泛使用的迭代方法。它有一個簡單的語法:

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的基本原理,讓我們更進一步。如果你必須執行以下任務怎麼辦:

  1. 矩陣相乘
  2. 求二次方程的根
  3. 繪製條形圖和直方圖
  4. 使統計模型
  5. 訪問網頁

如果您試圖從頭開始編寫代碼,那麼這將是一場噩夢,您在Python上停留的時間不會超過2天!
但我們不用擔心。值得慶幸的是,有許多預定義的庫,我們可以直接將它們匯入到代碼中,使我們的工作變得簡單。

例如,考慮我們剛剛看到的階乘例子。我們可以通過一個簡單的步驟做到:

math.factorial(N)

當然,我們需要為此匯入數學庫。接下來讓我們探索各種庫。

Python庫

讓我們通過瞭解一些有用的庫,在學習Python的旅程中向前邁出一步。第一步顯然是學習將它們匯入到我們的環境中。在Python中有幾種方法可以做到這一點:

在第一種方法中,我們定義了庫數學的別名m。現在我們可以使用math庫中的各種函式(例如factorial),通過使用別名m.factorial()取用它。

第二種方法,您已經匯入了math中的整個名稱空間,也就是說,您可以直接使用factorial(),而不需要取用數學。

提示:谷歌建議您使用第一種匯入庫的風格,因為您將知道函式來自何處。

以下是庫的串列,您將會需要任何科學計算和資料分析:

  • NumPy代表數值Python。NumPy最強大的特性是n維陣列。這個庫還包含基本的線性代數函式、傅里葉變換、高級隨機數功能以及與其他低級語言(如Fortran、C和c++)集成的工具。

  • SciPy代表科學Python。SciPy是建立在NumPy之上的。它是最有用的庫之一,提供了各種高級科學和工程模塊,如離散傅里葉變換,線性代數,優化和稀疏矩陣。

  • Matplotlib用於繪製各種各樣的圖形,從柱狀圖到線狀圖再到熱圖。您可以在ipython notebook (ipython notebook -pylab = inline)中使用Pylab特性來行內使用這些繪圖特性。如果忽略行內選項,那麼pylab將ipython環境轉換為與Matlab非常類似的環境。您還可以使用Latex命令將數學添加到繪圖中。

  • Pandas用於結構化資料操作和操作的。廣泛用於資料採集和製備。Pandas是最近才添加到Python中的,它在促進Python在資料科學家社區中的使用方面發揮了重要作用。

  • Scikit Learn 用於機器學習。該庫以NumPy、SciPy和matplotlib為基礎,包含了大量有效的機器學習和統計建模工具,包括分類、回歸、聚類和降維。

  • Statsmodels用於統計建模。Statsmodels是一個Python模塊,允許用戶研究資料、估計統計模型和執行統計測試。描述統計、統計測試、繪圖函式和結果統計的廣泛串列可用於不同型別的資料和每個估計值。

  • Seaborn用於統計資料可視化。Seaborn是一個用於在Python中生成具有吸引力和信息豐富的統計圖形的庫。它基於matplotlib。Seaborn的標的是使可視化成為探索和理解資料的核心部分。

  • Bokeh用於在現代web瀏覽器上創建交互式繪圖、儀錶板和資料應用程式。它使用戶能夠生成優雅和簡潔的圖形風格的3.js。此外,它還具有在非常大的或流式資料集上進行高性能交互的能力。

  • Blaze擴展Numpy和panda到分佈式和流資料集的能力。它可以用於訪問來自多個資料源的資料,包括Bcolz、MongoDB、SQLAlchemy、Apache Spark、PyTables等。與Bokeh一起,Blaze可以作為一個非常強大的工具,在巨大的資料塊上創建有效的可視化和儀錶板。

  • Scrapy是網頁爬蟲庫。對於獲取特定的資料樣式,它是一個非常有用的框架。它有能力從一個網站的主頁url開始,然後通過網站內的網頁來收集信息。

  • SymPy用於符號計算。它具有從基本符號算術到微積分、代數、離散數學和量子物理的廣泛功能。另一個有用的特性是將計算結果格式化為LaTeX代碼的能力。

  • Requests用於訪問web。它的工作原理類似於標準python庫urllib2,但是更容易編碼。您將發現與urllib2的細微差別,但是對於初學者來說,Requests可能更方便。

其它庫,你也需要知道:

  • os用於操作系統和檔案操作
  • networkx和igraph用於基於圖的資料操作
  • regular expressions用於在文本資料中查找樣式
  • BeautifulSoup 用於爬取網頁,它可以在一次運行中從單個頁面中提取信息。

現在我們已經熟悉了Python的基本原理和其他庫,讓我們通過Python深入研究要解決的問題。是的,我的意思是建立一個預測模型!在此過程中,我們使用了一些功能強大的庫,還遇到了其它資料結構。我們將帶您經歷三個關鍵階段:

  1. 資料探索-發現更多關於我們擁有的資料
  2. 資料管理——清理資料並對其進行處理,使其更適合統計建模
  3. 預測建模-運行實際的演算法

3.使用pandas在Python中進行探索性分析

為了進一步研究我們的資料,讓我向您介紹另一種動物(好像Python還不夠!)——熊貓。

pandas是Python中最有用的資料分析庫之一(我知道這些名稱聽起來很奇怪,但是等等!)。它們在資料科學社區中促進了Python的使用。現在,我們將使用pandas從Analytics Vidhya競賽中讀取資料集,執行探索性分析,並構建第一個基本分類演算法來解決這個問題。

在加載資料之前,讓我們瞭解pandas中的兩個關鍵資料結構—Series和DataFrames。

Series and Dataframes介紹

Series可以理解為一個一維標記/索引陣列。您可以通過這些標簽訪問本系列的各個元素。

dataframe類似於Excel工作簿——您有取用列的列名和可以使用行號訪問的行。本質上的區別在於對於資料框列名和行號被稱為列和行索引。

Series和dataframes構成Python中panda的核心資料模型。資料集首先讀入這些資料框,然後各種操作(例如group by、aggregation等)可以很容易地應用到它的列上。

更多:Pandas的10分鐘

實踐資料集-貸款預測問題

您可以從這裡下載資料集。變數描述如下:

讓我們從探索開始
首先,在您的終端/ windows命令提示符上鍵入以下命令,以行內Pylab樣式啟動iPython界面:

ipython notebook --pylab=inline

這將在pylab環境中打開iPython notebook,其中已經匯入了一些有用的庫。此外,您還可以行內地繪製資料,這使它成為一個非常好的交互式資料分析環境。您可以通過輸入以下命令(並獲得如下圖所示的輸出)來檢查環境是否已正確加載:

plot(arange(5))

匯入庫和資料集:
以下是我們將在本教程中使用的庫:

  • numpy
  • matplotlib
  • pandas

請註意,由於Pylab環境的原因,您不需要匯入matplotlib和numpy。我仍然將它們儲存在代碼中,以防您在不同的環境中使用這些代碼。

匯入庫之後,使用函式read_csv()讀取資料集。這是代碼的樣子:

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

df = pd.read_csv("/home/kunal/Downloads/Loan_Prediction/train.csv"

快速資料探索
讀取完資料集之後,可以使用函式head()查看幾行最上面的行

df.head(10)

這應該會打印10行。另外,您還可以通過打印資料集查看更多行。
接下來,您可以使用describe()函式查看數值欄位的摘要

df.describe()

函式將在輸出中提供count、mean、standard deviation (std)、min、quartile和max。

這裡有一些推論,您可以通過查看describe()函式的輸出來得出:

  • LoanAmount有(614 – 592)22個缺失值。
  • Loan_Amount_Term有(614 – 600)14個缺失值。
  • Credit_History有(614 – 564)50個缺失值。
  • 我們還可以看到大約84%的申請人有信用記錄。如何?Credit_History欄位的平均值為0.84(請記住,對於有信用記錄的用戶,Credit_History的值為1,否則為0)
  • 申請人的收入分配情況似乎與預期相符。CoapplicantIncome也一樣

請註意,我們可以通過將平均值與中位數(即50%)進行比較來瞭解資料中可能存在的偏差。
對於非數值(例如Property_Area、Credit_History等),我們可以查看頻率分佈,以瞭解它們是否有意義。頻率表可按以下命令列印:

df['Property_Area'].value_counts()

同樣,我們可以查看信用記錄端口的獨特值。註意,dfname[‘ column_name ‘]是訪問資料框的特定列的基本索引技術。它也可以是列的串列。更多信息,請參考上面共享的“Pandas的10分鐘”資源。

分佈分析
現在我們已經熟悉了基本的資料特征,讓我們來研究各種變數的分佈。讓我們從數值變數開始——即ApplicantIncome和LoanAmount

讓我們開始使用以下命令繪製ApplicantIncome直方圖:

df['ApplicantIncome'].hist(bins=50)

這裡我們觀察到極值很少。這也是為什麼需要50個箱子來描述清楚分佈的原因。
接下來,我們看一下箱形圖來理解分佈。 箱線圖可由以下方法繪製:

df.boxplot(column='ApplicantIncome')

這證實了大量異常值/極值的存在。這可以歸因於社會上的收入差距。這在一定程度上是由於我們關註的是不同教育水平的人。讓我們通過教育把他們隔離開來:

df.boxplot(column='ApplicantIncome'by = 'Education')

我們可以看到,大學畢業生和非大學畢業生的平均收入沒有顯著差異。但收入非常高的畢業生人數更多,這似乎是一個異常。

現在,讓我們使用以下命令查看LoanAmount的直方圖和箱線圖:

df['LoanAmount'].hist(bins=50)
df.boxplot(column='LoanAmount')

同樣,也有一些極值。顯然,申請收入和貸款額都需要一定數量的資料處理。貸款金額有缺失值和極值,而申請收入有少數極值,需要更深入的理解。我們將在接下來的章節中討論這個問題。

分類變數分析
現在我們已經瞭解了申請收入和貸款收入的分佈,讓我們更詳細地瞭解分類變數。我們將使用Excel風格的透視表和交叉表格。例如,讓我們看看根據信用歷史獲得貸款的機會。這可以在MS Excel中實現,使用透視表如下:

註意:這裡貸款狀態被編碼為1表示是,0表示不是。均值表示得到貸款的概率。
現在,我們將研究使用Python生成類似見解所需的步驟。請參閱本文,瞭解pandas中不同的資料操作技術。

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)

現在我們可以看到我們得到了一個類似於MS Excel的資料透視表。這可以用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倍。您可以通過已婚、自主創業、Property_Area等繪製類似的圖表。

另外,這兩個圖也可以通過將它們組合在堆疊的圖表中來可視化:

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

你也可以添加性別(類似於Excel中的資料透視表):

如果您還沒有意識到,我們剛剛在這裡創建了兩個基本的分類演算法,一個基於信用歷史,另一個基於兩個分類變數(包括性別)。您可以快速編寫代碼來在AV Datahacks上創建第一個提交。

我們剛剛看到瞭如何使用panda在Python中進行探索性分析。我希望你對熊貓(這種動物)的愛現在已經增加了——考慮到大量的幫助,這個庫能夠提供給你分析資料集。

接下來,讓我們進一步研究ApplicantIncome和LoanStatus變數,執行資料分析,並創建一個用於應用各種建模技術的資料集。我強烈建議您在進一步閱讀之前,使用另一個資料集和問題,並通過一個獨立的示例。

4. Python中的資料管理:使用pandas

對於那些一直跟隨你跑步的人,以下是你開始跑步時必須穿的鞋子。

資料管理——需求清單

在對資料進行探索的過程中,我們發現了資料集中存在的一些問題,這些問題需要在資料適合模型之前得到解決。這個練習通常稱為“資料管理”。以下是我們已經意識到的問題:

  1. 有些變數缺少值。我們應該根據缺失值的數量和變數的預期重要性明智地估計這些值。
  2. 在查看分佈時,我們發現申請收入和貸款額似乎在兩端都包含極值。雖然它們可能有直觀的意義,但應該得到適當的處理。

除了這些數字欄位的問題,我們還應該看看非數字欄位,如性別、財產面積、已婚、教育和受撫養人,看看它們是否包含任何有用的信息。
如果你對pandas還不熟悉,我建議你在繼續之前閱讀這篇文章。它詳細介紹了一些有用的資料操作技術。

檢查資料集中缺少的值
讓我們看看所有變數中缺失的值,因為大多數模型都不能處理缺失的資料,即使它們處理了,填補它們也常常有幫助。因此,讓我們檢查資料集中的null / NaNs的數量

df.apply(lambda x: sum(x.isnull()),axis=0

如果值為null,isnull()函式傳回1。這個命令應該告訴我們每一列中缺失的值的數量。

雖然缺失值的數量不是很多,但是很多變數都有缺失值,每一個缺失值都需要估計並添加到資料中。通過本文對不同的填補方法進行了詳細的闡述。

註意:請記住,丟失的值不一定總是nan。例如,如果Loan_Amount_Term為0,這有意義嗎?我想你的答案錯了,你是對的。所以我們應該檢查那些不實用的值。

如何填充LoanAmount中缺失的值?
填補貸款金額缺失的方法有很多,最簡單的方法是均值替換,可以通過以下代碼實現:

 df['LoanAmount'].fillna(df['LoanAmount'].mean(), inplace=True)

另一個極端可能是建立一個監督學習模型,根據其他變數預測貸款金額,然後使用年齡和其他變數預測存活期。
既然現在的目的是提出資料管理的步驟,我寧願採用一種介於這兩個極端之間的方法。一個關鍵的假設是,一個人是否受過教育或自雇,可以結合起來給出一個很好的貸款金額估計。

首先,讓我們看看箱線圖,看看是否存在趨勢:

因此,我們可以看到每個組的貸款金額中值有一些變化,這可以用來計算這些值。但首先,我們必須確保每個自雇和教育變數都不應該有缺失的值。
如前所述,Self_Employed有一些缺失的值。讓我們看看頻率表:

因為~86%的值是“不”,所以把缺失的值歸為“不”是安全的,因為成功的概率很高。這可以通過以下代碼來實現:

df['Self_Employed'].fillna('No',inplace=True)

現在,我們將創建一個資料透視表,它為自雇和教育特性的所有獨特值組提供中位數值。接下來,我們定義一個函式,它傳回這些單元格的值,並應用它來填充貸款金額缺失的值:

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)

這將為您提供一個估算貸款金額缺失值的好方法。
註意:只有當您沒有使用前面的方法(即使用平均值)填充Loan_Amount變數中缺失的值時,此方法才會工作。

如何處理貸款金額和申請收入分配中的極值問題?
讓我們首先分析貸款金額。由於極值在實際中是可能的,也就是說,有些人可能會因為特定的需求而申請高價值貸款。因此,我們不把它們當作異常值,而是嘗試一個對數變換來抵消它們的影響:

df['LoanAmount_log'] = np.log(df['LoanAmount'])
df['LoanAmount_log'].hist(bins=20)

再次看柱狀圖:

現在分佈看起來更接近正常,極值的影響已經明顯減弱。
ApplicantIncome。一種直覺可能是,一些申請人收入較低,但對共同申請人給予了強有力的支持。因此,將兩種收入合併為總收入並對其進行log變換可能是一個好主意。

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

現在我們看到分佈比以前好多了。我將由您來為性別、已婚、受撫養人、Loan_Amount_Term、Credit_History添加缺失的值。此外,我鼓勵您考慮從這些資料中可能得到的其他信息。例如,為貸款額/總收入創建一個列可能是有意義的,因為它提供了一個關於申請人是否適合償還貸款的概念。
接下來,我們將研究建立預測模型。

5. 用Python構建預測模型

在我們將資料用於建模之後,現在讓我們看看python代碼,以在我們的資料集上創建一個預測模型。我鼓勵您通過本文重溫一下sklearn。

由於sklearn要求所有輸入都是數值的,所以我們應該通過對類別進行編碼,將所有類別變數轉換為數值。在此之前,我們將填充資料集中丟失的所有值。這可以通過以下代碼來實現:

df['Gender'].fillna(df['Gender'].mode()[0], inplace=True)
df['Married'].fillna(df['Married'].mode()[0], inplace=True)
df['Dependents'].fillna(df['Dependents'].mode()[0], inplace=True)
df['Loan_Amount_Term'].fillna(df['Loan_Amount_Term'].mode()[0], inplace=True)
df['Credit_History'].fillna(df['Credit_History'].mode()[0], inplace=True)

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 

接下來,我們將匯入所需的模塊。然後我們將定義一個泛型分類函式,它以一個模型作為輸入,確定准確性和交叉驗證分數。由於這是一篇介紹性文章,所以我將不深入討論編碼的細節。有關使用R和Python代碼的演算法的詳細信息,請參閱本文。此外,通過本文複習交叉驗證也是很好的,因為它是衡量power性能的一個非常重要的指標。

#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]) 

邏輯回歸模型

讓我們建立第一個邏輯回歸模型。一種方法是將所有變數都納入模型中,但這可能導致過度擬合(如果您還不瞭解這個術語,請不要擔心)。簡而言之,使用所有變數可能導致模型理解特定於資料的複雜關係,並且不能很好地概括。閱讀更多關於邏輯回歸的內容。

我們可以很容易地做出一些直觀的假設來啟動這個專案。獲得貸款的機會將會更高:

  1. 申請人有信用記錄(還記得我們在探索中觀察到的嗎?)
  2. 申請人及合申請人收入較高的申請人
  3. 具有高等教育程度的申請人
  4. 具有高增長前景的城市地產

讓我們用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%
一般來說,我們期望增加變數來提升準確性。但這是一個更具挑戰性的案例。準確性和交叉驗證得分沒有受到不那麼重要的變數的影響。我們現在有兩個選擇:

  • 特征工程:獲取新信息並嘗試預測它們。我將把這個留給你的創造力。
  • 更好的建模技術。接下來讓我們來探索一下。

決策樹

決策樹是另一種建立預測模型的方法。它比邏輯回歸模型具有更高的精度。閱讀更多關於決策樹的信息。

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

準確率:81.930%交叉驗證得分:76.656%
在這裡,基於分類變數的模型無法產生影響,因為信用記錄占主導地位。讓我們試幾個數值變數:

#We can try different combination of variables:
predictor_var = ['Credit_History','Loan_Amount_Term','LoanAmount_log']
classification_model(model, df,predictor_var,outcome_var)

準確度:92.345%交叉驗證得分:71.009%
在這裡我們觀察到,雖然增加變數後模型的準確性提高了,但是交叉驗證的錯誤降低了。這是模型對資料過度擬合的結果。讓我們嘗試一個更複雜的演算法,看看它是否有幫助。

隨機森林

隨機森林是解決分類問題的另一種演算法。閱讀更多關於Random Forest的信息。
隨機森林的一個優點是,我們可以使它與所有的特征,它傳回一個特征的重要性矩陣,可以用來選擇特征。

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.000%交叉驗證得分:78.179%
這裡我們看到訓練集的準確率為100%,這是過度擬合的最終情況,可以通過兩種方式解決:

  • 減少預測器的數量
  • 調整模型引數
    我們兩個都試試。首先,我們將看到特征重要性矩陣,我們將從中提取最重要的特征。
#Create a series with feature importances:
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%
註意,雖然精確度降低了,但是交叉驗證的分數正在提高,這表明模型的泛化效果很好。記住,隨機森林模型並不是完全可重覆的。由於隨機化,不同的運行會導致輕微的變化。但產出應該保持在大致範圍內。

您可能已經註意到,即使在對random forest進行了一些基本的引數調優之後,我們仍然達到了交叉驗證的精度,僅略好於原始邏輯回歸模型。這個練習給了我們一些非常有趣和獨特的學習:

  1. 使用更複雜的模型並不能保證更好的結果。
  2. 在不理解底層概念的情況下,避免將複雜的建模技術作為黑盒使用。這樣做會增加過度擬合的趨勢,從而降低模型的可解釋性。
  3. 特征工程是成功的關鍵。每個人都可以使用Xgboost模型,但真正的藝術和創造力在於增強您的功能,以更好地適應模型。
    您可以通過這個鏈接訪問本文中使用的資料集和問題陳述:貸款預測挑戰

原文鏈接:
https://www.analyticsvidhya.com/blog/2016/01/complete-tutorial-learn-data-science-python-scratch-2/

公眾號推薦:資料人才(ID:datarencai)

(一個幫助資料人才找工作的公眾號,

也分享資料人才學習和生活的有趣事情。)

赞(0)

分享創造快樂