質問編集履歴

7

optunaからベイズ最適化に変更

2021/03/27 03:53

投稿

TakoyakiOishii
TakoyakiOishii

スコア16

title CHANGED
File without changes
body CHANGED
@@ -126,7 +126,7 @@
126
126
  ```
127
127
 
128
128
 
129
- ###Optunaを使用して学習
129
+ ###ベイズ最適化(optunaから修正)を使用して学習
130
130
  ```python
131
131
 
132
132
  #空のレイヤー作成

6

正則化した場合の出力を追加。

2021/03/27 03:53

投稿

TakoyakiOishii
TakoyakiOishii

スコア16

title CHANGED
File without changes
body CHANGED
@@ -292,10 +292,19 @@
292
292
 
293
293
  ##--------------------------------追記-------------------------------------
294
294
  以下のように設定し、それぞれのf1スコアを見れるようにしました。
295
+ ###オーバーサンプリング
295
296
  ![イメージ説明](f23479055923564b1783c29e366ceac9.png)
296
297
  ![イメージ説明](d5de6b2ddea48fe71d302bc01a0a8a2e.png)
297
298
  一番上が、ほとんど0.8台ですが、これでえられたハイパーパラメータを使用しても、0.4台のf1-scoreとなりました。
298
299
 
300
+ ###アンダーサンプリング
301
+ 後ほど追加
302
+
303
+
304
+ ###正則化しただけ(オーバーフィッティング、アンダーサンプリングなし)
305
+ ![イメージ説明](02174da2dd9ae01b6c22a41e2df3ddb7.png)
306
+ ![イメージ説明](7110ff6be786b23a03c6089673a26a61.png)
307
+
299
308
  #####---------------追記終わり---------------
300
309
 
301
310
  ### 試したこと

5

コード全体を記述

2021/03/27 03:27

投稿

TakoyakiOishii
TakoyakiOishii

スコア16

title CHANGED
File without changes
body CHANGED
@@ -14,19 +14,146 @@
14
14
  (色々手探りで1週間ほどやっていたので、最終がこれです。一番良かったのは、xgBoostingでやった場合でしたが、精度が上がらなかったので、kerasに変えて再挑戦しました。)
15
15
  return の値は、3がMAXになるようにしています。
16
16
 
