Pythonでデータ前処理!Scikit-learn Binarizerによる簡単な二値化テクニック

Python

Pythonで機械学習やデータ分析を行う際、データの前処理は結果を大きく左右する重要なステップです。特に、数値データを扱う中で「特定の数値より大きいか小さいか」だけで分類したいケースは少なくありません。

この記事では、Pythonの機械学習ライブラリ**Scikit-learn(サイキットラーン)に含まれるBinarizer(バイナライザー)**に焦点を当てます。

Binarizerは、数値データを設定した「しきい値」に基づいて「0」か「1」の2つの値に変換(二値化)するための非常にシンプルで強力なツールです。

この記事を最後まで読めば、以下のことがわかります。

  • Binarizerが何をするためのものか
  • Binarizerの基本的な使い方(fit, transform
  • しきい値(threshold)を自由に設定する方法
  • よく似た他のクラス(LabelBinarizerなど)との明確な違い

データ前処理の引き出しを一つ増やしたい初学者の方は、ぜひ参考にしてください。

本記事で解説するBinarizerの公式ドキュメントはこちらです。


  1. はじめに:Scikit-learnのBinarizerとは?
    1. Binarizerの役割:データを「0」と「1」にスッキリ分ける
    2. なぜ二値化(Binarization)が必要? データ前処理における重要性
    3. この記事で学べること:Binarizerの基本から実践的な使い方まで
  2. Binarizerを使うための準備 (Scikit-learnのインストール)
    1. 多くのPython環境には同梱済み
    2. もし入っていなければ:pipでのインストール方法
    3. Binarizerのバージョンについて(sklearn 1.x系での動作)
  3. Scikit-learn Binarizerの基本的な使い方 (fit / transform)
    1. まずはインポート
    2. ステップ1:Binarizerのインスタンスを作成する
    3. ステップ2:「fit」でデータのルールを学習する
    4. ステップ3:「transform」でデータを実際に変換する
    5. 「fit_transform」メソッドで学習と変換を同時に行う
  4. 【実践】サンプルコードでBinarizerを動かしてみよう
    1. 準備:サンプルの数値データ (Numpy配列)
    2. 例1:デフォルトのしきい値 (threshold=0.0) で二値化する
    3. Binarizerの最も重要なパラメータ「threshold」とは?
    4. 例2:しきい値 (threshold) を自分で指定して二値化する (例: 50)
    5. 2次元配列(行列)データにも適用可能
  5. Binarizerとしきい値(threshold)の挙動を理解する
    1. しきい値のルール:「しきい値より大きい」場合に1になる
    2. 0やマイナスの値を含む場合の動作確認
  6. (補足)Binarizerと類似クラスとの違いは?
    1. Binarizer vs LabelBinarizer (最重要)
    2. Binarizer vs OneHotEncoder
    3. Binarizer vs StandardScaler / MinMaxScaler
    4. 今回のケースではBinarizerが最適
  7. まとめ:Binarizerでデータ前処理を簡単・スピーディに

はじめに:Scikit-learnのBinarizerとは?

まずはBinarizerがどのようなもので、なぜ必要なのかを見ていきましょう。

Binarizerの役割:データを「0」と「1」にスッキリ分ける

Binarizerは、Scikit-learnのsklearn.preprocessingモジュールに含まれるクラスです。

その役割はたった一つ。 「指定したしきい値(threshold)よりも大きい数値は1に、それ以下の数値は0に変換する」 ことです。

例えば、「50点」をしきい値にした場合、

  • 80点 → 1
  • 45点 → 0
  • 50点 → 0 (しきい値「以下」は0になります) というように、データを白黒ハッキリさせるイメージです。

なぜ二値化(Binarization)が必要? データ前処理における重要性

なぜわざわざ詳細な数値データを「0」と「1」という大雑把な情報に変換する必要があるのでしょうか?

主な理由は以下の通りです。

  1. 特徴量の単純化(ノイズの除去) 細かい数値の揺れ(例: 50.1と50.2)を無視し、「しきい値を超えているか否か」という本質的な情報だけを抽出したい場合があります。
  2. 特定のアルゴリズムへの適用 アルゴリズムによっては、入力データが特定の形式(例: ブール値や0/1)であることを要求する場合があります。
  3. 新しい特徴量の作成(Feature Engineering) 例えば、「商品の購入金額」というデータから「購入経験があるか(金額 > 0)」という新しい「0/1」の特徴量を作成できます。

Binarizerは、こうしたデータ前処理のタスクを非常に簡単に行うための機能です。

この記事で学べること:Binarizerの基本から実践的な使い方まで

この記事では、Binarizerの基本的な使い方から、最も重要なパラメータであるthresholdの設定方法、そして初心者が混同しがちな類似クラスとの違いまで、サンプルコードを交えて丁寧に解説していきます。


Binarizerを使うための準備 (Scikit-learnのインストール)

Binarizerは、Scikit-learnライブラリの一部として提供されています。

多くのPython環境には同梱済み

AnacondaやGoogle Colaboratoryなど、一般的なデータ分析環境を使用している場合、Scikit-learn(sklearn)は最初からインストールされていることがほとんどです。

もし入っていなければ:pipでのインストール方法

もし手元の環境にインストールされていない場合は、以下のpipコマンドで簡単にインストールできます。

# ターミナルやコマンドプロンプトで実行
pip install scikit-learn

Binarizerのバージョンについて(sklearn 1.x系での動作)

BinarizerはScikit-learnの非常に古くからある基本的な機能の一つです。この記事で紹介する使い方は、現在主流の1.x系のバージョンであれば問題なく動作しますのでご安心ください。


Scikit-learn Binarizerの基本的な使い方 (fit / transform)

Binarizerの使い方は、Scikit-learnの他の「Transformer」(データ変換器)と共通のインターフェースを持っており、非常にシンプルです。

まずはインポート

Binarizersklearn.preprocessingモジュールにあります。まずこれをインポートしましょう。

from sklearn.preprocessing import Binarizer
import numpy as np

BinarizerはNumpy配列を扱うのが得意なため、numpyも一緒にインポートしておきます)

