web-dev-qa-db-ja.com

scikit-learnの特定の列のみを正規化するにはどうすればよいですか?

私は次のようなデータを持っています:

[
   [0, 4, 15]
   [0, 3, 7]
   [1, 5, 9]
   [2, 4, 15]
]

oneHotEncoderhttp://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html#sklearn.preprocessing.OneHotEncoder.fit_transform を使用してこのデータを前処理しましたしたがって、線形回帰には次のようになります。

[
   [1, 0, 0, 4, 15]
   [1, 0, 0, 3, 7]
   [0, 1, 0, 5, 9]
   [0, 0, 1, 4, 15]
]

ただし、このデータを正規化したいと思います。

これまでのところ、次のようにデータを正規化しています。

preprocessing.normalize(data)

ただし、これにより、カテゴリ列を含むすべての列が正規化されます。

私の質問は次のとおりです。

  • 特定の列のみを正規化するにはどうすればよいですか?
  • カテゴリデータを正規化することが望ましいですか、それとも回避する必要がありますか?

ありがとうございました!

9
Yahya Uddin

numpy を使用して、データのスライスをnormalizeに渡します。カテゴリデータの正規化に関する質問については、 CrossValidated でその質問に対するより良い回答が得られる可能性があります。

最初の質問の例:

In [1]: import numpy as np
        from sklearn.preprocessing import normalize

        # Values as floats or normalize raises a type error
        X1 = np.array([
                      [1., 0., 0., 4., 15.],
                      [1., 0., 0., 3., 7.],
                      [0., 1., 0., 5., 9.],
                      [0., 0., 1., 4., 15.],
                      ])

In [2]: X1[:, [3,4]] # last two columns
Out[2]: array([[  4.,  15.],
               [  3.,   7.],
               [  5.,   9.],
               [  4.,  15.]])

最後の2つの列を正規化し、新しいnumpy配列X2に割り当てます。

In [3]: X2 = normalize(X1[:, [3,4]], axis=0) #axis=0 for column-wise
        X2
Out[3]: array([[ 0.49236596,  0.6228411 ],
               [ 0.36927447,  0.29065918],
               [ 0.61545745,  0.37370466],
               [ 0.49236596,  0.6228411 ]])

次に、X1X2を連結して目的の出力にします。

In [4]: np.concatenate(( X1[:,[0,1,2]], X2), axis=1)
Out[4]: array([[ 1.        ,  0.        ,  0.        ,  0.49236596,  0.6228411 ],
               [ 1.        ,  0.        ,  0.        ,  0.36927447,  0.29065918],
               [ 0.        ,  1.        ,  0.        ,  0.61545745,  0.37370466],
               [ 0.        ,  0.        ,  1.        ,  0.49236596,  0.6228411 ]])
7
Kevin

pandas.DataFrameを使用している場合は、 sklearn-pandas を確認することをお勧めします。

1
Dror