成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

技術 | 使用Python來學習數據科學的完整教程

開發 后端
Python真的是一個強大的工具,并且日益成為數據科學家中流行的編程語言。原因在于Python很容易學習,與其他數據庫和工具(如Spark和Hadoop)集成很好。最主要還是因為Python具有很強的計算能力和強大的數據分析庫。

[[197367]]

我在SAS工作了5年多之后,決定走出舒適區。作為一名數據科學家,我在尋找其他好用的工具,幸運的是,沒過多久,我發現了Python。

一直以來,我喜歡敲代碼。事實證明,有了Python,敲代碼變得更為容易。

我花了一周時間來學習Python的基礎知識,從那時起,我不僅深入鉆研Python,而且還幫助許多其他人學習這門語言。起初,Python是門通用語言,多年來,隨著社區的大力支持,現在有了數據分析及預測建模庫。

由于缺少Python數據科學資源,我決定創建本教程,旨在幫助大家快速入門。在本教程中,我們將討論如何使用Python來進行數據分析,在實踐中總結方法。

Python數據分析基礎

為什么要學習使用Python來進行數據分析?

使用Python來進行數據分析的原因有很多,過去一段時間通過對比SAS和R,有以下幾點理由:

  • 開源免費
  • 強大社區支持
  • 易學
  • 成為數據科學和web產品分析的通用語言

誠然,它還有很多缺點:

Python是一種解釋語言而不是編譯語言,因此占用更多的CPU時間。然而,由于節省了程序員時間(易學),Python仍然是一個不錯的選擇。

Python 2.7與3.4版本的比較

這是Python中最受爭議的話題之一,作為初學者,你繞不開這個問題。其實選擇哪個版本都沒有對錯,完全取決于你的需要和實際使用場景。我會嘗試給大家一些指引,幫助大家做出明智的選擇。

為什么選擇Python 2.7?

社區支持,這是早期需要的,Python 2版本在2000年下半年發布,超過15年的使用了。

第三方庫支持,雖然許多庫提供3.X的支持,但仍然有大量庫只能在2.X版本上運行。如果你打算將Python用于特定的場景,如網頁開發,高度依賴外部模塊,你可能選擇2.7版本會更好。

3.X版本的一些功能向后兼容,可以使用2.7版本。

為什么選擇Python 3.4?

簡潔快速,Python開發人員已經修復了一些自身的Bug,為其發展打下更堅實的基礎。最初這些可能與你不是很相關,終將是很重要的。

未來趨勢,2.7版本是2.X系列的最后一個版本,最終大家都必須轉到3.X版本。Python 3已經發布了5年的穩定版本,并將持續推進。

沒有明確顯示到底誰好,但我認為最重要的是大家應該專注于將Python當作一門語言來學習。版本之間的轉換是一個時間的問題。遲點,繼續關注Python 2.X與3.X比較的文章。

如何安裝Python?

有兩種安裝Python的方法:

你可以直接在官網上下載Python,并安裝所需要的組件和庫。

或者,你可以下載安裝預裝庫的軟件包,我建議你下載Anaconda,另外可以是Canopy Express。

第二種方法免去安裝其他庫的麻煩,因此我會推薦給初學者。如果你對單個庫的最新版本感興趣,你必須等到整個軟件包的更新。除非你在做前沿的統計研究,否則應該沒有什么影響。

選擇開發環境

一旦安裝了Python,就有各種各樣的開發環境,以下是常見的3種:

  • Terminal / Shell
  • IDLE (默認)
  • iPython notebook(類似R中的markdown) 

 

正確的開發環境取決于你的需要,我個人更喜歡iPython Notebook。它有很多好的功能,編寫代碼時提供了文檔記錄功能,可以選擇運行代碼塊(而不是逐行執行)。

我們將使用iPython開發環境完成本教程。

預熱:運行你的第一個Python程序

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

 

提醒幾點

你可以在terminal / cmd上輸入“ipython notebook”來啟動iPython Notebook,這取決于你正在使用的操作系統。

可以通過點擊“UntitledO”來重命名。

界面顯示In [*]表示輸入,Out[*]表示輸出。

執行當前代碼塊按快捷鍵“Shift + Enter”,運行當前塊并插入額外的塊按快捷鍵“ALT + Enter”。

