發表文章

如何得到和 Anaconda 的 Jupyter Notebook 一樣的使用者體驗但卻不需安裝 Anaconda ?

圖片
 身為一個資料科學家或是機器學習工程師,Jupyter Notebook 是必不可少的好用工具,而 Anaconda 則是在入門這個領域的時候為了減少痛苦而安裝的一個龐大軟體。 但實際上大部分時候我們只需要 Anaconda 中的 Jupyter Notebook,而不是它內含的其他東西以及Python 環境選擇 (我不如用 pipenv...),若是你像我一樣希望捨棄笨重的 Anaconda,但又希望獲得同樣的體驗,而不是每次都要打開 terminal,輸入 Jupyter Notebook 才能打開的話,這篇會是一篇適合你閱讀的文章。 Anaconda 上的體驗是怎樣的? 若是以只使用 Jupyter Notebook 為前提的話,它主要的方便在於安裝 Anaconda 之後會自動產生一個 Jupyter Notebook 的捷徑在開始工具欄,當你需要使用的時候就直接點開就好。而不用打開 terminal 打字什麼的。 (我很在意這個所以一直被 Anaconda 綁架......)  除此之外,Anaconda 的 Jupyter Notebook 路徑是固定的,每次開啟都會在 username 那個資料夾裡面,所以我得因此被其綁架而得把所有資料和 Notebook 都放在那個資料夾裡面。 所以,接下來就要開始如何將 Jupyter Notebook 以一個有 icon 的桌面捷徑開啟而且還可以基於開啟的路徑而開啟的教學。 安裝 Jupyter Notebook pip install notebook 建立 Jupyter Notebook 捷徑 首先要在桌面上右鍵新增 -> 建立捷徑,然後在項目位置中打入  cmd /k "jupyter notebook" , 如下圖。 然後就將捷徑命名為 jupyter notebook,或是其他你喜歡的名字,像是 AI 煉蠱場之類的。 這串項目位置的意思是當點擊這個捷徑的時候會做兩個動作 :   1. 打開 cmd   2. 自動打入 jupyter notebook 改變 Jupyter Notebook Icon 這步很簡單,總之就是去下載 jupyter notebook 的 icon (記得轉成 .ico 檔名),然後儲存在電腦中的某一處。接下來只要右鍵點開 -> 內容

時間序列資料的交叉驗證方法 Cross Validation on Time Series data

圖片
最近接了一個跟時間序列資料預測有關的case,也因此開始惡補一些跟時間序列有關的知識。時間序列資料其實和正常的資料相比來說有許多不同的地方需要小心處理,其中一個我自己挺有印象的就是驗證方法上的不同,因此打算寫一篇 blog 來介紹幾個能夠在時間序列上使用的驗證方法。 為什麼正常的交叉驗證不可行? 這是因為正常的過程是基於 隨機 的切分資料,不論是 Boostrapping resampling, k-fold 或是 stratified k-fold 等等都一樣。想像如果你將一群有時間前後關係的資料打亂,可能會因為隨機性而拿未來的資料來預測過去,拿現在的資料預測過去,這在機器學習上完全不合理,因此我們必須用其他方法來避免掉這種 future-looking 的預測方式。 Walking Forward (Time Series Split ) Cross-Validation 既然我們只需要避免 future-looking,那麼我們的交叉驗證方法 只需要確保使用的訓練資料其時間是早於測試資料即可 。 舉一個例子來說,比如有一個時間序列資料集,照時間順序排列包含 [1, 2, 3, 4, 5] 第一個 iteration : Training: [1] , Test: [2] 第二個 iteration : Training: [1, 2], Test: [3] 第三個 iteration : Training: [1, 2, 3], Test: [4] 第四個 iteration : Training: [1, 2 ,3, 4], Test: [5] 最後將四個 fold 的模型表現平均起來就得到交叉驗證的最後結果 這種方法不僅能達成交叉驗證的核心思想,也就是要把所有資料都至少掃過一遍來驗證,以避免資料的偏誤。同時也比不使用交叉驗證,只將整個資料切成兩半,以時間較早的作為訓練,較晚的作為測試的方式都好很多。 除此之外也能夠在不同時間線上測試模型的表現有沒有不一樣,以便之後能夠對那個時間所發生的事件做深入分析。 實作上可以參考  sklearn.model_selection.TimeSeriesSplit Blocked Cross Validation 相較於 Walk Forward CV,Blocked CV 完全隔開了訓練資料以及測試資料的使用。 sour

