質問編集履歴
7
optunaからベイズ最適化に変更
test
CHANGED
File without changes
|
test
CHANGED
@@ -254,7 +254,7 @@
|
|
254
254
|
|
255
255
|
|
256
256
|
|
257
|
-
###
|
257
|
+
###ベイズ最適化(optunaから修正)を使用して学習
|
258
258
|
|
259
259
|
```python
|
260
260
|
|
6
正則化した場合の出力を追加。
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
コード全体を記述
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,
|
303
|
+
def buildModel(lr, batch_size,N,layer):
|
50
304
|
|
51
305
|
|
52
306
|
|
53
307
|
model = Sequential()
|
54
308
|
|
55
|
-
model.add(Dense(
|
309
|
+
model.add(Dense(10, activation="relu", input_shape=[len(x_train.keys(),)]))
|
56
|
-
|
310
|
+
|
57
|
-
for i in range(int(
|
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)>
|
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)>
|
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)>
|
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,
|
389
|
+
'lr' : (0.0001, 0.01),
|
106
|
-
|
390
|
+
|
107
|
-
"N":(50,
|
391
|
+
"N":(50, 150),
|
108
|
-
|
109
|
-
|
392
|
+
|
110
|
-
|
111
|
-
"
|
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
|
-
|
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に変更
test
CHANGED
File without changes
|
test
CHANGED
@@ -136,7 +136,7 @@
|
|
136
136
|
|
137
137
|
以下のように設定し、それぞれのf1スコアを見れるようにしました。
|
138
138
|
|
139
|
-
![イメージ説明](9
|
139
|
+
![イメージ説明](f23479055923564b1783c29e366ceac9.png)
|
140
140
|
|
141
141
|
![イメージ説明](d5de6b2ddea48fe71d302bc01a0a8a2e.png)
|
142
142
|
|
3
f1スコア
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
修正
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に置いてある未知データの精度が悪いと言うことが起こってしまっています。学習データに対するアウトプットは、
|
141
|
+
が、結局学習データ、評価データ、テストデータの精度がいいのに、SIGNATEに置いてある未知データの精度が悪いと言うことが起こってしまっています。学習データに対するアウトプットは、未知データに対するoutputは、0.5~0.6程のf1値なので困っています。
|
142
|
+
|
143
|
+
一応この後に、学習データを増すためにテストデータと学習データにわけて訓練してますが、そこでのテストデータのf1-measureは、0.8ほどとなっています。
|
142
144
|
|
143
145
|
|
144
146
|
|
1
少し変更
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
|
|