天天看點

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

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

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

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

另一方面,依賴于我們的視覺系統了來提取資訊,有至少一個主要缺陷:至多隻能同時感覺三個次元。而今天的資料集,有很多的次元比這要高得多。

現在資料科學家普遍面臨的問題是:

如何駕馭人腦的模式識别超能力,實作複雜、高維資料集的可視化?

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

下面,是一副幫助你直覺性了解資料降維的圖示。

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

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

kaggle 開發了 hypertools 工具包,來幫助開發者對高維資料進行降維視覺探索。

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

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

import pandas as pd import hypertools as hyp

接下來,把資料讀取到 pandas dataframe:

data = pd.read_csv('../input/mushrooms.csv') data.head()
這才是使用資料降維&可視化工具 HyperTools 的正确姿勢! | Kaggle 實戰教程

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

hyp.plot(data, 'o')
這才是使用資料降維&可視化工具 HyperTools 的正确姿勢! | Kaggle 實戰教程

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

hyp.plot(data,'o', group=class_labels, legend=list(set(class_labels)))
這才是使用資料降維&可視化工具 HyperTools 的正确姿勢! | Kaggle 實戰教程

紅色代表有毒,綠色無毒

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

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:

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)))
這才是使用資料降維&可視化工具 HyperTools 的正确姿勢! | Kaggle 實戰教程

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

為了對溫度變化做可視化,我們會用 hypertools 來給資料降維,然後把溫度随時間的變化用線畫出來:

hyp.plot(temps)
這才是使用資料降維&可視化工具 HyperTools 的正确姿勢! | Kaggle 實戰教程

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

hyp.plot(temps, normalize='across')
這才是使用資料降維&可視化工具 HyperTools 的正确姿勢! | Kaggle 實戰教程

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

hyp.plot(temps, normalize='across', group=years.flatten(), palette='rdbu_r')
這才是使用資料降維&可視化工具 HyperTools 的正确姿勢! | Kaggle 實戰教程

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

hyp.plot(temps, normalize='across', group=years.flatten(), palette='rdbu_r', ndims=2)
這才是使用資料降維&可視化工具 HyperTools 的正确姿勢! | Kaggle 實戰教程

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

hyp.plot(temps, normalize='across', animate=true, chemtrails=true)
這才是使用資料降維&可視化工具 HyperTools 的正确姿勢! | Kaggle 實戰教程

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

本文作者:三川