數據科學入門

作者:Joel Grus
讀者:鍋巴GG

Joel Grus 是 Google 的一位軟件工程師,曾于數家創業公司擔任數據科學家。目前住在西雅圖,專注于數據科學工作并樂此不疲。偶爾在 joelgrus.com 發表博客,長期活躍于Twitter @joelgrus。Github

數據的威力

生活中,數據無處不在。用戶的每次點擊,網站都會記錄下來。你每時每刻的位置和速度,智能手機也會記錄下來。“量化自我”生活方式的倡導者使用智能計步器記錄心率、行動習慣、飲食習慣、睡眠方式。智能汽車記錄駕駛習慣,智能家居設施記錄生活習慣,智能購物設備記錄購物習慣,等等。互聯網是一個廣袤的知識譜系,包括有無數交叉引用的百科全書,電影、音樂、賽訊、彈球機、模因、雞尾酒等各種專業數據庫,以及許多政府發布的多得讓人理不清頭緒的統計數據(某些還是比較真實的)。
在這些數據之中隱藏著無數問題的答案,這些問題從沒有人提出過。讓我們在這本書中一起學習如何找出這些問題。

  • 什么是數據科學家?

數據科學家有什么特點呢?他們是計算機科學家中的統計專家,是統計專家中的計算機科學家。數據科學家是能夠從混亂數據中剝離出洞見的人。

線性代數

線性代數是數學的一個分支,研究向量空間

向量

抽象地說,向量是指可以加總(以生成新的向量),可以乘以標量(即數字),也可以生成新的向量的對象。
具體來說(對我們而言),向量是有限維空間的點。即使你本無意視你的數據為向量,將數值數據表示為向量也是非常好的處理方式。

  • 向量的運算

最簡單的入門方法是將向量表示為數字的列表。一個包含三個數字的列表對應一個三維空間的向量,反之亦然:

 170, # 磅
 40 ] # 歲

grades = [95, # 考試1
80, # 考試2
75, # 考試3
62 ] # 考試4

>
> 我們常常需要對兩個向量做加法。向量以分量方式(componentwise)做運算。

  * 點乘(dot product)
  >兩個向量的點乘表示對應元素的分量乘積之和
  > 點乘衡量了向量 v 在向量 w 方向延伸的程度。
  >