在深入解決問題之前,讓我們回顧一下,了解Python的基礎知識。 我們知道數據結構、迭代和條件結構構成任何語言的關鍵。 在Python中,這些包括列表,字符串,元組,字典,for循環,while循環,if-else等。我們來看看其中的一些。

Python庫及數據結構

Python數據結構

以下是一些在Python中使用的數據結構。你應該熟悉它們,以便適當使用它們。

Lists – 列表是Python中最常用的數據結構之一。 可以通過在方括號中寫入逗號分隔值的序列來簡單地定義列表。列表可以包含不同類型的項,但通常這些項都具有相同的類型。 Python列表是可變的,可以更改列表的各個元素。

下面是一個快速定義一個列表然后訪問它的例子:

 

Strings – 字符串可以簡單地通過使用單個(’),雙(“)或三個(’’’)的逗號來定義。 用三引號(’’’)括起來的字符串允許跨行,并且在文檔字符串中經常使用(Python的記錄函數的方法)。 “\”用作轉義字符。 請注意,Python字符串是不可變的,因此不能更改字符串的一部分。

 

Tuples – 一個元組用逗號分隔的值來表示。元組是不可變的,輸出被圓括號包圍,以便嵌套元組被正確處理。 此外,即使元組是不可變的,如果需要,可以保存可變數據。

 

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

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

  

Python迭代和條件構造

像大多數語言一樣,Python也有一個FOR循環,它是最廣泛使用的迭代方法。它有一個簡單的語法:

  1. for i in [Python Iterable]: 
  2.  
  3. expression(i)  

這里“Python Iterable”可以是列表,元組或其他高級數據結構,我們將在后面的部分中討論。我們來看一個簡單的例子,確定一個數字的階乘。

  1. fact = 1 
  2.  
  3. for i in range(1,N+1): 
  4.  
  5. fact *= i  

根據條件語句,這些語句用于根據條件執行代碼片段。最常用的結構是if-else,具有以下語法:

  1. if [condition]: 
  2.  
  3.     __execution if ture__ 
  4.  
  5. else
  6.  
  7. __execution if false__  

例如,如果我們要打印數字N是偶數還是奇數:

  1. if N%2 == 0: 
  2.  
  3.     print 'Even' 
  4.  
  5. else
  6.  
  7. print 'Odd'  

現在,你已經熟悉Python的基礎知識了,我們進一步了解一下,如果必須執行以下任務,該怎么辦?

1.兩個矩陣相乘

2.找到二次方程的根

3.繪制條形圖和直方圖

4.網頁訪問

如果你嘗試從頭開始編寫代碼,那將成為一場惡夢,你將在Python上不會堅持超過2天!但是不用擔心, 幸運的是,有許多預定義的庫,我們可以直接導入到我們的代碼中,使我們的編程工作變得容易。

例如,考慮我們剛剛看到的階乘例子。完成只需一個步驟:

  1. math.factorial(N) 

當然,我們需要導入math庫。我們來研究一下各種庫。

Python庫

通過了解一些有用的庫,將在我們學習Python的過程中領先一步。第一步顯然是學會將它們導入我們的環境中。在Python中有以下幾種方法:

  1. import math as m 
  2.  
  3. from math import *  

在第一種方式中,我們定義了一個別名為m的math庫?,F在我們可以使用別名m.factorial()引用它,從math庫(例如階乘)中使用各種函數。

第二種方式,導入了math庫的整個名稱空間,即可以直接使用factorial()而不引用math。

提示:Google建議你使用第一種導入庫方式,因為你將知道函數來自哪里。