17
+ #コード全容(追記部分)
18
+ ###データの準備
17
19
  ```python
18
20
 
21
+ import numpy as np
22
+ import pandas as pd
23
+ from pandas import Series, DataFrame
24
+ import sklearn
25
+ from sklearn.model_selection import train_test_split
26
+ import tensorflow as tf
27
+ from tensorflow import keras
28
+ import pathlib
29
+ from keras import optimizers
30
+ from tensorflow.keras import layers
31
+ from sklearn import datasets
32
+ from keras.models import Sequential
33
+ from keras.layers.core import Dense, Activation
34
+ from bayes_opt import BayesianOptimization
35
+ import pandas as pd
36
+
37
+ test = pd.read_csv("/content/drive/MyDrive/competition/ツイッターのボット/test.tsv",index_col="id",sep='\t')
38
+ train = pd.read_csv("/content/drive/MyDrive/competition/ツイッターのボット/train.tsv",index_col="id",sep='\t')
39
+ ```
40
+ ###ダミー変数化
41
+ ```python
42
+
43
+ #GetDummiesで数値をダミー変数化
44
+ train = pd.get_dummies(train, columns=['default_profile', 'default_profile_image',"geo_enabled"])
45
+ ##互いに相関が高いものを排除
46
+ train = train.drop(columns=["default_profile_0","default_profile_image_0","geo_enabled_0"])
47
+
48
+ test = pd.get_dummies(test, columns=['default_profile', 'default_profile_image',"geo_enabled"])
49
+ ##互いに相関が高いものを排除
50
+ test = test.drop(columns=["default_profile_0","default_profile_image_0","geo_enabled_0"])
51
+ ```
52
+
53
+ ###学習データを教師データと、学習データに分類
54
+ ```python
55
+
56
+ train_ = train.drop(columns="bot")
57
+ test_ = train["bot"]
58
+ ```
59
+
60
+
61
+ ###正則化
62
+
63
+ ```python
64
+ def normalization(x,y):
65
+ return (x - y['mean']) / y['std']
66
+
67
+ #学習データに対して
68
+ train_stats = train_.describe()
69
+ train_stats_T = train_stats.transpose()
70
+ normed_train_X = normalization(train_,train_stats_T)
71
+
72
+ #テストデータに対して
73
+ test_stats = test.describe()
74
+ test_stats_T = test_stats.transpose()
75
+ normed_test = normalization(test,test_stats_T)
76
+
77
+ normed_train = pd.concat([normed_train_X,test_],axis=1)
78
+ ```
79
+
80
+ ###アンダーサンプリング
81
+
82
+ ```python
83
+ test_df=pd.DataFrame(test_)
84
+
85
+ # Class count
86
+ count_class_0, count_class_1 = normed_train["bot"].value_counts()
87
+ #1345 243
88
+
89
+ # Divide by class
90
+ df_class_0 = normed_train[normed_train['bot'] == 0]
91
+ df_class_1 = normed_train[normed_train['bot'] == 1]
92
+
93
+ #ここで、一気にアンダー化する。
94
+ df_class_0_under = df_class_0.sample(count_class_1)
95
+
96
+ df_test_under = pd.concat([df_class_0_under, df_class_1], axis=0)
97
+
98
+ print('Random under-sampling:')
99
+ print(df_test_under["bot"].value_counts())
100
+
101
+ train_under_train=df_test_under.drop(columns="bot")
102
+ train_under_test=df_test_under["bot"]
103
+ ```
104
+
105
+ ###オーバーサンプリングの場合
106
+
107
+ ```python
108
+ !pip install imblearn
109
+ from imblearn.over_sampling import SMOTE
110
+ sm = SMOTE()
111
+ x_resampled, y_resampled = sm.fit_resample(normed_train_X, test_)
112
+ ```
113
+
114
+
115
+ ###学習データと、教師データ、評価データに分類
116
+ ```python
117
+ #normed_train_X test_は、普通の正則化しただけのデータ
118
+ #train_under_train、train_under_testは、アンダーサンプリング
119
+ #x_resampled,y_resampledは、オーバーサンプリングの場合のデータ
120
+ #上記のいずれかを使う
121
+
122
+ from sklearn.model_selection import train_test_split
123
+ x_train, x_test, y_train, y_test = train_test_split(normed_train_X, test_, test_size = 0.2,random_state=0,stratify=pd.DataFrame(test_).bot)
124
+
125
+ x_train, x_valid, y_train, y_valid = train_test_split(x_train, y_train, test_size = 0.2,random_state=0,stratify=pd.DataFrame(y_train).bot)
126
+ ```
127
+
128
+
129
+ ###Optunaを使用して学習
130
+ ```python
131
+
132
+ #空のレイヤー作成
133
+ df = pd.DataFrame(index=[])
134
+
19
135
  from sklearn.model_selection import StratifiedKFold
20
136
  from sklearn.metrics import f1_score
21
137
 
22
138
 
23
- kf = StratifiedKFold(n_splits=5, random_state=42)
24
139
  f1_list=[]
140
+ score_valid_list =[]
141
+ score_test_list =[]
25
- def buildModel(lr, batch_size,N,ur,num):
142
+ score_train_list =[]
143
+ score_list =[]
26
144
 
145
+ N_list=[]
146
+ batch_size_list=[]
147
+ lr_list=[]
148
+ layer_list=[]
149
+ ur_list=[]
150
+ target_list=[]
151
+
152
+ def buildModel(lr, batch_size,N,layer):
153
+
27
154
  model = Sequential()
28
- model.add(Dense(4, activation="relu", input_shape=[len(x_train.keys(),)]))
155
+ model.add(Dense(10, activation="relu", input_shape=[len(x_train.keys(),)]))
29
- for i in range(int(num)):
156
+ for i in range(int(layer)):
30
157
  model.add(Dense(3, activation="relu"))
31
158
 
32
159
  model.add(Dense(1,activation="sigmoid"))
@@ -38,22 +165,36 @@
38
165
  model.fit(x_train, y_train,epochs=int(N),batch_size=int(batch_size))
39
166
 
40
167
  #テストデータで精度を確認
168
+ for i in range(10):
41
- score_valid = f1_score(model.predict(x_valid)>ur, y_valid)
169
+ score_valid = f1_score(model.predict(x_valid)>i*0.1, y_valid)
42
- score_test = f1_score(model.predict(x_test)>ur, y_test)
170
+ score_test = f1_score(model.predict(x_test)>i*0.1, y_test)
43
- score_train= f1_score(model.predict(x_train)>ur, y_train)
171
+ score_train= f1_score(model.predict(x_train)>i*0.1, y_train)
44
172
 
45
- print("------------------------------")
173
+ print("------------------------------")
46
- print(score_train,score_valid,score_test)
174
+ print("score_train",score_train,"score_valid:",score_valid,"score_test",score_test)
175
+
176
+
177
+
47
- score = score_valid+score_test+score_train
178
+ score = score_valid+score_test+score_train
179
+ if(score!=0):
180
+ score_train_list.append(score_train)
181
+ score_valid_list.append(score_valid)
182
+ score_test_list.append(score_test)
183
+ score_list.append(score)
184
+ N_list.append(N)
185
+ batch_size_list.append(batch_size)
186
+ lr_list.append(lr)
187
+ layer_list.append(layer)
188
+ ur_list.append(i*0.1)
189
+
48
190
  return score
49
191
 
50
192
  def bayesOpt():
51
193
  pbounds = {
52
194
  'batch_size' : (10,100),
53
- 'lr' : (0.01, 1.0),
195
+ 'lr' : (0.0001, 0.01),
54
- "N":(50, 200),
196
+ "N":(50, 150),
55
- "ur":(0, 1),
56
- "num":(0,8)
197
+ "layer":(0,8)
57
198
  }
58
199
  optimizer = BayesianOptimization(f=buildModel, pbounds=pbounds)
59
200
  optimizer.maximize(init_points=5, n_iter=100, acq='ucb')
@@ -61,10 +202,94 @@
61
202
 
62
203
 
63
204
  study = bayesOpt()
205
+ ```
64
206
 
