機械学習における正規化、標準化を行う場合には、
①データ全体に対してまとめて正規化、標準化をかけるべきなのか
②データの各columnsごとに正規化、標準化をかけるべきなのか。
基本的には、columnごと(変数ごと)にスケーリングするべきです。
すべての(説明)変数のスケールを同一に揃えることに意義があります。そうすることによって、アルゴリズムによっては収束速度や性能に顕著な性能が現れます。SVMやMLPあたりで実験してみるといいかもしれません。
(ただし、まったく影響しないアルゴリズムもあるので注意。たとえば決定木など。そういうものを使うのであればスケーリングの必要性は薄い)
ただし、たとえば文書ベクトルを作るためにtf-idfを計算してからスケーリング、というのは当然無意味ですし、デカルト座標で取ったデータをスケーリングすると距離が狂うので好ましくない・・・といったケースもあります。その辺りはケースバイケースでよしなに判断する必要があります。
また、ここでいうスケーリングとは少し違いますが、行方向で揃えるという操作もあります。新聞記事をたくさん集めてきて特定の単語が何回出現するか・・・といった分析をやりたいときなど、記事によって長さが違うと公平に比較できませんから、文字数か単語数あたりで割っておいて相対的な頻度に変換する訳です。そういうこともある、ということを頭に入れておいてください。
そもそも、sklearnのMinMaxScaler
などは「列ごとに(変数ごとに)スケーリング」される仕様です。逆に配列全体でスケーリングする方法は(sklearn.preprocessing
のスケーリングモデルを使う限りは)自然な使い方をする限りないと思います。
Transforms features by scaling each feature to a given range.
https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.MinMaxScaler.html
python
1>>> from sklearn.preprocessing import MinMaxScaler
2>>> mms = MinMaxScaler()
3>>> mms.fit_transform([[0, 0], [1, 10], [5, 500]])
4array([[0. , 0. ],
5 [0.2 , 0.02],
6 [1. , 1. ]])
データフレームをまるごと入れるのは乱暴なので、必要な部分だけ切り出したnumpy配列にして渡すのが自然です。
基本的にsklearnのモデルはnumpy配列を入出力で使うことを想定しています。たとえば次のように書いてあります。
X : numpy array of shape [n_samples, n_features]
できるだけ上流でnumpy配列に変換し、sklearnに入力する段階ではすべてnumpy配列として取り扱った方が、余計なトラブルを避けられます。
あと、下のコードはそもそも動作しないはずです。
python
1X_scaled_=scaler.fit_transform(df[df.columns[1])
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/04/24 09:59
2019/04/25 02:21