Python Data Science Cheat Sheet,數據科學總結

前言

Python是搞Data Science的不二選擇。對於新手來說(比如我) ,需要快速學會使用Python的常用package。這篇博客主要就是總結一下用Python搞Data Science的大體步驟和一些細節。 PS. 我在美國的第一個學期,選了一門課叫做 Data Science Fundamentals,課程鏈接。使用的教材是《The Data Science Design Manual》 ,這本書的可讀性很強,涉及面廣,深入淺出,是給我們上課的老師自己寫的一本書。




Data Science Project Main Steps

數據科學的項目大多遵循如下四個步驟:獲得數據,數據預處理,建模和分析,評估和展現。

Step Name Packages
1 Get Data Pandas, Beautiful soup, …
2 Data Preprocessing Pandas, Numpy, NLTK, Scikit-image, …
3 Modeling and Analysis Scikit-learn, Numpy, Scipy, Sympy, Tensorflow, …
4 Evaluate and Present Jupyter Notebook, Matplotlab, Seaborn, …


Step 0: Environment

做 data science 項目最好使用anaconda,這個東西可以理解爲:Python + 很多很多packages。安裝完anaconda之後,大部分需要的packages都有了,比如 numpy, pandas, matlabplot等等。

命令 說明
conda install xxx 缺啥packages就補啥,類似於 pip install,不過既然用了conda,就不用pip了
conda list –revisions 萬一conda環境蹦了,看看你做了什麼,類似於 git log
conda install –revision [revision number] 退回到以前的conda版本,類似於 git reset –hard xxx
conda create -n myenv python=3.6 建立一個conda環境,類似於virtualenv -p /usr/bin/… myenv
conda activate myenv 激活某個conda環境


Step 1: Getting the Data

Python是一門面向對象的語言(object oriented programming)。但是在做data science的過程中,需要切換思維,切換成面向數組/表的編程(array or table oriented porgramming),基本上,你的數據都是以數組/表的形式組織的。這種思維在面向GPU編程的時候也是很需要的。

Pandas

Pandas is used to get data from a web url, a local file, or data you just created in the program. HERE is a great ten minute code example guide to Pandas。建議把這個網頁裏面的代碼在Notebook裏面抄一遍。

Pandas 用三種數據結構來存儲數據。

數據結構 維數 元素
Series 1 維 Scalar Value
DataFrame 2 維 Series
Panal 3 維 DataFrame

其中DataFrame的使用最爲廣泛。DataFrame是用來存儲二維數據的。二維數據包括:數據庫裏面的表(table),和csv格式的spreadsheet文件。table和spreadsheet這種二維關係型數據的廣泛使用,使得DataFrame這個數據結構廣泛使用。打印一個DataFrame對象就是一個表,垂直向下的方向是X軸(row,index,axis=0),水平向右方向是Y軸(column,axis=1)。X軸的row代表一行一行的record(記錄),Y軸的column代表feature(特徵屬性)。 df.iloc[3,4]代表第4行記錄的第5個屬性(下標從0開始)。注意:這裏千萬不要和平面直角座標系聯繫在一起。在平面直角座標系裏面,垂直向上的是Y軸,水平向右的是X軸。

Beautiful Soup

我在學習用Beautiful soup寫爬蟲程序的時候,主要參考了這個網頁。我寫爬蟲腳本的最大感想是:不要有畏懼心理,勇敢的去寫,不斷測試改進,沒有爬蟲腳本一開始就是如你所願的。這個是我自己寫的爬歌曲genre的程序。


其實,真正的問題在於,數據在哪裏?阿里巴巴,Kaggle等公司的大數據挑戰項目,每次的挑戰任務都會提供一個很大的csv spreadsheet。但是如果自己做Data Science Project呢?那麼就要需要花費很多心思去尋找數據在哪裏。沒有數據簡直就是“巧婦難爲無米之炊”。數據獲取方式包括:網絡爬蟲,網站提供API,網站直接提供數據下載,自己調研手動輸入數據,給有數據的機構發郵件請求數據,花錢買數據。。。俗話說:好的開始就是成功的一半。有了高質量的數據就是好的開始。

我團隊在做 Project #8:Do Popular Songs Endure時,獲取歌曲數據有如下幾種方式:

  1. 人工輸入法。最後我們團隊要找的目標在Spotify的桌面客戶端裏面。我們除了人工把客戶端裏面的數據輸入到excel裏面,沒有找到別的辦法。
  2. 網頁的Ctrl C+V法。我們需要的特徵在一個網頁裏的表格裏面,我們可以直接複製,然後粘貼到Excel。
  3. 爬蟲方法。我寫了爬蟲程序,爬Wikipedia裏面的數據。
  4. API方法。韓國隊友拿到了Spotify的API,直接從API裏面弄到了數據。

我門在做這個項目的過程中,估計接近百分之80的時間花在搞數據上面了!



Step 2: Data Preprocessing

數據預處理主要是data cleaning,還包括scaling,encoding等等。

Data Cleaning

