這才是使用數據降維&可視化工具 HyperTools 的正確姿勢! | Kaggle 實戰教程

機器學習 地理 科技 雷鋒網 2017-04-14

雷鋒網按:世界首屈一指的機器學習競賽平臺 Kaggle,在今年早些時候推出了基於 Python 的高維數據降維以及可視化處理工具 HyperTools,並將其作為 Kaggle Kernels 的一部分免費提供給開發者。

日前,Kaggle 在博客公佈了使用 HyperTools 的官方教程。其中包含兩個例子:用 HyperTools 對蘑菇數據做可視化,以及對全球氣象數據做可視化。示例包含代碼,需要做數據降維可視化的童鞋,這是一篇不錯的 HyperTools 上手教程。全文由雷鋒網編譯。

這才是使用數據降維&可視化工具 HyperTools 的正確姿勢! | Kaggle 實戰教程

數據科學家、分析師處理的數據集,正在變得越來越複雜。

機器學習的很大一部分專注於從複雜數據中抽取涵義。但是,這一過程中人類仍然扮演很重要的角色。人類的視覺系統非常善於檢測複雜結構,並發現海量數據中的微妙模式。人眼睜開的每一秒鐘,都有無數的數據點(到達視網膜的光線圖形)蜂擁至大腦的視覺區域。對於識別沙灘上的一枚完整貝殼,或是人群中朋友的臉,人腦能輕鬆完成。這一點其實十分了不起。我們的大腦是無監督模式發現的“狂人”。

另一方面,依賴於我們的視覺系統了來提取信息,有至少一個主要缺陷:至多隻能同時感知三個維度。而今天的數據集,有很多的維度比這要高得多。

現在數據科學家普遍面臨的問題是:

如何駕馭人腦的模式識別超能力,實現複雜、高維數據集的可視化?

如何降維?

如同其名,降維是指把高維數據集轉化為低維數據集。比如說,把 Kaggle 上針對蘑菇的 UCI ML 數據集組織為矩陣。每一行都包含一系列蘑菇的特徵,比如菌蓋大小、形狀、顏色、氣味等等。對這做降維,最簡單的方法是忽略某些特徵。比如挑出你最喜歡的三個特徵,去掉其他。但如果忽略的特徵包含有價值的甄別信息,比方說要判斷蘑菇是否有毒,這就非常有問題了。

一個更復雜的辦法,是隻考慮主要的東西,來對數據集進行降維。即將特徵進行合併,用合併後的主成分來解釋數據集中的大多數變化。利用一項名為主成分分析(PCA)的技術,我們能夠在降維的同時,儘可能保留數據集的寶貴變化。這裡的思路是,我們能夠創建一系列(更少)新的特徵,每一項新特徵都由幾項舊特徵合併得到。舉個例子,其中一項新特徵也許會同時代表形狀和顏色,另一項代表尺寸和毒性。大體上,每一項新特徵都會由原始特徵的加權和得到。

下面,是一副幫助你直覺性理解數據降維的圖示。

假設你有一個三維數據集(左),你想要把它轉化為右邊的二維數據集。PCA 會在原始 3D 空間找出主要的座標軸,即點與點之間的差別最大。當我們把兩條最能解釋數據差異的座標軸確定下來(左圖中的黑線),就可以在這兩條座標軸上重新為數據作圖。3D 數據集現在就變成了 2D 的。這裡,我們選擇的是低維例子,所以我們能看到發生了什麼。但是,這項技術能用同樣的方式應用於高維數據集。

這才是使用數據降維&可視化工具 HyperTools 的正確姿勢! | Kaggle 實戰教程

HyperTools

Kaggle 開發了 HyperTools 工具包,來幫助開發者對高維數據進行降維視覺探索。

它基本的流水線,是導入高維數據集(或者一系列高維數據集),在單個函數調用裡降維,然後創建圖表。該算法包建立在多個大家很熟悉的工具的基礎上,比如 matplotlib、scikit-learn 和 seaborn。HyperTools 以易用性為首要設計目標,請見下面的兩個例子。

