表現: データのクリーニング

リンゴの木には、素晴らしい果物と雑草が混在しています。 高級食料品店のりんごは 100% 完璧な果物です。 果樹園と食料品店の間では、悪いリンゴを除去したり、救済可能なリンゴに小さなワックスをかけたりするのに多くの時間を費やしています。ML エンジニアは、不適切な例を捨て、救済可能な例をクリーンアップするために膨大な時間を費やします。少しの「悪いリンゴ」であっても、大規模なデータセットを台無しにすることもあります。

特徴値のスケーリング

スケーリングとは、浮動小数点の特徴値を自然な範囲(100 から 900 など)から標準範囲(0 から 1 または -1 から +1 など)に変換することを意味します。特徴セットが 1 つの特徴のみで構成されている場合、スケーリングによる実質的なメリットはほとんど、あるいはまったくありません。ただし、特徴セットが複数の特徴で構成されている場合、特徴スケーリングには次の利点があります。

  • 勾配降下法をより迅速に収束させることができます。
  • モデル内の 1 つの数値が NaN になる「NaN トラップ」を回避できます(トレーニング中に値が浮動小数点精度の上限を超える場合など)。また、数学演算により、モデル内の他のすべての数値も最終的に NaN になります。
  • モデルが各特徴に適した重みを学習できるようにします。特徴スケーリングを行わないと、範囲の広い特徴に注目しすぎてしまいます。

すべての浮動小数点特徴にまったく同じスケールを指定する必要はありません。特徴 A を -1 から +1 にスケーリングし、特徴 B を -3 から +3 にスケーリングしても、深刻な問題はありません。ただし、特徴 B を 5,000 から 100,000 にスケーリングすると、モデルが適切に反応しなくなります。

極端な外れ値の処理

次のプロットは、カリフォルニア州の住宅に関するデータセットroomsPerPerson という特徴を表しています。roomsPerPerson の値は、あるエリアの会議室の合計数をそのエリアの人口で割って計算されています。このプロットは、カリフォルニア州の大部分の地域に 1 人 1 室または 2 部屋があることを示しています。x 軸で見てみましょう。

RoomsPerPerson のプロット。ほぼすべての値が 0 ~ 4 でクラスタ化されていますが、1 人あたり 55 部屋となっているロングテールがあります。

図 4. おとり。

こうした極端な外れ値の影響を最小限に抑えるにはどうすればよいでしょうか。一つは、すべての値のログを取得する方法です。

log(roomsPerPerson) のプロット。値の 99% は約 0.4 ~ 1.8 に集まっていますが、それでも 4.2 程度になる長いテールがあります。

図 5. 対数スケーリングにはまだ後端が残っています。

対数スケーリングはわずかに優れていますが、それでも外れ値には大きなテールがあります。さらに別の方法を見てみましょう。roomsPerPerson の最大値を任意の値(4.0 など)に単純に「キャップ」または「クリップ」するとどうなるでしょうか。

RoomsPerPerson のプロット。すべての値が -0.3 ~ 4.0 の間になります。プロットはベルの形をしているが、4.0 の異常な丘がある

図 6: 特徴値を 4.0 にクリップする

特徴値を 4.0 でクリップしても、4.0 より大きい値がすべて無視されるわけではありません。つまり、4.0 より大きい値はすべて 4.0 になります。これは 4.0 の面白い丘についての説明です。それにもかかわらず、スケーリングされた特徴セットは元のデータよりも有用になっています。

ビニング

次のプロットは、カリフォルニア州のさまざまな緯度における住宅の相対的普及率を示しています。クラスタリングに注目してください。ロサンゼルスはおよそ緯度 34 度、サンフランシスコはおよそ緯度 38 度です。

緯度ごとの住宅のプロット。このプロットはきわめて不規則で、緯度 36 度付近にはドルドラムがあり、緯度 34 度と 38 度付近では大きな急上昇が見られます。

図 7. 緯度あたりの住宅数。

データセットにおいて、latitude は浮動小数点値です。ただし、モデル内で latitude を浮動小数点特徴量として表すのは意味がありません。これは、緯度と住宅の値の間に線形関係が存在しないためです。たとえば、緯度 35 の家は緯度 34 の家よりも \(\frac{35}{34}\) 高価な(または安い)ことはありません。それでも、個々の緯度はおそらく住宅価格の予測因子になるでしょう。

緯度を有用な予測子にするために、次の図に示すように、緯度を「ビン」に分割します。

緯度ごとの住宅のプロット。このプロットは、

図 8. 値のビニング。

浮動小数点数の特徴を 1 つにするのではなく、11 の個別のブール値特徴(LatitudeBin1LatitudeBin2、...、LatitudeBin11)を使用できます。11 の個別の特徴を持つことはやや不要なため、1 つの 11 要素ベクトルにまとめます。これにより、緯度 37.4 を次のように表現できます。

[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0]

ビニングのおかげで、モデルは緯度ごとにまったく異なる重みを学習できるようになりました。

スクラブ

これまで、トレーニングとテストに使用されたすべてのデータは信頼できるものであると想定してきました。実際には、次の 1 つ以上の理由でデータセット内の多くの例が信頼できません。

  • 省略された値。たとえば、住宅の築年数の値の入力を忘れたとします。
  • 例の重複。たとえば、サーバーが同じログを 2 回誤ってアップロードした場合などです。
  • 不正なラベル。たとえば、オークの木の画像をカエデと誤ってラベル付けしたとします。
  • 不適切な特徴値。たとえば、数字を 2 桁以上入力したり、温度計を太陽の下に置いていなかったりする場合です。

通常、検出された不適切な例はデータセットから削除して修正します。省略された値や重複する例を検出するには、簡単なプログラムを作成します。不適切な特徴値やラベルの検出は かなり難しい場合があります

不良個々のサンプルを検出するだけでなく、集計内の不良データも検出する必要があります。ヒストグラムは、集計データを可視化するための優れたメカニズムです。また、次のような統計情報を取得すると便利です。

  • 最大値と最小値
  • 平均と中央値
  • Standard deviation

個別の特徴に対して最も一般的な値のリストの生成を検討してください。たとえば、country:uk を含むサンプルの数が期待する数と一致するようにします。データセットで実際に language:jp を最も一般的な言語にするべきでしょうか。

データについて知る

次のルールに従ってください。

  • どのようなデータを使うべきか考えてみましょう。
  • データがこれらの要件を満たしていることを確認します(または、満たしていない理由を説明できること)。
  • トレーニング データが他のソース(ダッシュボードなど)と一致していることを再確認します。

ミッション クリティカルなコードと同様に、データの取り扱いには細心の注意を払ってください。優れた ML には質の高いデータが不可欠です。

その他の情報

Rules of Machine Learning ML Phase II: Feature Engineering