以下是庫列表,任何科學計算和數據分析會用到:

  • NumPy:代表的是Numerical Python。NumPy最強大的功能是n維數組。該庫還包含基本的線性代數函數,傅里葉變換,隨機數函數和與其他底層語言(如Fortran,C和C ++)集成的工具。
  • SciPy:代表的是Scientific Python。SciPy建立在NumPy基礎上。它是離散傅里葉變換,線性代數,優化和稀疏矩陣等多種高級科學和工程模塊最有用的庫之一。
  • Matplotlib:用于繪制各種各樣的圖形,從直方圖到線圖、熱力圖。你可以使用ipython notebook中的Pylab功能(ipython notebook -pylab = inline)在線使用這些繪圖功能。如果忽略內聯選項,pylab將ipython環境轉換為與Matlab非常相似的環境。還可以使用Latex命令在圖像添加數學符號。
  • Pandas:用于結構化數據的運算和操作。廣泛用于數據整理和預處理。相較而言,Pandas被添加到Python時間不久,其有助于提高Python在數據科學社區的使用。
  • Scikit:用于機器學習。該庫建立在NumPy,SciPy和matplotlib基礎上,包含許多有效的機器學習和統計建模工具,例如分類,回歸,聚類和降維。
  • Statsmodels:用于統計建模。Statsmodels是一個Python中提供用戶探索數據、估計統計模型和執行統計測試的模組??捎糜诓煌愋蛿祿拿枋鲂越y計,統計測試,繪圖功能和結果統計。
  • Seaborn:用于數據可視化。Seaborn是一個用于在Python中制作有吸引力和翔實的統計圖形庫。它是基于matplotlib。Seaborn旨在使可視化成為探索和理解數據的核心組成。
  • Bokeh:用于在現代網絡瀏覽器上創建交互式圖表,儀表盤和數據應用程序。它賦予用戶以D3.js的風格生成優雅簡潔的圖形。此外,它具有超大型或流式數據集的高性能交互能力。
  • Blaze:將Numpy和Pandas的能力擴展到分布式和流式傳輸數據集。它可以用于從眾多來源(包括Bcolz,MongoDB,SQLAlchemy,Apache Spark,PyTables等)訪問數據。與Bokeh一起,Blaze可以作為在巨型數據塊上創建有效可視化和儀表盤的強大的工具。
  • Scrapy:用于網絡爬蟲。它是獲取特定模式數據的非常有用的框架。它從網站首頁url開始,然后挖掘網站內的網頁內容來收集信息。
  • SymPy:用于符號計算。它具有從基本算術符號到微積分,代數,離散數學和量子物理學的廣泛能力。另一個有用的功能是將計算結果格式化為LaTeX代碼。
  • Requests:用于web訪問。它類似于標準python庫urllib2,但是代碼更容易。你會發現與urllib2的微妙差異,但是對于初學者來說,Requests可能更方便。

你可能需要的額外的庫:

  • os用于操作系統和文件操作
  • networkx和igraph為基于圖的數據操作
  • regular expressions用于在文本中查找特定模式的數據
  • BeautifulSoup用于網絡爬蟲。它不如Scrapy,因為它只是單個網頁中提取信息。

既然我們熟悉Python基礎知識和庫,那么我們可以通過Python深入解決問題。做預測模型過程中,我們會使用到一些功能強大的庫,也會遇到不同的數據結構。我們將帶你進入三個關鍵階段:

  • 數據探索 – 詳細了解我們的數據
  • 數據清洗 – 清理數據,使其更適合統計建模
  • 預測建模 – 運行實際算法并獲得結果

使用pandas進行數據探索

為了進一步探索我們的數據,給你介紹另一個動物(好像Python還不夠!)- Pandas

[[197368]] 

Pandas是Python中最有好用的數據分析庫之一(我知道這些名字聽起來很奇怪,先這樣!)促使越來越多數據科學界人士使用Python?,F在我們將使用pandas從Analytics Vidhya比賽中讀取數據集,進行探索性分析,并構建我們的第一個基礎分類算法來解決這個問題。

在數據加載之前,先了解Pandas中2個關鍵數據結構 – Series和DataFrames。

Series及DataFrame介紹

Series可以理解為1維標簽/索引數組。你可以通過這些標簽訪問series的各個元素。

Dataframe類似于Excel工作簿,列名稱引用列,使用行號訪問行。本質區別在于dataframes中列名稱和行號稱為列和行索引。

Series和DataFrames構成了Pandas在Python中的核心數據模型。數據集首先被讀入Dataframes,然后各種操作(例如分組、聚合等)可以非常容易地應用于其列。

應用案例 – 貸款預測問題

以下是變量的描述:

變量 描述
Loan_ID 貸款ID
Gender 男/女
Married 已婚(Y/N)
Dependents 贍養人數
Education 教育程度(Graduate/Under Graduate)
Self_Employed 自雇人士(Y/N)
ApplicantIncome 申報收入
CoapplicantIncome 綜合收入
LoanAmount 貸款金額
Loan_Amount_Term 貸款月數
Credit_History 信用記錄
Property_Area 房產位置(Urban/Semi Urban/Rural)
Loan_Status 貸款批準狀態(Y/N)

開始數據探索

