数据集可视化工具FACETS

谷歌发布了 Facets,一款开源的可视化工具。它可以帮助你理解、分析和调试 ML 数据集。Facets 包含两个部分——Facets Overview 和 Facets Dive——允许用户从不同的粒度观看数据的全景图,还可以轻易地被用在 Jupyter notebooks 之内,或者嵌入网页之中。除了开放 Facets 源代码,谷歌还创建了演示网站,Github 和网站地址见:
github 地址:https://github.com/pair-code/facets
演示地址:https://pair-code.github.io/facets/

overview

Overview提供一个或多个数据集的高级视图。它生成特征的可视化统计分析,还可以用于比较两个或多个数据集之间的统计信息,可以处理离散值和连续值。

Feature Statistics Protocol Buffer

  • 存储ML系统输入数据的单个特性列的汇总统计信息
  • 顶层原型是DatasetFeatureStatisticsList(DFSL),是一系列的DatasetFeatureStatistics(DFS),每个FDS表示单个数据集的特征统计信息,它包含一系列的FeatureNameStatistics(包含单个数据集中单个特性的统计信息)
  • feature statistics取决于datasets的数据类型(numeric, string, or raw bytes),numeric类型
    • numeric类型包含:最大值、均值、中值、最小值、方差、缺失比例、0值比例等
    • string类型包含:string平均长度, 唯一值个数,缺失值比例,top等
  • 可选项weighted统计:如果数据集中有weight特征,则可进行带权值统计,显示时可在权值统计和普通统计之间进行视图切换
  • 可选项custome统计:自定义统计特性

Feature Statistics Generation

numpy、pandas、tensorflow包需要安装

from 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}])

将pandas转化为Proto形式,pandas读入,再用ProtoFromDataFrames转换

注:上面这种方式适用与小数据,大量数据需要采用spark处理

Visualization

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 javascript实例
  • UInt8Array(protocol buffer的序列化二进制文件)
  • base-64编码的序列化protocol buffer(如上例所示)
Understanding the Visualization
  • numeric特征展示
    在这里插入图片描述
  • string特征展示
    在这里插入图片描述

dive

Dive是一种工具,可以交互式地探索多达数万个多维数据点,允许用户在高级概览和低级细节之间无缝切换。每个示例在可视化中都表示为一个单独的项,并且这些点可以通过它们的特征值在多个维度中进行面/桶形定位。通过将平滑动画和缩放与面板和过滤相结合,Dive可以很容易地发现复杂数据集中的模式和异常值

Getting Started

Providing Data to Dive

数据格式如下:

[{
  "name": "apple",
  "category": "fruit",
  "calories": 95
},{
  "name": "broccoli",
  "category": "vegetable",
  "calories": 50
},{
 ...Many more foods...
}]
  • 不需要所有的数据都具有相同key,允许存在缺失值
  • 只能处理numeric和string类型数据,array之类的复杂数据类型会优先转化为string
Providing Sprites For Dive to Render

可以替换展示形式

Navigating the Dive Controls
  • Faceting Controls
    XY轴选择,连续型数据等分成不同的段,离散型进行数值统计,值太多归为other
  • Positioning Controls
    默认情况下直接将数据堆叠在一起或者放在散点图中
  • Color Controls
  • Display Controls 每个点呈现什么
示例程序

只需要把数据替换一下,其他的形式可以不用更改

import sys
sys.path.append('./python')

# 读入数据
import pandas as pd
features = ["Age", "Workclass", "fnlwgt", "Education", "Education-Num", "Marital Status",
            "Occupation", "Relationship", "Race", "Sex", "Capital Gain", "Capital Loss",
            "Hours per week", "Country", "Target"]
train_data = pd.read_csv(
#     "https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data",
    'E:/PyProject/facets/facets_overview/adult.data',
    names=features,
    sep=r'\s*,\s*',
    engine='python',
    na_values="?")
test_data = pd.read_csv(
#     "https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.test",
    'E:/PyProject/facets/facets_overview/adult.test',
    names=features,
    sep=r'\s*,\s*',
    skiprows=[0],
    engine='python',
    na_values="?")

#展示
from IPython.core.display import display, HTML

jsonstr = train_data.to_json(orient='records')
HTML_TEMPLATE = """
        <script src="https://cdnjs.cloudflare.com/ajax/libs/webcomponentsjs/0.7.24/webcomponents-lite.js"></script>
        <link rel="import" href="https://raw.githubusercontent.com/PAIR-code/facets/master/facets-dist/facets-jupyter.html">
        <facets-dive id="elem" height="600"></facets-dive>
        <script>
          var data = {jsonstr};   #数据
          document.querySelector("#elem").data = data;
        </script>"""
html = HTML_TEMPLATE.format(jsonstr=jsonstr)
display(HTML(html))

参考:
https://www.jiqizhixin.com/articles/2017-07-18

猜你喜欢

转载自blog.csdn.net/wkh7717/article/details/90053774