207
+
208
+ ###ここでデータフレームに、lr、layer_listなど、入れていつでも観れるようにする。
209
+
65
- study.res
210
+ ```python
211
+ val_train_matchlist =pd.Series(score_valid_list).round(1)==pd.Series(score_train_list).round(1)
212
+ test_val_matchlist =pd.Series(score_test_list).round(1)==pd.Series(score_valid_list).round(1)
213
+ #val_train_matchlist =(pd.Series(score_valid_list)-pd.Series(score_train_list)).abs()
214
+ #test_val_matchlist =(pd.Series(score_test_list)-pd.Series(score_valid_list)).abs()
215
+
216
+
217
+ df["score"]=pd.Series(score_list)
218
+ df["score_train"]=pd.Series(score_train_list)
219
+ df["score_valid"]=pd.Series(score_valid_list)
220
+ df["score_test"]=pd.Series(score_test_list)
221
+ df["unoverfitting_val_train"]=val_train_matchlist
222
+ df["unoverfitting_test_val"]=test_val_matchlist
223
+
224
+ df["unoverfitting"]=val_train_matchlist==test_val_matchlist
225
+ #df["overfitting"]=(val_train_matchlist+test_val_matchlist)/2
226
+
227
+ df["batch_size"]=pd.Series(batch_size_list)
228
+ df["N"]=pd.Series(N_list)
229
+ df["layer"]=pd.Series(layer_list)
230
+ df["ur"]=pd.Series(ur_list)
231
+ df["lr_list"]=pd.Series(lr_list)
66
232
  ```
