在機器學習任務中,數據集的質量優劣對數據分析的結果影響非常大,所謂 Garbage in, garbage out,數據決定模型的上限 ,因此數據質量成爲數據分析流程不可或缺的一個環節。即使是像Kaggle那樣主辦方已經把數據集準備好的場景,也需要評估train set和test set的分佈是否一致,存不存在偏斜等。如果兩者不一致,可能會導致離線cv分數非常高,可是在leaderborad卻下跌了很多,以至於大量花在模型調參上的功夫其實都白費了。

本文不對數據採集的過程深入探討,即不討論怎麼在數據採集過程中保證數據的準確性; 而是聚焦在對現有的數據集,如何快速高效地評估數據集的質量,找出數據集中存在的瑕疵問題。

通常我們使用pandas手工地檢查數據集,不停地做出假設然後驗證; 現在介紹給大家一個神器: Facets

Facets

Facets 是Google的一個開源項目,用於 幫助理解和分析機器學習數據集的可視化工具 。該項目使用基於Typescript編寫的PloymerWeb組件,可以輕鬆地嵌入到Jupyter notebook或網頁。

Facets包含2個可視化組件: Overview Dive 可使用Overview瞭解數據集每個特徵的分佈,或使用Dive研究個別樣本的細節。這兩個組件讓你可以輕鬆地調試自己的數據,這在機器學習中與調試模型一樣重要。

若想通過機器學習得到理想的結果,需要深入地理解數據。 然而數據集可能包含數以億計的數據點,每個數據點又包含數百個(甚或數千個)特徵,因此,直觀地理解整個數據集幾乎是不可能的。 可視化工具有助於發現大型數據集的微妙之處並從中發現真知灼見。 一張圖片傳達的信息勝過千言萬語,而一個直觀的可視化工具則更勝一籌。

Facets自動幫助用戶快速理解其數據集特徵的分佈情況,並且能夠在同一個視圖中比較多個數據集(如訓練集和測試集)。 將妨礙機器學習過程的常見數據問題暴露到眼前,例如,異常的特性值、缺失值比例很高的特徵、分佈不均的特徵,以及數據集之間偏態分佈的特徵。

Overview展示了訓練集和測試集的分佈

在圖表中,這些特徵 按照"不均勻性"排序 ,分佈最不均勻的特徵位於頂部。紅色的數字則暗示可能的故障點,例如 高比例的缺失值、同一特徵在不同數據集之間分佈差異很大等

有兩種使用Facets的方法:

  • 官網 直接上傳並可視化用戶自己的數據集,而不必安裝或設置任何軟件,甚至不需要數據離開您的計算機

  • 使用jupyter notebook的Extension(文章後面有安裝教程)

Overview介紹

Overview提供了一個或多個數據集的high-level視圖,用以給出可視化形式的 feature-by-feature 的統計分析,以及數據集之間的統計比較。該工具可以處理數值型特徵、類別型(字符串)特徵

Overview可以幫助揭露數據集的潛在問題:

  • 不符合預期的特徵取值

  • 缺失值

  • train/validate/test數據集的偏斜

Overview可視化的 核心目的 是 "異常檢測"和"數據集間的分佈比較"

生成Feature statistics

overview可以通過pip安裝:

pip install facets-overview

TensorFlow 也需要被安裝: 之所以不在pip的依賴文件中,是允許用戶自由選擇安裝cpu或gpu版本

目前支持兩種數據源格式:

  • ProtoFromDataFrames() TfRecord files of tensorflow Example protocol buffers

  • ProtoFromTfRecordFiles() pandas DataFrames

以DataFrame爲例:


from facets_overview.generic_feature_statistics_generator import GenericFeatureStatisticsGenerator

import pandas as pd


df = pd.DataFrame({'num' : [1, 2, 3, 4], 'str' : ['a', 'a', 'b', None]})

proto = GenericFeatureStatisticsGenerator().ProtoFromDataFrames([{'name': 'test', 'table': df}])

feature statistics protocol buffer  是核心的數據結構,它存儲了關於數據集的所有統計信息,使用GenericFeatureStatisticsGenerator()。ProtoFromDataFrames()函數生成。該函數的參數是一個dict的列表,每個字典描述一個數據集。

大數據集

這裏的大數據集是指數據量大到無法一次全部讀入內存。

分佈式版本參見 Facets Overview Spark project

對結果進行可視化

jupyter noetbook平臺

安裝jupyter插件

Note that for using Facets Overview in a Jupyter notebook, there are two considerations:

  1. In the notebook, you will need to change the path that the Facets Overview python code is loaded from to the correct path given where your notebook kernel is run from.

  2. You must also have the Protocol Buffers python runtime library installed:  https://github.com/protocolbuffers/protobuf/tree/master/python . If you used pip or anaconda to install Jupyter, you can use the same tool to install the runtime library.