ステップ1:Binarizerのインスタンスを作成する

まず、Binarizerクラスの「インスタンス(実体)」を作成します。このとき、変換のルール(しきい値)を指定できます。

# Binarizerのインスタンスを作成
# threshold=0.0 がデフォルト値
binarizer = Binarizer(threshold=0.0)

# しきい値を50にしたい場合は以下のように指定
# binarizer_50 = Binarizer(threshold=50.0)

デフォルトでは、しきい値は0.0に設定されています。

ステップ2:「fit」でデータのルールを学習する

Scikit-learnの多くの変換器は、fit()メソッドを使ってデータから変換のルール(平均値や最大値など)を学習します。

# サンプルデータ
data = np.array([[1], [-1], [5], [0]])

# ルールの学習(Binarizerの場合、fitは実質何もしない)
binarizer.fit(data)

重要なポイント: Binarizerは、変換のルール(しきい値)をインスタンス作成時に人間が指定します。データから何かを学習するわけではありません。

しかし、Scikit-learnのAPI(使い方)の統一性を保つため、fit()メソッド自体は存在します(中身は空ですが)。機械学習パイプラインなどに組み込む際に、この統一性が役立ちます。

ステップ3:「transform」でデータを実際に変換する

fit()で(形式的に)学習させた後、transform()メソッドを使ってデータを二値化します。

# データの変換
transformed_data = binarizer.transform(data)

print(transformed_data)

実行結果(threshold=0.0の場合):

[[1]  # 1 > 0.0 なので 1
 [0]  # -1 <= 0.0 なので 0
 [1]  # 5 > 0.0 なので 1
 [0]] # 0 <= 0.0 なので 0

しきい値0.0を超えたものだけが1になっているのがわかります。

「fit_transform」メソッドで学習と変換を同時に行う

fit()transform()を個別に呼び出すのが面倒な場合、fit_transform()メソッドで一括処理できます。

data = np.array([[1], [-1], [5], [0]])
binarizer = Binarizer(threshold=0.0)

# fitとtransformを同時に実行
transformed_data = binarizer.fit_transform(data)

print(transformed_data)

結果は先ほどと同じです。Binarizerのようにfitが実質不要な場合は、fit_transformを使うのが一般的です。


【実践】サンプルコードでBinarizerを動かしてみよう

Binarizerの動作を、具体的な数値例でさらに確認していきましょう。

準備:サンプルの数値データ (Numpy配列)

ここでは、テストの点数を想定した1次元のNumpy配列と、複数の特徴量を持つ2次元のNumpy配列を準備します。

# 1次元配列(数学の点数をイメージ)
scores_math = np.array([30, 80, 50, 95, 40])

# 2次元配列(数学、英語、理科の点数をイメージ)
scores_all = np.array([
    [30, 90, 45],  # Aさん
    [80, 50, 70],  # Bさん
    [50, 60, 40]   # Cさん
])

例1:デフォルトのしきい値 (threshold=0.0) で二値化する

まずはデフォルトのthreshold=0.0で試してみましょう。この設定は、主に「その値がプラスかマイナスか(0を含む)」を判定するのに使われます。