![向量投影](http://upload-images.jianshu.io/upload_images/1772-0e548302b8d8f647.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

### 矩陣
>**矩陣**是一個二維的數據集合。我們將矩陣表示為列表的列表,每個內部列表的大小都一樣,表示矩陣的一行。如果 A 是一個矩陣,那么 A[i][j] 就表示第 i 行第 j 列的元素。按照數學表達的慣例,我們通常用大寫字母表示矩陣。

* 矩陣的重要性不言而喻,原因有以下幾個:
  1. 可以通過將每個向量看成是矩陣的一行,來用矩陣表示一個包含多維向量的數據集。例如,如果有 1000 個人的身高、體重和年齡,就可以創建一個 1000×3 的矩陣。
  2. 可以用一個 n×k 矩陣表示一個線性函數,這個函數將一個 k 維的向量映射到一個 n 維的向量上。我們使用的很多技術與概念都隱含著這樣的函數。
  3. 可以用矩陣表示二維關系。

#### 延伸學習
線性代數在數據科學家中應用很廣(通常是隱式使用,且不諳此道的人也經常使用)。閱讀這方面的教材是個好主意。網上也有很多免費資源,如:
* UC Davis 提供的有關線性代數的資源(https://www.math.ucdavis.edu/~linear/);
* 圣邁克爾大學提供的有關線性代數的資源(http://joshua.smcvt.edu/linearalgebra/);
* 對 喜 歡 挑 戰 的 讀 者 來 說,Linear Algebra Done Wrong(http://www.math.brown.edu/~treil/papers/LADW/LADW.html)是一本進階讀物。

### 統計學
>統計學是我們賴以理解數據的數學與技術。這是一個龐大繁榮的領域,要用圖書館的一整個書架(甚至一整間屋子)的書來闡述。

* 描述單個數據集
>對任何數據集,最簡單的描述方法就是數據本身:

num_friends = [100, 49, 41, 40, 25,

……等等許多

]

對足夠小的數據集來說,這甚至可以說是最好的描述方法。但隨著數據規模變大,這就顯得笨拙又含混了。(想象一個包含一億個數字的列表。)為此,我們使用統計來提煉和表達數據的相關特征。

  * 中心傾向
  > 我們常常希望了解數據中心位置的一些概念。一個常用的方法是使用均值(mean 或average),即用數據和除以數據個數。
  > 如果你有兩個數據點,均值就意味著兩點的中間點。隨著數據集中點數的增加,均值點會移動,但它始終取決于每個點的取值。
  > 我們常常也會用到中位數(median),它是指數據中間點的值(如果數據點的個數是奇數),或者中間兩個點的平均值(如果數據點的個數是偶數)。
  > **均值對數據中的異常值非常敏感。**

  * 離散度
  > * 離散度是數據的離散程度的一種度量。通常,如果它所統計的值接近零,則表示數據聚集在一起,離散程度很小,如果值很大(無論那意味著什么),則表示數據的離散度很大。例如,一個簡單的度量是極差(range),指最大元素與最小元素的差。
  > * 離散度的另一個更復雜的度量是方差(variance)
  > * 方差的單位是原數據單位的平方(即“平方朋友”)。然而,用方差很難給出直觀的比較,所以我們更常使用標準差(standard deviation)
  > **一種更加穩健的方案是計算 75% 的分位數和 25% 的分位數之差**

* 相關
>用戶在某個網站上花費的時間與其在這個網站上擁有的朋友數相關(他并不是一個無所事事的領導)。現在,他要求你來驗證這個想法。

  * 協方差(covariance),這個概念是方差的一個對應詞。方差衡量了單個變量對均值的偏離程度,而協方差衡量了兩個變量對均值的串聯偏離程度。
  >回想一下點乘(dot)的概念,它意味著對應的元素對相乘后再求和。如果向量 x 和向量 y的對應元素同時大于它們自身序列的均值,或者同時小于它們自身序列的均值,那將為求和貢獻一個正值。如果其中一個元素大于自身的均值,而另一個小于自身的均值,那將為求和貢獻一個負值。因此,如果協方差是一個大的正數,就意味著如果 y 很大,那么 x 也很大,或者如果 y 很小,那么 x 也很小。如果協方差為負而且絕對值很大,就意味著 x 和 y 一個很大,而另一個很小。接近零的協方差意味著以上關系都不存在。
>
  >**這個數字很難解釋,原因如下:**
  > * 它的單位是輸入單位的乘積(即朋友 - 分鐘 - 每天),難于理解。(“朋友 - 分鐘 - 每天”是什么鬼?)
  > * 如果每個用戶的朋友數增加到兩倍(但分鐘數不變),方差會增加至兩倍。但從某種意義上講,變量的相關度是一樣的。換句話講,很難說“大”的協方差意味著什么。

    > **因此,相關是更常受到重視的概念,它是由協方差除以兩個變量的標準差**
    >* 相關系數沒有單位,它的取值在 -1(完全反相關)和 1(完全相關)之間。相關值 0.25 代表一個相對較弱的正相關。
>
    > **相關系數的計算對異常值非常敏感。如果我們計算時希望忽略這個人,該怎么做呢?**
    
* 辛普森悖論
> 辛普森悖論是指分析數據時可能會發生的意外。具體而言,如果忽略了混雜變量,相關系數會有誤導性。
>
>關鍵點在于,相關系數假設在其他條件都相同的前提之下衡量兩個變量的關系。而當數據類型變成隨機分配,就像置身于精心設計的實驗之中時,“其他條件都相同”也許還不是一個糟糕的前提假設。但如果存在另一種類型分配的更深的機制,“其他條件都相同”可能會成為一個糟糕的前提假設。
>
>避免這種窘境的唯一務實的做法是充分了解你的數據,并且盡可能核查所有可能的混雜因
素。顯然,這不可能萬無一失。

* 相關系數其他注意事項
>相關系數為零表示兩個變量之間不存在線性關系。但它們之間還可能會存在其他形式的關
系。相關系數無法告訴你關系有多強。即便兩個變量完全相關,但(這取決于你想度量什么)很有可能這種關系并沒有實際意義。

* 相關和因果
> 你很可能聽說過這樣一句話:**“相關不是因果。”**
> 這樣的說辭大致出自一位遇到了一堆威脅著他不可動搖的世界觀的數據的人之口。然而,這是個重要的論斷——如果 x 和 y 強相關,那么意味著可能 x 引起了 y,或 y 引起了 x,或者兩者相互引起了對方,或者存在第三方因素同時引起了 x 和 y,或者什么都不是。
>
>進行隨機試驗是證實因果關系的可靠性的一個好方法。你可以先將一組具有類似的統計數
據的用戶隨機分為兩組,再對其中一組施加稍微不同的影響因素,然后你會發現,不同的
因素會導致不同的結果。


## 概率
>為了達到我們的目的,你得把概率論視為對從事件空間中抽取的事件的不確定性進行量化
的一種方式。我們暫且不探究術語的技術內涵,而是用擲骰子的例子來理解它們。空間是
指所有可能的結果的集合。這些結果的任何一部分就是一個事件,比如,“骰子擲出的點
數為 1”“骰子擲出的點數是偶數”等都是事件。
>
>我們用 P(E) 來標記“事件 E 的概率”。

* 不獨立和獨立
> 泛泛地講,如果 E 發生意味著 F 發生(或者 F 發生意味著 E 發生),我們就稱事件 E 與事件 F 為不相互獨立(dependent)。反之,E 與 F 就相互獨立(independent)。
>
> 舉個例子,如果兩次擲起一枚均勻的硬幣,那么我們無法根據第一次擲硬幣的結果是否是
正面朝上來判斷第二次的結果是否正面朝上。第一次擲硬幣的結果和第二次擲硬幣的結
果,這兩個事件就是獨立的。相反,如果第一次擲硬幣的結果是正面朝上,那么我們能很
明顯能判斷出兩次擲硬幣是否都是反面朝上。(如果第一次擲硬幣的結果是正面朝上,那
么很明顯兩次擲硬幣的結果不可能都是反面朝上。)因此,第一次結果正面朝上和兩次結
果不可能都是反面朝上,這兩個事件就是不獨立的。
>
>從數學角度講,事件 E 和事件 F 獨立意味著兩個事件同時發生的概率等于它們分別發生的
概率的乘積:
>```
P(E, F)=P(E)P(F)

在上例中,“第一次擲硬幣正面朝上”的概率為 1/2,“兩次擲硬幣都是背面朝上”的概率
為 1/4,但“第一次擲硬幣正面朝上并且兩次擲硬幣都是背面朝上”的概率為 0。

  • 條件概率

如果事件 E 與事件 F 獨立,那么定義式如下:

P(E, F)=P(E)P(F)
如果兩者不一定獨立(并且 F 的概率不為零),那么 E 關于 F 的條件概率式如下:
P(E|F)=P(E, F)/P(F)
條件概率可以理解為,已知 F 發生,E 會發生的概率。
更常用的公式是上式的變形:
P(E, F)=P(E|F)P(F)
如果 E 和 F 獨立,則上式應該表示為:
P(E|F)=P(E)

這個數學公式意味著,F 是否發生并不會影響 E 是否發生的概率。

舉一個常見的關于一個有兩個孩子(性別未知)的家庭的有趣例子。
如果我們假設:

  1. 每個孩子是男孩和是女孩的概率相同
  2. 第二個孩子的性別概率與第一個孩子的性別概率獨立
    那么,事件“沒有女孩”的概率是 1/4,事件“一個男孩,一個女孩”的概率為 1/2,事件
    “兩個女孩”的概率為 1/4。

現在,問題是事件 B“兩個孩子都是女孩”關于事件 G“大孩子是女孩”的條件概率是多少?
用條件概率的定義式進行計算如下:
P(B|G)=P(B, G)/P(G)=P(B)/P(G)=1/2
事件 B 與 G 的交集(“兩個孩子都是女孩并且大孩子是女孩”)剛好是事件 B 本身。(一旦你知道兩個孩子都是女孩,那大孩子必然是女孩。)

接著再問,事件“兩個孩子都是女孩”關于事件“至少一個孩子是女孩”(L)的條件
概率是多少?
出乎意料的是,結果異于前問。
與前問相同的是,事件 B 和事件 L 的交集(“兩個孩子都是女孩,并且至少一個孩子是女
孩”)剛好是事件 B。這意味著:
P(B|L)=P(B, L)/P(L)=P(B)/P(L)=1/3
為什么會有這樣的結果?如果你已知至少一個孩子是女孩,那么這個家庭有一個男孩和一
個女孩的概率是有兩個女孩的兩倍。

  • 貝葉斯定理

貝葉斯定理是數據科學家的最佳朋友之一,它是條件概率的某種逆運算。

假設我們需要計算事件 E 基于已發生的事件 F 的條件概率,但我們已知的條件僅僅是事件 F 基于已發生的事件 E 的條件概率。兩次利用條件概率的定義,可以得到下式:
P(E|F) = P(E, F)/P(F) = P(F|E)P(E)/P(F)
事件 F 可以分割為兩個互不重合的事件“F 和 E 同時發生”與“F 發生 E 不發生”。我們用符號

E 指代“非 E”(即“E 沒有發生”),有下式:

因此:

上式為貝葉斯定理常用的表達方式。

移除異常值之后的相關系數我們實際上假設了人們接受測試的概率或多或少
都是隨機的。如果只有表現出特定癥狀的人才會去接受測試,我們應該將表
達式重新表達為基于事件“測試結果正常,并且表現出癥狀”的條件概率,
這樣計算出的結果會增高很多。


* 隨機變量
> 隨機變量指這樣一種變量,其可能的取值有一種聯合概率分布。
> 1. 定義一個簡單的隨機變量:擲起一枚硬幣,如果正面朝上,隨機變量等于 1,如果背面朝上,隨機變量等于 0。
> 2. 可以再定義更復雜些的隨機變量,如擲起一枚硬幣 10 次,查看正面朝上的次數,或者從
range(10) 取出的一個值,每個數值被取到的可能性都相等。
>
>**聯合分布**對變量實現每種可能值都賦予了概率。通過擲硬幣得到的隨機變量等于 0 的概率
為 0.5,等于 1 的概率也為 0.5。從 range(10) 中生成隨機變量的分布為從 0 到 9 之間的每個數值賦予 0.1 的概率。
>有時會討論一個隨機變量的期望值,表示這個隨機變量可能值的概率加權值。擲硬幣
隨機變量的期望值為 1/2(=0 * 1/2 + 1 * 1/2),而 range(10) 隨機變量的期望值為 4.5。
>隨機變量也可以基于某些條件事件產生,就像其他事件一樣。
>大部分情況下,我們會隱式使用隨機變量的概念,即在使用時,并沒有對此加以特別關
注。如果仔細思考,可以看出其中的端倪。

* 連續分布
>擲硬幣對應的是**離散分布**(discrete distribution)——對離散的結果賦予正概率。我們常常希望對**連續結果的分布**進行建模。(對于我們的研究目的來說,這些結果最好都是實數,但實際中并不總是這樣的)例如,均勻分布(uniform distribution)函數對 0 到 1 之間的所有值都賦予相同的權重(weight)。
>
>因為 0 和 1 之間有無數個數字,因而對每個點而言,賦予的權重幾乎是零。因此,我們用
帶概率密度函數(probability density function,pdf)的連續分布來表示概率,一個變量位于某個區間的概率等于概率密度函數在這個區間上的積分。
>
>我們還常常對累積分布函數(cumulative distribution function,cdf)感興趣,這個函數給出了一個隨機變量小于等于某一特定值的概率。

* 正態分布
>正態分布是分布之王!它是典型的鐘型曲線形態分布函數,可以完全由兩個參數決定:
均值 μ(mu)和標準差 σ(sigma)。均值描述鐘型曲線的中心,標準差描述曲線有多
“寬”。
>正態分布的分布函數如下:
>
![](http://upload-images.jianshu.io/upload_images/1772-18215b87bbdeef02.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

* 中心極限定理
>正態分布的運用如此廣泛,很大程度上歸功于中心極限定理(central limit theorem)。這個定理說,一個定義為大量獨立同分布的隨機變量的均值的隨機變量本身就是接近于正態分布的。

![](http://upload-images.jianshu.io/upload_images/1772-9217f9d33713b672.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
>近似表達的意義在于,如果你想知道擲起一枚均勻的硬幣 100 次中正面朝上超過 60 次的概率,那么可以用一個正態分布 Normal(50, 5) 的隨機變量大于 60 的概率來估計。這比計算二項式分布 Binonimal(100, 0.5) 的累積分布函數更容易(盡管在大多數應用中,你可以借助統計軟件方便地計算出任何你想要的概率)。

## 假設與推斷
>具備以上統計學和概率理論知識以后,我們接著該做什么呢?數據科學的科學部分,乃是不斷針對我們的數據和生成數據的機制建立假設和檢驗假設。

* 統計假設檢驗
>在各種各樣的假設之下,這些統計數據可以理解為從某種已知分布中抽取的隨機變量觀測值,這可以讓我們對這些假設是否成立做出論斷。

* 置信區間
>我們一直在對正面朝上的概率 p 進行假設檢驗,這是未知的“正面朝上”分布的參數。對假設檢驗,我們還有第三種方法:在參數的觀測值附近建立置信區間(confidence interval)。
>
>例如,我們可以通過計算每次拋擲對應的伯努利隨機變量的均值來估計不均勻硬幣的概率——正面朝上記為 1,背面朝上記為 0,取這一系列伯努利隨機變量的平均值。如果我們觀測的 1000 次拋擲中有 525 次正面朝上,那么我們可以估計出 p 等于 0.525。
但是這個估計的可信度有多大呢?如果我們已知 p 的精確值,那么根據**中心極限定理**,伯努利隨機變量的均值近似服從**正態分布**,其中均值為 p,標準為:
>`math.sqrt(p * (1 - p) / 1000)`
>這里,p 是未知的,所以我們使用估值:
>```
p_hat = 525 / 1000
mu = p_hat
sigma = math.sqrt(p_hat * (1 - p_hat) / 1000) # 0.0158

這種計算是不嚴格的,但運用廣泛。

借助正態近似我們得出結論:以下區間包含真實參數p 的可能性為 95%:
normal_two_sided_bounds(0.95, mu, sigma) # [0.4940, 0.5560]
這是關于區間的解釋,不是關于 p 值的解釋。你需要這樣理解:如果你重復實驗很多次,其中 95% 的“真”參數(每次都相同)會落在觀測到的置信區間(每次可能會都不同)中。

  • P-hacking

如果一個程序僅有 5% 的時間錯誤地拒絕了原假設,那么根據定義,5% 的時間會錯誤地拒絕原假設。

  • 運行A/B測試

這某種程度上有些欺騙性。只有在標準差已知的條件下數學推理才正確。我們從數據中估計參數,這意味著我們實際中應該用 t 分布。但如果數據集足夠大,正態分布和 t 分布之間的差別可以忽略不計。

  • 貝葉斯推斷

我們所看到的處理方式都包含對檢驗所做的與概率有關的陳述:“如果原假設正確,那么你觀測到極端統計量的概率僅有 3%。”

推斷的一個替代方法是將未知參數視為隨機變量。分析師(也就是你)從參數的先驗分布(prior distribution)出發,再利用觀測數據和貝葉斯定理計算出更新后的后驗分布(posterior distribution)。不再對檢驗本身給出概率判斷,而是對參數本身給出概率判斷。
比如,如果未知參數是概率(就像擲硬幣的例子),我們使用 Beta 分布(Beta distribution)作為先驗分布,Beta 分布僅對 0 和 1 賦值。

后驗分布也是 Beta 分布,這并非偶然。二項分布給出了正面朝上的數字,Beta 是二項分布的共軛先驗分布(conjugate prior,http://www.johndcook.com/blog/conjugate_prior_diagram/
這意味著,無論你何時使用從相關的二項分布中得到的觀測值更新 Beta 先驗分布,你還是會得到一個 Beta 后驗分布。
用貝葉斯推斷進行假設檢驗是飽受爭議的——部分源于它的數學原理非常復雜,部分源于選擇先驗分布的主觀性。

梯度下降

從事數據科學工作時,常常會面臨這樣的需要:為某種特定的情形尋找最佳模型。“最佳”常常會被解讀為某種類似于“最小化模型殘差”或者“最大化數據的可能性”。換句話說,它代表了優化某種問題的解決方案。

這意味著我們需要解決一連串的最優化問題。尤其是,我們需要從零開始解決問題。我們采用的方法是一種叫作梯度下降(gradient descent)的技術,適合從零開始逐步解決問題。

  • 梯度下降的思想

對函數來說,梯度(在微積分里,這表示偏導數向量)給出了輸入值的方向,在這個方向上,函數增長得最快。

  • 隨機梯度下降法

我們常常用梯度下降的方法,通過最小化某種形式的殘差來選擇模型參數。如果使用之前的批處理方法,每個梯度計算步都需要我們預測并計算整個數據集的梯度,這使每一步都會耗費很長時間。

現在,這些殘差函數常常具有可加性(additive),意味著整個數據集上的預測殘差恰好是每個數據點的預測殘差之和。

在這種情形下,我們轉而使用一種稱為隨機梯度下降(stochastic gradient descent)的技術,它每次僅計算一個點的梯度(并向前跨一步)。這個計算會反復循環,直到達到一個停止點。

獲取數據

略過了,個人建議和本書作者一致,使用Python

數據工作

  • 探索你的數據

當確定了需要研究的問題,并已獲取了一些數據時,你摩拳擦掌地恨不得馬上建模求解。但是,你需要克制一下。首先,你應該探索數據。

  • 探索一維數據

最簡單的情形是,你得到的一個數據集合僅僅是一維數據集。
這兩種分布有非常不同的最大值和最小值。但是,僅僅知道這一點并不足以理解它們有何差異。

  • 二維數據

散點圖

  • 多維數據

對于多維數據,你可能想了解各個維度之間是如何相關的。一個簡單的方法是考察相關矩陣(correlation matrix),矩陣中第 i 行第 j 列的元素表示第 i 維與第 j 維數據的相關性。
散點圖矩陣
通過這些散點圖你會看出,序列 1 與序列 0 的負相關程度很高,序列 2 和序列 1 的正相關程度很高,序列 3 的值僅有 0 和 6,并且 0 對應序列 2 中較小的值,6 對應較大的值。

  • 數據清洗、處理

清洗和預處理等

  • 數據調整

許多技術對數據單位(scale)敏感。比如,假設你有一個包括數百名數據科學家的身高和體重的數據集,并且需要創建體型大小的聚類(cluster)。
直觀上講,我們用聚類表示相近的點,這意味著我們需要某種點距離的概念。我們知道有歐幾里得距離函數 distance,所以自然地,一種方法是將數據對 (height, weight) 視為二維空間中的點。

  • 降維

有時候,數據的“真實”(或有用的)維度與我們掌握的數據維度并不相符。

坐標軸“錯誤”的數據

數據的大部分變差看起來像是沿著單個維度分布的,既不與 x 軸對應,也不與 y 軸對應。
當這種情形發生時,我們可以使用一種叫作主成分分析(principal component analysis,PCA)的技術從數據中提取出一個或多個維度,以捕獲數據中盡可能多的變差。

 實際上,這樣的技術不適用于低維數據集。
降維多用于數據集的維數很高的情形。
你可以通過一個小子集來抓住數據集本身的大部分變差。
不過,這種情況很復雜,絕非一兩章能講得清。
去均值后的數據

現在,已有一個去均值的矩陣 X,我們想問,最能抓住數據最大變差的方向是什么?
具體來說,給定一個方向 d(一個絕對值為 1 的向量),矩陣的每行 x 在方向 d 的擴展是點積 dot(x, d)。并且如果將每個非零向量 w 的絕對值大小調整為 1,則它們每個都決定了一個方向。
我們可以找出使方差最大的那個方向。只要得到梯度函數,我們就可以通過梯度下降法計算出來。
第一主成分僅是使函數最大化的方向。
一旦我們找到了第一主成分的方向,就可以將數據在這個方向上投影得到這個成分的值,
如果還想得到其他的成分,就要先從數據中移除投影,
在更高維的數據集中,我們可以通過迭代找到我們所需的任意數目的主成分,然后再將原數據轉換為由主成分生成的低維空間中的點。
這種技術很有價值,原因有以下幾點。首先,它可以通過清除噪聲維度和整合高度相關的維度來幫助我們清理數據。
在提取出數據的低維代表后,我們就可以運用一系列并不太適用于高維數據的技術。我們可以在本書的很多地方看到運用這種技術的例子。

同時,它既可以幫助你建立更棒的模型,又會使你的模型更難理解。
很容易理解諸如“工作年限每增加一年,平均工資會增加 1 萬美元”這樣的結論。
但諸如“第三主成分每增加0.1,平均工資就會增加 1 萬美元”這樣的結論就很難理解了。

機器學習

在很多人眼里,數據科學幾乎就是機器學習,而數據科學家每天做的事就是建立、訓練和調整機器學習模型(而且,這些人當中有很大一部分并不真正知道機器學習是什么)。

事實上,數據科學的主要內容是把商業問題轉換為數據問題,然后收集數據、理解數據、清理數據、整理數據格式,而后才輪到機器學習這一后續工作。

盡管如此,機器學習也是一種有趣且必要的后續工作,為了做好數據科學工作,你很有必要學習它。

  • 建模

什么是模型?它實際上是針對存在于不同變量之間的數學(或概率)聯系的一種規范。
比如,如果你想為你的社交網站融資,可以建立一個商業模型(大多數情況下建立在一個工作表里),模型的輸入是諸如“用戶數”“每位用戶的廣告收入”“雇員數”之類的變量,輸出是接下來幾年的年度利潤。

  • 什么是機器學習?

是創建并使用那些由學習數據而得出的模型。
在其他語境中,這也可以叫作預測建模或者數據挖掘。
一般來說,我們的目標是用已存在的數據來開發可用來對新數據預測多種可能結果的模型,比如:

  • 預測一封郵件是否是垃圾郵件
  • 預測一筆信用卡交易是否是欺詐行為
  • 預測哪種廣告最有可能被購物者點擊
  • 預測哪支橄欖球隊會贏得超級杯大賽

下面我們會看到有監督的模型(其中的數據標注有正確答案,可供學習)和無監督的模型(沒有標注)。半監督的模型(其中有一部分數據帶有標注)和在線的模型(模型需要根據新加入的數據做持續調整)。

  • 過擬合和欠擬合

在機器學習中,一種常見的困境是過擬合(overfitting)——指一個在訓練數據上表現良好,但對任何新數據的泛化能力卻很差的模型。這可能牽扯到對數據中噪聲的學習,也可能涉及學習識別特別的輸入,而不是對可以得到期望的輸出進行準確預測的任何因素。
另一種有害的情況是欠擬合(underfitting),它產生的模型甚至在訓練數據上都沒有好的表現,盡管通常這暗示你模型不夠好而要繼續尋找改進的模型。

過擬合和欠擬合

水平線顯示了最佳擬合階數為 0(也就是常數)的多項式,它對訓練數據來說存在嚴重的欠擬合。最佳擬合的階數為 9(也就是有 10 個參數)的多項式精確地穿過訓練數據的每個點,但這是嚴重過擬合的。
如果模型對訓練數據是過擬合的,那么它在(完全劃分開的)測試數據集上會有可能真的表現得很不好,換句話說,如果它在測試數據上表現良好,那么你可以肯定地說它擬合良好而非過擬合。

  • 正確性

模型的選擇通常是查準率和查全率之間的權衡。一個模型如果在信心不足的情況下預測“是”,那么它的查全率可能會較高,但查準率卻較低;而如果一個模型在信心十足的情況下預測“是”,那么它的查全率可能會較低,但查準率卻較高。
另一方面,也可以把這當作假陽性和假陰性之間的權衡。預測的“是”太多通常會給出很多的假陽性。預測的“否”太多通常會給出很多的假陰性。

  • 偏倚-方差權衡

思考過擬合問題的另一種角度是把它作為偏倚和方差之間的權衡。 偏倚和方差這兩個名詞是用來度量在(來自同一個大型總體的)不同的訓練數據集上多次重復訓練模型的情況。

“過擬合和欠擬合”中提到的 0 階模型對(取自同一總體的)任何可能的訓練集都會造成大量的錯誤。這表明該模型偏倚較高。然而任何兩個隨機選擇的訓練集會給出很相似的模型(因為任何兩個隨機選擇的訓練集都應該有大致相似的平均值)。所以我們稱這個模型有低方差。高偏倚和低方差典型地對應著欠擬合
9 階模型完美地擬合訓練集,它具有很低的偏倚和很高的方差(因為任何兩個訓練集都可能給出非常不同的模型形式)。這種情況對應過擬合。
如果你的模型有高偏倚(這意味著即使在訓練數據上也表現不好),可以嘗試加入更多的特征。從 0 階模型到 1 階模型就是一個很大的改進。
如果你的模型有高方差,那可以類似地移除特征;另一種解決方法是(如果可能的話)獲得更多的數據。

利用更多數據降低方差

  • 特征提取和選擇

我們之前提到,如果數據沒有足夠的特征,模型很可能就會欠擬合。但如果數據有太多的特征,模型又容易過擬合。那什么是特征呢,它們又從何而來?
特征(feature)是指提供給模型的任何輸入。在最簡單的情況下,特征是直接提供給你的。
如果你想基于某人的工作年限來預測其薪水,那工作年限就是你所擁有的唯一的特征。

K近鄰法

假設你打算預測我會在下次大選給誰投票。如果你對我一無所知(但是你有數據),一個明智的方法是看看我的鄰居們打算怎么投票。我住在西雅圖市中心,我的鄰居們總是會打算投票給民主黨的候選人,這說明“民主黨候選人”有可能是我的投票對象。

現在假設你對我的了解不僅限于家庭住址——可能你還知道我的年齡、收入,以及有幾個孩子,等等。參照我的行為被這些維度影響(或刻畫)的程度,觀察那些在這些維度上最接近我的鄰居似乎比觀察我所有的鄰居會得到更好的預測結果。這就是最近鄰分類(nearset neighbors classification)方法背后的思想。

神經網絡

人工神經網絡(artificial neural network,或簡稱神經網絡)是受大腦啟發而開發出來的一種預測模型。我們可以把大腦看作一團相互連接的神經元。每個神經元都以其他神經元的輸出為輸入,進行相應計算,如果結果超過某個閾值,則這個神經元將會進入激活狀態,否則它會繼續保持非激活狀態。
相應地,人工神經網絡則是由人工神經元組成,同樣也對輸入進行類似的計算。神經網絡可以解決各式各樣的問題,比如手寫體識別與面部識別等,同時,深度學習作為數據科學最為火爆的一個分支也大量用到神經網絡。然而,大部分神經網絡都是些“黑盒子”,也就是說,即使考察了其工作細節,也很難獲悉它們到底是如何解決問題的。此外,大型的神經網絡的訓練工作難度也非常大。作為一名處于“發育期”的數據科學家,你所遇到的大多數問題都不適合用神經網絡來處理。有朝一日,當你試圖打造一個催生奇點的人工智能的時候,或許神經網絡會是個不錯的選擇。

聚類分析

聚類分析是一種無監督學習方法,也就是說,它可以利用完全未經標注的數據(也可以使用標注過的數據,但我們忽略這些標簽)進行工作。

自然語言處理

自然語言處理(natural language processing,NLP)是指與語言有關的各種計算技術。

網絡分析

當我們面對許多有趣的數據問題時,如果把它們看作由各種類型的節點(node)和連接它們的邊(edge)所構成的網絡,那就再合適不過了。

推薦系統

現實中,利用數據提供某種建議也是很常見的。例如,Netflix 能夠向用戶推薦他們可能想看的電影,亞馬遜會向你推薦你可能會買的商品,Twitter 會為你推薦你可能想關注的用戶。本章將介紹幾種利用數據來提供建議的方法。

MapReduce

MapReduce 是一個用來在在大型數據集上執行并行處理的算法模型。盡管這是一個非常強大的技術,但它的基本原理卻很簡單。
假設我們有一組待處理的項目,這些項目可能是網頁日志、許多本書的文本、圖像文件或者是其他東西。一個基本的 MapReduce 算法包括下面幾個步驟。

  1. 使用mapper函數把每個項目轉化成零個或多個鍵值對。(通常這被稱為map函數,但是已經有了一個叫 map 的 Python 函數,所以我們不能把它們混淆。)
  2. 用相同的鍵把所有的鍵值對收集起來。
  3. 在每一個分好組的值集合上使用reducer函數,對每個對應的鍵生成輸出值。
  • 為什么是MapReduce?

MapReduce 的主要優點就是通過將處理過程移動到數據來進行分布式的計算。
假設我們想對數以十億計的文檔進行單詞計數。我們最初的(非 MapReduce 的)方法要求機器在每一個文檔上進行處理。這意味著所有的文檔要么存在機器上要么在處理期間轉移到機器上。更重要的是,這意味著機器一次只能處理一個文檔。

如果機器是多核的,且如果代碼是為了利用多核的優勢而重寫過的,那
它是有可能一次處理幾個文檔的。但即使這樣,所有的文檔也
都要放到機器中來。

數據科學前瞻

  • IPython
  • 數學
  • 不從零開始——多學習已經存在的庫
  • NumPy
  • pandas
  • scikit-learn
  • 可視化
  • R語言
  • 尋找數據

總結:獲益良多,但是數據科學是學習和實踐并重的科學。看完就動手做才是重點。


想加入更多樂讀創業社的活動,請訪問網站→ http://ledu.club
或關注微信公眾號選取:

樂讀微信公眾號

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容