回答編集履歴

1

d

2019/10/21 06:08

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -11,25 +11,54 @@
11
11
  scikit-learn を使用する場合、StandardScaler の transform をテストデータに対しても適用すればよいです。
12
12
  pickle で保存する際は SVM オブジェクトの他、StandardScaler オブジェクトも保存します。
13
13
 
14
+ ## 学習時
15
+
14
16
  ```python
17
+ import pickle
18
+
19
+ import numpy as np
15
20
  from sklearn import svm
16
21
  from sklearn.datasets import make_blobs
17
22
  from sklearn.model_selection import train_test_split
18
23
  from sklearn.preprocessing import StandardScaler
19
24
 
20
25
  # データセットを作成する。
21
- X, y = make_blobs(n_samples=100, centers=2, random_state=0)
26
+ X, y = make_blobs(n_samples=1000, centers=2, random_state=0)
22
- X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.15)
23
27
 
28
+ # ホールドアウト分割する。
29
+ X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.15, stratify=y, random_state=0)
30
+
31
+ # テストデータは保存しておく。
32
+ np.savez("test.npz", X=X_test, y=y_test)
33
+
24
- # 標準化する。
34
+ # 学習データを標準化する。
25
35
  sc = StandardScaler()
26
36
  X_train_std = sc.fit_transform(X_train)
27
37
 
28
38
  # 学習する。
29
- clf = svm.LinearSVC(C=1)
39
+ clf = svm.LinearSVC(C=1, random_state=0)
30
40
  clf.fit(X_train_std, y_train)
31
41
 
32
- # 推論する。
42
+ # 保存する。
43
+ pickle.dump(clf, open("svm.pickle", "wb"))
44
+ pickle.dump(sc, open("scaler.pickle", "wb"))
45
+ ```
46
+
47
+ ## 推論時
48
+
49
+ ```python
50
+ import pickle
51
+
52
+ import numpy as np
53
+
54
+ # 読み込む。
55
+ clf = pickle.load(open("svm.pickle", "rb"))
56
+ sc = pickle.load(open("scaler.pickle", "rb"))
57
+ test_data = np.load("test.npz")
58
+
59
+ # テストデータを標準化する。
33
- X_test_std = sc.transform(X_test)
60
+ X_test_std = sc.transform(test_data["X"])
61
+
62
+ # 予測する。
34
63
  y_pred = clf.predict(X_test_std)
35
64
  ```