質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.30%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

20885閲覧

sklearn MinMaxScalerによる正規化とそれを戻す方法

Shu0101

総合スコア14

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

0クリップ

投稿2019/11/07 08:52

問題設定

こんにちは。
sklearnの正規化とそれを戻す方法についてご教授いただけませんでしょうか。
現在、以下のようなコードを書いてみたのですが、正しく戻っておらず悩んでおります。
なお、scalerもfitを用いたものではinverse_transformに与えることはできるのに対し、fit_transformではできない理由もよく分かっておりません。
よろしくお願いいたします。

該当のソースコード

python

1import numpy as np 2from pandas import Series 3import matplotlib.pyplot as plt 4from sklearn.preprocessing import MinMaxScaler 5 6data = [0.0e+00, 5.1e+00, 5.1e+00, 5.2e+00, 4.6e+00, 1.2e+00, 7.3e-01, 4.5e-03] 7Series = Series(data) 8values = Series.values 9values = values.reshape((len(values), 1)) 10 11scaler = MinMaxScaler(feature_range=(0, 1)) 12scaler1 = scaler.fit(values) 13scaler2 = scaler.fit_transform(values) 14inversed = scaler1.inverse_transform(values) 15 16print(data) 17print (scaler2) 18print(inversed) 19 20plt.plot(data) 21plt.plot(scaler2) 22plt.plot(inversed)
cmbnur👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

1

fitfit_transformメソッドの返り値が何になるかについて、混乱があるのかもしれません。

python

1scaler = MinMaxScaler(feature_range=(0, 1))

だったとして、

python

1scaler1 = scaler.fit(values)

scaler1scalerと同一のオブジェクト(scikit-learnのモデル)です(ただしfitしたので内部状態は変わっている)。

python

1scaler2 = scaler.fit_transform(values)

scaler2transformした結果の配列です(変数名が適当ではない)。

また、ついでですが、

python

1# A 2result = transformer.fit(X).transform(X) 3 4# B 5result = transformer.fit_transform(X)

のAとBは等価の処理になります。


python

1inversed = scaler1.inverse_transform(values)

fitしたときの値を渡しても意味がありません。

fit_transformを使わない場合の書き方。

python

1# 変換 2scaler.fit(values) 3scaled = scaler.transform(values) 4# 以下も可 5# scaled = scaler.fit(values).transform(values) 6 7# 逆変換 8inversed = scaler.inverse_transform(scaled) 9 10# values と inversedはほぼ同じ(細かい誤差はある)

fit_transformを使う場合もほとんど同じです。

python

1# 変換 2scaled = scaler.fit_transform(values) 3 4# 逆変換 5inversed = scaler.inverse_transform(scaled) 6 7# values と inversedはほぼ同じ(細かい誤差はある)

投稿2019/11/07 10:50

編集2019/11/07 10:51
hayataka2049

総合スコア30939

Shu0101👍を押しています

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Shu0101

2019/11/08 06:03

ありがとうございます。 誤った理解をしておりました・・・ また、FitとTransformの役割も理解でき、感謝いたしております。
guest

0

ベストアンサー

Python

1inversed = scaler1.inverse_transform(values)

の部分なのですが、inverse_transform()は正規化された値を元に戻す処理なのですから、入力データとして正規化された値を入れて確認しないと意味がないのではないですか?

以下、fit()transform()を分けて処理した場合、fit_transform()で処理した場合の療法で問題なく動作しております。

Python

1import numpy as np 2from sklearn.preprocessing import MinMaxScaler 3 4values = np.array([0.0e+00, 5.1e+00, 5.1e+00, 5.2e+00, 4.6e+00, 1.2e+00, 7.3e-01, 4.5e-03]).reshape(-1,1) 5 6# fit() と transform() を使用する場合 7scaler = MinMaxScaler(feature_range=(0, 1)) 8scaler.fit(values) 9scaled_value = scaler.transform(values) 10inversed = scaler.inverse_transform(scaled_value) 11print(values) 12print(scaled_value) 13print(inversed) 14 15# fit_transform() を使用する場合 16scaler2 = MinMaxScaler(feature_range=(0, 1)) 17scaled_value2 = scaler2.fit_transform(values) 18inversed2 = scaler2.inverse_transform(scaled_value) 19print(values) 20print(scaled_value2) 21print(inversed2)

投稿2019/11/07 09:23

magichan

総合スコア15898

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Shu0101

2019/11/08 06:01

早急にご指摘いただき、ありがとうございました! おっしゃる通り、間違って理解しておりました・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問