雷鋒網按:世界首屈一指的機器學習競賽平臺 Kaggle,在今年早些時候推出了基於 Python 的高維資料降維以及視覺化處理工具 HyperTools,並將其作為 Kaggle Kernels 的一部分免費提供給開發者。
日前,Kaggle 在博客公佈了使用 HyperTools 的官方教程。其中包含兩個例子:用 HyperTools 對蘑菇資料做視覺化,以及對全球氣象資料做視覺化。示例包含代碼,需要做資料降維視覺化的童鞋,這是一篇不錯的 HyperTools 上手教程。全文由雷鋒網編譯。
資料科學家、分析師處理的資料集,正在變得越來越複雜。
機器學習的很大一部分專注於從複雜資料中抽取涵義。但是,這一過程中人類仍然扮演很重要的角色。人類的視覺系統非常善於檢測複雜結構,並發現海量資料中的微妙模式。人眼睜開的每一秒鐘,都有無數的資料點(到達視網膜的光線圖形)蜂擁至大腦的視覺區域。對於識別沙灘上的一枚完整貝殼,或是人群中朋友的臉,人腦能輕鬆完成。這一點其實十分了不起。我們的大腦是無監督模式發現的“狂人”。
另一方面,依賴於我們的視覺系統了來提取資訊,有至少一個主要缺陷:至多只能同時感知三個維度。而今天的資料集,有很多的維度比這要高得多。
現在資料科學家普遍面臨的問題是:
如何駕馭人腦的模式識別超能力,實現複雜、高維資料集的視覺化?
如何降維?
如同其名,降維是指把高維資料集轉化為低維資料集。比如說,
把 Kaggle 上針對蘑菇的 UCI ML 資料集
組織為矩陣。每一行都包含一系列蘑菇的特徵,比如菌蓋大小、形狀、顏色、氣味等等。對這做降維,
最簡單的方法是忽略某些特徵。
比如挑出你最喜歡的三個特徵,去掉其他。但如果忽略的特徵包含有價值的甄別資訊,比方說要判斷蘑菇是否有毒,這就非常有問題了。
一個更複雜的辦法,是只考慮主要的東西,來對資料集進行降維。
即將特徵進行合併,用合併後的主成分來解釋資料集中的大多數變化。
利用一項名為主成分分析(PCA)的技術,我們能夠在降維的同時,盡可能保留資料集的寶貴變化。這裡的思路是,我們能夠創建一系列(更少)新的特徵,每一項新特徵都由幾項舊特徵合併得到。舉個例子,其中一項新特徵也許會同時代表形狀和顏色,另一項代表尺寸和毒性。大體上,每一項新特徵都會由原始特徵的加權和得到。
下面,是一副説明你直覺性理解資料降維的圖示。
假設你有一個三維資料集(左),你想要把它轉化為右邊的二維資料集。PCA 會在原始 3D 空間找出主要的坐標軸,即點與點之間的差別最大。當我們把兩條最能解釋資料差異的坐標軸確定下來(左圖中的黑線),就可以在這兩條坐標軸上重新為資料作圖。3D 資料集現在就變成了 2D 的。這裡,我們選擇的是低維例子,所以我們能看到發生了什麼。但是,這項技術能用同樣的方式應用于高維資料集。
HyperTools
Kaggle 開發了 HyperTools 工具包,來幫助開發者對高維資料進行降維視覺探索。
它基本的流水線,是導入高維資料集(或者一系列高維資料集),在單個函式呼叫裡降維,然後創建圖表。該演算法包建立在多個大家很熟悉的工具的基礎上,比如 matplotlib、scikit-learn 和 seaborn。HyperTools 以易用性為首要設計目標,請見下面的兩個例子。
用 HyperTools 找毒蘑菇,對靜態點雲進行視覺化
首先,我們來探索下上文提到的蘑菇資料集。從導入相關演算法庫開始:
import pandas as pd
import hypertools as hyp
接下來,把資料讀取到 pandas DataFrame:
data = pd.read_csv('../input/mushrooms.csv')
data.head()
DataFrame 的每一行對應著對某一個蘑菇的觀察值,每一列反映出一個蘑菇的描述性特徵。這裡,僅展示了表單的一部分。現在,我們可以通過把資料導入 HyperTools,把高維資料在低維空間表示出來。為了對文本列進行處理,在降維之前,HyperTools 會先把每個文本列轉為一系列二元的假變數。如果“菌蓋尺寸”這一列包含“大”和“小”標籤,這一列會被轉為兩個二元列,一個針對“大”,另一個針對“小”。 1 代表該特徵(“大”或“小”)的存在,0 代表不存在。(雷鋒網注:詳細解釋請參考 pandas 檔中的 get_dummies 函數)
hyp.plot(data, 'o')
在繪製 DataFrame 上,我們實際上創建了一個三維的“蘑菇空間”。具有相似特徵的蘑菇,是空間中距離相近的點,特徵不同的,則距離更遠。用這種方式做 DataFrame 視覺化,一件事馬上變得很清楚:數據中有多組簇。換句話說,蘑菇特徵的所有組合並不是等可能的(equally likely),而特定的組合,會傾向於聚到一起。為更好理解這一空間,我們可以根據所感興趣的資料特徵,對每個點上色。舉個例子,根據蘑菇是否有毒/可食用來上色。
hyp.plot(data,'o', group=class_labels, legend=list(set(class_labels)))
紅色代表有毒,綠色無毒
isualizing the data in this way highlights that mushrooms’ poisonousness appears stable within each cluster (e.g. mushrooms that have similar features), but varies across clusters. In addition, it looks like there are a number of distinct clusters that are poisonous/edible. We can explore this further by using the ‘cluster’ feature of HyperTools, which colors the observations using k-means clustering. In the description of the dataset, it was noted that there were 23 different types of mushrooms represented in this dataset, so we’ll set the n_clusters parameter to 23:
用這種方式視覺化,可以清楚看出,每個簇中的蘑菇是否有毒都是穩定的。但不同之處在於簇與簇之間。另外,看起來有好幾個十分明確的“有毒”以及“可食用”的簇。我們可以借助 HyperTools 的“聚類”功能,對此進一步探索。它使用了 k-means 聚類方法對觀察值上色。資料集的描述表明其有 23 種不同種類的蘑菇,因此,我們把n _clusters 參數設為 23。
hyp.plot(data, 'o', n_clusters=23)
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:
cluster_labels = hyp.tools.cluster(data, n_clusters=23)
hyp.plot(data, group=cluster_labels)
在默認設置中,HyperTools 使用 PCA 來進行降維。但只需要額外的幾行代碼,我們就可以直接從 sklearn 中調用相關函數,以使用其它降維方法。。舉個例子,如果我們使用 t-SNE 來給資料降維的話:
from sklearn.manifold import TSNE
TSNE_model = TSNE(n_components=3)
reduced_data_TSNE = TSNE_model.fit_transform(hyp.tools.df2mat(data))
hyp.plot(reduced_data_TSNE,'o', group=class_labels, legend=list(set(class_labels)))
不同的降維方法,會突出或保留資料的不同方面。
這裡
有一個包含額外示例(包括其它降維方法)的資源庫。
對於如同通過降維和視覺化暴露出資料的幾何機構,上述的資料考察(data expedition)給出了一個例子。蘑菇資料集的觀察值形成了獨立的簇,我們通過 HyperTools 來發現這些簇。類似這樣的探索和視覺化,能夠指導我哦們的分析決策,比如,是否要用一個特定種類的分類器,來區分有毒 vs 可食用的蘑菇。如果你想要自己試試用 HyperTools 分析這個蘑菇資料集,
請戳這裡
。
用 HyperTools 發現全球變暖
上文蘑菇資料集包含的是靜態觀察值,我們再一起來看看全球氣溫資料。這個案例會向大家展示,如何利用 HyperTools 使用動態軌跡對時間序列資料進行視覺化。
接下來的資料集,是 1875–2013 年間全球 20 個城市每月的氣溫記錄。為了用 HyperTools 來準備資料集,我們創建了一個時間/城市矩陣,每一行是接下來每月的氣溫記錄,每一列是不同城市的氣溫值。你可以用 Kaggle 上的
Berkeley Earth Climate Change
來重建這一示例,或者克隆這一 GitHub
資源庫
。
為了對溫度變化做視覺化,我們會用 HyperTools 來給資料降維,然後把溫度隨時間的變化用線畫出來:
hyp.plot(temps)
這看起來像一團亂麻,是吧?但我們承諾了找出資料的結構——現在就來找吧。
由於每個城市的地理位置不同,它溫度時間序列的平均值和方差會比其他城市更高或者更低。這會反過來影響降維時該城市的權重。為了對每個城市在圖表中的權重進行標準化處理,我們可設置標準化 flag (預設值是 False)。設置 normalize='across' 。HyperTools 整合了一系列實用的標準化選項,詳情請戳
這裡
。
hyp.plot(temps, normalize='across')
用滑鼠旋轉該資料圖,旋即暴露出的結構很有意思。我們可以按照年份來對線條上色,使其結構更顯眼,並説明我們理解它如何隨時間而變化。偏紅的線條,意味著時間更久遠,偏藍的線條意味著時間更近。
hyp.plot(temps, normalize='across', group=years.flatten(), palette='RdBu_r')
上色後的線條,暴露出了資料的兩個關鍵結構資訊。第一,有系統性的藍色到紅色的色彩漸變,表明全球的整體氣溫模式有系統性的改變。第二,每種顏色有週期性的模式,反映出季節氣候變化。我們也可以用二維圖形對這兩個現象做視覺化:
hyp.plot(temps, normalize='across', group=years.flatten(), palette='RdBu_r', ndims=2)
現在是壓軸戲——在創建靜態圖形之外,HyperTools 還能創建動圖,這有時能顯露出資料中的其他模式。創造出動圖,只需要在對時間序列資料做視覺化時,簡單地把 animate=True 傳給 hyp.plot。如果你還傳了 chemtrails=True,一條資料的低透明度足跡會保留在圖形中:
hyp.plot(temps, normalize='across', animate=True, chemtrails=True)
最終的成果,便是該動畫。注視著它給你帶來的滿足感,叫做“全球變暖”。
以上便是用 HyperTools 為氣象和蘑菇資料做視覺化的例子。想要瞭解更多的話,請訪問專案的
GitHub 資源庫
,
檔閱讀網頁
,Kaggle 研究團隊寫的
論文
,以及
notebooks 演示
。
via
kaggle