耳聞目擊了機器學習的諸般神奇,有沒有衝動打算本身嘗試一下?本文咱們經過一個貸款風險評估的案例,用最通俗的語言向你介紹機器學習的基礎招式,一步步幫助你用Python完成本身的第一個機器學習項目。試過以後你會發現,機器學習真的不難。python
祝賀你,成功進入了一家金融公司實習。git
第一天上班,你還處在興奮中。這時主管把你叫過去,給你看了一個文件。github
文件內容是這個樣子的:算法
主管說這是公司寶貴的數據資產。囑咐你認真閱讀,而且從數字中找出規律,以便作出明智的貸款決策。安全
每一行數據,都表明了以前的一次貸款信息。你琢磨了好久,終於弄明白了每一列究竟表明什麼意思:微信
sub_grade
: 貸款細分級別short_emp
:一年之內短時間僱傭emp_length_num
:受僱年限home_ownership
:居住狀態(自有,按揭,租住)last_delinq_none
:貸款申請人是否有不良記錄last_major_derog_none
:貸款申請人是否有還款逾期90天以上記錄revol_util
:透支額度佔信用比例total_rec_late_fee
:逾期罰款總額safe_loans
:貸款是否安全最後一列,記錄了這筆貸款是否定期收回。拿着之前的這些寶貴經驗教訓,主管但願你可以總結出貸款是否安全的規律。在面對新的貸款申請時,從容和正確應對。app
主管讓你找的這種規律,能夠用決策樹來表達。框架
咱們來講說什麼是決策樹。dom
決策樹長得就像這個樣子:機器學習
作決策的時候,你須要從最上面的節點出發。在每個分支上,都有一個判斷條件。知足條件,往左走;不知足,向右走。一旦走到了樹的邊緣,一項決策就完成了。
例如你走在街上,碰見鄰居老張。你熱情地打招呼:
「老張,吃了嗎?」
好了,這裏就是個分支。老張的回答,將決定你的決策走向,即後面你將說什麼。
第一種狀況。
老張:吃過了。
你:要不來我家再吃點兒?
第二種狀況。
老張:還沒吃。
你:那趕忙回家吃去吧。再見!
……
具體到貸款這個實例,你須要依次分析申請人的各項指標,而後斷定這個貸款申請是否安全,以作出是否貸款給他的決策。把這個流程寫下來,就是一棵決策樹。
做爲一名金融界新兵,你本來也是抱着積極開放的心態,但願多嘗試一下的。可是當你把數據表下拉到最後一行的時候,你發現記錄竟然有46509條!
你估算了一下本身的閱讀速度、耐心和認知負荷能力,以爲這個任務屬於Mission Impossible(不可能完成),因而開始默默地收拾東西,打算找主管道個別,辭職不幹了。
且慢,你沒必要如此沮喪。由於科技的發展,已經把一項黑魔法放在了你的手邊,隨時供你取用。它的名字,叫作機器學習。
什麼叫機器學習?
從前,人是「操做」計算機的。一項任務如何完成,人內心是徹底有數的。人把一條條指令下達給電腦,電腦負責傻呵呵地幹完,收工。
後來人們發現,對有些任務,人根本就不知道該怎麼辦。
前些日子的新聞裏,你知道Alpha Go和柯潔下圍棋。柯潔不只輸了棋,還哭了。
但是製造Alpha Go的那幫人,當真知道怎樣下棋,才能贏過柯潔嗎?你就是讓他們放棄體育家精神,攢雞毛湊撣子一塊兒上,跟柯潔下棋……你估計哭的是誰?
一幫連本身下棋,都下不贏柯潔的人,又是如何製做出電腦軟件,打敗了人類圍棋界的「最強大腦」呢?
答案正是機器學習。
你本身都不知道如何完成的任務,天然也不可能告訴機器「第一步這麼幹,第二步那麼辦」,或者「若是出現A狀況,打開第一個錦囊;若是出現B狀況,打開第二個錦囊」。
機器學習的關鍵,不在於人類的經驗和智慧,而在於數據。
本文咱們接觸到的,是最爲基礎的監督式學習(supervised learning)。監督式學習利用的數據,是機器最喜歡的。這些數據的特色,是都被打了標記。
主管給你的這個貸款記錄數據集,就是打了標記的。針對每一個貸款案例,後面都有「是否安全」的標記。1表明了安全,-1表明了不安全。
機器看到一條數據,又看到了數據上的標記,因而有了一個假設。
而後你再讓它看一條數據,它就會強化或者修改原先的假設。
這就是學習的過程:創建假設——收到反饋——修正假設。在這個過程當中,機器經過迭代,不斷刷新本身的認知。
這讓我想起了經典相聲段子「蛤蟆鼓」裏面的對話片斷。
甲:那我問問你,蛤蟆你看見過吧?
乙:誰沒見過蛤蟆呀。
甲:你說爲何它那麼小的動物,叫喚出來的聲音會那麼大呢?
乙:那是由於它嘴大肚兒大脖子粗,叫喚出來的聲音必然大。萬物都是一個理。
甲:我家的字紙簍子也是嘴大脖子粗,爲何它不叫喚哪?
乙:字紙簍是死物,那是竹子編的,不但不叫,連響都響不了。
甲:吹的笙也是竹子的,怎麼響呢?
乙:雖然竹子編的,由於它有窟窿有眼兒,有眼兒的就響。
甲:我家篩米的篩子滿是窟窿眼兒,怎麼吹不響?
這裏相聲演員乙,就一直試圖創建能夠推廣的假設。惋惜,甲老是用新的例證摧毀乙的三觀。
在四處碰壁後,可憐的機器跌跌撞撞地成長。看了許許多多的數據後,電腦逐漸有了本身對一些事情判斷的想法。咱們把這種想法叫作模型。
以後,你就能夠用模型去輔助本身作出明智的判斷了。
下面咱們開始動手實踐。用Python作個決策樹出來,輔助咱們判斷貸款風險。
使用Python和相關軟件包,你須要先安裝Anaconda套裝。詳細的流程步驟請參考《 如何用Python作詞雲 》一文。
主管給你展現的這份貸款數據文件,請從 這裏 下載。
文件的擴展名是csv,你能夠用Excel打開,看看是否下載正確。
若是一切正常,請把它移動到我們的工做目錄demo裏面。
到你的系統「終端」(macOS, Linux)或者「命令提示符」(Windows)下,進入咱們的工做目錄demo,執行如下命令。
pip install -U PIL
複製代碼
運行環境配置完畢。
在終端或者命令提示符下鍵入:
jupyter notebook
複製代碼
Jupyter Notebook已經正確運行。下面咱們就能夠正式編寫代碼了。
首先,咱們新建一個Python 2筆記本,起名叫作loans-tree。
爲了讓Python可以高效率處理表格數據,咱們使用一個很是優秀的數據處理框架Pandas。
import pandas as pd
複製代碼
而後咱們把loans.csv裏面的內容所有讀取出來,存入到一個叫作df的變量裏面。
df = pd.read_csv('loans.csv')
複製代碼
咱們看看df這個數據框的前幾行,以確認數據讀取無誤。
df.head()
複製代碼
由於表格列數較多,屏幕上顯示不完整,咱們向右拖動表格,看錶格最右邊幾列是否也正確讀取。
經驗證,數據全部列都已讀入。
統計一下總行數,看是否是全部行也都完整讀取進來了。
df.shape
複製代碼
運行結果以下:
(46508, 13)
複製代碼
行列數量都正確,數據讀取無誤。
你應該還記得吧,每一條數據的最後一列safe_loans
是個標記,告訴咱們以前發放的這筆貸款是否安全。咱們把這種標記叫作目標(target),把前面的全部列叫作「特徵」(features)。這些術語你如今記不住不要緊,由於之後會反覆遇到。天然就會強化記憶。
下面咱們就分別把特徵和目標提取出來。依照機器學習領域的習慣,咱們把特徵叫作X,目標叫作y。
X = df.drop('safe_loans', axis=1)
y = df.safe_loans
複製代碼
咱們看一下特徵數據X的形狀:
X.shape
複製代碼
運行結果爲:
(46508, 12)
複製代碼
除了最後一列,其餘行列都在。符合咱們的預期。咱們再看看「目標」列。
y.shape
複製代碼
執行後顯示以下結果:
(46508,)
複製代碼
這裏的逗號後面沒有數字,指的是隻有1列。
咱們來看看X的前幾列。
X.head()
複製代碼
運行結果爲:
注意這裏有一個問題。Python下作決策樹的時候,每個特徵都應該是數值(整型或者實數)類型的。可是咱們一眼就能夠看出,grade, sub_grade
, home_ownership
等列的取值都是類別(categorical)型。因此,必須通過一步轉換,把這些類別都映射成爲某個數值,才能進行下面的步驟。
那咱們就開始映射吧:
from sklearn.preprocessing import LabelEncoder
from collections import defaultdict
d = defaultdict(LabelEncoder)
X_trans = X.apply(lambda x: d[x.name].fit_transform(x))
X_trans.head()
複製代碼
運行結果是這樣的:
這裏,咱們使用了LabelEncoder函數,成功地把類別變成了數值。小測驗:在grade列下面,B被映射成了什麼數字?
請對比兩個表格,思考10秒鐘。
答案是1。你答對了嗎?
下面咱們須要作的事情,是把數據分紅兩部分,分別叫作訓練集和測試集。
爲何這麼折騰?
由於有道理。
想一想看,若是期末考試以前,老師給你一套試題和答案,你把它背了下來。而後考試的時候,只是從那套試題裏面抽取一部分考。你憑藉超人的記憶力得到了100分。請問你學會了這門課的知識了嗎?不知道若是給你新的題目,你會不會作呢?答案仍是不知道。
因此考試題目須要和複習題目有區別。一樣的道理,咱們用數據生成了決策樹,這棵決策樹確定對已見過的數據處理得很完美。但是它可否推廣到新的數據上呢?這纔是咱們真正關心的。就如同在本例中,你的公司關心的,不是之前的貸款該不應貸。而是如何處理從此遇到的新貸款申請。
把數據隨機拆分紅訓練集和測試集,在Python裏只須要2條語句就夠了。
from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X_trans, y, random_state=1)
複製代碼
咱們看看訓練數據集的形狀:
X_train.shape
複製代碼
運行結果以下:
(34881, 12)
複製代碼
測試集呢?
X_test.shape
複製代碼
這是運行結果:
(11627, 12)
複製代碼
至此,一切數據準備工做都已就緒。咱們開始呼喚Python中的scikit-learn軟件包。決策樹的模型,已經集成在內。只須要3條語句,直接調用就能夠,很是方便。
from sklearn import tree
clf = tree.DecisionTreeClassifier(max_depth=3)
clf = clf.fit(X_train, y_train)
複製代碼
好了,你要的決策樹已經生成完了。
就是這麼簡單。任性吧?
但是,我怎麼知道生成的決策樹是個什麼樣子呢?眼見才爲實!
這個……好吧,我們把決策樹畫出來吧。注意這一段語句內容較多。之後有機會我們再詳細介紹。此處你把它直接抄進去執行就能夠了。
with open("safe-loans.dot", 'w') as f:
f = tree.export_graphviz(clf,
out_file=f,
max_depth = 3,
impurity = True,
feature_names = list(X_train),
class_names = ['not safe', 'safe'],
rounded = True,
filled= True )
from subprocess import check_call
check_call(['dot','-Tpng','safe-loans.dot','-o','safe-loans.png'])
from IPython.display import Image as PImage
from PIL import Image, ImageDraw, ImageFont
img = Image.open("safe-loans.png")
draw = ImageDraw.Draw(img)
img.save('output.png')
PImage("output.png")
複製代碼
見證奇蹟的時刻到了:
你是否是跟我第一次看到決策樹的可視化結果同樣,驚詫了?
咱們其實只讓Python生成了一棵簡單的決策樹(深度僅3層),可是Python已經盡職盡責地幫咱們考慮到了各類變量對最終決策結果的影響。
欣喜若狂的你,在悄悄背誦什麼?你說想把這棵決策樹的判斷條件背下來,而後去作貸款風險判斷?
省省吧。都什麼時代了,還這麼喜歡背誦?
之後的決策,電腦能夠自動化幫你完成了。
你不信?
咱們隨便從測試集裏面找一條數據出來。讓電腦用決策樹幫咱們判斷一下看看。
test_rec = X_test.iloc[1,:]
clf.predict([test_rec])
複製代碼
電腦告訴咱們,它調查後風險結果是這樣的:
array([1])
複製代碼
以前提到過,1表明這筆貸款是安全的。實際狀況如何呢?咱們來驗證一下。從測試集目標裏面取出對應的標記:
y_test.iloc[1]
複製代碼
結果是:
1
複製代碼
經驗證,電腦經過決策樹對這個新見到的貸款申請風險判斷無誤。
可是咱們不能用孤證來講明問題。下面咱們驗證一下,根據訓練得來的決策樹模型,貸款風險類別判斷準確率究竟有多高。
from sklearn.metrics import accuracy_score
accuracy_score(y_test, clf.predict(X_test))
複製代碼
雖然測試集有近萬條數據,可是電腦當即就算完了:
0.61615205986066912
複製代碼
你可能會有些失望——忙活了半天,怎麼才60%多的準確率?剛及格而已嘛。
不要灰心。由於在整個兒的機器學習過程當中,你用的都是缺省值,根本就沒有來得及作一個重要的工做——優化。
想一想看,你買一臺新手機,本身還得設置半天,不是嗎?面對公司的貸款業務,你用的居然只是沒有優化的缺省模型。可即使這樣,準確率也已經超過了及格線。
關於優化的問題,之後有機會我們詳細展開來聊。
你終於擺脫了實習第一天就灰溜溜逃走的厄運。我彷彿看到了一顆將來的華爾街新星正在冉冉升起。
苟富貴,無相忘哦。
貸款風險判斷以外,你以爲決策樹還有哪些用武之地?除了本文提到的決策樹,你還知道哪幾種用於分類的機器學習算法?歡迎留言分享給你們,咱們一塊兒交流討論。
喜歡請點贊。還能夠微信關注和置頂個人公衆號「玉樹芝蘭」(nkwangshuyi)。
若是你對數據科學感興趣,不妨閱讀個人系列教程索引貼《如何高效入門數據科學?》,裏面還有更多的有趣問題及解法。