首先,在terminal/ Windows命令提示符下鍵入以下命令,以Inline Pylab模式啟動iPython界面:

  1. ipython notebook --pylab=inline 

這樣在pylab環境中打開了iPython notebook,它已經導入了一些有用的庫。此外,可以內聯繪制數據,這使得它成為一個非常好的交互式數據分析環境。 你可以通過鍵入以下命令(并獲得如下圖所示的輸出)來檢查環境是否加載正確:

  1. plot(arange(5)) 

 

我當前在Linux中工作,并將數據集存儲在以下位置: /home/kunal/Downloads/Loan_Prediction/train.csv

導入庫和數據集:

以下是我們將在本教程中使用的庫:

  1. numpy 
  2.  
  3. matplotlib 
  4.  
  5. pandas  

請注意,由于Pylab環境,你不需要導入matplotlib和numpy。我仍然將它們保留在代碼中,以便在不同的環境中使用代碼。

導入庫后,使用函數read_csv()讀取數據集。代碼如下:

  1. import pandas as pd 
  2.  
  3. import numpy as np 
  4.  
  5. import matplotlib as plt 
  6.  
  7. df = pd.read_csv("/home/kunal/Downloads/Loan_Prediction/train.csv") #使用Pandas讀入數據集轉換成dataframe  

快速數據探索

讀取數據集后,可以使用head()函數查看前幾行

  1. df.head(10) 

 

這樣輸出了10行,或者,也可以打印查看更多行數據集。

接下來,可以使用describe()函數來查看數值字段的摘要 

  1. df.describe() 

 

describe()函數將在其輸出中提供計數、平均值、標準偏差(std)、最小值、四分位數和最大值。

這里有幾個發現,你可以通過看看describe()函數的輸出來繪制:

1.LoanAmount有(614 – 592)22個缺失值。

2.Loan_Amount_Term有(614 – 600)14個缺失值。

3.Credit_History有(614 – 564)50個缺失值。

4.我們也可以看到,約84%的申請人有信用記錄,怎么樣?Credit_History字段的平均值為0.84(記住,Credit_History對于具有信用記錄的用戶而言為1,否則為0)

5.申請人收入分布似乎符合預期。與CoapplicantIncome相同。

請注意,我們可以通過比較平均值與中位數來了解數據中可能的偏差。

對于非數值(例如Property_Area,Credit_History等),我們可以查看頻率分布來了解它們是否有意義。頻率表可以通過以下命令打印輸出:

  1. df['Property_Area'].value_counts() 

同樣,我們可以看看信用歷史的獨特價值。請注意,dfname [‘column_name’]是一種基本的索引方法來訪問dataframe的特定列。它也可以是一個列名的列表。

分布分析

現在我們熟悉基本的數據特征,我們來研究各種變量的分布。從數字變量ApplicantIncome和LoanAmount開始。

首先使用以下命令繪制ApplicantIncome的直方圖:

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

 

在這里我們觀察到很少極端值。這也是為什么需要50個箱子來明確分配分配的原因。

