『The Big Book of Dashboards』という書籍を読んでいます。グラフやダッシュボードを作りデータ可視化を行う上で、データを扱う人間が気を付けるべきことはたくさんあります。それは人間の脳の働きや色覚が異なる人への配慮、色の使い方やデータタイプなど様々です。こういった(恐らくデザイナーさんが普通に知っている)可視化テクニックを体系的に教えてくれる良書であると思います。
デザインや色の使い方を直感や感覚値で選んでいた私はとても参考になっているので、いくつか勉強になった観点を共有します
Color Vision Deficiency(CVD)は、日本語だと色覚異常や色盲などと訳されます(※専門家でないので誤っていたらご指摘ください)。CVDをもつ人は、色は見えるが大多数の人と見え方が異なっていたり、特定の色を区別できない。本書籍だと女性で0.4%、男性で8%ほど、程度は違えどCVDであると記載されています(※色彩検定のHPには異なる数字が記載されている)。
大企業に勤めていて、大勢の人が可視化したダッシュボードを見る場合や、可視化した情報を一般公開する場合には、無視することはできません。色の見え方は多様であることを理解し、多様な人間が苦なく正確に情報を理解するためには、CVDの人がどのように色を区別しているかの知識を持つ必要があります。
私自身もこれから勉強を始める身ですが、CVDにも様々なタイプがあり一概に全員が同じ傾向にあるとは言えないようです。例えば、protanopia(=red color blindness)、Deuteranopia(=green color blindness)、Tritanopia(=blue color blindness)などのタイプがあります。
『The Big Book of Dashboards』には、より細かく、様々なシナリオにおける可視化のテクニックや注意すべき知識が述べられています。今まで感覚でなんとなくやっていたことが体系的な知識として獲得できると思いますので、大変お勧めです。データを扱う人間であれば知っていて損はないと思います。
2. The upcoming Spark 3.0: What’s Next:猿田 浩輔さん、Xiao Liさん
Sparkに関するこれまでの振り返りと今後の展望について共有がなされました。
振り返り
2018年の12月末にはSpark2.4がリリースされている。Sparkは、Unified Data Processing Engineとして着実に進化。バッチ処理、ETLでの活用が依然として多いが、新たに「IoTやアナリティクス領域」でのデータ活用を取り込めている。Spark2.0以降では、これらのデータ活用に即した機能追加も行われた(ex:Structured Streaming/Pythonからの利用における利便性向上/PandasUDFなどの拡充)。詳しくは下記資料にまとめられています。
今回自分は3つのモデルを組み合わせて最終的なsubmissionを生成していました。Non Tree Based Modelが1つとTree based Modelが2つです。これらのモデルのタイプに応じて、特徴量生成のケアや前処理方法は異なるため、改めて整理することが出来ました。前処理についてはCourseraのKaggleコースで勉強し、その内容の一部をアウトプットしました。
Numericデータにおいて注意すべき1つに、Scaling(スケーリング)がある。Scalingとは、「特徴量の取りうる値の範囲(スケール)を変えること」をさす。例えば、体重と身長、価格と数量では、単位と値の範囲が異なる。特徴量間で極端に異なるスケールのデータセットのままでは、うまく学習できない可能性があり、スケールを揃える必要がある。一般的にTree Based ModelモデルではScalingに依存しないが、Non Tree Based Modelの場合には予測に失敗するか悪影響を及ぼす。
Scalingの影響に関して、Non Tree based Modelに含まれるKNNを利用した例を1つ挙げる。2つの数値データを特徴量としたデータセットにおいて、「オレンジのデータがAとBのどちらと同じグループに含まれるか」のクラス分類を考えてみる。データ間の距離(類似性)をユークリッド距離で計算する場合、左の図ではBとの距離が近くなるために、Bと同じグループに分類される。次に特徴量Xを100倍にしたとする。その結果オレンジのデータはAとの距離が近くなり、Aと同じグループに分類されるだろう。これは相対的に特徴量Xの影響力を肥大化させ、特徴量Yを無視することに繋がる。
なお、sklearnのドキュメント内の説明では、This transformation is often used as an alternative to zero mean, unit variance scaling.と記載があり、次に挙げるStandard Scalarの代替手段として利用されるのだろうか。
Min Max ScalarやStandard Scalarにおいても、外れ値の影響について述べたが、特に線形モデルでは、外れ値の有無が予測精度に大きく影響を与える。これらに対処するために、下限と上限を決め、2つの選択された値の間で特徴量を切り取る方法などがとられる。Kaggleコース内では、特徴量の分布の中から1%~99%のデータを切り取る方法が提案されている。
多くのモデルは、正規分布を仮定していることが多いので、対数変換により正規分布に近似させる。データを正規分布に従わせる以外にも、外れ値が含まれるデータの分散を小さくするためにも使われる。すなわち、対数変換により極端に大きすぎる外れ値を平均値に近づける。これに伴い、ゼロに近い値をもう少し区別しやすくなる。特徴量の平方根を取る方法も同様の効果が見込める可能性がある。Non Tree Based Modelの中でも、特にNeural Networkで有効。
Ordinal featureの最もシンプルなエンコード方法であり、この特徴量のユニークな値を異なる数値にマッピングする方法である。Ordinalデータに限らず、Label EncodingはKaggleのCompetitionでのベースモデルとして、とりあえずCategoricalデータを全てLabel EncodingしているKernelをよく目にする。それほど、最も簡単な方法の1つである。Label EncodingはTree Based Modelでうまく作用するが、逆にNon Tree Based Modelでは効果的ではない。
カテゴリーが出現する頻度にデータを置き換えるエンコード方法であり、Tree Based Modelで有効。カテゴリーの頻度がTargetデータとの間に相関がある場合には、線形モデルにおいても効果がある。
注意すべき点としては、仮に複数のカテゴリーで同じ頻度を持つ場合、それらの値を持つデータを区別をすることができないため問題になる可能性がある。この場合の対処として、下記サイトにはwill need to change it to ranked frequency encodingと記載されている。当初、ranked frequency encodingとはよくわからなかったが、恐らくFrequency Encodingとは別に、Label Encodingの特徴量も用意すれば、Tree Based Modelであれば分割可能だということだと思う。
### FREQUENCY ENCODING# size of each category
encoding = titanic.groupby('Embarked').size()
# get frequency of each category
encoding = encoding/len(titanic)
titanic['enc'] = titanic.Embarked.map(encoding)
# if categories have same frequency it can be an issue# will need to change it to ranked frequency encodingfrom scipy.stats import rankdata
One-Hot Encodingは既に最大値1、最小値0にスケーリングされており、Non Tree Based Modelに適用する場合に有効。One-Hot Encodingは、カテゴリー数だけバイナリデータが特徴量として生成される。これは1つの特徴量を効率的に分類しようとするTree Based Modelでの分類を困難にする。
次のブログで、Tree Based ModelでOne-Hot-Encodingを実行したプロセスの図が描かれているが、直感的に効率が悪いことが確認できると思う。