はじめに
scikit-learnのOneHotEncoderをそのまま使うと、カテゴリ変数の水準数分だけダミー変数が作られる。この場合、線形回帰手法などでは多重共線性が生じるため、ダミー変数を水準数-1に減らしたい。その方法を調べたのでメモっておく。
環境
- scikit-learn 0.21.2
方法
OneHotEncoderのdropオプションを"first"にすると、最初のダミー変数を除去してくれる
やってみよう
ここでは以下のようなカテゴリ変数が格納された列を抽出してカテゴリ変数にしてみよう。
[['D']
['D']
['D']
['T']
['T']
['T']
['N']
['N']
['N']]
ソースは以下のとおりである。dropオプションを"first"にした場合、合わせてhandle_unknown='error'も設定しないと怒られる。
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import OneHotEncoder
import numpy as np
def main():
X = np.array([
[1, "D"],
[3, "D"],
[5, "D"],
[2, "T"],
[4, "T"],
[6, "T"],
[1, "N"],
[8, "N"],
[2, "N"],
])
y = np.array([2, 6, 10, 6, 12, 18, 1, 8, 2])
# 2列目を取り出し
category = X[:, [1]]
print(category)
encoder = OneHotEncoder(handle_unknown='error', drop='first')
encoder.fit(category)
result = encoder.transform(category)
print(result.toarray())
if __name__ == "__main__":
main()
結果
drop='first'をつけない場合。
[[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
[0. 0. 1.]
[0. 0. 1.]
[0. 0. 1.]
[0. 1. 0.]
[0. 1. 0.]
[0. 1. 0.]]
drop='fist'をつけた場合
[[0. 0.]
[0. 0.]
[0. 0.]
[0. 1.]
[0. 1.]
[0. 1.]
[1. 0.]
[1. 0.]
[1. 0.]]
確かに最初の列が消えている。これでこころおきなくfitメソッドを呼び出すことができる。