データ サイエンス プロジェクトの開発中に遭遇する実際のデータセットのほとんどには、混合データ型の列が含まれています。これらのデータセットは両方で構成されます カテゴリー的な 数値列も同様です。ただし、さまざまな機械学習モデルはカテゴリデータでは機能しないため、このデータを機械学習モデルに適合させるには数値データに変換する必要があります。たとえば、データセットに 性別 次のようなカテゴリ要素を含む列 男性と 女性 。これらのラベルには特定の優先順位がなく、またデータが文字列ラベルであるため、機械学習モデルはラベルに何らかの階層があると誤って解釈しました。
この問題を解決する 1 つのアプローチは、たとえばこれらのラベルに数値を割り当てるラベル エンコーディングです。 男 そして 女性 にマッピングされる 0 そして 1 。しかし、これによりモデルにバイアスが加わる可能性があります。 女性 パラメータは 1>0 ですが、理想的には、両方のラベルがデータセット内で同等に重要です。この問題に対処するために、ワン ホット エンコーディング技術を使用します。
ワンホットエンコーディング
ワン ホット エンコーディングは、機械学習モデルでカテゴリ変数を数値として表すために使用する手法です。
ワン ホット エンコーディングを使用する利点は次のとおりです。
- これにより、数値入力を必要とするモデルでカテゴリ変数を使用できるようになります。
- カテゴリ変数に関するより多くの情報をモデルに提供することで、モデルのパフォーマンスを向上させることができます。
- これは、カテゴリ変数に自然な順序 (小、中、大など) がある場合に発生する可能性がある順序の問題を回避するのに役立ちます。
ワン ホット エンコーディングを使用する場合の欠点は次のとおりです。
- 変数内のカテゴリごとに個別の列が作成されるため、次元が増加する可能性があります。これにより、モデルがより複雑になり、トレーニングが遅くなる可能性があります。
- ほとんどのワンホット エンコード列ではほとんどの観測値が 0 になるため、データがまばらになる可能性があります。
- 特に変数に多くのカテゴリがあり、サンプルサイズが比較的小さい場合、過学習が発生する可能性があります。
- ワンホット エンコーディングはカテゴリ データを処理するための強力な手法ですが、次元の増加、疎性、過学習につながる可能性があります。慎重に使用し、順序エンコードやバイナリ エンコードなどの他の方法を検討することが重要です。
ワンホットエンコーディングの例
で ワンホットエンコーディング の場合、カテゴリ パラメーターは男性ラベルと女性ラベルの両方に個別の列を準備します。したがって、男性が存在する場合、値は男性列の値が 1、女性列の値が 0 になり、その逆も同様です。例で理解してみましょう。果物、それに対応するカテゴリ値、および価格が与えられているデータを考えてみましょう。
| フルーツ | 果物のカテゴリ値 | 価格 |
|---|---|---|
| りんご | 1 | 5 |
| マンゴー | 2 | 10 |
| りんご | 1 | 15 |
| オレンジ | 3 | 二十 |
データにワンホット エンコーディングを適用した後の出力は次のようになります。
| りんご | マンゴー | オレンジ | 価格 |
|---|---|---|---|
| 1 | 0 | 0 | 5 |
| 0 | 1 | 0 | 10 |
| 1 | 0 | 0 | 15 |
| 0 | 0 | 1 | 二十 |
Python を使用したワンホット エンコーディング
データフレームの作成
CSV ファイルからワンホットエンコーディングを実装するデータフレームを作成します。
c#Python3
# Program for demonstration of one hot encoding # import libraries import numpy as np import pandas as pd # import the data required data = pd.read_csv('employee_data.csv') print(data.head())> 出力:

データフレームの最初の 5 行
カテゴリ列の一意の要素
を使用できます 個性的() からの関数 パンダ ライブラリを使用して、データフレームの列から一意の要素を取得します。
Python3 print(data['Gender'].unique()) print(data['Remarks'].unique())>
出力:
array(['Male', 'Female'], dtype=object) array(['Nice', 'Good', 'Great'], dtype=object)>
列内の要素の数
使用できます value_counts() pandas の関数を使用して、データフレーム内の各要素の数を取得します。
Python3 data['Gender'].value_counts() data['Remarks'].value_counts()>
出力:
Female 7 Male 5 Name: Gender, dtype: int64 Nice 5 Great 4 Good 3 Name: Remarks, dtype: int64>
カテゴリ列でワンホット エンコーディングを実行するために利用できる 2 つの方法があります。
Pandas ライブラリを使用したカテゴリ列のワンホット エンコーディング
使用できます pd.get_dummies() カテゴリカル列をワンホット エンコードするパンダの関数。この機能
Python3 one_hot_encoded_data = pd.get_dummies(data, columns = ['Remarks', 'Gender']) print(one_hot_encoded_data)>
出力:

データセットの One-Hot エンコードされた列
観察できるのは、 3 備考 そして 2 性別 データ内の列。ただし、使用できるのは n-1 パラメーターを定義する列 (ある場合) n ユニークなラベル。たとえば、 性別女性 列をドロップして 性別男性 列を作成すると、ラベルが 1 の場合は女性を意味し、ラベルが 0 の場合は男性を意味するというように、情報全体を伝えることもできます。このようにして、カテゴリデータをエンコードし、パラメーターの数も減らすことができます。
Sci-kit Learnライブラリを使用したワンホットエンコーディング
Scikit-learn(sklearn) は、データ前処理のための多数のツールを提供する Python の人気のある機械学習ライブラリです。それは、 ワンホットエンコーダー カテゴリ変数と数値変数をバイナリ ベクトルにエンコードするために使用する関数。
Python3 #one hot encoding using OneHotEncoder of Scikit-Learn import pandas as pd from sklearn.preprocessing import OneHotEncoder #Building a dummy employee dataset for example data = {'Employee id': [10, 20, 15, 25, 30], 'Gender': ['M', 'F', 'F', 'M', 'F'], 'Remarks': ['Good', 'Nice', 'Good', 'Great', 'Nice'], } #Converting into a Pandas dataframe df = pd.DataFrame(data) #Print the dataframe: print(f'Employee data :
{df}') #Extract categorical columns from the dataframe #Here we extract the columns with object datatype as they are the categorical columns categorical_columns = df.select_dtypes(include=['object']).columns.tolist() #Initialize OneHotEncoder encoder = OneHotEncoder(sparse_output=False) # Apply one-hot encoding to the categorical columns one_hot_encoded = encoder.fit_transform(df[categorical_columns]) #Create a DataFrame with the one-hot encoded columns #We use get_feature_names_out() to get the column names for the encoded data one_hot_df = pd.DataFrame(one_hot_encoded, columns=encoder.get_feature_names_out(categorical_columns)) # Concatenate the one-hot encoded dataframe with the original dataframe df_encoded = pd.concat([df, one_hot_df], axis=1) # Drop the original categorical columns df_encoded = df_encoded.drop(categorical_columns, axis=1) # Display the resulting dataframe print(f'Encoded Employee data :
{df_encoded}')> 出力
Employee data : Employee id Gender Remarks 0 10 M Good 1 20 F Nice 2 15 F Good 3 25 M Great 4 30 F Nice Encoded Employee data : Employee id Gender_F Gender_M Remarks_Good Remarks_Great Remarks_Nice 0 10 0.0 1.0 1.0 0.0 0.0 1 20 1.0 0.0 0.0 0.0 1.0 2 15 1.0 0.0 1.0 0.0 0.0 3 25 0.0 1.0 0.0 1.0 0.0 4 30 1.0 0.0 0.0 0.0 1.0>