2020年1月26日 星期日

[機器學習] SMOTE and undersamplimg

在醫學資訊學的領域裡面, 常常遇到一種很痛苦的情況, 就是想預測的事件佔訓練資料的比例太少, 舉例來說, 我們想用機器學習來預測某種罕見疾病的發生率, 可是大部分的臨床情形我們可能蒐集到幾百甚至幾千個符合條件的病人, 但是裡面只有十個病人有這個疾病, 這樣在使用機器學習來做預測的時候, 會遇到許多困難, 比如說要做cross validation的時候, 很容易某一個training set 完全沒有我們想預測的事件, 造成訓練結果不理想甚至有問題, 因此, 聰明的電腦科學家就想到一個辦法, 就是所謂的oversampling(過度取樣), 簡單來說就是把我們想預測的事件樣本把它增加, 來讓資料更容易訓練

其中有一個很有名的做法, 就是SMOTE(Synthetic Minority Over-sampling Technique), 其實這個方法早在2002年就有人提出來了(reference 1), 簡單來說, 就是選取相鄰的點, 然後再點跟點中間做內插, 內插得到的點, 就當作新的樣本, 用這樣來增加樣本數

paper 內其實pseudocode整理的非常好, 不過寫部落格就是要用自己的話說一次這樣記憶才會深刻XD, 因此還是來講解一下XD

pseudocode 我用中文稍微講解一下:

函數SMOTE(T,N,K)

輸入:  T:  minority class的個數
           N: 想拿多少比例出來做SMOTE
           K: 要找幾個相鄰的minority class的點來做SMOTE

輸出: T*(N/100)個點

演算法:

用白話來說就是先隨機分布樣本, 再把樣本裡面 T*(N/100)的樣本拿出來, 之後再針對每一個樣本, 針對其最接近的K個點, 取出其中一個點, 做內插, 內差的比例也是隨機決定的

其實這個算法還蠻簡單的, 不過作者再這篇文章裏面還有提到只做SMOTE可能還不夠好, 要改善majority class 跟 minority class的話, 還可以針對majority class 做undersampling, 也就是只取一部份的majority class來做預測

R語言裡面也有相關SMOTE套件, 有比較舊的DMwR, 還有比較新的SMOTEfamily

這裡簡單講一下 DMwR套件裡面的SMOTE 函數, 其實這個函數連undersampling都做了, 有幾個參數:

form: 拿來預測的formula, 其實簡單想就是拿來預測的分類
data: 拿來預測的資料
perc.over: minority class要增加幾倍, 舉例來說perc.over設為100,表示原本的minority class變成兩倍
k: 要看最近的幾個鄰居
prec.under: majority class要拿多少數量, 舉例來說perc.over設為100, 如果perc.under設為400,就會拿perc.over的四倍
learner: 可以不用設定, 也可以設成之後要拿來分類的演算法

reference:
1. Chawla, Nitesh V., et al. "SMOTE: synthetic minority over-sampling technique." Journal of artificial intelligence research 16 (2002): 321-357.
2. https://CRAN.R-project.org/package=DMwR 
3. https://cran.r-project.org/web/packages/smotefamily/smotefamily.pdf

2020年1月25日 星期六

[數學] 極限的概念

最近因為工作需要, 因此想開始看MIT OCW的微分方程單元, 常微分方程其實有一堆公式解, 憑著薄弱的印象還記的一些....., 不過才看沒幾個小節, 就覺得自己的觀念還是不夠扎實, 因此還是回來複習微積分, 一開始我先來看台大朱樺老師的, 先來整理極限概念

先從MIT OCW 的一個小概念開始, 自然數的指數函數, 大家都知道可以寫成$ f(x) = e^{x}$, 其中有兩個性質值得玩味:
1. $  \forall x \in R, f(x)>0 $
2. $ \displaystyle{\lim_{x \to -\infty}} f(x) = 0$

這邊引進了兩個概念, 第一個是極限的概念, 第二個是無限的概念, 到這邊如果觀念不清楚的話, 會一直想不懂為什麼第一個式子一定大於零, 第二個式子可以等於零

在這邊引用台大朱樺老師的講義, 裡面提到極限的直觀定義(白話來講: 就是比較沒那麼數學的定義), 就是我們可以把$ \displaystyle{\lim_{x \to a}} f(x) = L$, 理解成函數f(x)在a點附近有定義(但是在a點這個點不一定要有定義), 當我們很接近a點時, 函數f(x)的值會很接近L.

上述的定義可以看出一件事, 極限符號的等於其實不是真正等於, 而是很接近的意思

當然上面的講法還是不夠數學, 來看比較數學的定義, 一樣是引用台大朱樺老師的講義,

if f(x) is defined at some open interval including a,  $ \forall \epsilon>0, \exists  \delta >0,  if \;0< |x-a| < \delta, then \;|f(x)-L|<\epsilon$, then we can say $ \displaystyle{\lim_{x \to a}} f(x) = L$


上面的數學式子看起來很複雜, 其實白話翻譯跟前一個定義說的差不多, 可以理解成當我們想要找到一個很接近L的值的時候, 一定可以在函數上找到對應點來對應

數學這種東西, 不練習是學不會的, 以下來個簡單的小例題

例題練習:

prove $  \displaystyle{\lim_{x \to 3}} x^{2} = 9$

