大家一起學 Python – (14) XGBOOST: Kaggle 之王道

Kaggle 是一個開放的機器學習比賽平台。裡面有成千上萬的機器學習相關的比賽,而比賽很常都是由大公司如: Google,Microsoft 所舉辦。如果在某個比賽得了前三名的話,你不但可以獲得獎金,甚至可以把經歷放到履歷裡面讓自己變得很香。重點是我們這群普通人還有一堆 label 過的 data 可以使用。 在過去的比賽中,最常用到的模型都是屬於 Ensembled Trees 類型,最有名的就是傳說中的 Random Forest。但在 2016 年,一個 KDDCup 大大,華盛頓大學資工系博士生,Tianqi Chen(不知道中文名)提出了 XGBoost,並且屌打了過去的演算法,並稱霸 Kaggle 的天下。雖然如今 Kaggle 也快被 Neural Network 佔領地位了,但是還是有很多人都還是會先用 XGBoost 來當成 baseline,或最終模型。 在繼續解釋前,我們要先講解一下一些決策樹基本概念。決策樹很適合用在表類數據,只要找到正確的 feature 來做 splitting, 基本上都會有很高的準確率;並且它的可譯性高,因此很受歡迎。樹長得越深,代表模型長得越複雜,這樣會降低效率,甚至可能造成這棵樹不夠 generalized,使得它很容易 overfit。反之,樹長得太淺複雜度降低,雖然會很有效率,但是會很有可能造成 variance 太大,所給的答案是亂猜的。 那我們稍微來介紹一下什麼是 XGBoost。 Define: eXtreme Gradient Boosting 正如上次的介紹,我們每次在使用一個模型前,要稍微對模型有個了解。我們在上面稍微提到了,XGBoost 為 Ensembled Trees 的一種,因此它是背後的演算法也是基於一組 …

大家一起學 Python – (13) scikit-learn: Decision Trees

