Posted at

Adversarial Validationについてメモ


概要

Adversarial Validationとは、学習データとテストデータが大きく異なる場合、

学習データをそのまま使ってもいい検証結果が得られないから、

テストデータに似た学習データを作ろうという手法みたいです。


元ネタ

http://fastml.com/adversarial-validation-part-one/

http://fastml.com/adversarial-validation-part-two/


手順

取り込んだ学習データとテストデータが判別できるラベルを追加します。

train = pd.DataFrame({'A': [1,2,3,4,5,6,7,8,9,10]})

test = pd.DataFrame({'A': [100,200,300,400,3,1,200]})

train['TARGET'] = 1
test['TARGET'] = 0

学習データとテストデータをくっつけます。

data = pd.concat(( train, test ))

x = data.drop( [ 'TARGET' ], axis = 1 )
y = data.TARGET

データを分割します。

from sklearn.model_selection import train_test_split

num_train = 5
x_train, x_test, y_train, y_test = train_test_split( x, y, train_size = num_train )

作成した、テストデータと検証データで、分類モデルを作成、評価します。


from sklearn.ensemble import RandomForestClassifier

clf = RandomForestClassifier(random_state=0)
clf = clf.fit(x_train, y_train)

yy = clf.predict(x_train)

テストデータに似ているスコアでソートします

y_sorted = np.sort(yy, axis=0)

plt.plot(y_sorted)

x_sorted = np.sort(x_train, axis=0)

plt.plot(x_sorted)

ソートしたデータから60%を学習データとして使用します。

sixty = int(num_train * .6)

sixty = num_train - sixty
thresh = x_sorted[sixty, 0] #このグラフだと200とかになりました
# threshより大きい値を学習データにする

以上、Adversarial Validationの考え方のメモです。

分類モデルはCNNや、他のアルゴリズムでも問題ないです。

KaggleでPublic LBとLocalCVの結果が大幅に違う場合、試してみる価値ありかと。

めっちゃわかりやすい記事ありました!

https://blog.amedama.jp/entry/adversarial-validation