這個證明大部份人看到都不會太適應, 因為這是進入嚴謹數學的第一步, 首先我們來想看看要如何證明這個題目, 從定義出發, 對於每一個$\epsilon$, 我們至少要找到一個$\delta$, 來滿足條件, 反過來說, 如果我們從$\delta$出發, 可以對應到所有的$\epsilon$的話, 那就證明出來了, 證明方法如下:

$|x^{2}-9|=|x-3||x+3|$
我們取$\delta=1$, 則$|x-3|<1,  2<x<4,  4<|x+2|<6$
所以 $|x-3||x+3|< 6|x-3|$, if $\delta \leq 1$, 注意這裡是小於等於, 因為小於也會成立, 所以我們要怎麼選$\delta$, 才能保證涵蓋所有$\epsilon$呢? 其實不難, 不過第一個想到的人真的很厲害....

取法是$\delta = min(1, \dfrac{\epsilon}{6})$
我們可以分成兩個情況看,
第一個情況
$\min = 1$, 則$|x-3||x+3|< 6|x-3|$, 這是上面推導出來的
第二個情況
$\min = \dfrac{\epsilon}{6}<1$, 則$|x-3||x+3|< 6|x-3|$, 和上面的式子一樣

所以不論是哪一種情況, $|x-3||x+3|< 6|x-3| < 6\delta \leq 6* \dfrac{\epsilon}{6}=\epsilon$
QED.

回到一開始的例子, $ \displaystyle{\lim_{x \to -\infty}} f(x) = 0$, 表示當x足夠大,接近無限大的時候, f(x)會很接近0, 不過上面這段話用前面的定義是沒辦法推出來的, 極限在無限大或無線小時, 定義方式會稍有不同, 其實也就是把x的範圍改成大於或小於某個數,其他差不多

從一開始的定義裡面也可以看出來, 極限值只能有一個, 如果從左邊逼近跟從右邊逼近的值會不一樣的話, 則稱為極限值不存在

這樣講有點抽象, 舉例來幫助理解, $f(x) = \dfrac{|x|}{x}$, 求$ \displaystyle{\lim_{x \to 0}} f(x) = ?$, 簡單可以看出左極限和右極限的值不一樣, 一邊是1, 一邊是-1, 又依照原始定義, 區間內的點的對應值都會落在極限值附近, 所以極限值不存在(這是比較白話的講法, 比較數學的版本以後有機會再來補!)


reference:
1. 微分方程課程網址: https://ocw.mit.edu/courses/mathematics/18-03sc-differential-equations-fall-2011/
2. 台大開放式課程, 朱樺老師講義(網址點此)
3. http://sites.science.oregonstate.edu/math/home/programs/undergrad/CalculusQuestStudyGuides/SandS/lHopital/define_limit.html
4. calculus, a complete course 7th edition
5. stewart's calculus, early transcendental, 6th edition

2020年1月19日 星期日

[遊記] 岡山登山 - 龍之口山

最近筆者去了岡山, 因為筆者平常很忙, 所以行程都是臨時隨便找的, 算是真正的自由行?

這次去的行程我猜一般台灣人不太會去, 因為我也是臨時google隨便亂找的XD, 因為筆者喜歡爬山, 因此找了一個位在岡山近郊"湯迫"(ゆば)的步道, 名字很霸氣, 叫做龍之口山, 交通方式也不難,  就在岡山車站前面的桃太郎大道搭車, 大概不用半小時就到登山口了. 這裡不得不感嘆日本人的細心, 小魯一上車就跟司機說我想去湯迫, 司機還一臉訝異, 特地跑來問我說, 到底去那麼郊外的地方幹嘛, 我就說我要去爬龍之口山, 司機還很好心的直接在我到登山口前面的站牌, 因為不是在湯迫站下車, 還要往前幾站XDDD

先來看登山口照片


登山口就在站牌旁邊, 開爬! 一開始爬不久, 就會遇到一個神社大門,
一直讓我想起之前玩電玩的時候, 那個在神社前面戰鬥的場景, 過癮!


剛開始比較陡, 可以看到步道上面還有些碎石, 不是很好走


步過過了一開始之後其實還蠻簡單的XDDDD, 感覺就是一般台灣郊山等級的步道, 不太困難, 沿路會有指標


不過悲劇的是, 到了某個有岔路的地方, 竟然指標只有一個(而且是指回原路的地方),可是有好幾個岔路啊, 這是只好先拍照, 然後選擇往上的步道



果然, 天公疼憨人? 一往上, 再走幾步路, 就到有指標的地方惹, 有兩條叉路,一條往山頂, 一條往神社, 我先往神社前進


一下子就到山頂的神社惹, 還聽到路上的阿伯跟神社工作人員說今天人怎麼這麼少XDDDD
                         

之後回頭, 繼續往山頂進攻, 山頂可以看到岡山市!!!!


下山有個小插曲, 就是發現下山有好幾條條路, 想走看看, 但是不太確定下山是不是有巴士可以搭乘, 於是就在山頂用破日文亂問, 結果日本人山友竟然帶我下山之外 還把我載到車站@@ 感動!

仔細想想, 日本真是個富足的國家, 不只是物質方面, 心靈也是, 願意幫助陌生山友, 真的令人感動!!!!

附上google map