データ分析・上級問題チェック
問題 33 /40
scikit-learnのカテゴリ変数エンコーディングとOne-hotエンコーディングに関する説明で、誤っているものはどれか。
選択 1
カテゴリ変数エンコーディングは、カテゴリを数値に変換する。
選択 2
カテゴリ変数エンコーディングで、カテゴリを数値に変換して学習モデルを作ると、数値の大小に意味が付いてしまうことがある。
選択 3
One-hotエンコーディングは、値の分だけ列を増やし、各行の該当する値の列に1、それ以外の列に0が入力される。
選択 4
scikit-learnのOneHotEncoderクラスで変換すると scipy.sparse形式の疎行列が返るため、同じデータのndarrayよりメモリの使用量が増える。
解説
選択肢4が正解です。
【カテゴリ変数エンコーディング】
scikit-learnで学習モデルを作る場合、データを数値で渡す必要があるため、文字列だった場合は数値に変換します。
例えばある列に「北海道」「東京」「沖縄」というデータがあった場合、scikit-learnのLabelEncoderクラスでカテゴリ変数エンコーディングすると、「0」「1」「2」の数値に変わります。
これで学習できるようになりますが、数値に大小があるため、「北海道 < 東京 < 沖縄」という意味だとアルゴリズムに解釈される可能性があります。そのため、通常はカテゴリ変数エンコーディングではなく、One-hotエンコーディングを利用します。
【One-hotエンコーディング】
値の分だけ列を増やし、各行の該当する値の列に1、それ以外の列に0が入力されます。
先の「北海道」「東京」「沖縄」の例の場合、次のように変換されます。
df = pd.DataFrame(
['北海道', '東京', '沖縄'],
columns=['地名'])
▶︎
pd.get_dummies(df)
▶︎
値の分だけ列が増え、各行の該当する値の列に1、それ以外の列に0が入力されます。
pandasのget_dummies関数はDataFrameが返りますが、scikit-learnのOneHotEncoderクラスはscipy.sparse形式の疎行列が返ります。
DataFrameのほうが扱いやすいですが、カテゴリが多いと0のデータが大量になるため、メモリの使用量が増えます。scipy.sparse形式の疎行列は1の位置だけ記憶して利用するため、メモリの使用量を抑えることができます。
scikit-learnのRandomForestClassifierなど、主なアルゴリズムはscipy.sparse形式の疎行列をデータとして渡すことができます。
(公式書籍 p.217-221)