我們之前所學的基本 Python 的語法與套件都是為了這一刻吧… (不是變強嗎?)沒錯,我們要變超人了,也就是跳入機器學習/深度學習系列的 Python 套件/程式碼了~ 當然,這系列的文章並非機器學習的教學,因此在此不會先不考慮解釋一些理念的東西。有興趣的朋友都可以到這裡閱讀我其他的文章。在程式碼的部分,這系列的文章主要是為了要讓大家可以快速入門如何使用套件,不一定會是解決這些的問題的最佳方式。後面就只能靠大家的想像力了(讀多一點paper。 scikit-learn(a.k.a sklearn) 在入門機器學習時,我們通常都會先利用 scikit-learn 的套件來對現有的資料做一些快速的觀察。他集合了非常多機器學習/資料探勘所會用到的技術。而我們只需要呼叫 API 就可以了~ 感謝大大,讚歎大大~ 在機器學習裡面,對初學者來說最容易理解的分類模型就是決策樹(Decision Tree)。顧名思義,我們可以猜出這個模型就是透過資料中的屬性經過一系列的 if … else … 判斷式來找出標籤。而我們等等也會透過一些外掛套件來劃出我們的樹,並且再從中可以更理解我們呼叫的模組到底在做什麼。我們這次會使用在之前 Pandas 教學 裡面鐵達尼號的資料集,並且對這個資料集做出預測死亡的模型。 # 安裝 scikit-learn 模組 pip install scikit-learn # 下載資料集 curl http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic3.csv Prerequisites 下載完所需要套件以及資料集之後,我們就可以來開始寫 Code 了啦。 # 載入所需要的模組 from sklearn.metrics import classification_report from sklearn.model_selection import train_test_split …

大家一起學 Python – (12) Pickle

就如醃黃瓜可以存放一段時間,我們也希望程式裡面的一些 Session,Data,甚至是學習結果,都可以存到冰箱裡面(蛤?沒錯,我們今天就要跟大家介紹 Python 的 Pickle 套件~ 環境安裝 pip install pickle 我們通常在使用 Pickle 的時候都會用 Pickling 這個詞;其實 Pickle 實際上是在對 Python 物件(Objects)做 Serialization/Deserialization。序列化基本上是將一個在記憶體裡的物件轉換成一個字節串流(byte stream)方便做儲存或存取。可序列化的東西有一些基本變數如:int,float,str,tuple,list,set,dict 和模組中的 top-level class/function。 看到 Serialization 的時候大家可能一時會想到 JSON,Pickle 跟 JSON 大致上是同樣的概念。只是差別在於 Pickle 是 Python 專屬的序列化,並且也沒有 JSON 的可讀性。 Pickling 大概知道 Serialization 的基本概念之後,我們來開始實作吧~ 我們在範例程式碼做的東西基本上就是開啓一個新的 .pickle 檔案開起來,並且將我們在上面初始化的 KNN 模型儲存到 knn.pickle 裏面。現在可以到程式目錄地下查看是否有這個檔案,並且如果用記事本打開的話會有亂碼。過了一個永恆, 如果要再呼叫這個模型的話,只需要開啓之前的 .pickle …

大家一起學 Python – (11) Matplotlib

我們在做一些做一些資料分析的時候,經常面對的是一堆完全無法理解的數字數據;就算你看得懂,你老闆也未必想要聽你慢慢解釋這些數據到底代表什麼東西。因此,如果我們可以做出來一個圖表,把這些數據做視覺化(data visualization)。這個時候就算你老闆不知道你在工三小,至少他可以一眼看得出來你有做一些數據整理。Matplotlib 就是在 Python 裡最常拿來做數據視覺化的套件;我們甚至可以用它來畫出一個 3D 的圖表哦~ 環境安裝 <span class="hljs-attr">pip</span> <span class="hljs-string">install matplotlib</span> 跟上一門 Pandas 的一樣,我們會在 notebook 上面做練習。這樣圖表可以直接在 code block 下面呈現出來,比較好看。我們主要都會用 matplotlib 裡面的 pyplot submodule,並把它匿名為 plt。之後會看到一個比較奇怪的指令 %matplotlib inline,這種 % 的指令是叫 magic function,只會在這種 .ipynb 系列的環境出現。而這個指令是讓 matplotlib 的圖表可以直接在環境裡顯示出來。 <span class="hljs-keyword">import</span> matplotlib.pyplot <span class="hljs-keyword">as</span> plt %matplotlib inline plt.plot() 我們首先來畫一個線型圖表。首先我們要透過 plt.plot() 方法宣告一條線,每次呼叫一次 plt.plot() 我們的圖表就會多一條線。並且傳入 …

大家一起學 Python – (10) Pandas

Pandas(不是熊貓)是 Python 裡很常用來做資料分析、處理和操作的 library。我們可以直接通過它內建的方法,將一個 .csv 或資料庫,並把它變成很像 excel 的東東(data frame)。那我們就趕快來進入主題吧~ 安裝環境 安裝指令: pip install pandas 我們在這次的教學環境會使用 Jupyter Notebook 來操作。如果在 VSCode 或者 Terminal 上操作的話有一些指令可能需要再包到 print() 裡才可以看到哦~ read_filetype() 我們通常在做資料分析的時候,會比較常碰到 .csv(comma-separated values) 檔。如果有興趣玩玩看一些 data 的話,可以到 kaggle 去申請一個帳號來玩玩。但為了這個教學比較有實作的感覺,我們就先到這裡下載很有名的鐵達尼號的資料集~ 感謝 Vanderbilt 大學無私貢獻 先將我們剛才下載的 titanic3.csv 放到跟我們程式碼同樣一個資料夾。我們再透過 pd.read_csv() 讀取 .csv 檔裡的資料成一個 data frame 物件。並且,我們可以透過 data frame 的內建方法 head() …

大家一起學 Python – (9) NumPy

終於講到這個主題了~ 相信大家都看過 Numpy 這個模組,但是應該都不是很熟悉(沒關係,大鳥大學的時候完全不會寫 Python)。Numpy 基本上是 Python 在做一些所謂 Data Science 運算的核心模組,它對於做高緯度(>3D)的陣列/矩陣運算非常便利。好,進入主題… 環境安裝 Python 裡沒有預設安裝 numpy 的模組。因此在開始寫之前,我們需要安裝這個模組;否則將出現以下錯誤訊息。 >>> import numpy as np Traceback (most recent call last): File "<stdin>", line 1, in <module> ModuleNotFoundError: No module named 'numpy' 各位可以到你們的指令介面直接下這個指令。 pip install numpy numpy.array() 很有趣的一件事情是,雖然 Python 把陣列稱為 list,Numpy 還是把它稱為 array。我們先來講一下一些在敘述 numpy array …

大家一起學 Python – (8) RegEx

Regular Expression 是一個很好用來做文字操作的一個工具。它主要就是透過使用者輸入的字元中找出一篇文章裡相對應的 pattern。聽起來很抽象吧,文字是會有怎樣的 pattern 咧?我們就不浪費時間直接進入主題吧~ RegEx Patterns 我們會將 RegEx 的 pattern 寫在一個方括號([])裡,並且如果要限制字數的話,我們會寫在大掛號({})裡。以下為懶人包,不用謝~ Syntax Meaning Example [A-Z0-9] Pattern 所有大寫英文字母和數字 {1-3},{:5} 字元數 1 至 3 個字元, 0 至 5 個字元 [^wW] 以外/沒有??? 不是 w, W 的字元 a|b 或、pipe、or a 或 b colou?r 前一個字元可選 color, colour he*y! 0 或以上前一個字元 hey!, heey!, heeey!… …

大家一起學 Python – (7) 內建模組 (sys, os)

很多人都會鼓勵初學者學寫 Python 的原因是因為 Python 的 有很多非常好用的 libraries/framework,尤其是在一些圖像處理(OpenCV,Pillow)、機器學習/深度學習(Keras,PyTorch)、網頁架構(Django,Flask)等等。但是我們在套用這些套件前,讓我們先來看看怎樣使用一些 Python 一些內建就安裝好的模組吧~ 在還沒有開始前我們先來看 Python 裡面如何 import 模組。基本上我們可以直接 import 模組(1);我們也可以選擇 import 模組裡面的其中一個 method(2);最後也可以更改程式碼裡呼叫模組裡的名稱,這個舉動叫 aliasing(3)。當然,我們通常都會統一更改的名稱… import math #(1) from random import seed #(2) import math.e as euler #(3) # Python 的 math 模組裡面還有很多很有趣的函式可以自己玩玩看哦~ sys 我們先來看一個系統模組,這裡的系統指的是 Python 的軟體,而不是作業系統(os)。當我們的程式碼需要讀取使用者所傳入的 arguments 時,input() 只會在呼叫 Python 之後向使用者 prompt 一個 string;這時我們可以用 …

大家一起學 Python – (6) Sorted、Filter、Map、Enumerate

我們之前有提到一些蠻有用的內建函式,這裡要再跟大家介紹一些很有用的內建函式,順便來練習一下之前提到的 Lambda Function。這一系列教大家的 Function 主要都會傳入一個可迭代(iterable)的物件。 sorted() 顧名思義,sorted 就是拿來做順序排列用的啦~基本上 input 會是一個 iterable 的 object。我們在做文字標記的時候很常需要從一個文集(corpus)裡面將整個文件字串斷詞、不重複、並且有排序。下列範例程式基本上就稍微模擬了這個狀況~ corpus = 'this is a list. this list have some strings. these strings have punctuations!!!'.split() # split() 是 string 裡的一個方法(method),他會將一個字串裡對空格(或是 input 的字元)做斷詞 print(corpus) # Output: ['this', 'is', 'a', 'list.', 'this', 'list', 'have', 'some', 'strings.', 'these', 'strings', 'have', …

大家一起學 Python – (5) 控制流程

控制流程(Control Flow)其實不是什麼大學問,只是一個程式流程的邏輯… 換句話說,就是你們在 C 語言所學的 if … else statement,或者 for while loops 等等。雖然這些對資管系的學生來說應該都算蠻基本的常識,但是要再此提醒大家這個邏輯對你們理解別人的程式碼的時候非常重要哦~甚至鼓勵各位在寫程式碼前可以先畫一個流程圖,讓你們寫程式的時候可以寫得更有效率… (OS: 好啦老人不要再嘮叨了…) 條件判斷 很明顯,條件判斷都不會離開布林值(Boolean Value)。主要是當一個條件回复的值是 True 的時候,才會跑這一段程式。當然,Python 裡面是沒有 !True 的寫法, 所以要用 not 來表示 False。在這裡提醒各位要記得縮排哦~ # Syntax if condition: # do this elif condition: # do this else condition: # do this 對了,Python 裡面是沒有 switch case 的條件判斷語法(其實 if …