# 1次元配列(Numpy配列は (n_samples, n_features) の2次元形状を期待されることが多いのでreshape)
data_1d = scores_math.reshape(-1, 1) # (5,) -> (5, 1) に変換

# デフォルト (threshold=0.0)
binarizer_default = Binarizer(threshold=0.0)
result_default = binarizer_default.fit_transform(data_1d)

print("--- デフォルト (threshold=0.0) ---")
print(result_default)

実行結果:

--- デフォルト (threshold=0.0) ---
[[1]  # 30 > 0.0
 [1]  # 80 > 0.0
 [1]  # 50 > 0.0
 [1]  # 95 > 0.0
 [1]] # 40 > 0.0

今回の点数データはすべて0より大きいので、すべて1になってしまいました。

Binarizerの最も重要なパラメータ「threshold」とは?

Binarizerの使いこなしは、このthreshold(しきい値)パラメータをいかに設定するかにかかっています。

Binarizer(threshold=50.0)のように指定することで、0/1に分ける基準値を自由に変更できます。

例2:しきい値 (threshold) を自分で指定して二値化する (例: 50)

では、しきい値を「50点」に設定してみましょう。これは「50点より上なら合格(1)、50点以下なら不合格(0)」という判定をしたい場合に相当します。

# 1次元配列データ (reshape済み)
data_1d = scores_math.reshape(-1, 1)

# しきい値を 50.0 に設定
binarizer_50 = Binarizer(threshold=50.0)
result_50 = binarizer_50.fit_transform(data_1d)

print("--- しきい値 50.0 の場合 ---")
print(f"元のデータ: {scores_math}")
print("変換後のデータ:")
print(result_50.flatten()) # flatten()で1次元に戻して表示

実行結果:

--- しきい値 50.0 の場合 ---
元のデータ: [30 80 50 95 40]
変換後のデータ:
[0 1 0 1 0]

元のデータと見比べると、

  • 30 (<= 50) → 0
  • 80 (> 50) → 1
  • 50 (<= 50) → 0
  • 95 (> 50) → 1
  • 40 (<= 50) → 0 となり、thresholdの値(50点)ちょうどは0になることがわかります。

2次元配列(行列)データにも適用可能

Binarizerは2次元のデータにもそのまま適用できます。各要素が個別にしきい値と比較されます。

# 2次元配列(数学、英語、理科の点数)
scores_all = np.array([
    [30, 90, 45],  # Aさん
    [80, 50, 70],  # Bさん
    [50, 60, 40]   # Cさん
])

# しきい値 50.0 のBinarizer
binarizer_50 = Binarizer(threshold=50.0)
result_all = binarizer_50.fit_transform(scores_all)

print("--- 2次元配列 (threshold=50.0) ---")
print("元のデータ:")
print(scores_all)
print("変換後のデータ:")
print(result_all)

実行結果:

--- 2次元配列 (threshold=50.0) ---
元のデータ:
[[30 90 45]
 [80 50 70]
 [50 60 40]]
変換後のデータ:
[[0 1 0]  # [30, 90, 45] -> [0, 1, 0]
 [1 0 1]  # [80, 50, 70] -> [1, 0, 1]
 [0 1 0]] # [50, 60, 40] -> [0, 1, 0]

このように、データの形状(次元)を保ったまま、すべての要素が0か1に変換されます。


Binarizerとしきい値(threshold)の挙動を理解する

Binarizerを使う上で唯一の注意点が、しきい値の扱いです。

しきい値のルール:「しきい値より大きい」場合に1になる

Binarizerのルールは「X > threshold」です。 つまり、値がしきい値(threshold)「より大きい」場合にのみ1になり、しきい値**「以下」**(<= threshold)の場合はすべて0になります。

数学の不等号で「>=」(以上)と間違えやすいので注意しましょう。

0やマイナスの値を含む場合の動作確認

しきい値(threshold)自体も、マイナスの値や0に設定できます。

data_mix = np.array([[-2.0], [-0.5], [0.0], [0.1], [3.0]])

# しきい値を 0.0 (デフォルト) に
binarizer_0 = Binarizer(threshold=0.0)
print(f"--- threshold=0.0 ---")
print(binarizer_0.fit_transform(data_mix).flatten())

# しきい値を -1.0 に
binarizer_m1 = Binarizer(threshold=-1.0)
print(f"--- threshold=-1.0 ---")
print(binarizer_m1.fit_transform(data_mix).flatten())

実行結果:

