プログラミング
 Computer >> コンピューター >  >> プログラミング >> プログラミング

教師なし離散化とは?等幅ビニングと等頻度ビニングの違いを解説

属性が「離散(discrete)」であるとは、取り得る値の数が比較的少なく有限であることを指します。一方、「連続(continuous)」な属性は、取り得る値の数が非常に多く(実質的に無限)、一般にはある区間として表現されます。

言い換えると、離散データ属性は値域が有限集合である関数とみなすことができ、連続データ属性は値域が無限の全順序集合、すなわち通常は区間である関数とみなせるということです。

離散化の目的と2つのアプローチ

離散化とは、連続属性が取り得る値の数を減らすために、その値域を複数の区間へ分割する処理のことです。この問題へのアプローチには大きく分けて2つの方法があります。

  • 教師なし離散化: 訓練データに含まれるインスタンスのクラスに関する知識を使わずに、各属性を量子化する方法。
  • 教師あり離散化: 離散化の際にクラス情報を積極的に考慮に入れる方法。

クラスタリング問題のように、クラスが未知であるか、そもそも存在しない場合には、教師なし離散化が唯一の選択肢となります。

最も単純な方法:等幅ビニング

数値属性を離散化する最も直感的な方法は、その値域をあらかじめ決められた数の等間隔に分割することです。これは固定された、データに依存しない基準であり、一般的にはデータ収集の時点で行われます。

しかし、教師なし離散化には落とし穴があります。粗すぎる区分や不適切な境界の選択によって、学習過程で有益になり得た微妙な差異が失われ、複数のクラスに属するインスタンスが不必要に同一の区間へ押し込められてしまう危険性があるのです。

等幅ビニングの欠点

等幅ビニングでは、インスタンスが非常に偏った形で分布しがちです。一部のビンには多数のインスタンスが集中する一方、まったく含まれないビンも生じます。これは、属性が良好な決定構造の構築に貢献する能力を著しく損なう可能性があります。

改善策:等頻度ビニング

より優れたアプローチは、区間のサイズを可変にし、それぞれの区間にほぼ同数の訓練事例が含まれるように境界を選ぶことです。この手法は「等頻度ビニング」と呼ばれ、属性の値域を、その軸上におけるインスタンスの分布に基づいて、あらかじめ決めた数のビンに分割します。

この結果得られるビンの内容からヒストグラムを作成すると、それがしばしば平坦になるため、等頻度ビニングは「ヒストグラム均等化」とも呼ばれます。ビンを一種のリソースと捉えるなら、この手法はその有効活用を最大限に引き出す方法だと言えます。

等頻度ビニングの限界

ただし、等頻度ビニングもインスタンスのクラス情報には関知しないため、不適切な境界を生むことがあります。例えば、あるビン内のインスタンスがあるクラスに属し、次のより大きなビンには別のクラスのインスタンスが含まれているものの、そのビンの先頭の1件だけが最初のクラスに属するケースを考えてみましょう。

このような場合、クラスの区分を尊重して、その先頭のインスタンスを前のビンへ含める方が理にかなっています。つまり、同頻度という性質を多少犠牲にしても、区間の同質性(homogeneity)を優先する価値があるのです。

  1. C#の属性(Attribute)とは?基本構文と主な定義済み属性をわかりやすく解説

    C#における属性(Attribute)とは、クラス、メソッド、構造体、列挙型、アセンブリなど、プログラムを構成するさまざまな要素の動作に関する情報を、実行時(ランタイム)に伝えるための宣言型のタグです。 属性を使うことで、コード自体には手を加えずに、追加のメタデータを要素へ付与することができます。 属性の基本構文 属性は以下のような形式で記述します。 [attribute(positional_parameters, name_parameter = value, ...)] Element この構文のポイントは次のとおりです。 属性名とその値は角括弧 [ ] の中に記述します。 属性は、適

  2. C#のコメントとは?複数行・単一行コメントの書き方を解説

    コメントは、コードの内容や意図を説明するために記述する注釈です。コンパイラはコメント部分を完全に無視するため、プログラムの動作には一切影響しません。C#では、複数行にわたるコメントは「/*」で始まり、「*/」で終わります。 複数行コメント /* 以下はC#における 複数行コメントの例です */ 「/* ... */」で囲まれた範囲はすべてコンパイラによって無視されます。処理の概要や注意点など、複数行にわたる説明を残したい場合に使用します。 単一行コメント // 変数の宣言 int a = 10; 単一行コメントは「//」から行末までがコメントとして扱われます。変数の意味や処理の意図を手軽にメモ