原始的數據常常是無法直接使用的,需要做“清潔”。做data cleaning我還是使用Pandas。常見的date cleaning包括:

  1. Missing value。數據缺失(nan)。最簡單的方法是刪除這一行。不過最好impute一下,把缺失的數據填補上去,這
  2. Name unification。比如”B. J. Thomas”和”B.J. Thomas”其實本是一個人,但是着兩個字符串相差了一個空格,導致程序會認爲是兩個人。
  3. Outlier。outlier需要引起注意,有時候outlier是由一些錯誤引起的,那麼此時可以直接把outlier刪除。如果確實有正確的outlier,那麼最好不要刪除,刪除雖然可以減小誤差,但是就是自欺欺人了,很容易overfit
  4. Feature selection。在做kaggle challenge項目的時候它給你一大坨數據,有很多features。這些Highly correlated的一些features最好只保留一個,或者做一個PCA。

Scaling

Scaling的意思是,改變數值數據的範圍,比如:normalization和log

在data cleaning之後,拿ML算法建模之前,把數據的取值範圍按照公式運算一下,這個公式一般是Z-score。做完z-score之後,該feature的均值爲0,方差爲1。做normalization的目的是使feature之間的數值具有可比性。

有時候,在z-score之前,還要做一個logarithm。這就涉及到power law分佈了。我們的project中,犯了這個錯誤被老師指出來了。Billboard排行榜是對歌曲的流行度的一個排名,從第1到第100。那麼假設第一名和第三名之間的流行程度相差X,第五十一名和五十三名之間相差Y,那麼X和Y想等麼?顯然不是,應該X>>Y。這篇論文公式6描述了billboard排行榜單和流行程度之間的函數關係。


Encoding

Encoding是指把categorical(分類)數據轉換成numerical(數值)型數據。字符串就是categorical數據,sklearn的庫不能接受字符串。一種方法是直接刪除整個字符串特徵數據。還有一種方法叫做onehotencoding。我在做project的時候,使用了pd.get_dummies。我的使用情景是:一首歌屬於一個genre,但是genre屬性是categorical的,爲了能夠使用sklearn的迴歸算法,就用get_dummies把genre變成了0-1的數值型數據。



Step 3: Modeling and Analysis

Sklearn

在做好前期的數據工作之後,建模和分析就變得輕鬆了,在我做的project中,所謂建模就是兩三行代碼,如下:

model = linear_model.LinearRegression()
model = model.fit(feature, target)

建模之後,就是拿模型去預測測試數據:

pred = model.predict(test)

所以到底用那個模型(機器學習算法)呢?除了大概瞭解這些算法的運行機理之外,就是把這些sklearn算法都拿來一一試一遍。


Step 4: Evaluate and Present

Evaluation的話,就是拿pred和真實值做對比,沒有對比就沒有傷害。傷害完了還要去做evaluation評估。基本的評估包括:mean/median absolute err-or(MAE), mean squeared error(MSE)等,還做圖:誤差分佈圖,和預測-真實值圖,其中縱座標爲預測值,橫座標爲真實值。一個evaluation report例子,這例子的permutation可以不做。

我們可以寫一個程序(一個函數),一次運行就可以生成各種evaluation結果。這樣可以快速得知我們的數據和模型如何。


Jupyter Notebook

Jupyter Notebook combines code, data, equations, visualizations and explanatory text all in one. Super easy to use. You code, run results and write documentations in a web browser. For data science project, I believe Jupyter notebook is better than IDEs such as Pycharm or Visual Studio. Even if you use an IDE to write your code, you still will need a tool to write the report, such as Word or LaTex, which is miseralbe. When you use Jupyter Notebook, after you finish wirting your code, your data science project’s report is already almost finished.

HERE are shortcut keys for Jupyter Notebook. In the notebook, there are two modes: command mode and edit mode (just like Vim has three modes). Press Esc to get into command mode, and press Enter to get into edit mode. In edit mode, Tab completion works just like the tab completion in Linux/Unix. Tab自動補全一個編程利器,加快效率。

HERE 是如何修改Jupyter Notebook的起始目錄,可以把起始目錄改成項目的路徑。HERE 是如何將Notebook 連接到 remote server。Here 是如何將 Notebook連接到Google Cloud。


Seaborn

Seaborn基於Matplotlib。HERE是如何seaborn繪製一個漂亮的heatmap熱力圖。

Pandas.plot

沒錯,pandas無處不在,它也可以用來作圖,我還挺喜歡用它來作圖的。我覺得Pndas.plot比matplotlib用起來方便快速一些。



其他

代碼優化

原生的Python程序比較慢,特別是 for loop。加快Python 程序的速度的兩個簡單的方法是:能用 Numpy 的地方,絕不用 list;使用 Numba,它是一個編譯優化工具,HERE 是一個簡易的Numba教程。最後,如果程序的瓶頸是大規模的數字,矩陣運算的話,可以使用GPU來加速程序,在這裏可以使用 CUDA 庫。



Talk is Cheap Show Me the Code

這個GitHub有我CSE519 Data Science Fundamentals所有的作業,代碼和報告。這篇博客包含了這門課的回憶錄。


Last updated: 2018/8/16

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章