When visualizing a large amount of data in Dive in a Juypter notebook, as is done in the Dive demo Jupyter notebook, you will need to start the notebook server with an increased IOPub data rate. This can be done with the command jupyter notebook --NotebookApp.iopub_data_rate_limit=10000000.

生成HTML


from IPython.core.display import display, HTML

import base64

protostr = base64.b64encode(proto.SerializeToString()).decode("utf-8")

HTML_TEMPLATE = """<link rel="import" href="/nbextensions/facets-dist/facets-jupyter.html" >

<facets-overview id="elem"></facets-overview>

<script>

document.querySelector("#elem").protoInput = "{protostr}";

</script>"""

html = HTML_TEMPLATE.format(protostr=protostr)

display(HTML(html))

protoInput 屬性可以接收三種形式的DatasetFeatureStatisticsList protocol buffer:

  • An instance of the DatasetFeatureStatisticsList javascript class, which is the class created by the protocol buffer compiler buffer.

  • A UInt8Array containing the serialized binary of a protocol buffer.

  • A string containing the base-64 encoded serialized protocol buffer, as shown in the code example above.

報錯解決方法: 關鍵在於 href="/nbextensions/facets-dist/facets-jupyter.html" 這裏使用的是相對引用,因此 需要注意notebook的工作路徑 我採用的辦法是,直接把notebook放在 C:\ProgramData\jupyter下面。

Overview的價值?

是的,確切地講,用pandas手動來進行這個層面的分析已經是一種最佳實踐了。 但是我們很容易忘記了要詳細檢查數據中每一列的所有指標。 而這個工具就能確保我們不再遺忘這重要一步,並且將所有反常之處都標記出來。

數據結構解讀 & Google序列化工具——Pb

Overview的可視化依靠feature statistics protocol buffer. Pb的messages存儲了多個數據集、各個特徵的統計量彙總。

頂層proto是DatasetFeatureStatisticsList,是一個DatasetFeatureStatistics的列表; 每一個 DatasetFeatureStatistics表示單個dataset的多個特徵統計量。

DatasetFeatureStatistics包含了一組FeatureNameStatistics; 每個表示單個特徵的各種統計量。

特徵的數據類型不同(數值型、字符型、原始字節),特徵統計量也不同。

數值型特徵,特徵統計量包含 min, mean, median, max and standard deviation。

字符型特徵,特徵統計量包含 average length, number of unique values and mode。

Feature statistics 包含了一個可選的field以支持帶權重的統計量。

如果數據集包含樣本權值信息,那麼可以被用來計算帶權重的統計量。

如果proto包含了weighted字段,那麼可視化中會顯示帶權重的統計量,且用戶可以在unweighted 與weighted 之間切換。

Feature statistics還包含了一個可選字段,用於 自定義統計量。

如果想要跟蹤和可視化某些特徵額外的統計量,可以在custom stats字段中添加。

以custom stat names到 custom stat values(numbers或strings)的映射形式。

Dive

Dive是一個工具,用來交互式探索高維的海量數據,使用戶能夠在higl-level與low-level之間切換自如。 每一個樣本,被表示爲一個單獨的項,樣本可以通過它們的屬性值被faceting/bucketing; 讓你更加清晰地洞察數據,甚至還能讓你通過縮放來查看某一特定的數據。

從這裏開始,很多事情都會變得很有趣。 你可以按照行和列來擷取數據中一小個“facet”,觀察它在所有特徵值中的情況。 就好比你在網購一雙鞋,然後通過過濾工具篩選大小、品牌和顏色。 Dive使得挖掘出複雜數據集的模式和異常值變得更加簡單。

有興趣可以直接去 facets網站 上,嘗試上傳你的數據並開始探索。

拓展

Protocol buffers

Protocol Buffers以下簡稱pb,是google開發的一個可以序列化 反序列化object的數據交換格式,類似於xml,但是比xml 更輕,更快,更簡單。 而且以上的重點突出一個跨平臺,和xml json等數據序列化一樣,跨平臺跨語言。

歸根到底,pb還是一個序列化反序列化工具,那麼使用上來說其實我個人認爲是沒有json那麼簡單的,但是卻可以保證即使是在python這種動態語言中,數據類型也不會出現錯誤。 他的使用需要定義一個.proto文件,該文件裏面會定義好數據類型和格式。 我在這裏就不再搬運各語言對應的字段,因爲這些官方文檔中都寫的非常清楚。 這裏直接上最簡單的使用。

安裝:

直接在GitHub 上下載已經編譯好了的 binary文件: protoc-3.6.1-win32.zip

gihub源碼編譯

下載源碼


git clone https://github.com/PAIR-code/facets

cd facets

然後通過setup.py安裝package:

python setup.py install

python setup.py build 是python編譯這個module的過程, 這個過程比較複雜,最後會生成build文件夾。 除去build過程後的install過程,就是複製build/lib下面的文件到用戶指定的lib庫。

相關文章