用 HyperTools 找毒蘑菇,對靜態點雲進行可視化

首先,我們來探索下上文提到的蘑菇數據集。從導入相關算法庫開始:

  1. import pandas as pd

  2. import hypertools as hyp

接下來,把數據讀取到 pandas DataFrame:

  1. data = pd.read_csv('../input/mushrooms.csv')

  2. data.head

這才是使用數據降維&可視化工具 HyperTools 的正確姿勢! | Kaggle 實戰教程

DataFrame 的每一行對應著對某一個蘑菇的觀察值,每一列反映出一個蘑菇的描述性特徵。這裡,僅展示了表單的一部分。現在,我們可以通過把數據導入 HyperTools,把高維數據在低維空間表示出來。為了對文本列進行處理,在降維之前,HyperTools 會先把每個文本列轉為一系列二元的假變量。如果“菌蓋尺寸”這一列包含“大”和“小”標籤,這一列會被轉為兩個二元列,一個針對“大”,另一個針對“小”。 1 代表該特徵(“大”或“小”)的存在,0 代表不存在。(雷鋒網注:詳細解釋請參考 pandas 文件中的 get_dummies 函數)

  1. hyp.plot(data, 'o')

這才是使用數據降維&可視化工具 HyperTools 的正確姿勢! | Kaggle 實戰教程

在繪製 DataFrame 上,我們實際上創建了一個三維的“蘑菇空間”。具有相似特徵的蘑菇,是空間中距離相近的點,特徵不同的,則距離更遠。用這種方式做 DataFrame 可視化,一件事馬上變得很清楚:數據中有多組簇。換句話說,蘑菇特徵的所有組合並不是等可能的(equally likely),而特定的組合,會傾向於聚到一起。為更好理解這一空間,我們可以根據所感興趣的數據特徵,對每個點上色。舉個例子,根據蘑菇是否有毒/可食用來上色。

  1. hyp.plot(data,'o', group=class_labels, legend=list(set(class_labels)))

這才是使用數據降維&可視化工具 HyperTools 的正確姿勢! | Kaggle 實戰教程

紅色代表有毒,綠色無毒

用這種方式可視化,可以清楚看出,每個簇中的蘑菇是否有毒都是穩定的。但不同之處在於簇與簇之間。另外,看起來有好幾個十分明確的“有毒”以及“可食用”的簇。我們可以藉助 HyperTools 的“聚類”功能,對此進一步探索。它使用了 k-means 聚類方法對觀察值上色。數據集的描述表明其有 23 種不同種類的蘑菇,因此,我們把n _clusters 參數設為 23。

  1. hyp.plot(data, 'o', n_clusters=23)

這才是使用數據降維&可視化工具 HyperTools 的正確姿勢! | Kaggle 實戰教程

To gain access to the cluster labels, the clustering tool may be called directly using hyp.tools.cluster, and the resulting labels may then be passed to hyp.plot:

為訪問簇的標籤,該聚類工具可用 hyp.tools.cluster 直接調用,相關標籤隨機被傳遞到 hyp.plot:

  1. cluster_labels = hyp.tools.cluster(data, n_clusters=23)

  2. hyp.plot(data, group=cluster_labels)

在默認設置中,HyperTools 使用 PCA 來進行降維。但只需要額外的幾行代碼,我們就可以直接從 sklearn 中調用相關函數,以使用其它降維方法。。舉個例子,如果我們使用 t-SNE 來給數據降維的話:

  1. from sklearn.manifold import TSNE

  2. TSNE_model = TSNE(n_components=3)

  3. reduced_data_TSNE = TSNE_model.fit_transform(hyp.tools.df2mat(data))

  4. hyp.plot(reduced_data_TSNE,'o', group=class_labels, legend=list(set(class_labels)))

這才是使用數據降維&可視化工具 HyperTools 的正確姿勢! | Kaggle 實戰教程

不同的降維方法,會突出或保留數據的不同方面。這裡有一個包含額外示例(包括其它降維方法)的資源庫。

