10天100小時學資料科學,我推薦你這樣學!

XiaoxiaoLi發表於2016-07-14

有位網友在 Quora 提問,並補充說「我有10天空閒時間,每天想花十個小時學習資料科學入門知識,應該學點什麼呢?謝謝」伯樂線上摘編了 Roman Trusov 的回覆,非常值得新手參考。


哥們我太羨慕你了,不是誰都有像你這樣的機會的。

10天100小時的學習時間裡應該分配給儘量多樣化的知識。這也算是一大筆投資,所以應當嚴肅對待,根據學出來的結果可以把拿到實習 offer 之類的當做目標。

說實話,我不覺得學習線上課程對你這次的學習有什麼用,上課也不過就能給你點成就感罷了。如果你有不錯的數學和程式設計基礎,那麼直接上手寫程式碼、跑資料、看結果,比上線上課程有意思得多。那可是一百個小時呀!如果你真能在接下來十天的一百個小時裡儘自己最大的努力學習,就能學到世界級專家所需知識的百分之一。時間緊任務重,你,準備好了嘛?

庫和演算法的內部實現之類的將來有得是時間學,你現在還用不上。我下面列出的任務量巨大,需要你全身心投入,目標是讓你能夠廣泛地接觸到這個領域的一些主要工具。

第一天和第二天

下載 StackExchange 的公開資料:下載連結在此(需梯子)

處理資料需要關聯式資料庫管理系統,第一天大概要幹這些:

  1. 安裝 MySQL 配置好後把上面下載的資料匯入資料庫
  2. 閱讀 SQL 基礎知識。花點時間做幾個小練習題來熟悉資料操作。比如說,寫個能夠抽取所有滿足下面條件的提問的指令碼:提問是關於 Python 和 SQL的、回答多於三個、最佳回答的作者在這兩個主題下擁有大於十個被選中的回答。你有可能會發現指令碼效能有問題。
  3. 閱讀 SQL 索引知識,瞭解雜湊和排序等。修改上面的指令碼讓它能立刻馬上跑出結果。
  4. 寫個能處理上面查詢語句的 Python 類。這就需要學習 Python MySQL driver。你需要一個工具,能幫助你從資料庫中抽取資料並且能把它們以比較方便的形式呈現出來。

雖不清楚題主底子怎麼樣,但我覺得上面的任務即使對菜鳥來說也是完全能夠完成的。你只要有些基礎的 Python 知識就足夠了。

第二天可以用來了解用 pandas 來讀取資料,以及用 numpy 來對數值型資料進行操作。這些庫的文件看起來頁數多很嚇人,但不用都讀。只要學會匯入 CSV 檔案、新增提取資料列、合併兩個資料庫這些操作就行了。

第三天

雖然實際工作中通常都是在整個資料庫上做查詢,但學習如何在小量級的資料做操作並且得到有意義的結果也是相當重要的。比如說,可以試著從整個資料集中自己隨機抽取一些資料,然後把它們的得分的分佈和整個資料集上的得分分佈做比較。

現在可以再進一步了。雖然手握整個 Stack Exchange 的資料庫,但是因為我對 StackOverflow 裡面的資料比較熟悉一點,下面只會用到 StackOverflow 的資料。我能想到的一個有意思的練習:根據時間看程式語言的流行程度。

為什麼這個練習有用呢?

  • 如何抽取與僅僅程式語言本身有關的提問而不抽取只與技術有關的提問呢?(比如我想要和 Python 語法有關的提問,而不想要那種問如何在 Django 中用 MangoDB 的提問)
  • 提問的標籤數量非常大,為了最後將結果視覺化需要謹慎挑選輸入資料
  • 可以學習到至少一個視覺化框架
  • 可以生成很多美圖

會做上面的例子,自然而然就可以探尋更多資料裡有意思的屬性了。學會問問題是一個很重要的能力。

第四天和第五天

資料科學家曾被評為“21 世紀最性感的職業”。你知道還有什麼很性感麼?圖論哦!

問題標籤之間是如何聯絡在一起的?是否能僅僅用 Stack Overflow 上的回答就構建一個和技術有關的圖?該選哪個標準來計算兩個標籤有多相似?圖的視覺化該如何做?試 Gephi 了嗎?

都做好了之後,需要給上面生成的圖新增描述。僅僅一張圖本身能提供的價值有限,你需要一直盯著它看,直到理解它背後所代表的意義。

學習聚類演算法 (至少要學 k-means 和 DBSCAN)和 K 近鄰演算法。要是願意鑽研的話,還可以試試各種圖論演算法,算圖的各項指標。建議使用 networkx 這個庫和 scikit-learn 庫裡的一些相關部分,這些庫能大大簡化任務的難度。

