ml-class 將在十六日終結,我從此課獲益不淺,以下是五件我在此課學到最有用的東西。

1. Linear Algebra

之前說過,在上這個課前是完全沒有讀過 linear algebra 。奇就奇在為何我可以係生物統計學碩士。不會 linear algebra 的統計學人,就像彈結他不會彈 Barre Chord 那樣,你是會彈到某幾首歌的,但卻不能彈深奧的歌。
((我最近都想問問以前在碩士課教 Stat 的教授,為何不教 Linear algebra 。我是知道此問題的答案,因為當年教流行病學的教授,也即是我的論文指導老師說過,只需要訓練我們看得明 SPSS 的 output 就可以了。再者,當年同學見到課堂上講到任何 equation 都即時怕怕,就別說甚麼 linear algebra 了。到尾,我們連甚麼是 maximum likelihood 也不知道。據說我是舊制的最後一屆,新一屆將課程再行簡化,向「看得明 SPSS 的 output 就可以了」更進一步。)) ((外國的 Biostat prerequisite ,除了有 linear algebra 之外,還有 multivariate calculus 。沒有此兩知識,讀完 biostat 也枉然。枉然的意思是,你可能可以應用 biostat 的一些技巧,但卻不能步入 biostat 研究的奧堂。我正是處於此枉然狀態。))

舉例,有數據如下

Sales Price
160 126
180 103
200 82
220 75
240 82
260 40
280 20

如想建立 regression model ,以 price 估計 sales ,在 R 的做法很易的:

[code]
# < -
sales <- c(126, 103, 82, 75, 82, 40, 20)
price <- c(160, 180, 200, 220, 240, 260, 280)
lm(sales~price)
[/code]

其實 under the hood ,也是 linear algebra 。

[code]
# <-
data.mat <- matrix(c((rep(1, length(price))), price), ncol=2, byrow=FALSE)
beta.hat <- solve(t(data.mat) %*% data.mat) %*% t(data.mat) %*% sales
y.hat <- data.mat %*% beta.hat
[/code]

2. Vectorization

我會用到的工具 ( R, Octave )是 vector/matrix 語言。市面上還有不少此類工具,如 Python/numpy 或 Perl/PDL 。用到此類工具,如知道 vectorization 技巧,可取代很多的 loop ,加快速度。 ((當然,加速了,就用多了記憶體,這是 space-time tradeoff 。))
假設我不知道 R 可以計 Standard Deviation 。我自行 implement 了以下兩個不同的版本。 forloop.sd 是用兩個 for loop 去計算 mean (bar.x) 及 sum of squared difference,而 vec.sd 是用 vectorization 的方法計算。

[code]
#< -
fl.sd <- function(x) {
sum.x <- 0
for (i in 1:length(x)) {
sum.x <- sum.x + x[i]
}
bar.x <- sum.x/length(x)
sum.sq.diff <- 0
for (i in 1:length(x)) {
sum.sq.diff <- sum.sq.diff + (x[i] - bar.x)^2
}
return(sqrt(sum.sq.diff*(1/(length(x)-1))))
}
vec.sd <- function(x) {
bar.x <- sum(x)/length(x)
sq.diff <- (x - bar.x)^2
return(sqrt(sum(sq.diff) * (1/(length(x)-1))))
}
[/code]

再進行以下的實驗:

[code]
# <-
n <- 10
n.tested <- c()
fl.time <- c()
vec.time <- c()
while (n <= 10000000) {
n.tested <- append(n.tested, n)
fl.time <- append(fl.time, system.time(fl.sd(rnorm(n)))[3])
vec.time <- append(vec.time, system.time(vec.sd(rnorm(n)))[3])
n <- n*10
}
plot(n.tested, fl.time,type="l", log="x", xlab="no of cases", ylab="time")
lines(n.tested, vec.time, type="l", col="red")
legend("topleft", legend=c("Loop","Vectorization"), col=c("black", "red"), lty=c(1,1), box.col="white")
[/code]

上圖的 x-axis 是 log scale 的,是用 rnorm 生產出來的亂數數量。而 y-axis 是計算 sd 所需的時間。從圖中所見, 當 no of cases 仍是低於 10000 時,有沒有 vectorization 的時間差別不大。但當增加至 100000 時,差別開始出現。到 no of cases 增至一千萬時, forloop 版本要用 37 秒計算,而 vectorization 版本只需 1.7 秒。當 no of cases 每增加十倍時,計算所需時間亦約增加十倍。這是因為計算 sd 的算法屬於 Big-O notation 的 O(N) 。 ((又稱 linear time ,代表 processing time 與 input size 成線性比例。)) Vectorization 比 forloop 快,是因為 R (或其他 matrix/vector 語言) 的 Matrix/vector operations 是經過專門優化的。在寫如 Artificial neural network 或 collaborative filtering 等等的 algorithm ,如果不用上 vectorization ,根本不能成事。

3. Algorithmic Model Culture

Ref: Brieman. Stat Sci 2001; 16: 199-231

嚴格來說並不是在 ml-class 學,而是自己好奇去讀的。 Machine Learning 和 Statistics 都是在做 model ,為何 Machine Learning 好似好 free ,而 Statistics 卻是諸多限制?
原來傳統 Statistics 假定數據產生自某種 data model ,而我們假定我們知道此 data model 的形態。我們用 regression 之類的工具去為此 data model 作 parameterization 。但是在非統計學的 Algorithmic Model Culture ,卻認為我們從來不知 data model 的形態。 model 的目的只是找出一個可由 input variables 預測 output variable 的 function 。此 culture 也特別注重 model validation 。

4. 2x2 table

在講 classification problem 時, Machine Learning 在分析 2x2 table 時用了完全不同的 terminology 。以下是我為此而製作的 conversion table 。

Machine Learning Biostatistics
Precision Positive Predictive Value
Recall Sensitivity
? Negative Predictive Value
? Specificity
? Likelihood ratio

在選擇 Threshold 的問題上,在 Machine Learning 是用 F1 score ,而 F1 score 是 precision 和 recall 的 harmonic mean 。但是在 medical research ,用的方法仍是 plot 一個 ROC curve 。實制是找出 sensitivity + specificity 最高的 threshold 。
如果我在下一篇文用 F1 score 來找 threshold 的話,恐怕又是收到「不夠 intuitive 」的評價吧。

5. Good data > good algorithm

"It's not who has the best algorithm who wins. It's who with more data."

此句話是真的,但當然 feature x 亦應有資料去 predict y 。例如你只有 acceleration 的數據,卻要去估計 force 。就算數據有無限多,也不會準。但是,如果有 acceleration 和 mass 的數據去估計 force 。 ((f=ma, Newton's laws of motion)) 要是你用無限多的數據去建立 model ,你用任何一種 algorithm 的誤差 ((variance and bias)) ,都應該差不多地低。