67
233
 
234
+ ###上記で、入れたものデータフレームを視覚化
235
+ ```python
236
+ pd.set_option('display.max_rows', 1600)
237
+ Overfitting_check=df[df["unoverfitting"]==True].sort_values("score",ascending=False)
238
+ Overfitting_check[Overfitting_check["unoverfitting_val_train"]==True]
239
+ ```
240
+
241
+ ###学習データを増やす+先ほど得られたハイパーパラメータを記述。
242
+ ```python
243
+ from sklearn.model_selection import train_test_split
244
+ import matplotlib.pyplot as plt
245
+ from sklearn.metrics import confusion_matrix
246
+
247
+ loss_list=[]
248
+ x_train, x_test, y_train, y_test = train_test_split(train_under_train, train_under_test, test_size = 0.1,random_state=0)
249
+ lr=0.002052
250
+ batch_size=44.888441
251
+ N=90.036519
252
+ ur=0.5
253
+ layer=5.056227
254
+ model2 = Sequential()
255
+ model2.add(Dense(10, activation="relu", input_shape=[len(x_train.keys(),)]))
256
+ for i in range(int(layer)):
257
+ model2.add(Dense(3, activation="relu"))
258
+ model2.add(Dense(1,activation="sigmoid"))
259
+
260
+ optimizer = optimizers.Adam(lr)
261
+
262
+ model2.compile(loss='binary_crossentropy', optimizer=optimizer,metrics=["accuracy"])
263
+
264
+ history=model2.fit(x_train, y_train,epochs=int(N),batch_size=int(batch_size),validation_split=0.1)
265
+
266
+ #テストデータで精度を確認
267
+ score_test = f1_score(model2.predict(x_test)>ur, y_test)
268
+ print(confusion_matrix(y_test, model2.predict(x_test)>ur))
269
+ print("------------------------------")
270
+ print(score_test)
271
+
272
+
273
+ #plt.plot(history.history['accuracy'])
274
+ plt.plot(history.history['loss'])
275
+ plt.plot(history.history['val_loss'])
276
+
277
+
278
+ plt.show()
279
+ ```
280
+
281
+ ###ここで、未知データ(testのデータ)に対して学習
282
+
283
+ ```python
284
+ pd.set_option('display.max_rows', 1600)
285
+
286
+ pred=model.predict(normed_test)>ur
287
+ test_data =pd.DataFrame(pred.astype(np.int))
288
+
289
+ print(test_data)
290
+
291
+ ```
292
+
68
293
  ##--------------------------------追記-------------------------------------
69
294
  以下のように設定し、それぞれのf1スコアを見れるようにしました。
70
295
  ![イメージ説明](f23479055923564b1783c29e366ceac9.png)

4

orberfittingをunoberfittingに変更

2021/03/26 06:28

投稿

TakoyakiOishii
TakoyakiOishii

スコア16

title CHANGED
File without changes
body CHANGED
@@ -67,7 +67,7 @@
67
67
 
68
68
  ##--------------------------------追記-------------------------------------
69
69
  以下のように設定し、それぞれのf1スコアを見れるようにしました。
70
- ![イメージ説明](9915c857ee78e721987770ac286e5841.png)
70
+ ![イメージ説明](f23479055923564b1783c29e366ceac9.png)
71
71
  ![イメージ説明](d5de6b2ddea48fe71d302bc01a0a8a2e.png)
72
72
  一番上が、ほとんど0.8台ですが、これでえられたハイパーパラメータを使用しても、0.4台のf1-scoreとなりました。
73
73
 

3

f1スコア

2021/03/25 13:39

投稿

TakoyakiOishii
TakoyakiOishii

