回答編集履歴

5

修正

2020/05/16 03:50

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -63,6 +63,8 @@
63
63
  from sklearn.pipeline import make_pipeline
64
64
 
65
65
  from sklearn.svm import SVC
66
+
67
+ from sklearn.preprocessing import StandardScaler
66
68
 
67
69
 
68
70
 

4

修正

2020/05/16 03:50

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -12,99 +12,75 @@
12
12
 
13
13
 
14
14
 
15
- ## 参考
15
+ ### 追記
16
16
 
17
17
 
18
18
 
19
- 特徴量エンジニアリグやモデのパラメータ調整はいなすがSVM に突っ込むだけで70%なりました。
19
+ R.Shigemori さんのコメトをみて、マーして確認してみたところ、たしかに最初のサだけ4時刻分かなようで、train_time_series.csv の4データとtrain_labels.csvの最初の1データを除いて、374個のサンプルデータするべきみいです
20
20
 
21
21
 
22
22
 
23
- * 前処理: 標準化の
23
+ #### データ読込み
24
-
25
- * モデル: SVM
26
24
 
27
25
 
28
26
 
29
27
  ```python
30
28
 
31
- import numpy as np
29
+ import pandas as pd
30
+
31
+
32
+
33
+ # CSV を読みこむ。
34
+
35
+ data = pd.read_csv("train_time_series.csv", skiprows=[1, 2, 3, 4]) # 最初の4行分のデータはスキップ
36
+
37
+ labels = pd.read_csv("train_labels.csv", skiprows=[1]) # 最初の1行分のデータはスキップ
38
+
39
+
40
+
41
+ n_samples = data.shape[0] // 10
42
+
43
+ X = data[["x", "y", "z"]].values.reshape(-1, 10, 3)
44
+
45
+ y = labels["label"].values.astype(int) - 1 # ラベルを 0 始まりにする
46
+
47
+ print(X.shape, y.shape) # (374, 10, 3) (374,)
48
+
49
+ ```
50
+
51
+
52
+
53
+ #### SVC の学習サンプル
54
+
55
+
56
+
57
+ ```python
32
58
 
33
59
  from sklearn.metrics import accuracy_score
34
60
 
35
61
  from sklearn.model_selection import train_test_split
36
62
 
37
- from sklearn.preprocessing import StandardScaler
63
+ from sklearn.pipeline import make_pipeline
38
64
 
39
65
  from sklearn.svm import SVC
40
66
 
41
67
 
42
68
 
43
- # データを読み込む
69
+ # 学習データとテストデータに分割する
44
70
 
45
- # * 区切り文字: delimiter=","
71
+ X_flatten = X.reshape(len(X), -1) # (374, 10, 3) -> (374, 30)
46
72
 
47
- # * 4~6列目を使用: usecols=[4, 5, 6]
73
+ X_train, X_test, y_train, y_test = train_test_split(
48
74
 
49
- # * ヘッダースキップ: skiprows=1
50
-
51
- # * ゲッダー除き、3740行分読み込み: max_rows=3740
75
+ X_flatten, y, test_size=0.2, random_state=42
52
-
53
- X = np.loadtxt(
54
-
55
- "train_time_series.csv", delimiter=",", usecols=[4, 5, 6], skiprows=1, max_rows=3740
56
76
 
57
77
  )
58
78
 
59
79
 
60
80
 
61
- # ラベルを読み込む。
62
-
63
- # * 区切り文字: delimiter=","
64
-
65
- # * 3列目を使用: usecols=3
66
-
67
- # * ヘッダースキップ: skiprows=1
68
-
69
- # * ゲッダー除き、374行分読み込み: max_rows=374
70
-
71
- y = np.loadtxt(
72
-
73
- "train_labels.csv", delimiter=",", usecols=3, skiprows=1, max_rows=374, dtype=int
74
-
75
- )
76
-
77
-
78
-
79
- X = X.reshape(X.shape[0] // 10, -1) # 形状を変更する。(N * 10, 3) -> (N, 30)
80
-
81
- y -= 1 # クラス ID を [0, 1, 2, 3] にする。
82
-
83
-
84
-
85
- # 学習データとテストデータに分割する。
86
-
87
- X_train, X_test, y_train, y_test = train_test_split(
88
-
89
- X, y, test_size=0.2, random_state=42
90
-
91
- )
92
-
93
-
94
-
95
- # 標準化する。
96
-
97
- transformer = StandardScaler()
98
-
99
- X_train = transformer.fit_transform(X_train)
100
-
101
- X_test = transformer.transform(X_test)
102
-
103
-
104
-
105
81
  # SVM で学習する。
106
82
 
107
- clf = SVC(gamma="auto")
83
+ clf = make_pipeline(StandardScaler(), SVC(gamma="auto"))
108
84
 
109
85
  clf.fit(X_train, y_train)
110
86
 
@@ -114,9 +90,59 @@
114
90
 
115
91
  acc = accuracy_score(y_test, y_pred)
116
92
 
117
- print(f"{acc:.2%}") # 70.67%
93
+ print(f"{acc:.2%}") # 66.67%
118
94
 
119
95
  ```
