質問編集履歴

7

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

2021/03/27 03:53

投稿

TakoyakiOishii
TakoyakiOishii

スコア16

test CHANGED
File without changes
test CHANGED
@@ -254,7 +254,7 @@
254
254
 
255
255
 
256
256
 
257
- ###Optunaを使用して学習
257
+ ###ベイズ最適化(optunaから修正)を使用して学習
258
258
 
259
259
  ```python
260
260
 

6

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

2021/03/27 03:53

投稿

TakoyakiOishii
TakoyakiOishii

スコア16

test CHANGED
File without changes
test CHANGED
@@ -586,6 +586,8 @@
586
586
 
587
587
  以下のように設定し、それぞれのf1スコアを見れるようにしました。
588
588
 
589
+ ###オーバーサンプリング
590
+
589
591
  ![イメージ説明](f23479055923564b1783c29e366ceac9.png)
590
592
 
591
593
  ![イメージ説明](d5de6b2ddea48fe71d302bc01a0a8a2e.png)
@@ -594,6 +596,22 @@
594
596
 
595
597
 
596
598
 
599
+ ###アンダーサンプリング
600
+
601
+ 後ほど追加
602
+
603
+
604
+
605
+
606
+
607
+ ###正則化しただけ(オーバーフィッティング、アンダーサンプリングなし)
608
+
609
+ ![イメージ説明](02174da2dd9ae01b6c22a41e2df3ddb7.png)
610
+
611
+ ![イメージ説明](7110ff6be786b23a03c6089673a26a61.png)
612
+
613
+
614
+
597
615
  #####---------------追記終わり---------------
598
616
 
599
617
 

5

コード全体を記述

2021/03/27 03:27

投稿

TakoyakiOishii
TakoyakiOishii

スコア16

test CHANGED
File without changes
test CHANGED
@@ -30,7 +30,239 @@
30
30
 
31
31
 
32
32
 
33
+ #コード全容(追記部分)
34
+
35
+ ###データの準備
36
+
33
- ```python
37
+ ```python
38
+
39
+
40
+
41
+ import numpy as np
42
+
43
+ import pandas as pd
44
+
45
+ from pandas import Series, DataFrame
46
+
47
+ import sklearn
48
+
49
+ from sklearn.model_selection import train_test_split
50
+
51
+ import tensorflow as tf
52
+
53
+ from tensorflow import keras
54
+
55
+ import pathlib
56
+
57
+ from keras import optimizers
58
+
59
+ from tensorflow.keras import layers
60
+
61
+ from sklearn import datasets
62
+
63
+ from keras.models import Sequential
64
+
65
+ from keras.layers.core import Dense, Activation
66
+
67
+ from bayes_opt import BayesianOptimization
68
+
69
+ import pandas as pd
70
+
71
+
72
+
73
+ test = pd.read_csv("/content/drive/MyDrive/competition/ツイッターのボット/test.tsv",index_col="id",sep='\t')
74
+
75
+ train = pd.read_csv("/content/drive/MyDrive/competition/ツイッターのボット/train.tsv",index_col="id",sep='\t')
76
+
77
+ ```
78
+
79
+ ###ダミー変数化
80
+
81
+ ```python
82
+
83
+
84
+
85
+ #GetDummiesで数値をダミー変数化
86
+
87
+ train = pd.get_dummies(train, columns=['default_profile', 'default_profile_image',"geo_enabled"])
88
+
89
+ ##互いに相関が高いものを排除
90
+
91
+ train = train.drop(columns=["default_profile_0","default_profile_image_0","geo_enabled_0"])
92
+
93
+
94
+
95
+ test = pd.get_dummies(test, columns=['default_profile', 'default_profile_image',"geo_enabled"])
96
+
97
+ ##互いに相関が高いものを排除
98
+
99
+ test = test.drop(columns=["default_profile_0","default_profile_image_0","geo_enabled_0"])
100
+
101
+ ```
102
+
103
+
104
+
105
+ ###学習データを教師データと、学習データに分類
106
+
107
+ ```python
108
+
109
+
110
+
111
+ train_ = train.drop(columns="bot")
112
+
113
+ test_ = train["bot"]
114
+
115
+ ```
116
+
117
+
118
+
119
+
120
+
121
+ ###正則化
122
+
123
+
124
+
125
+ ```python
126
+
127
+ def normalization(x,y):
128
+
129
+ return (x - y['mean']) / y['std']
130
+
131
+
132
+
133
+ #学習データに対して
134
+
135
+ train_stats = train_.describe()
136
+
137
+ train_stats_T = train_stats.transpose()
138
+
139
+ normed_train_X = normalization(train_,train_stats_T)
140
+
141
+
142
+
143
+ #テストデータに対して
144
+
145
+ test_stats = test.describe()
146
+
147
+ test_stats_T = test_stats.transpose()
148
+
149
+ normed_test = normalization(test,test_stats_T)
150
+
151
+
152
+
153
+ normed_train = pd.concat([normed_train_X,test_],axis=1)
154
+
155
+ ```
156
+
157
+
158
+
159
+ ###アンダーサンプリング
160
+
161
+
162
+
163
+ ```python
164
+
165
+ test_df=pd.DataFrame(test_)
166
+
167
+
168
+
169
+ # Class count
170
+
171
+ count_class_0, count_class_1 = normed_train["bot"].value_counts()
172
+
173
+ #1345 243
174
+
175
+
176
+
177
+ # Divide by class
178
+
179
+ df_class_0 = normed_train[normed_train['bot'] == 0]
180
+
181
+ df_class_1 = normed_train[normed_train['bot'] == 1]
182
+
183
+
184
+
185
+ #ここで、一気にアンダー化する。
186
+
187
+ df_class_0_under = df_class_0.sample(count_class_1)
188
+
189
+
190
+
191
+ df_test_under = pd.concat([df_class_0_under, df_class_1], axis=0)
192
+
193
+
194
+
195
+ print('Random under-sampling:')
196
+
197
+ print(df_test_under["bot"].value_counts())
198
+
199
+
200
+
201
+ train_under_train=df_test_under.drop(columns="bot")
202
+
203
+ train_under_test=df_test_under["bot"]
204
+
205
+ ```
206
+
207
+
208
+
209
+ ###オーバーサンプリングの場合
210
+
211
+
212
+
213
+ ```python
214
+
215
+ !pip install imblearn
216
+
217
+ from imblearn.over_sampling import SMOTE
218
+
219
+ sm = SMOTE()
220
+
221
+ x_resampled, y_resampled = sm.fit_resample(normed_train_X, test_)
222
+
223
+ ```
224
+
225
+
226
+
227
+
228
+
229
+ ###学習データと、教師データ、評価データに分類
230
+
231
+ ```python
232
+
233
+ #normed_train_X test_は、普通の正則化しただけのデータ
234
+
235
+ #train_under_train、train_under_testは、アンダーサンプリング
236
+
237
+ #x_resampled,y_resampledは、オーバーサンプリングの場合のデータ
238
+
239
+ #上記のいずれかを使う
240
+
241
+
242
+
243
+ from sklearn.model_selection import train_test_split
244
+
245
+ 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)
246
+
247
+
248
+
249
+ 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)
250
+
251
+ ```
252
+
253
+
254
+
255
+
256
+
257
+ ###Optunaを使用して学習
258
+
259
+ ```python
260
+
261
+
262
+
263
+ #空のレイヤー作成
264
+
265
+ df = pd.DataFrame(index=[])
34
266
 
35
267
 
36
268
 
@@ -42,19 +274,41 @@
42
274
 
43
275
 
44
276
 
45
- kf = StratifiedKFold(n_splits=5, random_state=42)
46
-
47
277
  f1_list=[]
48
278
 
279
+ score_valid_list =[]
280
+
281
+ score_test_list =[]
282
+
283
+ score_train_list =[]
284
+
285
+ score_list =[]
286
+
287
+
288
+
289
+ N_list=[]
290
+
291
+ batch_size_list=[]
292
+
293
+ lr_list=[]
294
+
295
+ layer_list=[]
296
+
297
+ ur_list=[]
298
+
299
+ target_list=[]
300
+
301
+
302
+
49
- def buildModel(lr, batch_size,N,ur,num):
303
+ def buildModel(lr, batch_size,N,layer):
50
304
 
51
305
 
52
306
 
53
307
  model = Sequential()
54
308
 
55
- model.add(Dense(4, activation="relu", input_shape=[len(x_train.keys(),)]))
309
+ model.add(Dense(10, activation="relu", input_shape=[len(x_train.keys(),)]))
56
-
310
+
57
- for i in range(int(num)):
311
+ for i in range(int(layer)):
58
312
 
59
313
  model.add(Dense(3, activation="relu"))
60
314
 
@@ -78,19 +332,49 @@
78
332
 
79
333
  #テストデータで精度を確認
80
334
 
335
+ for i in range(10):
336
+
81
- score_valid = f1_score(model.predict(x_valid)>ur, y_valid)
337
+ score_valid = f1_score(model.predict(x_valid)>i*0.1, y_valid)
82
-
338
+
83
- score_test = f1_score(model.predict(x_test)>ur, y_test)
339
+ score_test = f1_score(model.predict(x_test)>i*0.1, y_test)
84
-
340
+
85
- score_train= f1_score(model.predict(x_train)>ur, y_train)
341
+ score_train= f1_score(model.predict(x_train)>i*0.1, y_train)
86
-
87
-
88
-
342
+
343
+
344
+
89
- print("------------------------------")
345
+ print("------------------------------")
90
-
346
+
91
- print(score_train,score_valid,score_test)
347
+ print("score_train",score_train,"score_valid:",score_valid,"score_test",score_test)
92
-
348
+
349
+
350
+
351
+
352
+
353
+
354
+
93
- score = score_valid+score_test+score_train
355
+ score = score_valid+score_test+score_train
356
+
357
+ if(score!=0):
358
+
359
+ score_train_list.append(score_train)
360
+
361
+ score_valid_list.append(score_valid)
362
+
363
+ score_test_list.append(score_test)
364
+
365
+ score_list.append(score)
366
+
367
+ N_list.append(N)
368
+
369
+ batch_size_list.append(batch_size)
370
+
371
+ lr_list.append(lr)
372
+
373
+ layer_list.append(layer)
374
+
375
+ ur_list.append(i*0.1)
376
+
377
+
94
378
 
95
379
  return score
96
380
 
@@ -102,13 +386,11 @@
102
386
 
103
387
  'batch_size' : (10,100),
104
388
 
105
- 'lr' : (0.01, 1.0),
389
+ 'lr' : (0.0001, 0.01),
106
-
390
+
107
- "N":(50, 200),
391
+ "N":(50, 150),
108
-
109
- "ur":(0, 1),
392
+
110
-
111
- "num":(0,8)
393
+ "layer":(0,8)
112
394
 
113
395
  }
114
396
 
@@ -124,9 +406,177 @@
124
406
 
125
407
  study = bayesOpt()
126
408
 
127
-
409
+ ```
410
+
411
+
412
+
413
+
414
+
128
-
415
+ ###ここでデータフレームに、lr、layer_listなど、入れていつでも観れるようにする。
416
+
417
+
418
+
129
- study.res
419
+ ```python
420
+
421
+ val_train_matchlist =pd.Series(score_valid_list).round(1)==pd.Series(score_train_list).round(1)
422
+
423
+ test_val_matchlist =pd.Series(score_test_list).round(1)==pd.Series(score_valid_list).round(1)
424
+
425
+ #val_train_matchlist =(pd.Series(score_valid_list)-pd.Series(score_train_list)).abs()
426
+
427
+ #test_val_matchlist =(pd.Series(score_test_list)-pd.Series(score_valid_list)).abs()
428
+
429
+
430
+
431
+
432
+
433
+ df["score"]=pd.Series(score_list)
434
+
435
+ df["score_train"]=pd.Series(score_train_list)
436
+
437
+ df["score_valid"]=pd.Series(score_valid_list)
438
+
439
+ df["score_test"]=pd.Series(score_test_list)
440
+
441
+ df["unoverfitting_val_train"]=val_train_matchlist
442
+
443
+ df["unoverfitting_test_val"]=test_val_matchlist
444
+
445
+
446
+
447
+ df["unoverfitting"]=val_train_matchlist==test_val_matchlist
448
+
449
+ #df["overfitting"]=(val_train_matchlist+test_val_matchlist)/2
450
+
451
+
452
+
453
+ df["batch_size"]=pd.Series(batch_size_list)
454
+
455
+ df["N"]=pd.Series(N_list)
456
+
457
+ df["layer"]=pd.Series(layer_list)
458
+
459
+ df["ur"]=pd.Series(ur_list)
460
+
461
+ df["lr_list"]=pd.Series(lr_list)
462
+
463
+ ```
464
+
465
+
466
+
467
+ ###上記で、入れたものデータフレームを視覚化
468
+
469
+ ```python
470
+
471
+ pd.set_option('display.max_rows', 1600)
472
+
473
+ Overfitting_check=df[df["unoverfitting"]==True].sort_values("score",ascending=False)
474
+
475
+ Overfitting_check[Overfitting_check["unoverfitting_val_train"]==True]
476
+
477
+ ```
478
+
479
+
480
+
481
+ ###学習データを増やす+先ほど得られたハイパーパラメータを記述。
482
+
483
+ ```python
484
+
485
+ from sklearn.model_selection import train_test_split
486
+
487
+ import matplotlib.pyplot as plt
488
+
489
+ from sklearn.metrics import confusion_matrix
490
+
491
+
492
+
493
+ loss_list=[]
494
+
495
+ x_train, x_test, y_train, y_test = train_test_split(train_under_train, train_under_test, test_size = 0.1,random_state=0)
496
+
497
+ lr=0.002052
498
+
499
+ batch_size=44.888441
500
+
501
+ N=90.036519
502
+
503
+ ur=0.5
504
+
505
+ layer=5.056227
506
+
507
+ model2 = Sequential()
508
+
509
+ model2.add(Dense(10, activation="relu", input_shape=[len(x_train.keys(),)]))
510
+
511
+ for i in range(int(layer)):
512
+
513
+ model2.add(Dense(3, activation="relu"))
514
+
515
+ model2.add(Dense(1,activation="sigmoid"))
516
+
517
+
518
+
519
+ optimizer = optimizers.Adam(lr)
520
+
521
+
522
+
523
+ model2.compile(loss='binary_crossentropy', optimizer=optimizer,metrics=["accuracy"])
524
+
525
+
526
+
527
+ history=model2.fit(x_train, y_train,epochs=int(N),batch_size=int(batch_size),validation_split=0.1)
528
+
529
+
530
+
531
+ #テストデータで精度を確認
532
+
533
+ score_test = f1_score(model2.predict(x_test)>ur, y_test)
534
+
535
+ print(confusion_matrix(y_test, model2.predict(x_test)>ur))
536
+
537
+ print("------------------------------")
538
+
539
+ print(score_test)
540
+
541
+
542
+
543
+
544
+
545
+ #plt.plot(history.history['accuracy'])
546
+
547
+ plt.plot(history.history['loss'])
548
+
549
+ plt.plot(history.history['val_loss'])
550
+
551
+
552
+
553
+
554
+
555
+ plt.show()
556
+
557
+ ```
558
+
559
+
560
+
561
+ ###ここで、未知データ(testのデータ)に対して学習
562
+
563
+
564
+
565
+ ```python
566
+
567
+ pd.set_option('display.max_rows', 1600)
568
+
569
+
570
+
571
+ pred=model.predict(normed_test)>ur
572
+
573
+ test_data =pd.DataFrame(pred.astype(np.int))
574
+
575
+
576
+
577
+ print(test_data)
578
+
579
+
130
580
 
131
581
  ```