スコア16

title CHANGED
File without changes
body CHANGED
@@ -65,6 +65,14 @@
65
65
  study.res
66
66
  ```
67
67
 
68
+ ##--------------------------------追記-------------------------------------
69
+ 以下のように設定し、それぞれのf1スコアを見れるようにしました。
70
+ ![イメージ説明](9915c857ee78e721987770ac286e5841.png)
71
+ ![イメージ説明](d5de6b2ddea48fe71d302bc01a0a8a2e.png)
72
+ 一番上が、ほとんど0.8台ですが、これでえられたハイパーパラメータを使用しても、0.4台のf1-scoreとなりました。
73
+
74
+ #####---------------追記終わり---------------
75
+
68
76
  ### 試したこと
69
77
 
70
78
  xGBoosting、keras、pytorch、その他downsizing、1に重み付け、k-fold等を行いました。

2

修正

2021/03/25 13:32

投稿

TakoyakiOishii
TakoyakiOishii

スコア16

title CHANGED
File without changes
body CHANGED
@@ -68,7 +68,8 @@
68
68
  ### 試したこと
69
69
 
70
70
  xGBoosting、keras、pytorch、その他downsizing、1に重み付け、k-fold等を行いました。
71
- が、結局学習データ、評価データ、テストデータの精度がいいのに、SIGNATEに置いてある未知データの精度が悪いと言うことが起こってしまっています。学習データに対するアウトプットは、f-means test,train,valそれぞれ0.8程。未知データに対するoutputは、0.5~0.6程のf1値なので困っています。
71
+ が、結局学習データ、評価データ、テストデータの精度がいいのに、SIGNATEに置いてある未知データの精度が悪いと言うことが起こってしまっています。学習データに対するアウトプットは、未知データに対するoutputは、0.5~0.6程のf1値なので困っています。
72
+ 一応この後に、学習データを増すためにテストデータと学習データにわけて訓練してますが、そこでのテストデータのf1-measureは、0.8ほどとなっています。
72
73
 
73
74
  ### 最後に
74
75
  はじめに戻りますが、学習データでの精度がいいのに、未知データの精度が悪い場合、どうやって改善すればいいでしょうか?学習データ、テストデータ、評価データを見てもか学習している感じではないのですが...

1

少し変更

2021/03/24 16:15

投稿

TakoyakiOishii
TakoyakiOishii

スコア16

title CHANGED
File without changes
body CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  ### 何をしているのか
6
6
  現在、練習のためSIGNATEの練習問題(ボットの判別:https://signate.jp/competitions/124/data)
7
- を解いています。
7
+ を解いています。なお、不均衡データです。
8
8
  目標値がF1-Scoreなのですが、学習データでの精度がいいのにも関わらず、未知データに対して精度が出ないと言うことが起こってしまっています。
9
9
 
10
10
 
@@ -68,7 +68,7 @@
68
68
  ### 試したこと
69
69
 
70
70
  xGBoosting、keras、pytorch、その他downsizing、1に重み付け、k-fold等を行いました。
71
- が、結局学習データ、評価データ、テストデータの精度がいいのに、SIGNATEに置いてある未知データの精度が悪いと言うことが起こってしまっています。学習データに対するアウトプットは、f-means 0.8程。未知データに対するoutputは、0.5~0.6程のf1値なので困っています。
71
+ が、結局学習データ、評価データ、テストデータの精度がいいのに、SIGNATEに置いてある未知データの精度が悪いと言うことが起こってしまっています。学習データに対するアウトプットは、f-means test,train,valそれぞれ0.8程。未知データに対するoutputは、0.5~0.6程のf1値なので困っています。
72
72
 
73
73
  ### 最後に
74
74
  はじめに戻りますが、学習データでの精度がいいのに、未知データの精度が悪い場合、どうやって改善すればいいでしょうか?学習データ、テストデータ、評価データを見てもか学習している感じではないのですが...