サンプリングベースのアプローチとは?クラス不均衡問題への対処法を解説
サンプリングによるクラス不均衡問題への対処
サンプリングは、機械学習におけるクラス不均衡問題に対処するために広く活用されている手法です。その基本的な考え方は、データ例の分布を意図的に変化させ、訓練データセットの中で少数派クラス(レアクラス)を明確に定義できるようにすることにあります。サンプリングには、アンダーサンプリング、オーバーサンプリング、そして両方を組み合わせたハイブリッド方式など、さまざまな手法が存在します。
ここでは、100件の陽性例と1,000件の陰性例を含むデータセットを例に、各手法を見ていきましょう。
アンダーサンプリング(多数派クラスの削減)
アンダーサンプリングでは、すべての陽性例に加えて、陰性例からランダムに選択した100件を抽出し、訓練セットを構成します。しかしこの手法には、訓練に有用な陰性例の一部が選ばれずに失われてしまうという課題があり、その結果、最適とは言えないモデルが生成される可能性があります。
この問題を克服する方法の一つが、アンダーサンプリングを複数回実行し、アンサンブル学習と同様のアプローチで複数の分類器を構築することです。さらに、「焦点を絞ったアンダーサンプリング(Focused Undersampling)」を採用することもできます。これは、どの陰性例を除去すべきかについて情報に基づいた判断を行う手法であり、例えば決定境界から遠く離れた位置にある事例などを除去対象とします。
オーバーサンプリング(少数派クラスの増強)
オーバーサンプリングでは、訓練セット内の陽性例と陰性例の数が等しくなるまで、陽性例を複製していきます。この操作は、決定木などの分類器が決定境界を形成する際に影響を及ぼします。陽性例と陰性例を分離するための新たな決定境界を形成・検証するのに十分な事例が存在しない場合、陽性例が誤分類されてしまうことがあるのです。
一方で、ノイズを含むデータにオーバーサンプリングを適用すると、ノイズ事例が何度も複製されることにより、モデルの過学習(オーバーフィッティング)を引き起こすリスクがあります。なお、オーバーサンプリングは訓練セットに新しい情報を追加するものではない点にも注意が必要です。陽性例を複製することには、ごく一部の訓練事例のみが属する領域(スモール・ディスジャンクト)を定義するモデルの該当部分が、学習アルゴリズムによる刈り込み(プルーニング)で失われるのを防ぐという効果があります。ただし、陽性例が増加することで、モデル構築にかかる計算時間が長くなるというデメリットも生じます。
ハイブリッド方式(両者の組み合わせ)
ハイブリッド方式では、多数派クラスのアンダーサンプリングと少数派クラスのオーバーサンプリングを組み合わせることで、クラス間の分布をより均一な状態へと近づけます。
アンダーサンプリングは、ランダムサブサンプリングでも、焦点を絞ったサブサンプリングでも実施可能です。一方、オーバーサンプリングについては、既存の陽性例を複製する方法に加え、既存の陽性例の近傍に新しい陽性例を生成する方法(SMOTEなどの合成ベース手法に相当)も利用できます。これにより、単純な複製による過学習のリスクを抑えつつ、少数派クラスの表現力を高めることが期待できます。
-
C#のインデクサーとは?基本構文と実装例をわかりやすく解説
インデクサーとはC#のインデクサー(indexer)は、クラスのオブジェクトに対して、配列と同じように「[ ]」を使ってインデックスでアクセスできるようにする機能です。これにより、内部に持つデータのコレクションへ、直感的かつ安全に読み書きを行うことができます。インデクサーの基本的な構文は次のとおりです。基本構文element-type this[int index] { // get アクセサー:index で指定された値を返す get { } // set アクセサー:index で指定された位置に値を設定する set { } }インデクサーは
-
C#の名前空間(namespace)とは?定義方法と基本的な使い方を解説
名前空間とは名前空間(namespace)とは、ある一連の名前を別の一連の名前から分離して管理するための仕組みです。大規模なプロジェクトでは、複数の開発者が同じ名前のクラスやメソッドを作成することがあり、名前の衝突(コンフリクト)が発生する可能性があります。名前空間を使うことで、こうした衝突を防ぎ、コードを論理的に整理できます。また、.NET Framework が提供する System なども名前空間の一つであり、標準ライブラリの機能はすべて名前空間によって分類・管理されています。名前空間の定義方法名前空間の定義は、namespace キーワードで始まり、その後に名前空間名を続けて記述します