對於如同通過降維和可視化暴露出數據的幾何機構,上述的數據考察(data expedition)給出了一個例子。蘑菇數據集的觀察值形成了獨立的簇,我們通過 HyperTools 來發現這些簇。類似這樣的探索和可視化,能夠指導我哦們的分析決策,比如,是否要用一個特定種類的分類器,來區分有毒 vs 可食用的蘑菇。如果你想要自己試試用 HyperTools 分析這個蘑菇數據集,請戳這裡。

用 HyperTools 發現全球變暖

上文蘑菇數據集包含的是靜態觀察值,我們再一起來看看全球氣溫數據。這個案例會向大家展示,如何利用 HyperTools 使用動態軌跡對時間序列數據進行可視化。

接下來的數據集,是 1875–2013 年間全球 20 個城市每月的氣溫記錄。為了用 HyperTools 來準備數據集,我們創建了一個時間/城市矩陣,每一行是接下來每月的氣溫記錄,每一列是不同城市的氣溫值。你可以用 Kaggle 上的 Berkeley Earth Climate Change 來重建這一示例,或者克隆這一 GitHub資源庫。

為了對溫度變化做可視化,我們會用 HyperTools 來給數據降維,然後把溫度隨時間的變化用線畫出來:

  1. hyp.plot(temps)

這才是使用數據降維&可視化工具 HyperTools 的正確姿勢! | Kaggle 實戰教程

這看起來像一團亂麻,是吧?但我們承諾了找出數據的結構——現在就來找吧。

由於每個城市的地理位置不同,它溫度時間序列的平均值和方差會比其他城市更高或者更低。這會反過來影響降維時該城市的權重。為了對每個城市在圖表中的權重進行標準化處理,我們可設置標準化 flag (默認值是 False)。設置 normalize='across' 。HyperTools 整合了一系列實用的標準化選項,詳情請戳這裡。

  1. hyp.plot(temps, normalize='across')

這才是使用數據降維&可視化工具 HyperTools 的正確姿勢! | Kaggle 實戰教程

用鼠標旋轉該數據圖,旋即暴露出的結構很有意思。我們可以按照年份來對線條上色,使其結構更顯眼,並幫助我們理解它如何隨時間而變化。偏紅的線條,意味著時間更久遠,偏藍的線條意味著時間更近。

  1. hyp.plot(temps, normalize='across', group=years.flatten, palette='RdBu_r')

這才是使用數據降維&可視化工具 HyperTools 的正確姿勢! | Kaggle 實戰教程

上色後的線條,暴露出了數據的兩個關鍵結構信息。第一,有系統性的藍色到紅色的色彩漸變,表明全球的整體氣溫模式有系統性的改變。第二,每種顏色有周期性的模式,反映出季節氣候變化。我們也可以用二維圖形對這兩個現象做可視化:

  1. hyp.plot(temps, normalize='across', group=years.flatten, palette='RdBu_r', ndims=2)

這才是使用數據降維&可視化工具 HyperTools 的正確姿勢! | Kaggle 實戰教程

現在是壓軸戲——在創建靜態圖形之外,HyperTools 還能創建動圖,這有時能顯露出數據中的其他模式。創造出動圖,只需要在對時間序列數據做可視化時,簡單地把 animate=True 傳給 hyp.plot。如果你還傳了 chemtrails=True,一條數據的低透明度足跡會保留在圖形中:

  1. hyp.plot(temps, normalize='across', animate=True, chemtrails=True)

這才是使用數據降維&可視化工具 HyperTools 的正確姿勢! | Kaggle 實戰教程

最終的成果,便是該動畫。注視著它給你帶來的滿足感,叫做“全球變暖”。

以上便是用 HyperTools 為氣象和蘑菇數據做可視化的例子。想要了解更多的話,請訪問項目的 GitHub 資源庫,文件閱讀網頁,Kaggle 研究團隊寫的論文,以及 notebooks 演示。

via kaggle

相關推薦

推薦中...