--- threshold=0.0 ---
[0 0 0 1 1]
# -2.0 <= 0.0 -> 0
# -0.5 <= 0.0 -> 0
# 0.0 <= 0.0 -> 0
# 0.1 > 0.0 -> 1
# 3.0 > 0.0 -> 1

--- threshold=-1.0 ---
[0 1 1 1 1]
# -2.0 <= -1.0 -> 0
# -0.5 > -1.0 -> 1
# 0.0 > -1.0 -> 1
# 0.1 > -1.0 -> 1
# 3.0 > -1.0 -> 1

ルール通りに動作していることが確認できます。


(補足)Binarizerと類似クラスとの違いは?

Scikit-learnにはBinarizerと名前や機能が似ているクラスがいくつかあり、初心者が混乱しやすいポイントです。 特に、**LabelBinarizerOneHotEncoder**との違いは明確に理解しておく必要があります。(OneHotEncoderに関する詳しい記事はこちらです。LabelBinarizerに関する詳しい記事はこちらです。)

Binarizer vs LabelBinarizer (最重要)

読者が最も混同しやすいのがLabelBinarizerです。

  • Binarizer(今回の主役)
    • 目的: **数値データ(特徴量)**を「しきい値」で0/1に分ける。
    • 入力: [10, 50, 80] のような数値
    • 出力: [0, 0, 1] のような数値(しきい値50の場合)。
    • シーン: 「50点以上か」「金額が0より大きいか」など。
  • LabelBinarizer
    • 目的: **カテゴリデータ(主にラベル)**を0/1の形式に変換する。
    • 入力: ['犬', '猫', '犬'][1, 2, 1] のようなカテゴリ
    • 出力: 2クラスなら [1, 0, 1]。3クラス以上(マルチクラス)なら [[1, 0], [0, 1], [1, 0]] のようなワンホットベクトル
    • シーン: 機械学習の「正解ラベル」をモデルが扱える0/1形式に変換するとき。

使い分けの結論:

  • 数値を扱いたい(例: 50点以上) → Binarizer
  • カテゴリを扱いたい(例: ‘犬’か’猫’か) → LabelBinarizer

Binarizer vs OneHotEncoder

OneHotEncoderもよく比較されます。

  • OneHotEncoder
    • 目的: **カテゴリデータ(主に特徴量)**をワンホットベクトル(ダミー変数)に変換する。
    • 入力: [['男性', '東京'], ['女性', '大阪']] のようなカテゴリ
    • 出力: [[1, 0, 1, 0], [0, 1, 0, 1]] のような0/1のベクトル。
    • シーン: 「性別」や「出身地」といったカテゴリカルな特徴量を、機械学習モデルに投入できるように変換するとき。

Binarizer数値を入力するのに対し、OneHotEncoderLabelBinarizerカテゴリを入力する、という点が決定的な違いです。

Binarizer vs StandardScaler / MinMaxScaler

StandardScaler(標準化)やMinMaxScaler(正規化)も、Binarizerと同じsklearn.preprocessingモジュールに属する、数値データを変換するクラスです。(StandardScalerに関する詳しい記事はこちらです。MinMaxScalerに関する詳しい記事はこちらです。)

  • StandardScaler / MinMaxScaler
    • 目的: 数値データの**スケール(尺度)**を揃える。(例: 0〜1の範囲に収める、平均0・分散1にする)
    • 出力: 0/1ではなく、変換された連続値(例: 0.35-1.2)。

これらは、データの「分布」を整えるのが目的であり、データを「0か1か」に単純化するBinarizerとは全く異なる役割を持ちます。

今回のケースではBinarizerが最適

「テストの点数が50点より上か下か」「温度が0度より高いか低いか」といった、連続的な数値を特定のしきい値で分類したい場合には、Binarizerが最もシンプルで最適な選択肢となります。


まとめ:Binarizerでデータ前処理を簡単・スピーディに

今回は、Scikit-learnのBinarizerについて、その基本的な使い方から実践的なサンプルコード、類似クラスとの違いまでを詳しく解説しました。

  • Binarizerは、数値データを**しきい値(threshold)**で0か1に変換する。
  • ルールは「しきい値より大きい(>」場合に1になる。
  • Binarizer(threshold=50.0) のように、しきい値は自由に設定できる。
  • fit_transform()メソッドで学習(形式的)と変換を一度に実行できる。
  • 「カテゴリ」を扱うLabelBinarizerOneHotEncoderとは明確に区別して使う。

Binarizerは非常にシンプルな機能ですが、データの前処理や特徴量エンジニアリングにおいて強力な武器となります。ぜひ使いこなして、データ分析の精度向上に役立ててください。

コメント

タイトルとURLをコピーしました