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

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

新規登録して質問してみよう
ただいま回答率
85.48%
機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

Q&A

解決済

1回答

8726閲覧

標準化した学習済モデルでは、1件の予測はできない?

python_2019

総合スコア68

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

0グッド

0クリップ

投稿2019/10/21 05:03

標準化したデータをサポートベクターマシンで機械学習して、
モデルを作成しました。
これを再利用したいと考えています。

再利用の時に入力する未知データは、
やはり事前に標準化する必要があるのでしょうか?
それとも、そのまま入力してもよいのでしょうか?

標準化して入力する場合、

 ①学習時にテストデータ1000件を標準化してモデルを作成
②この学習済モデルに未知データ1件を標準化して入力し予測

そうしますと、未知データは1件なので、
標準偏差を求めることができず、標準化はできなくなり、
予測自体できない事にはなりませんでしょうか?

実際に予測してみると、未知データが1件の場合、
エラーにはならないものの、どんなデータでも、
なぜか同じ結果となります。

標準化の場合、最低、2件以上の未知データを同時に入力しないと、
標準偏差が求まらないため、予測できないのでしょうか?

この場合でも、学習時の1000件の標準化に対して、
予測時に2件の未知データの標準化では、母数が大きく異なり、
正確な予測はできないのではと思いますが、いかがでしょうか?

この辺、お詳しい方、ご指導をお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

やはり事前に標準化する必要があるのでしょうか?

標準化する必要があります。

標準偏差を求めることができず、標準化はできなくなり、
予測自体できない事にはなりませんでしょうか?

テストデータを標準化する際は学習データを標準化する際に計算した平均、標準偏差と使って変換します。つまり、学習データを変換するのと同じ計算を行います。
テストデータは変換しても平均0、分散1になりませんが、それで問題ありません。

scikit-learn を使用する場合、StandardScaler の transform をテストデータに対しても適用すればよいです。
pickle で保存する際は SVM オブジェクトの他、StandardScaler オブジェクトも保存します。

学習時

python

1import pickle 2 3import numpy as np 4from sklearn import svm 5from sklearn.datasets import make_blobs 6from sklearn.model_selection import train_test_split 7from sklearn.preprocessing import StandardScaler 8 9# データセットを作成する。 10X, y = make_blobs(n_samples=1000, centers=2, random_state=0) 11 12# ホールドアウト分割する。 13X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.15, stratify=y, random_state=0) 14 15# テストデータは保存しておく。 16np.savez("test.npz", X=X_test, y=y_test) 17 18# 学習データを標準化する。 19sc = StandardScaler() 20X_train_std = sc.fit_transform(X_train) 21 22# 学習する。 23clf = svm.LinearSVC(C=1, random_state=0) 24clf.fit(X_train_std, y_train) 25 26# 保存する。 27pickle.dump(clf, open("svm.pickle", "wb")) 28pickle.dump(sc, open("scaler.pickle", "wb"))

推論時

python

1import pickle 2 3import numpy as np 4 5# 読み込む。 6clf = pickle.load(open("svm.pickle", "rb")) 7sc = pickle.load(open("scaler.pickle", "rb")) 8test_data = np.load("test.npz") 9 10# テストデータを標準化する。 11X_test_std = sc.transform(test_data["X"]) 12 13# 予測する。 14y_pred = clf.predict(X_test_std)

投稿2019/10/21 05:22

編集2019/10/21 06:08
tiitoi

総合スコア21956

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

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

python_2019

2019/10/21 05:48 編集

ご丁寧なご指導、どうもありがとうございます。 「テストデータを標準化する際は学習データを標準化する際に計算した平均、標準偏差と使って変換」 につきまして、理解できました。 実際に、作成されたモデルを呼び出して、未知データに再利用する場合は、どのようにすればよいでしょうか? 以下のようなコードで未知データを標準化して、再利用しようとしましたら、未知データ件数が1件の場合は、エラーにはなりませんが、どんなデータでも1件の場合は、同じ予測結果となってしまいます。 そうならないために、どのように修正すればよいでしょうか? StandardScaler オブジェクトの保存をすれば解決しますでしょうか?  ご指導いただければ助かります。 import pickle # 学習済モデル(SVM)のロード(読み込み)(モデルはすでに保存済) with open('ERP(DNN_標準化).sav', mode='rb') as fp: clf = pickle.load(fp) import numpy as np import pandas as pd from sklearn.preprocessing import StandardScaler stdsc = StandardScaler() # 未知データの読み込み df1 = pd.read_excel('target+notarget_未知.xlsx',sheet_name='説明変数') x_test_michi = np.array(df1) # データを標準化 x_test_michi_std = stdsc.fit_transform(x_test_michi) # 未知データをロードした学習済モデルで予測 y_test_michi_std = clf.predict(x_test_michi_std) y_test_michi_std = np.argmax(y_test_michi_std, axis=1) print(y_test_michi_std)
tiitoi

2019/10/21 05:48 編集

テストデータを標準化する際には学習データを変換した際のパラメータを使って変換するため、fit_transform ではなく、transform だけでよいです。 手順でいうと、 1. StandardScaler の fit_transform で学習データを変換する。 2. 変換した学習データで学習する。 3. モデルと StandardScaler を pickle で保存する。 4. モデルと StandardScaler を pickle で読み込む。 5. テストデータを StandardScaler の transform (fit_transform でない) で変換する。 6. モデルで推論する。 となります。 今のコードだと、pickle で学習時の StandardScaler を保存して、推論時に読み込むという処理がないので、それも追加する必要があります。
python_2019

2019/10/21 05:53

ご指導ありがとうございます。 「pickle で学習時の StandardScaler を保存」 ということですが、現在、以下のように保存しています。 これにStandardScaler も保存するにはどうすればよいでしょうか? 基本的な事で申し訳ありません。ネットで検索してもなかなか見つからないもので...。 どうぞよろしくお願いいたします。 # モデルを保存する import pickle filename = 'ERP(DNN_標準化).sav' pickle.dump(model, open(filename, 'wb'))
tiitoi

2019/10/21 06:09

同じやり方で StandardScaler オブジェクトをまるごと pickle.dump で保存し、pickle.load で読み込めばよいです。 回答のコードを修正しました。
python_2019

2019/10/21 06:28

ご指導ありがとうございます。 ご指摘いただいたコードの通り修正しましたら、正常動作しました。 大変、助かりました。 追加でもう1点、お教えいただきたいのですが、 「正規化(normalize)」の場合も同様のコードでよいのでしょうか?
tiitoi

2019/10/21 06:33

同じやり方でよいです。
python_2019

2019/10/21 07:03

承知いたしました。 いろいろありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問