做這個有什麼用?

  • 可以接觸到不同格式的資料,比如 CSV, GEPHI, 邊的集合等。
  • K-means 是一個有用的演算法,學了不吃虧,以後用得上
  • 研究資料的時候,發掘有意義的聚類是最重要的任務之一

可以根據自己的情況在這兩天之中分配任務。我會推薦頭一天玩玩 networkx 和 Gephi。第二天我會做聚類分析,因為做聚類的時候會有一些有挑戰的問題,比如你需要思考:到底該用怎樣的向量來表示問題標籤才能保留它們之間的距離呢?!

第六天

到了第六天應該已經基本明白資料庫部分了。然而文字還沒有接觸過,只會算字數不算(此處有冷冷的一語雙關)。

今天應該用來簡單學點文字分析。學學潛在語義索引就夠了,所有需要的東西在 scikit-learn 庫裡都有,還需要用一些 SQL。一般的流程是:

  1. 選出想用的資料
  2. 用 scikit 來抽取文字特徵 (建議用 scikit 裡的 TF-IDF Vectorizer)
  3. 給文字加標籤。你可以做一個簡單的練習:根據回答的文字來預測它會得多少分。這裡文字的得分就是它的標籤,TF-IDF 可以作為特徵向量。

最好是能用 numpy 格式來為每個假設準備一個資料集。比如:

  1. 一個用來預測回答的得分
  2. 對回答按主題分類 (可以選擇二十種程式語言的一些回答作為樣本)

一定要注意蒐集到的資料集要清理乾淨,你要確切地知道里面都有些什麼。說起來簡單做起來難。

第七、八、九天

前一天中已經得到了乾淨的資料集。假設一個用於分類一個用於預測(在第五天時已經學過它們的區別了)。在這幾天(譯者注:原文寫的第五天應是筆誤)該集中學習迴歸模型了。scikit 庫裡提供了很全面的工具。應該上手試試下面提到的方法裡至少三種:

  1. 線性模型。線性模型的種類浩如煙海。首先要比較它們的效能,然後讀讀最好的線性模型的相關知識,瞭解不同模型的區別。提示:好好學學 ElasticNet 迴歸。如果你數學還行的話可以讀讀 Bishop 的《模式識別與機器學習》 一書。書裡很好地講解了 ElasticNet 迴歸模型好用的原因。如果沒時間的話可以不看。
  2. 迴歸樹。
  3. KNN 迴歸。KNN 通常很好用,不要瞧不起這些簡單的方法。
  4. 整合學習模型如隨機森林和自適應增強學習。

學習的主要目標並不是立刻變成這些演算法的專家,而應該先跑起來程式碼,好用了之後然後再問問題。

同樣的方法也適用於分類問題。思考應該用什麼指標才能衡量結果的好壞。假設要建立一個給新聞排序的智慧資訊平臺,該如何評估它的好壞呢?

對所有的模型做交叉驗證是必不可少的。閱讀 k 折(k-fold)交叉驗證有關內容,研究如何用 scikit 來做 k 折交叉驗證,然後對所有你之前建立過的模型都做一遍交叉驗證。

第十天

既然你想做一個資料科學家,這次經歷不能落下它最有意思的部分,那就是展示結果。

無論你想選什麼樣的形式來展示它們都無所謂(將來很難有這樣自由選擇展示形式的機會了)。無論是半學術論文形式、PPT 展示、部落格文章,還是一個手機 app 都可以,任君選擇。把你的故事分享給大家。寫寫你在資料集裡發現了什麼、都做了些什麼假設,分析假設能否成立的原因、簡單描述下用到的演算法、用簡潔明瞭的形式來展示交叉驗證的結果等,並且一定要多多放些圖表。

這部分無論做到什麼程度都不算用力過猛。我保證,如果你真能做一個好的展示並且展示給自己的伯樂看,入門 offer 指日可待。

【補註】:Roman Trusov 的這個回答有 760+ 頂,並且有不少評價非常高的評論。伯小樂摘編幾個:

Muhammed Hussain:我沒有回答題主的問題,但看到這個回覆後,我決定從工作中抽出 10 天來學習。

Sethu Iyer:哇!從沒想過 10 天能如此高效!

TEJAS SARMA:現在我知道暑假頭 10 天能做什麼了。

Parisa Rai:讀完這個回答,我是多麼希望自己還是一個初學者呀。我認為,除了那些只有 10 天空閒時間的童鞋,每個初學者都可以按答主的建議來。

Anastasia Kukanova:你知道還有什麼很性感麼?這個回答!

打賞支援我翻譯更多好文章,謝謝!

打賞譯者

打賞支援我翻譯更多好文章,謝謝!

10天100小時學資料科學,我推薦你這樣學!

相關文章