132
582
 

4

orberfittingをunoberfittingに変更

2021/03/26 06:28

投稿

TakoyakiOishii
TakoyakiOishii

スコア16

test CHANGED
File without changes
test CHANGED
@@ -136,7 +136,7 @@
136
136
 
137
137
  以下のように設定し、それぞれのf1スコアを見れるようにしました。
138
138
 
139
- ![イメージ説明](9915c857ee78e721987770ac286e5841.png)
139
+ ![イメージ説明](f23479055923564b1783c29e366ceac9.png)
140
140
 
141
141
  ![イメージ説明](d5de6b2ddea48fe71d302bc01a0a8a2e.png)
142
142
 

3

f1スコア

2021/03/25 13:39

投稿

TakoyakiOishii
TakoyakiOishii

スコア16

test CHANGED
File without changes
test CHANGED
@@ -132,6 +132,22 @@
132
132
 
133
133
 
134
134
 
135
+ ##--------------------------------追記-------------------------------------
136
+
137
+ 以下のように設定し、それぞれのf1スコアを見れるようにしました。
138
+
139
+ ![イメージ説明](9915c857ee78e721987770ac286e5841.png)
140
+
141
+ ![イメージ説明](d5de6b2ddea48fe71d302bc01a0a8a2e.png)
142
+
143
+ 一番上が、ほとんど0.8台ですが、これでえられたハイパーパラメータを使用しても、0.4台のf1-scoreとなりました。
144
+
145
+
146
+
147
+ #####---------------追記終わり---------------
148
+
149
+
150
+
135
151
  ### 試したこと
