やはり事前に標準化する必要があるのでしょうか?
標準化する必要があります。
標準偏差を求めることができず、標準化はできなくなり、
予測自体できない事にはなりませんでしょうか?
テストデータを標準化する際は学習データを標準化する際に計算した平均、標準偏差と使って変換します。つまり、学習データを変換するのと同じ計算を行います。
テストデータは変換しても平均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:48 編集
2019/10/21 05:48 編集
2019/10/21 05:53
2019/10/21 06:09
2019/10/21 06:28
2019/10/21 06:33
2019/10/21 07:03