96
+
97
+
98
+
99
+ ## サンプルを可視化した例
100
+
101
+
102
+
103
+ ```python
104
+
105
+ import matplotlib.pyplot as plt
106
+
107
+ import numpy as np
108
+
109
+ from mpl_toolkits.mplot3d import Axes3D
110
+
111
+
112
+
113
+ fig = plt.figure(figsize=(12, 10))
114
+
115
+
116
+
117
+ class_ids = np.unique(y)
118
+
119
+ class_names = ["立つ", "歩く", "階段を下る", "階段を登る"]
120
+
121
+ cols = 5
122
+
123
+
124
+
125
+ for i, class_id in enumerate(class_ids):
126
+
127
+ some_samples = X[np.where(y == class_id)][:cols]
128
+
129
+ for j, sample in enumerate(some_samples):
130
+
131
+ ax = fig.add_subplot(4, cols, i * cols + j + 1, projection="3d")
132
+
133
+ ax.plot(sample[:, 0], sample[:, 1], sample[:, 2])
134
+
135
+ ax.set_title(class_names[class_id])
136
+
137
+
138
+
139
+ plt.show()
140
+
141
+ ```
142
+
143
+
144
+
145
+ ![イメージ説明](88899561c5a3f121b924e4a3b5c0e2cc.jpeg)
120
146
 
121
147
 
122
148
 

3

修正

2020/05/16 03:45

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -124,4 +124,6 @@
124
124
 
125
125
 
126
126
 
127
+ * 1つのサンプルが10時刻分の x, y, z なので、上記では潰して30次元にしてしまいましたが、時系列データとして扱えるモデルも試すといいかもしれません。
128
+
127
- 標準化やディープラーニングの学習など、ライブラリで代用できるものは独自実装ではなく、ライブラリを使ったほうがいいと思います。数値計算の実装でバグがあったりすると、見つけるのはなかなか大変です。
129
+ * 標準化やディープラーニングの学習など、ライブラリで代用できるものは独自実装ではなく、ライブラリを使ったほうがいいと思います。数値計算の実装でバグがあったりすると、見つけるのはなかなか大変です。

2

修正

2020/05/15 16:07

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -117,3 +117,11 @@
117
117
  print(f"{acc:.2%}") # 70.67%
118
118
 
119
119
  ```
120
+
121
+
122
+
123
+ ----
124
+
125
+
126
+
127
+ 標準化やディープラーニングの学習など、ライブラリで代用できるものは独自実装ではなく、ライブラリを使ったほうがいいと思います。数値計算の実装でバグがあったりすると、見つけるのはなかなか大変です。

1

修正

2020/05/15 16:05

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -4,9 +4,11 @@
4
4
 
5
5
  iris は簡単な問題ですから、適当なモデルを使ってもほぼ100%の精度が出ます。
6
6
 
7
- iris と同じやり方で他データセットでも精度が出ることはないので、問題に応じて、前処理やモデルをろいろ試す必要があります。
7
+ 4クラスなので、完全にランダムに答えたら、25%になるはずですから、60%で全然ダメということはないと思います。
8
8
 
9
- 4クラスなので、完全にランダムに答えたら、25%になはずですから、60%でも全然ダメということはないと思います。
9
+ iris と同じやり方で他データセットも精度が出るということは言えないので、問題に応じて、前処理やモデルをろいろ試す必要があります。
10
+
11
+ 入力が数値データの場合、ディープラーニングがいいとも限らないので、他のモデル等も試してみてください。
10
12
 
11
13
 
12
14