質問編集履歴
7
optunaからベイズ最適化に変更
title
CHANGED
File without changes
|
body
CHANGED
@@ -126,7 +126,7 @@
|
|
126
126
|
```
|
127
127
|
|
128
128
|
|
129
|
-
###
|
129
|
+
###ベイズ最適化(optunaから修正)を使用して学習
|
130
130
|
```python
|
131
131
|
|
132
132
|
#空のレイヤー作成
|
6
正則化した場合の出力を追加。
title
CHANGED
File without changes
|
body
CHANGED
@@ -292,10 +292,19 @@
|
|
292
292
|
|
293
293
|
##--------------------------------追記-------------------------------------
|
294
294
|
以下のように設定し、それぞれのf1スコアを見れるようにしました。
|
295
|
+
###オーバーサンプリング
|
295
296
|

|
296
297
|

|
297
298
|
一番上が、ほとんど0.8台ですが、これでえられたハイパーパラメータを使用しても、0.4台のf1-scoreとなりました。
|
298
299
|
|
300
|
+
###アンダーサンプリング
|
301
|
+
後ほど追加
|
302
|
+
|
303
|
+
|
304
|
+
###正則化しただけ(オーバーフィッティング、アンダーサンプリングなし)
|
305
|
+

|
306
|
+

|
307
|
+
|
299
308
|
#####---------------追記終わり---------------
|
300
309
|
|
301
310
|
### 試したこと
|
5
コード全体を記述
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
|
-
|
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(
|
155
|
+
model.add(Dense(10, activation="relu", input_shape=[len(x_train.keys(),)]))
|
29
|
-
for i in range(int(
|
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
|
-
|
169
|
+
score_valid = f1_score(model.predict(x_valid)>i*0.1, y_valid)
|
42
|
-
|
170
|
+
score_test = f1_score(model.predict(x_test)>i*0.1, y_test)
|
43
|
-
|
171
|
+
score_train= f1_score(model.predict(x_train)>i*0.1, y_train)
|
44
172
|
|
45
|
-
|
173
|
+
print("------------------------------")
|
46
|
-
|
174
|
+
print("score_train",score_train,"score_valid:",score_valid,"score_test",score_test)
|
175
|
+
|
176
|
+
|
177
|
+
|
47
|
-
|
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.
|
195
|
+
'lr' : (0.0001, 0.01),
|
54
|
-
"N":(50,
|
196
|
+
"N":(50, 150),
|
55
|
-
"ur":(0, 1),
|
56
|
-
"
|
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
|
-
|
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
|

|
4
orberfittingをunoberfittingに変更
title
CHANGED
File without changes
|
body
CHANGED
@@ -67,7 +67,7 @@
|
|
67
67
|
|
68
68
|
##--------------------------------追記-------------------------------------
|
69
69
|
以下のように設定し、それぞれのf1スコアを見れるようにしました。
|
70
|
-

|
71
71
|

|
72
72
|
一番上が、ほとんど0.8台ですが、これでえられたハイパーパラメータを使用しても、0.4台のf1-scoreとなりました。
|
73
73
|
|
3
f1スコア
title
CHANGED
File without changes
|
body
CHANGED
@@ -65,6 +65,14 @@
|
|
65
65
|
study.res
|
66
66
|
```
|
67
67
|
|
68
|
+
##--------------------------------追記-------------------------------------
|
69
|
+
以下のように設定し、それぞれのf1スコアを見れるようにしました。
|
70
|
+

|
71
|
+

|
72
|
+
一番上が、ほとんど0.8台ですが、これでえられたハイパーパラメータを使用しても、0.4台のf1-scoreとなりました。
|
73
|
+
|
74
|
+
#####---------------追記終わり---------------
|
75
|
+
|
68
76
|
### 試したこと
|
69
77
|
|
70
78
|
xGBoosting、keras、pytorch、その他downsizing、1に重み付け、k-fold等を行いました。
|
2
修正
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に置いてある未知データの精度が悪いと言うことが起こってしまっています。学習データに対するアウトプットは、
|
71
|
+
が、結局学習データ、評価データ、テストデータの精度がいいのに、SIGNATEに置いてある未知データの精度が悪いと言うことが起こってしまっています。学習データに対するアウトプットは、未知データに対するoutputは、0.5~0.6程のf1値なので困っています。
|
72
|
+
一応この後に、学習データを増すためにテストデータと学習データにわけて訓練してますが、そこでのテストデータのf1-measureは、0.8ほどとなっています。
|
72
73
|
|
73
74
|
### 最後に
|
74
75
|
はじめに戻りますが、学習データでの精度がいいのに、未知データの精度が悪い場合、どうやって改善すればいいでしょうか?学習データ、テストデータ、評価データを見てもか学習している感じではないのですが...
|
1
少し変更
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
|
はじめに戻りますが、学習データでの精度がいいのに、未知データの精度が悪い場合、どうやって改善すればいいでしょうか?学習データ、テストデータ、評価データを見てもか学習している感じではないのですが...
|