今回は、PythonでのOne hotエンコーディングの実践的な実装にフォーカスしていきます。
では、さっそく始めましょう
まず、1つのホットエンコーディングとは何でしょうか?
ワンホットエンコーディングの概念を深く理解する前に、いくつかの前提条件を理解しましょう。
変数は大きく2つの部分に分けられます。
- 1.連続変数。連続変数: 数値変数を表す変数です。例 [1,2,3,4,5,6…..100]
- カテゴリー変数。データ値のカテゴリーやグループを表す変数です。例 [アップル,マンゴー,ベリー]。
データセットにおいて、[apple, berry, mango]のようなグループの形でカテゴリデータを含むデータに出会うことがある。
データの各カテゴリを独立したエンティティとして表現するために、我々はエンコード技術を使用します。
最も一般的に使用されるエンコーディング技法は以下の通りです。
- ダミー変数
- ラベルエンコーディング
- ワンホットエンコーディングなどです。
今日は、ワンホットエンコーディングについて説明します。
ワンホットエンコーディングは、バイナリ・ベクトルの形でカテゴリ・データを表現します。
さて,バイナリ・ベクトル形式でカテゴリを表現した場合,データはいつ0と1,すなわち整数に変換されるのだろうかという疑問が湧くかもしれません.
しかし、あるホットエンコーディング方式では、それをデータに適用する前に、カテゴリデータの値を整数値にマッピングする必要があります。
これを行うのが、ラベルエンコードです。
ラベルエンコードの実用的な使い方は、これから説明します。
つまり、1つのホットエンコーディングによって、データ値のすべてのカテゴリに整数値が割り当てられ、バイナリベクタにマッピングされます。
つまり、整数値にマッピングされたデータ値は、整数値(カテゴリ)のインデックス値が1である以外は、すべて0となるバイナリ・ベクトルとして表現されることになる。
One Hot Encoding の実装例
apple and berry]というカテゴリカルデータを持つデータセットを考えてみましょう。
ラベルエンコードの結果、appleに「0」、berryに「1」が割り当てられるとします。
ここで、「0」とエンコードされたラベル「apple」は、「1,0」というバイナリベクトルを持つことになります。
これは、appleの符号化インデックスが0であるため、値1が配置されるからです(ラベルの符号化で確認できます)。
したがって、[apple, berry, berry]は次のように符号化されます。
[1, 0]
[0, 1]
[0, 1]
では、この概念を例として実装してみましょう。
この記事もチェック:Python(sklearn)でラベルエンコードの実装をする方法
実施例1.グループ化されたカテゴリーデータでホットエンコーディングを行う。
以下の例を見てください。
果物のカテゴリを1つのホットエンコーディングで表現しています。
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OneHotEncoder
cat_data = [ "apple" , "mango" , "apple" , "berry" , "mango" , "apple" , "berry" , "apple" ]
label = LabelEncoder()
int_data = label.fit_transform(cat_data)
int_data = int_data.reshape( len (int_data), 1 )
onehot_data = OneHotEncoder(sparse = False )
onehot_data = onehot_data.fit_transform(int_data)
print ( "Categorical data encoded into integer values.... )
print (onehot_data)
|
出力。
Categorical data encoded into integer values.... [[ 1. 0. 0. ]
[ 0. 0. 1. ]
[ 1. 0. 0. ]
[ 0. 1. 0. ]
[ 0. 0. 1. ]
[ 1. 0. 0. ]
[ 0. 1. 0. ]
[ 1. 0. 0. ]]
|
説明
- データをロードした後、カテゴリデータを完全に整数値にエンコードするために
LabelEncoder()
のオブジェクトを作成した。 -
- さらに、同じ整数データを
OneHotEncoder()
に渡して、整数値をカテゴリのバイナリベクトルにエンコードさせる。
- さらに、同じ整数データを
-
-
fit_transform()
関数は、データまたは値の集合に対して実行される特定の関数を適用します。
-
実施例2.データセットでホットエンコーディングを行う
この例では、データセットを Python 環境に取り込みました。
データセットは以下の通りです。
import pandas
import numpy
from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import ColumnTransformer
cat_data = pandas.read_csv( "bank-loan.csv" )
#print(cat_data) column_set = ColumnTransformer([( 'encoder' , OneHotEncoder(),[ 0 ])], remainder = 'passthrough' )
onehot_data = numpy.array(column_set.fit_transform(cat_data), dtype = numpy. str )
print (onehot_data)
|
さらに、ColumnTransformer()
関数を使って、N個のカテゴリーのうち、カテゴリー0を最初の列として示すオブジェクトを作成した。
最後に、これをカテゴリデータ全体に適用して、バイナリ配列形式にエンコードしています。
それでは、pandasとnumpyのライブラリをインポートしましょう。
[[ '0.0' '1.0' ]
[ '1.0' '0.0' ]
[ '1.0' '0.0' ]
...
[ '1.0' '0.0' ]
[ '1.0' '0.0' ]
[ '1.0' '0.0' ]]
|
出力してみましょう。
つまり、1列目が0番目のカテゴリー、2列目が1番目のカテゴリーを表しています。
この記事もチェック:Pythonでデータセットから別のデータセットへピボットテーブルを作成する
まとめ
ここまでで、このトピックは終了です。
何か疑問があれば、お気軽にコメントください。
それでは、今後ともよろしくお願いいたします。