接下來,我們來看一下箱線圖來了解分布。箱線圖可以通過以下方式繪制:

  1. df.boxplot(column='ApplicantIncome'

 

這證實了許多異常值/極端值的存在。這可歸因于社會的收入差距。部分原因可能是由于我們研究了不同教育水平的人。通過教育變量將其分離開:

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

 

我們可以看到大學學歷和非大學學歷的平均收入之間沒有實質性差異。但是,高學歷中高收入人數更多,這似乎是離群值。

現在,我們來看看變量LoanAmount的直方圖和boxplot,使用以下命令:

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

 

再次,有一些離群值。顯然,ApplicantIncome和LoanAmount都需要一定量的數據清洗。 LoanAmount有缺失值和離群值,同時,ApplicantIncome有一些離群值,接下來我們將分幾個部分,做更深入的了解。

分類變量的分析

現在我們了解ApplicantIncome和LoanIncome的分布,為了更詳細地理解分類變量,我們將使用Excel的透視表和交叉表。例如,我們來看根據信用記錄獲得貸款的機會,這可以在MS Excel中使用數據透視表來實現: 

 

注意:這里的貸款狀態重編碼了,1代表是,0代表否,平均值表示貸款的概率。

現在我們將看看使用Python生成類似洞察所需的步驟。

  1. temp1 = df['Credit_History'].value_counts(ascending=True
  2.  
  3. temp2=df.pivot_table(values='Loan_Status',index=['Credit_History'],aggfunc=lambda x: x.map({'Y':1,'N':0}).mean()) 
  4.  
  5. print 'Frequency Table for Credit History:' 
  6.  
  7. print temp1 
  8.  
  9. print '\nProbility of getting loan for each Credit History class:' 
  10.  
  11. print temp2  

現在可以看到,我們得到一個類似MS Excel一樣的透視表,這可以使用“matplotlib”庫,用以下代碼畫條形圖:

  1. import matplotlib.pyplot as plt 
  2.  
  3. fig = plt.figure(figsize=(8,4)) 
  4.  
  5. ax1 = fig.add_subplot(121) 
  6.  
  7. ax1.set_xlabel('Credit_History'
  8.  
  9. ax1.set_ylabel('Count of Applicants'
  10.  
  11. ax1.set_title("Applicants by Credit_History"
  12.  
  13. temp1.plot(kind='bar'
  14.  
  15. ax2 = fig.add_subplot(122) 
  16.  
  17. temp2.plot(kind = 'bar'
  18.  
  19. ax2.set_xlabel('Credit_History'
  20.  
  21. ax2.set_ylabel('Probability of getting loan'
  22.  
  23. ax2.set_title("Probability of getting loan by credit history")  

 

這表明如果申請人有有效的信用記錄,獲得貸款的機會是沒有有效信用記錄的8倍。你可以通過已婚,自雇,居住地區等繪制相似的圖表。

或者,這兩個圖也可以通過將它們組合在堆疊圖表中來進行可視化:

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

 

還可以添加性別(類似于Excel中的數據透視表):

 

如果你還沒有意識到,我們在這里創建了兩個基本的分類算法,一個基于信用記錄,另一個基于2分類變量(包括性別)。你可以快速編碼,以便在AV Datahacks上創建你的第一次提交版本。

我們看到如何在Python中使用pandas進行探索性數據分析,希望你對pandas(熊貓)的愛將會增加,pandas庫為你的數據集分析提供一些幫助。

接下來,我們進一步探討ApplicantIncome和LoanStatus變量,執行數據運算并創建一個數據集以應用各種建模技術。強烈建議再選擇一個數據集和問題,閱讀一個獨立的例子,然后再做進一步分析。

python數據清洗:Pandas

對于從事數據分析的人來說,下面這些是你必須要做的。

數據清洗 – 重構數據

在數據探索時,為了構建一個好的模型,需要先解決掉數據集中發現了的一些問題。這個過程通常稱為“數據清洗”。針對以下問題,我們看到:

1.變量缺失值。我們應該根據缺失值的數量和變量的預期重要性明智地估計這些值。

2.在分析這些分布的同時,我們看到變量ApplicantIncome和LoanAmount似乎都包含了離群值。雖然他們可能會有直觀的意義,但應該得到適當的處理。

除了這些數值型的數據問題之外,我們還應該關注非數值型數據,如性別、區域、已婚、教育程度和贍養人數,用以挖掘任何有用的信息。

檢查數據集中的缺失值

一起看看所有變量中的缺失值,因為大多數模型不能使用含缺失值的數據,缺失值填補很重要。所以,我們檢查數據集中的null / NaN的數量。

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

如果值為null則isnull()返回1,那么該命令計算出每個列中缺失值的數量。

 

雖然缺失值數量不是很多,但是大多變量都有缺失值,需要估算并填補缺失值。

注意:缺失值可能并不總是NaN。例如,如果Loan_Amount_Term為0,那么是否有意義,或者是否是缺失值?我想你的答案是缺失值,你是對的。所以我們應該檢查數據是否有實際意義。

如何填補LoanAmount中的缺失值?

有許多方法來填補貸款額度的缺失值,最簡單的是用均值替換,可以通過以下代碼來完成:

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

另外也可以是建立一個監督學習模型,以其他變量如年齡等為基礎預測貸款額度。

既然現在是數據清洗的步驟,我寧愿采取介于兩者之間的一種方法。一個關鍵的假設是,一個人教育程度或者個體經營戶與否,可以結合起來給出一個很好的貸款額度的估計。

首先,我們來看一下箱線圖,看看是否存在趨勢規律: 

[[197373]] 

 

因此,我們看到每個組的貸款額中位數有一些變化,可以用來作估算值。但是,我們必須先確保Self_Employed和Education變量中的每一個都不應該有缺少值。

如前所述,Self_Eployee有一些缺失的值??纯搭l率表:

 

大約86%的值為“No”,將缺失值估計為“No”是安全的,因為正確的概率會更高??梢允褂靡韵麓a完成:

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

現在,我們將創建一個數據透視表,它提供了貸款額度中位數按Self_Eployed和Education交叉分組。接下來,我們定義一個函數,它返回這些單元格的值并應用它來填補貸款金額的缺失值:

  1. table = df.pivot_table(values='LoanAmount'index='Self_Employed' ,columns='Education', aggfunc=np.median) 
  2.  
  3. # Define function to return value of this pivot_table 
  4.  
  5. def fage(x): 
  6.  
  7. return table.loc[x['Self_Employed'],x['Education']] 
  8.  
  9. Replace missing values 
  10.  
  11. df['LoanAmount'].fillna(df[df['LoanAmount'].isnull()].apply(fage, axis=1), inplace=True)  

這樣為你提供一個很好的方式來估算貸款額度的缺失值。

如何處理LoanAmount和ApplicantIncome分布中的極端值?

我們首先分析LoanAmount。 極端值可能有實際意義的,有些人可能因為特殊需要才申請高額貸款,所以不用把它們視為離群值,我們來嘗試用對數變換來消除它們的影響:

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

再次查看直方圖:

 

現在分布看起來更加接近正態分布,極端值的影響已經顯示減弱。

對于變量ApplicantIncome,一個可能的直覺是,一些申請人申報收入較低,但是綜合收入高也獲得支持。所以把申報收入作為總收入結合在一起是一個好主意,并采取同樣的對數變換。

  1. df['TotalIncome'] = df['ApplicantIncome'] + df['CoapplicantIncome'
  2.  
  3. df['TotalIncome_log'] = np.log(df['TotalIncome']) 
  4.  
  5. df['LoanAmount_log'].hist(bins=20) 

 

現在我們看到分布比以前好多了。我會把性別、已婚、贍養者、貸款月數、信用歷史等缺失值的估算留給大家完成。此外,我鼓勵大家考慮可能從數據中發掘附加信息,例如,創建列LoanAmount / TotalIncome可能是有道理的,因為它給出了申請人如何適應償還貸款的想法。

接下來,我們將看看創建預測模型。

在Python中構建一個預測模型

現在,我們已經有對建模有用的數據,現在我們來看看python代碼,在我們的數據集上創建一個預測模型。Skicit-Learn(sklearn)是Python中最常用的機器學習庫,我們將會借助它來建模。

既然,sklearn要求所有輸入都是數字,所以我們應該對類別進行編碼,將所有的分類變量轉換為數值變量。這可以使用以下代碼完成:

  1. from sklearn.preprocessing import LabelEncoder 
  2.  
  3. var_mod = ['Gender','Married','Dependents','Education','Self_Employed','Property_Area','Loan_Status'
  4.  
  5. le = LabelEncoder() 
  6.  
  7. for i in var_mod: 
  8.  
  9.     df[i] = le.fit_transform(df[i]) 
  10.  
  11. df.dtypes  

接下來,我們將導入所需的模塊。然后我們將定義一個通用分類函數,它將模型作為輸入,并確定準確度和交叉驗證得分。既然這是一個介紹性的文章,我將不再贅述編碼的細節。

  1. #Import models from scikit learn module: 
  2.  
  3. from sklearn.linear_model import LogisticRegression 
  4.  
  5. from sklearn.cross_validation import KFold   #For K-fold cross validation 
  6.  
  7. from sklearn.ensemble import RandomForestClassifier 
  8.  
  9. from sklearn.tree import DecisionTreeClassifier, export_graphviz 
  10.  
  11. from sklearn import metrics 
  12.  
  13. #Generic function for making a classification model and accessing performance: 
  14.  
  15. def classification_model(model, data, predictors, outcome): 
  16.  
  17.   #Fit the model: 
  18.  
  19.   model.fit(data[predictors],data[outcome]) 
  20.  
  21.   #Make predictions on training set
  22.  
  23.   predictions = model.predict(data[predictors]) 
  24.  
  25.   #Print accuracy 
  26.  
  27.   accuracy = metrics.accuracy_score(predictions,data[outcome]) 
  28.  
  29.   print "Accuracy : %s" % "{0:.3%}".format(accuracy) 
  30.  
  31.   #Perform k-fold cross-validation with 5 folds 
  32.  
  33.   kf = KFold(data.shape[0], n_folds=5) 
  34.  
  35.   error = [] 
  36.  
  37.   for train, test in kf: 
  38.  
  39.     # Filter training data 
  40.  
  41.     train_predictors = (data[predictors].iloc[train,:]) 
  42.  
  43.     # The target we're using to train the algorithm. 
  44.  
  45.     train_target = data[outcome].iloc[train] 
  46.  
  47.     # Training the algorithm using the predictors and target. 
  48.  
  49.     model.fit(train_predictors, train_target) 
  50.  
  51.     #Record error from each cross-validation run 
  52.  
  53.       error.append(model.score(data[predictors].iloc[test,:],data[outcome].iloc[test])) 
  54.  
  55.   print "Cross-Validation Score : %s" % "{0:.3%}".format(np.mean(error)) 
  56.  
  57.   #Fit the model again so that it can be refered outside the function
  58.  
  59.   model.fit(data[predictors],data[outcome]) 

邏輯回歸

我們來做第一個邏輯回歸模型。一種方法是將所有變量都放入模型中,但這可能會導致過擬合。 簡單來說,模型采用所有變量,有可能理解數據的特定的復雜關系,并不能很好地推廣。

我們可以很容易地做出一些直觀的假設,獲得貸款的機會會更高:

1.具有信用記錄的申請人

2.具有較高申請收入和綜合收入的申請人

3.高等教育水平的申請人

4.具有高增長前景的城市地產

我們用’Credit_History’做我們的第一個模型。

  1. outcome_var = 'Loan_Status' 
  2.  
  3. model = LogisticRegression() 
  4.  
  5. predictor_var = ['Credit_History'
  6.  
  7. classification_model(model, df,predictor_var,outcome_var)  

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

  1. #We can try different combination of variables: 
  2.  
  3. predictor_var = ['Credit_History','Education','Married','Self_Employed','Property_Area'
  4.  
  5. classification_model(model, df,predictor_var,outcome_var) 

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

一般來說,我們期望通過增加變量數量來提高準確度,但這是一個更具挑戰性的案例,準確度和交叉驗證得分不受重要性較小的變量的影響。信用歷史是主導模式。我們現在有兩個選擇:

1.特征工程:挖掘新信息,并嘗試預測。這個留給大家去發揮創造力。

2.更好的建模技術。接下來我們來探討一下。

決策樹

決策樹是構建預測模型的另一種方法,通常比邏輯回歸模型具有更高的精度。

  1. model = DecisionTreeClassifier() 
  2.  
  3. predictor_var = ['Credit_History','Gender','Married','Education'
  4.  
  5. classification_model(model, df,predictor_var,outcome_var)  

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

這里,基于分類變量的模型不會受信用歷史產生影響。我們來嘗試幾個數值型變量:

  1. #We can try different combination of variables: 
  2.  
  3. predictor_var = ['Credit_History','Loan_Amount_Term','LoanAmount_log'
  4.  
  5. classification_model(model, df,predictor_var,outcome_var)  

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

在這里我們觀察到,添加變量后模型準確度上升,交叉驗證錯誤率下降。這是模型數據過擬合的結果。我們嘗試一個更復雜的算法,看看是否有幫助。

隨機森林

隨機森林是解決分類問題的另一種算法。

隨機森林的一個優點是我們可以將所有特征放在一起,并返回一個可用于選擇的特征重要性矩陣。

  1. model = RandomForestClassifier(n_estimators=100) 
  2.  
  3. predictor_var = ['Gender''Married''Dependents''Education'
  4.  
  5. 'Self_Employed''Loan_Amount_Term''Credit_History''Property_Area'
  6.  
  7. 'LoanAmount_log','TotalIncome_log'
  8.  
  9. classification_model(model, df,predictor_var,outcome_var)  

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

訓練集的準確度是100%,這是過擬合的最終結果,可以通過兩種方式解決:

1.減少預測數量

2.調整模型參數

我們來試試這兩種方法,首先我們看到特征重要性矩陣,我們將從中篩選最重要的特征變量。

  1. #Create a series with feature importances: 
  2.  
  3. featimp = pd.Series(model.feature_importances_, index=predictor_var).sort_values(ascending=False
  4.  
  5. print featimp  

 

我們使用前5個變量來創建一個模型。另外,我們將修改一點點隨機森林模型的參數:

  1. model = RandomForestClassifier(n_estimators=25, min_samples_split=25, max_depth=7, max_features=1) 
  2.  
  3. predictor_var = ['TotalIncome_log','LoanAmount_log','Credit_History','Dependents','Property_Area'
  4.  
  5. classification_model(model, df,predictor_var,outcome_var)  

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

雖然準確度降低,但交叉驗證分數在提高,表明該模型的適用性很好。記住,隨機森林模型不是完全可復用的。不同的變量運行結果會有變化,但輸出盡量保持正確。

你會注意到,即使在對隨機森林進行了一些基本的參數調整之后,我們交叉驗證的精度只比原始邏輯回歸模型略好一些。這個案例給了我們一些非常有趣、特別的學習體驗:

1.使用更復雜的模型不能保證更好的預測結果。

2.避免使用復雜的建模技術作為黑盒子而不了解基本概念。這樣做會增加過擬合趨勢,從而降低模型解釋力。

3.特征工程是成功的關鍵。大家可以使用Xgboost模型,但真正的藝術和創造力在于增強特征能力以更好地適應模型。

你準備好迎接挑戰嗎?借助貸款預測問題開始數據科學之旅。

結束教程

我希望本教程將幫助你在使用Python開展數據科學分析時能最大限度地提高效率。我相信,這不僅給你提供一個基本的數據分析方法的引導,而且還向你展示了如何實現一些更先進的編程技術。

Python真的是一個強大的工具,并且日益成為數據科學家中流行的編程語言。原因在于Python很容易學習,與其他數據庫和工具(如Spark和Hadoop)集成很好。最主要還是因為Python具有很強的計算能力和強大的數據分析庫。

學習利用Python來完成任何數據科學項目的完整過程包括閱讀、分析、可視化和結果預測。 

責任編輯:龐桂玉 來源: 36大數據
相關推薦

2021-05-10 11:33:11

數字化

2020-03-20 14:40:48

數據科學Python學習

2020-12-31 06:18:08

人工智能物聯網大數據

2019-11-11 14:09:17

Swift數據科學語言

2020-12-23 07:56:13

數據科學數據工程技術

2022-11-02 14:45:24

Python數據分析工具

2023-05-16 08:31:04

2022-03-28 14:08:02

Python數據清洗數據集

2021-01-12 11:31:09

數據科學數據大數據

2023-05-04 12:35:39

AI科學

2019-07-31 15:14:40

Python數據科學可視化

2021-01-25 21:49:35

數據科學數據分析IT

2015-11-13 13:48:10

Python數據科學網站開發

2017-08-08 09:48:41

數據科學技術

2021-01-10 11:19:04

數據科學工具技術

2023-03-03 08:00:00

重采樣數據集

2021-07-12 15:17:08

機器學習化學元素氧化態

2019-04-25 14:00:24

編程語言機器學習Java

2020-06-10 07:54:11

PythonSQL數據科學

2017-07-20 15:39:48

深度學習神經科學解析夢境
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美日韩一 | 欧美精品在线观看 | 国产黑丝在线 | 91原创视频在线观看 | 色性av| 午夜私人影院在线观看 | 免费日韩网站 | 国产精品视频中文字幕 | 日本成人片在线观看 | 黄色片大全在线观看 | 国产乱码精品一区二区三区中文 | 亚洲精久久 | 亚洲视频一区在线观看 | 久草网站 | 在线一区二区国产 | 国产高清在线精品一区二区三区 | 欧美区在线 | 午夜视频在线观看网址 | 国产丝袜人妖cd露出 | 久久久免费电影 | 国产a视频 | 久久伊人精品一区二区三区 | 国产传媒在线播放 | avtt国产| 免费国产一区二区 | 欧美日韩一区二区视频在线观看 | 超碰操| 久久久视| 国产精品一区视频 | 国产a区 | 欧美一区二区三区的 | 亚洲精品视频在线播放 | 免费九九视频 | 久久久新视频 | 久久综合久久自在自线精品自 | 自拍第一页 | 成人黄视频在线观看 | 一区二区av | 婷婷国产一区二区三区 | 国产精品一区二区在线 | 欧美性网 |