136
152
 
137
153
 

2

修正

2021/03/25 13:32

投稿

TakoyakiOishii
TakoyakiOishii

スコア16

test CHANGED
File without changes
test CHANGED
@@ -138,7 +138,9 @@
138
138
 
139
139
  xGBoosting、keras、pytorch、その他downsizing、1に重み付け、k-fold等を行いました。
140
140
 
141
- が、結局学習データ、評価データ、テストデータの精度がいいのに、SIGNATEに置いてある未知データの精度が悪いと言うことが起こってしまっています。学習データに対するアウトプットは、f-means test,train,valそれぞれ0.8程。未知データに対するoutputは、0.5~0.6程のf1値なので困っています。
141
+ が、結局学習データ、評価データ、テストデータの精度がいいのに、SIGNATEに置いてある未知データの精度が悪いと言うことが起こってしまっています。学習データに対するアウトプットは、未知データに対するoutputは、0.5~0.6程のf1値なので困っています。
142
+
143
+ 一応この後に、学習データを増すためにテストデータと学習データにわけて訓練してますが、そこでのテストデータのf1-measureは、0.8ほどとなっています。
142
144
 
143
145
 
144
146
 

1

少し変更

2021/03/24 16:15

投稿

TakoyakiOishii
TakoyakiOishii

スコア16

test CHANGED
File without changes
test CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
  現在、練習のためSIGNATEの練習問題(ボットの判別:https://signate.jp/competitions/124/data)
12
12
 
13
- を解いています。
13
+ を解いています。なお、不均衡データです。
14
14
 
15
15
  目標値がF1-Scoreなのですが、学習データでの精度がいいのにも関わらず、未知データに対して精度が出ないと言うことが起こってしまっています。
16
16
 
@@ -138,7 +138,7 @@
138
138
 
139
139
  xGBoosting、keras、pytorch、その他downsizing、1に重み付け、k-fold等を行いました。
140
140
 
141
- が、結局学習データ、評価データ、テストデータの精度がいいのに、SIGNATEに置いてある未知データの精度が悪いと言うことが起こってしまっています。学習データに対するアウトプットは、f-means 0.8程。未知データに対するoutputは、0.5~0.6程のf1値なので困っています。
141
+ が、結局学習データ、評価データ、テストデータの精度がいいのに、SIGNATEに置いてある未知データの精度が悪いと言うことが起こってしまっています。学習データに対するアウトプットは、f-means test,train,valそれぞれ0.8程。未知データに対するoutputは、0.5~0.6程のf1値なので困っています。
142
142
 
143
143
 
144
144