๐ ๊ณต๋ถํ๋ ์ง์ง์ํ์นด๋ ์ฒ์์ด์ง?
[Kaggle] Credit Card Anomaly Detection ๋ณธ๋ฌธ
[Kaggle] Credit Card Anomaly Detection
์ง์ง์ํ์นด 2022. 11. 2. 11:23221102 ์์ฑ
<๋ณธ ๋ธ๋ก๊ทธ๋ kaggle์ ysjang0926๋์ notebook ์ ์ฐธ๊ณ ํด์ ๊ณต๋ถํ๋ฉฐ ์์ฑํ์์ต๋๋ค>
https://www.kaggle.com/code/ysjang0926/kor-introduction-to-anomaly-detection-r01/notebook
[kor]Introduction to Anomaly Detection_r01
Explore and run machine learning code with Kaggle Notebooks | Using data from Credit Card Fraud Detection
www.kaggle.com
๐ ์ ์ฉ ์นด๋ ์ฌ๊ธฐ ๊ฐ์ง
: ์ ์ฉ ์นด๋ ํ์ฌ๋ ์ฌ๊ธฐ์ฑ ์ ์ฉ ์นด๋ ๊ฑฐ๋๋ฅผ ์ธ์ํ์ฌ ๊ณ ๊ฐ์ด ๊ตฌ๋งคํ์ง ์์ ํญ๋ชฉ์ ๋ํด ์๊ธ์ ์ฒญ๊ตฌํ์ง ์๋๋ก ํ๋ ๊ฒ์ด ์ค์
- Dataset
: ์ ๋ฝ ์นด๋ ์์ง์๊ฐ 2013๋ 9์์ ์ ์ฉ ์นด๋๋ก ๊ฑฐ๋ํ ๋ด์ฉ์ด ํฌํจ๋จ
: 284,807๊ฑด์ ๊ฑฐ๋ ์ค 492๊ฑด์ ์ฌ๊ธฐ๊ฐ ๋ฐ์ํ ์ดํ ๋์ ๋ฐ์ํ ๊ฑฐ๋
: ๋ฐ์ดํฐ ์ธํธ๋ ๋งค์ฐ ๋ถ๊ท ํ์ ์ด๋ฉฐ ๊ธ์ ์ ํด๋์ค(์ฌ๊ธฐ)๋ ๋ชจ๋ ๊ฑฐ๋์ 0.172%๋ฅผ ์ฐจ์ง
: PCA ๋ณํ์ ๊ฒฐ๊ณผ์ธ ์ซ์ ์ ๋ ฅ ๋ณ์๋ง ํฌํจ๋จ
: ๊ธฐ๋ฅ V1, V2, … V28์ PCA๋ก ์ป์ ์ฃผ์ ๊ตฌ์ฑ ์์์ด๋ฉฐ PCA๋ก ๋ณํ๋์ง ์์ ์ ์ผํ ๊ธฐ๋ฅ์ '์๊ฐ'๊ณผ '์'
: '์๊ฐ'์๋ ๊ฐ ํธ๋์ญ์
๊ณผ ๋ฐ์ดํฐ ์ธํธ์ ์ฒซ ๋ฒ์งธ ํธ๋์ญ์
์ฌ์ด์ ๊ฒฝ๊ณผ๋ ์๊ฐ(์ด)์ด ํฌํจ
: 'Amount' ๊ธฐ๋ฅ์ ๊ฑฐ๋ ๊ธ์ก์ด๋ฉฐ, ์ด ๊ธฐ๋ฅ์ ์์ ์ข
์ ๋น์ฉ์ ๋ฏผ๊ฐํ ํ์ต์ ์ฌ์ฉ
: 'Class'๋ ์๋ต ๋ณ์์ด๋ฉฐ ์ฌ๊ธฐ์ ๊ฒฝ์ฐ ๊ฐ 1์ ์ทจํ๊ณ ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ 0์ ์ทจํจ
: ํด๋์ค ๋ถ๊ท ํ ๋น์จ์ด ์ฃผ์ด์ง๋ฉด AUPRC(์ ๋ฐ๋ ์ฌํ์จ ๊ณก์ ์๋ ์์ญ)๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋๋ฅผ ์ธก์
- ์ด์์น
- Anomaly
: ๋๋ถ๋ถ์ ๋ฐ์ดํฐ์ ๋ณธ์ง์ ์ธ ํน์ฑ์ด ๋ค๋ฅด๋ฉฐ, ๊ธฐ์กด ๋ถํฌ์์ ๋ฉ๋ฆฌ ๋จ์ด์ ธ ์์ด ์ ํ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์์ฑ๋์์ ๊ฒ์ผ๋ก ์ถ์ ๋๋ ๊ด์ธก์น
: ๋ค๋ฅธ ๋งค์ปค๋์ฆ์ ์ํด ๋ฐ์๋ ๊ฒ์ฒ๋ผ ๋ค๋ฅธ ๊ด์ธก์น์๋ ๋งค์ฐ ๋ค๋ฅธ ๊ด์ธก์น
- Novelty
: ๋ณธ์ง์ ์ธ ๋ฐ์ดํฐ๋ ๊ฐ์ง๋ง ์ ํ์ด ๋ค๋ฅธ ๊ด์ธก์น
: ๋ฐ์ดํฐ์์ ์ด์ ์ ๊ด์ฐฐ๋์ง ์์ ์๋ก์ด ํจํด์ ๊ฐ์ง ๊ด์ธก์น
: Novelty ๋ฐ์ดํฐ๋ Anomaly๋ก ๊ฐ์ฃผ๋์ง ์๊ณ Normal ๋ฐ์ดํฐ ๋ฒ์ฃผ๋ก ํฌํจ๋๊ธฐ ๋๋ฌธ์ ์ฐจ์ด๊ฐ ์์
- Outlier
: ๋ฐ์ดํฐ์ ์ ์ฒด์ ์ธ ํจํด์์ ๋ฒ์ด๋ ๊ด์ธก์น
: ๋ฐ์ดํฐ๊ฐ ์๊ณ์ด์ด๋ ์๋๋๋ก ๊ตฌ๋ถ๋ฉ๋๋ค. (์๊ฐ๊ณผ์ ๊ด๊ณ ์ฌ๋ถ)
- Anomaly : ์๊ฐ ๋๋ ์์๊ฐ ์๋ ํ๋ฆ์ ๋ฐ๋ฅธ ํจํด์ด ๋ณดํธ์ ์ธ ํจํด๋ค๊ณผ ๋ค๋ฅธ ๊ด์ธก์น
- Outlier : ์๊ฐ๊ณผ ๊ด๋ จ ์์ด ๋์์ ํํํ๋ ๊ด์ธก์น๋ค์ ์์น๋ฅผ ๋ณด๊ณ ๋ณดํธ์ ์ธ ํจํด๊ณผ ๋ฒ์ด๋ ๊ด์ธก์น
๐ ์ฝ๋ ๊ตฌํ
1. Data load
from keras.layers import Input, Dense
from keras.models import Model, Sequential
from keras import regularizers
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report, accuracy_score
from sklearn.manifold import TSNE
from sklearn import preprocessing
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import seaborn as sns
sns.set(style="whitegrid")
np.random.seed(203)
data = pd.read_csv("creditcard.csv")
data.head()
- Time : ์ด ํธ๋์ญ์ ๊ณผ ๋ฐ์ดํฐ์ธํธ์ ์ฒซ ๋ฒ์งธ ํธ๋์ญ์ ์ฌ์ด์ ๊ฒฝ๊ณผ๋ ์๊ฐ(์ด)
- v1 ~ v28 : ์ฌ์ฉ์ ID ๋ฐ ๋ฏผ๊ฐํ ๊ธฐ๋ฅ์ ๋ณดํธํ๊ธฐ ์ํ PCA ์ฐจ์ ์ถ์(v1-v28)์ ๊ฒฐ๊ณผ
- Amount : ๊ฑฐ๋ ๊ธ์ก- Class : Target ๋ณ์(0: ์ ์, 1: ๋น์ ์)
- ์ด 284,807๊ฑด์ ๊ฑฐ๋๋ด์ญ์ด ์ ๊ณต
- ์ฌ๊ธฐ ๊ฑฐ๋(Fraud Transaction)๋ 492๊ฑด
colors = ["#0101DF", "#DF0101"]
LABELS = ["Non-Fraud", "Fraud"]
sns.countplot('Class', data=data, palette=colors)
plt.title('Class Distribution \n (0 : Non-Fraud / 1 : Fraud)', fontsize=13)
plt.xticks(range(2), LABELS)
plt.xlabel("Class")
plt.ylabel("Frequency");
vc = data['Class'].value_counts().to_frame().reset_index()
vc['percent'] = vc["Class"].apply(lambda x : round(100*float(x) / len(data), 2))
vc = vc.rename(columns = {"index" : "Target", "Class" : "Count"})
vc
- amount์ time ๋ถํฌ
fig, ax = plt.subplots(1, 2, figsize=(18,4))
amount_val = data['Amount'].values
time_val = data['Time'].values
sns.distplot(amount_val, ax=ax[0], color='r')
ax[0].set_title('Distribution of Transaction Amount', fontsize=14)
ax[0].set_xlim([min(amount_val), max(amount_val)])
sns.distplot(time_val, ax=ax[1], color='b')
ax[1].set_title('Distribution of Transaction Time', fontsize=14)
ax[1].set_xlim([min(time_val), max(time_val)])
2. ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ
- ๊ฐ์ฅ ํฐ ๋ฌธ์ ์ค ํ๋๋ ์ฌ๊ธฐ ๊ฑฐ๋๊ฐ 0.17%์ ๋ถ๊ณผํ๊ธฐ ๋๋ฌธ์ ๋์์ ๋ถ๊ท ํ์ด ๋งค์ฐ ํฌ๋ค๋ ์ - non-fraud ๊ฑฐ๋๋ด์ญ์ 1,000ํ๋ง ์ฌ์ฉ
non_fraud = data[data['Class'] == 0].sample(1000)
fraud = data[data['Class'] == 1]
df = non_fraud.append(fraud).sample(frac=1).reset_index(drop=True)
X = df.drop(['Class'], axis = 1).values
Y = df["Class"].values
3. ์๊ฐํ
- t-SNE(t-Distributed Stochastic Neighbor Embedding)๋?
- ๋์ ์ฐจ์์ ๋ณต์กํ ๋ฐ์ดํฐ๋ฅผ 2์ฐจ์์ ์ฐจ์ ์ถ์ํ๋ ๋ฐฉ๋ฒ
- ๊ณ ์ฐจ์ ๋ฐ์ดํฐ์ ์๊ฐํ์ ์ฉ์ดํ๊ฒ ์ฌ์ฉ๋๋ฉฐ ์ฐจ์ ์ถ์ํ ๋๋ ๋น์ทํ ๊ตฌ์กฐ๋ผ๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฆฌํ ์ํ์ด๋ฏ๋ก ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ดํด
- ๊ณ ์ฐจ์ ๊ณต๊ฐ์์์ ๊ฐ ๋ฐ์ดํฐ ํฌ์ธํธ ์ฃผ๋ณ์ผ๋ก ์ ์ฌ๋๋ฅผ ๊ณ์ฐํ์ฌ, ๊ฐ ๋ฐ์ดํฐ ํฌ์ธํธ๋ฅผ 2์ฐจ์์์ ์๋ณธ ํน์ฑ ๊ณต๊ฐ์์ ๋น์ทํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ๊ฐ๊น๊ฒ ๋น์ทํ์ง ์์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ๋ฉ๋ฆฌ ๋จ์ด์ง๊ฒ ๋ง๋๋ฉฐ, ์ฆ ์ด์ ๋ฐ์ดํฐ ํฌ์ธํธ์ ๋ํ ์ ๋ณด๋ฅผ ๋ณด์กดํ๋ ค๊ณ ๋ ธ๋ ฅ
- PCA์ ์ฐจ์ด์
- PCA๋ linearํ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ง๋ง, t-SNE๋ ๋น์ ํ์ ์ธ ๋ฐฉ๋ฒ์ ์ฐจ์์ถ์ ๋ฐฉ๋ฒ
- PCA : ๊ณต๋ถ์ฐ ํ๋ ฌ์์ ๊ณ ์ ๋ฒกํฐ๋ฅผ ๊ณ์ฐ
- t-SNE : ๊ณ ์ฐจ์ ๊ณต๊ฐ์์์ ์ ๋ค์ ์ ์ฌ์ฑ๊ณผ ๊ทธ์ ํด๋นํ๋ ์ ์ฐจ์ ๊ณต๊ฐ์์์ ์ ๋ค์ ์ ์ฌ์ฑ์ ๊ณ์ฐ
- t-SNE๋ input feature๋ฅผ ํ์ธํ๊ธฐ ์ด๋ ต๊ธฐ ๋๋ฌธ์ t-SNE ๊ฒฐ๊ณผ๋ง ๊ฐ์ง๊ณ ๋ฌด์ธ๊ฐ๋ฅผ ์ถ๋ก ํ๊ธฐ ์ด๋ ค์ (t-SNE๋ ์ฃผ๋ก ์๊ฐํ ํด๋ก ์ฌ์ฉ)
- t-SNE ๊ตฌํ๋ ๋ฐฉ๋ฒ
- ๊ฐ ๋ฐ์ดํฐ ํฌ์ธํธ ์ฃผ๋ณ์ผ๋ก ์ ์ฌ๋๋ฅผ ๊ตฌํด ํด๋ฌ์คํฐ๋ฅผ ๋ง๋ฆ
- ๊ด์ฌ ๋ฐ์ดํฐ ํฌ์ธํธ๋ฅผ ํ๋ ์ก๊ณ , ๊ทธ ๊ฐ์ ํ๊ท ์ผ๋ก ๊ฐ๋ ์ ๊ท๋ถํฌ๊ทธ๋ํ๋ฅผ ๊ทธ๋ฆผ
- → ์ฃผ๋ณ์ ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ(๊ฐ์ ํด๋ฌ์คํฐ) ์ ์ฌ๋๊ฐ ๋๊ฒ ๋์ค๊ณ ,(์ ๊ท๋ถํฌ์ ํ๋ฅ ๊ฐ) ๋จผ ๋ฐ์ดํฐ๋ ์ ์ฌ๋๊ฐ ๋ฎ์
- ๋ชจ๋ ๋ฐ์ดํฐ ํฌ์ธํธ์ ๋ํ ์ ์ฌ๋๋ฅผ ๊ทธ๋ ค, ์๊ด๊ณ์๊ทธ๋ํ์ฒ๋ผ ๋์ดํจ
- → ๊ฐ์ ํด๋ฌ์คํฐ๋ ๋์ ์ ์ฌ๋๋ฅผ ์ง๋
- ์์๋ก ๋ฎ์ ์ฐจ์์ผ๋ก ๋ฐ์ดํฐ ํฌ์ธํธ๋ฅผ ์ฌ์์ํค๊ณ , ๋ฐ์ดํฐ๋ง๋ค ์ ์ฌ๋๋ฅผ ๊ณ์ฐํจ.(์ ๊ท๋ถํฌ๋ก ํ๋ฏ์ด)
- t๋ถํฌ๋ฅผ ๋์ ์ฌ์ฉํ๋๋ฐ, ๊ทธ๋์ t-sne์
- t-๋ถํฌ๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋, ํด๋ฌ์คํฐ๋ค์ ์ข๋ ์ฑ๊ธฐ๊ฒ ๋ถํฌ์ํค๊ธฐ ์ํจ
def tsne_plot(x1, y1, name="graph.png"):
tsne = TSNE(n_components=2, random_state=0)
X_t = tsne.fit_transform(x1)
plt.figure(figsize=(12, 8))
plt.scatter(X_t[np.where(y1 == 0), 0], X_t[np.where(y1 == 0), 1], marker='o', color='g', alpha=0.8, label='Non Fraud')
plt.scatter(X_t[np.where(y1 == 1), 0], X_t[np.where(y1 == 1), 1], marker='o', color='r', alpha=0.8, label='Fraud')
plt.legend(loc='best');
plt.show();
- ๋ชจ๋ ์ ์ ๊ฑฐ๋(transaction)๋ฅผ ๋ํ๋ด๋ฉฐ, Non-Fraud(๋น์ฌ๊ธฐ) ๊ฑฐ๋๋ ๋ น์์ผ๋ก ํ์๋๊ณ Fraud(์ฌ๊ธฐ) ๊ฑฐ๋๋ ๋นจ๊ฐ์์ผ๋ก ํ์
- ๋ ์ถ์ tsne์ ์ํด ์ถ์ถ๋ ์ฑ๋ถ
tsne_plot(X, Y, "original.png")
4. AutoEncoder
- Autoencoder๋ ์ถ๋ ฅ์ด ์ ๋ ฅ๊ณผ ๋์ผํ ํน์ํ ์ ํ์ ์ ๊ฒฝ๋ง(neural network) ์ํคํ ์ฒ
- ์ ๋ ฅ ๋ฐ์ดํฐ์ ๊ทนํ ๋ฎ์ level์ ํ์ตํ๊ธฐ ์ํด unsupervised ๋ฐฉ์์ผ๋ก ํ๋ จ๋๋ฉฐ, ๊ทธ๋ฐ ๋ค์ ์ด๋ฌํ ๋ฎ์ level์ ๊ธฐ๋ฅ์ ์ค์ ๋ฐ์ดํฐ๋ฅผ ํฌ์ํ๊ธฐ ์ํด ๋ค์ ๋ณํ
- ์ ๋ ฅ์ ๊ทธ๋๋ก ์ถ๋ ฅ(๋ณต์)ํด๋ด๋๋ก ํ๋ ๋ชฉ์ ํจ์๋ฅผ ๊ฐ๋ ํญ๋ฑ ํจ์(identity function) ๋ชจ๋ธ๋ง
- ์ ๋ ฅ๋ ๋ฐ์ดํฐ์ ํน์ฑ์ ์์ฝํ๋ Encoder(์ธ์ฝ๋)
- ์์ฝ๋ ์ ๋ณด๋ฅผ ๋ณต์ํ๋ Decoder(๋์ฝ๋)
=> ์ ๋ ฅ๊ฐ์ ๋ต์ผ๋ก ์ฃผ๊ธฐ ๋๋ฌธ์ ์ค์ค๋ก ํ์ต์ ํ๋ค๊ณ ํด์ ์๊ธฐ์ง๋ํ์ต
- ๊ฐ์ : ์ ์ ๊ด์ธก์น๋ค์ ๋ถ๋ ๊ด์ธก์น๋ณด๋ค ๋ ์ ๋ณต์๋ ๊ฒ
- ์ฐจ์์ด ์ถ์๋๋ ๋ถ๋ถ์ Bottlenect(์ ์ฌ๋ฒกํฐ)์ด๋ผ๊ณ ํ๋ฉฐ, Autoencoder๋ z ๋ถ๋ถ์ ํจ๊ณผ์ ์ผ๋ก ํ์ตํ๋ ๊ฒ์ด ๋ชฉ์
- MSE ์์ค ํจ์๋ฅผ ์ฌ์ฉํ๋ฉฐ, ์ค๊ฐ์ ์์นํ ๋ช ๊ฐ์ ๋ด๋ฐ์ ๋ณ๋ชฉ(bottle-neck) ํ์์ด ์ฌํ์ฌ Decoder์์ ์๋ ์ ๋ ฅ์ ์ฌ์์ฐํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ์ ์ฐจ์ ์ฝ๋๋ก ์ ๋ ฅ์ ์์ถํ๋ ํจ๊ณผ์ ์ธ ํํ์ ์์ฑํด์ผํจ
- ๊ณ ์ฐจ์ ๊ณต๊ฐ ์์ ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ์ ์ฐจ์์ ๊ณต๊ฐ์ผ๋ก ๋งตํ(mapping)ํ์ฌ ์ ์ฌ์ ์ธ ๋ณ์๋ก ํํ(latent representation)ํ์๋ค๊ฐ, ๋ค์ ์ ๋ ฅ๊ณผ ๊ฐ์ ๊ณ ์ฐจ์์ ๊ณต๊ฐ์ผ๋ก ๋ณต์ํด์ผ ํจ
- ๋ฐ์ดํฐ๊ฐ ์ ๋ณต์๋ ๊ฒฝ์ฐ ์ ์ฐจ์์ ๋ฐ์ดํฐ ํน์ฑ ๊ณต๊ฐ์ ์ ํ์ ํ๋ค๊ณ ๋ณผ ์ ์์
===> Autoencoder๋ ์ ๋ ฅ ๋ฐ์ดํฐ์ ๋ณต์๋ ๋ฐ์ดํฐ ์ฌ์ด์ ์ฐจ์ด(์ฌ๊ตฌ์ถ ์ค์ฐจ, Reconstruction Error)๋ฅผ ๊ณ์ฐํ์ฌ ์ด์์น๋ฅผ ํ์ง
- 1) Autoencoder๋ ์ด๋ค ๋ฐ์ดํฐ์ ์ ๋ ฅ์ ๋ฐ์ ํ, ์ ๋ณด๋ฅผ ์์ถ์์ผฐ๋ค๊ฐ ๋ค์ ํ์ฅํ๋ฉฐ ์ ๋ ฅ๋ฐ์ ๊ฒ๊ณผ ์ต๋ํ ๋น์ทํ ๊ฒฐ๊ณผ๊ฐ์ ๋ฐํํ๋ '์ฌ๊ตฌ์ฑ'์ ๋ฐฉ๋ฒ์ ํตํด ํน์ ๋ฐ์ดํฐ์ ํจํด์ ์ธ์ฝ๋ฉํจ
- 2) ์ ์ฉ์นด๋ ๊ฑฐ๋ ๋ฐ์ดํฐ์ ์ ๋๋ถ๋ถ ์ ์ ๊ฑฐ๋ ๋ฐ์ดํฐ๋ก ์ด๋ฃจ์ด์ ธ ์์ผ๋ฉฐ, ์ด์ ๊ฑฐ๋ ๋ฐ์ดํฐ๋ ์ ๊ฒ ํฌํจ๋์ด ์๋ ๋ถ๊ท ํํ ๋ฐ์ดํฐ์ ์
- 3) Autoencoder ๋ชจ๋ธ์ ์ ์ ๊ฑฐ๋ ๋ฐ์ดํฐ๋ง์ผ๋ก ํ์ต์ํค๋ฉด ์ด์ ๊ฑฐ๋ ๋ฐ์ดํฐ๊ฐ ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ ๊ฒฝ์ฐ์๋ ์ฌ๊ตฌ์ฑ์ด ์ ์ ๋๋๋ฐ, ์ด ์๋ฆฌ๋ฅผ ํ์ฉํด ์ ์ฉ์นด๋ ์ด์ ๊ฑฐ๋๋ฅผ ํ์งํจ
## input layer
input_layer = Input(shape=(X.shape[1],))
## encoding part
encoded = Dense(100, activation='tanh', activity_regularizer=regularizers.l1(10e-5))(input_layer)
encoded = Dense(50, activation='relu')(encoded)
## decoding part
decoded = Dense(50, activation='tanh')(encoded)
decoded = Dense(100, activation='tanh')(decoded)
## output layer
output_layer = Dense(X.shape[1], activation='relu')(decoded)
- Network์ ๊ตฌ์กฐ(๋ด๋ฐ์)๋ input → 100 → 50 → 50 → 100 → input์ผ๋ก, ๊ฐ์ด๋ฐ(Bottle-neck Layer) Dimension์ด 50์
- ์๊ฐํํ๋ ๊ณผ์ ์์ ์ด๋ฅผ ๋ค์ 2์ฐจ์์ผ๋ก t-SNE๋ฅผ ํ์ฉํ์ฌ ์ถ์ํ๊ณ ์๊ฐํํจ
autoencoder = Model(input_layer, output_layer)
# adadelta : Adagrad, RMSprop, Momentum ๋ชจ๋๋ฅผ ํฉ์น ๊ฒฝ์ฌํ๊ฐ๋ฒ
# Adadelta๋ ๊ณผ๊ฑฐ์ ๋ชจ๋ ๊ทธ๋๋์ธํธ๋ฅผ ๋์ ํ๋ ๋์ ๊ทธ๋๋์ธํธ ์
๋ฐ์ดํธ์ ์ด๋ ์ฐฝ์ ๊ธฐ๋ฐ์ผ๋ก ํ์ต๋ฅ ์ ์กฐ์
autoencoder.compile(optimizer="adadelta", loss="mse")
- ๊ฐ ๋ณ์์ ๋ฒ์๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ Min-Max scaling์ ํตํด ์์ค์ ๋ง์ถฐ์ฃผ๋ ์์ ์ ์ํ
x = data.drop(["Class"], axis=1)
y = data["Class"].values
x_scale = preprocessing.MinMaxScaler().fit_transform(x.values)
x_norm, x_fraud = x_scale[y == 0], x_scale[y == 1]
- ๋ชจ๋ธ ํ๋ จ
autoencoder.fit(x_norm[0:2000], x_norm[0:2000],
batch_size = 256, epochs = 10,
shuffle = True, validation_split = 0.20);
- sequential layers์ ํฌํจํ๋ ๋ ๋ค๋ฅธ ๋คํธ์ํฌ๋ฅผ ๋ง๋ค๊ณ , ์ ์ฌ์ ์ธ ๋ณ์๋ก์ ํํ(latent representation)์ด ์กด์ฌํ๋ ์ธ ๋ฒ์งธ layer๊น์ง๋ง ํ๋ จ๋ ๊ฐ์ค์น๋ฅผ ์ถ๊ฐ
hidden_representation = Sequential()
hidden_representation.add(autoencoder.layers[0])
hidden_representation.add(autoencoder.layers[1])
hidden_representation.add(autoencoder.layers[2])
- raw inputs์ ์์ธกํ์ฌ ์ฌ๊ธฐ(Fraud)์ ๋น์ฌ๊ธฐ(Non-Fraud)๋ผ๋ ๋ ๊ฐ์ง ํด๋์ค์ ๋ํ ์จ๊ฒจ์ง ํํ์ ์์ฑ
norm_hid_rep = hidden_representation.predict(x_norm[:3000])
fraud_hid_rep = hidden_representation.predict(x_fraud)
- ์ฌ๊ธฐ(Fraud)์ ๋น์ฌ๊ธฐ(Non-Fraud) ๊ฑฐ๋๊ฐ ๊ฐ์์ (visible)์ด๊ณ ์ ํ์ ์ผ๋ก(linearly) ๋ถ๋ฆฌํ ์ ์์์ ์ ์ ์์
rep_x = np.append(norm_hid_rep, fraud_hid_rep, axis = 0)
y_n = np.zeros(norm_hid_rep.shape[0])
y_f = np.ones(fraud_hid_rep.shape[0])
rep_y = np.append(y_n, y_f)
tsne_plot(rep_x, rep_y, "latent_representation.png")
5. Simple Linear Classifier
train_x, val_x, train_y, val_y = train_test_split(rep_x, rep_y, test_size=0.25)
clf = LogisticRegression(solver="lbfgs").fit(train_x, train_y)
pred_y = clf.predict(val_x)
print ("Classification Report: ")
print (classification_report(val_y, pred_y))
print ("")
print('Logistic Regression Accuracy Score: ', round(accuracy_score(val_y, pred_y) * 100, 3).astype(str) + '%')
- ์ด 873๊ฑด์ Test Set ์ค Non-Fraud๋ 742๊ฑด & Fraud๋ 114๊ฑด
- Fraud๋ 129๊ฑด ์ค 114๊ฑด์ ๋ง์ถ๊ณ 16๊ฑด์ ํ๋ฆฐ ๊ฒ์ ํ์ธ
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay
cm = confusion_matrix(y_pred=pred_y, y_true=val_y)
cmp = ConfusionMatrixDisplay(cm)
cmp.plot(cmap=plt.cm.Blues)
'๐ฉโ๐ป ์ปดํจํฐ ๊ตฌ์กฐ > Kaggle' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Kaggle] Best Book to Read in 2021 ํ์์ ๋ฐ์ดํฐ ๋ถ์ (plotly ์๊ฐํ) (0) | 2022.11.11 |
---|---|
[Kaggle]Pneumonia/Normal Classification(CNN) (0) | 2022.03.20 |
[Kaggle]Super Image Resolution_๊ณ ํ์ง ์ด๋ฏธ์ง ๋ง๋ค๊ธฐ (0) | 2022.02.07 |
[Kaggle] CNN Architectures (0) | 2022.02.04 |
[Kaggle] HeartAttack ์์ธก (0) | 2022.01.31 |