【讀書筆記】特徵工程不再難

圖片
本篇文章為 特徵工程不再難:資料科學新手也能輕鬆搞定! ( Feature Engineering Made Easy. By  Sinan Ozdemir, Divya Susarla ) 之個人讀書筆記。 書中有提供程式碼,請見此 Github Repo ,但應該是 Python 2,我下面的程式碼都會改為 Python 3 版本。 特徵工程的評估步驟 先得到機器學習模型的 baseline performance 應用特徵工程 對於每一種特徵工程,獲取一個效能指標並和 baseline 相比較 如果效能的改進大於某個臨界值 (User defined),則認為這種特徵工程是有益的,並將其部屬到機器學習模型中 效能的改變通常是以百分比(%)為計 (如果 baseline performance 是從 40% 準確率變成 76% 準確率的話,改進就是 76-40 / 40 = 90% 評估監督式學習演算法?迴歸通常用 MSE,分類通常用 Accuracy 或是 AUC 評估非監督式學習演算法?主要用  輪廓係數(  silhouette coefficient ) 或是用統計檢定的相關係數、t-test、卡方檢定(Chi-squared tests)以及其他方法來評估並量化原始資料以及轉換後的資料的結果 特徵工程的技巧有哪些 特徵理解 : 學習如何辨識定量(數值型)和定性資料(分類型) 特徵改進 : 清洗和填補缺失值 特徵選擇 : 透過統計方法選擇一部分特徵以減少資料雜訊 特徵建構 : 建構新的特徵,探索特徵之間的互動 特徵轉換 : 提取資料中的隱藏結構,利用數學方法轉換資料集、增強效果 特徵學習 : 以深度學習來對資料進行學習,以此來更加地瞭解資料 特徵理解 資料結構分為結構化和非結構化 結構化資料指的是可明確將觀察值(Row)和特徵(Column)分開的資料 非結構化資料指的是不遵守標準結構 (表格) 的資料 通常判斷資料的第一個問題是,資料是定量還是定性的? 事實上,資料可以同時是定量和定性的,為了更明確的去區分開來,通常會分為四個等級 定類等級 (nominal level) : 第一個等級,結構最弱,屬於定性資料,比如血型的A、B、O、AB,動物物種和人名,通常可以畫出眾數(mode)以及長條圖(bar plot)、圓餅圖來統計 定序等級 (ordin

機器學習競賽王者演算法:XGBoost、LightGBM、CatBoost

圖片
若是有參加過機器學習競賽的人應該都會聽過 XGBoost 這個橫掃各種競賽的演算法,其實後來也有衍生出 LightGBM 和 Cat boost 這兩種演算法可以使用,只是比較少人聽過,又鑒於這方面資料似乎比較少,就自己吃了一些學習資源來介紹,順便推動自己的學習,希望才疏學淺的本人可以幫助你更了解這三個常見演算法。 The map of machine Learning algorithms Source 不論是 XGBoost,  LightGBM 還是 Catboost,他們都屬於 Ensemble learning (集成式學習)中的 Boosting 方法。Ensemble learning 的基本想法就是一個不夠,你有沒有試過兩個?兩個不夠,你有沒有試過三個?也就是將多種學習方法都集合在一起使用,彼此互相補足,讓演算法的架構更加靈活。 Boosting Boosting 是 循序 的演算法,一開始會先產生多個弱學習器(Weak learner)並讓它們不斷改正舊模型的錯誤,最後合成起來變成一個強學習器(Strong learner)。而所謂的弱學習器是指比隨機猜的表現還要更好一點的模型,這種學習器的訓練成本低、複雜度也低,同時也不易 Overfitting。正因為這些特性,所以我們才可以在短時間內訓練很多種弱學習器,彼此組合起來得到一個強力的模型。 Gradient Boosting Gradient boosting 指的則是將梯度下降法(Gradient descent)應用到這些弱學習器的學習上,幫助最小化 error。這個方法的主要問題在於每跑一次 Gradient descent都需要重新建立一次學習器,這樣非常沒有效率,也因此 XGboost 出現了。 Gradient Boosting Decision Tree (GBDT) 當我們剛剛所提到的每一個弱學習器都是一個決策樹的時候,這個意圖學習並組合出最好的決策樹的Gradient Boosting就叫做GBDT。這也是我們目前最常見用來實作Gradient boosting的做法,同時, 這樣做也正好緩和了決策樹容易Overfitting 的問題。今天的三大主題 XGBoost, LightGBM, CatBoost 都是基於 GBDT 的改進方法。 XGBoost XGBoost的全名是 

為什麼只能在訓練資料上平衡不平衡的資料集? Why can only balance dataset on training data?

圖片
最近有位同學向我詢問一些資料競賽相關的內容,剛好發現他在程式上犯了這個初心者可能會犯的常見錯誤,也就是將 SMOTE (Synthetic Minority Oversampling Technique) 這種針對不平衡資料集  (imbalanced Dataset)  產生資料來讓其平衡的相關演算法應用在整個資料集上,而非只用在訓練資料集上。 目前的數據分析相關競賽通常都是給參賽者一些不平衡的資料集或者是特徵非常多的資料集(通常多達上百個特徵,尤其是金融相關競賽),此時初學者也常常會查詢到像是  Imblearn  這種專門處理不平衡資料及的套件使用。但其實無論是上採樣或者下採樣又抑或是混合上下採樣的方法, 它們其實都只能應用在訓練資料上,不能直接對整個資料集做平衡。 錯誤的使用會造成模型 作弊 ,並訓練出非常非常高的準確率,但實際上表現完全不好,就像過擬合(Overfitting)發生的時候那樣。 平衡資料集的方法 在面對上圖這種不平衡資料集時,基本上會有上採樣 (Oversampling) 和下採樣(Undersampling) 兩種方法可以使資料集平衡。上採樣指的是把資料少的類別複製幾份,直到兩類資料平衡。下採樣會將資料多的類別資料數減少或者是只從中選取少數資料出來代表這個類別。常見的方法有上採樣的 ADASYN、SMOTE、BorderlineSMOTE,還有結合上下採樣的 SMOTEENN,可參考 imblearn API doc 。 總之無論是使用哪種方法,都可以預期會得到下圖這樣平衡的資料集。 為什麼不可以直接平衡整個資料集呢? 為了回答這個問題,得先知道為什麼資料分割的獨立性是必須優先在所有方法之上的。這裡借用 Google 的 MLCC(Machine Learning Crash Course)  教材來講解。 當你拿到一份資料並想對其使用機器學習演算法來解決你的任務時,至少得將資料分割為訓練資料 (Training Set) 與測試資料 (Test Set),訓練資料是用來教你的模型從x推理到y,測試資料是用來測試這個訓練資料所訓練出來的模型在沒有見過的資料 (unseen data) 上表現如何,測試資料得必須與訓練資料 完全沒有交集, 否則就等於是數學老師直接在上課的時候告訴你期中考的題目和答案,也就是會造成作弊的情形發生。這不僅完全無

十種常見的軟體架構模式 10 Common Software Architectural Patterns

圖片
剛升上大四,發現大四的課程開始接觸到許多各種不同的領域,像是 Mobile App 這種跟 OOP 密不可分的領域,剛好這周談到軟體架構相關的東西,像是 MVC(Model-View-Controller) 之類的,讀起來蠻有趣的,同時有點好奇這種軟體架構有沒有一個大補帖可以一窺究竟,於是就爬了幾篇文之後,著手撰寫了這篇文章。 首先,架構模式 (architectural patterns) 與軟體工程的設計模式 (design patterns) 有些類似,兩者都是為了解決一些常見的軟體問題,但前者更為廣泛,且較能重複應用。我認為前者較有"架構"的感覺,也就是可重複使用性較高。前者的架構可以是跨領域應用的,而後者比較像是在某種情況下可以使用哪種模型。 軟體架構模式有以下10種常見的模式: 1. Layered pattern 最經典的例子就是網路的 OSI 七層設計 另外還有我曾在系統分析與設計學到的Three-layer  architecture 分別是View layer、logic layer、Data layer View layer : 系統的UI、外觀 logic layer: 功能的實作層 data layer : 存取資料的function 至於常見的應用當然是 Web application,以 Chrome 手機版為例,打開來看到的所有功能像是輸入網址欄、最近的瀏覽紀錄、左上的首頁按鈕等等都屬於 view layer,至於 logic layer 則是使用者開始在網址欄中輸入後對你所搜尋的事物的預測,比如輸入了"天氣",則會跑出像是天氣預報的推薦搜尋,當然還有按下搜尋後,根據使用者的輸入來推測他想查詢的是甚麼,這都屬於在實作這個搜尋功能。最後,Data layer 是介於資料庫與軟體之間的中介,Google 搜尋若想顯示出在 logic layer 的那些推薦搜尋,勢必得從他們的資料庫中調出關於使用者的資料還有較為宏觀的搜尋資料,只要是需要跟資料庫作互動的都屬於data layer。 2. Client-server pattern 這個模式可能是最常見的但也最簡單,就只有客戶端與伺服器端。客戶端作為主動方提出服務的要求,而伺服器端被動接收 到之後負責提供服務給客戶端。 最常見的應用就是瀏覽網站。當瀏覽

【讀書筆記】 簡報禪 PresentationZen

圖片
Image Source 這本書 已經 是兩年前還是大一的時候閱讀的,當時我將 「學會如何做出好簡報與講出好演講」 這件事情作為年度目標而努力。當時不僅常常聽演講,國文課和通識課也是修了一些和簡報相關的課程。結果最後回顧這年我所做過對精進簡報這件事情幫助最大的,我認為還是去圖書館借了這本書看帶給我的收穫最大 (這本書絕版了好險圖書館有XD)。 這本書並不是一本手把手教你如何做簡報的書,也不是告訴你做簡報有哪些技巧,他告訴我的是一場好簡報有哪些要注意的,有哪些原則可以遵守,有哪些限制是需要做的更重要的是, 如何說故事? 會意識到這真的是一本好書,是由於我在一堂英文課上做英文簡報,因為做了太多最後講不完,而老師給我的評語是雖然很認真做但每個畫面都充滿了太多的資訊, 一直以來大家都認為簡報認真做就是好簡報,但其實並不然, 對自己的簡報做出限制是很重要的 ,而這件事情是簡報禪從頭到尾都在強調的重點。 以下節錄了一些當時我所記下的重點概念,希望能幫到他人,當然自己如果能去想辦法拿到這本書來閱讀更好。 簡報三大守則: 限制、簡單、自然   『要做幾張投影片、用什麼特效、用什麼軟體、要列幾個重點、等等,這些都是問錯問題 真正要問的問題是: 我有多少時間? 簡報場地長得什麼樣子? 我會在上下、下午還是晚上進行簡報? 觀眾是哪些人? 觀眾的背景來歷是? 他們會對我有什麼樣的期待? 為什麼找我上去簡報? 我希望觀眾能做什麼? 哪一種視覺媒體最適合用於這一次的簡報情況和觀眾群? 我的簡報最基本的目的是什麼? 這一次要說的故事是什麼? 最重要的一個基本問題-我的核心重點是什麼? 或者說  如果觀眾只能夠記得一件事情 你希望他們記住的是什麼? 』 『 六條原則:SUCCESs Simplicity 簡潔 (全都很重要表示全都不重要  找出核心) Unexpectedness 出人意料 (提出問題 引出好奇心) Concreteness 具體 (真實例子舉例) Credibility 可信度高 (證據、數字、或是舉例) Emotions 富有情感 (圖片、人性化) Stories 故事性 (記得要有"衝突"(黑VS白之類的)、"對比"、引發情感) 說故事技巧: 找出問