데이터 청년 캠퍼스/분류(결정트리, 앙상블)
[분류] 신용카드 사기 거래 검출 실습
뚱뚜루뚱
2022. 7. 13. 12:18
신용카드 사기 거래 검출 실습1
1. 데이터 불러오기
from google.colab import drive
drive.mount("/content/drive")
creditcard = pd.read_csv('/content/drive/My Drive/Colab Notebooks/결정트리, 분류/data/신용카드사기검출/creditcard.csv')
2. 데이터 확인하기
creditcard.head()
creditcard.info()
creditcard.Class.value_counts() # 0: 정상거래 1: 비정상거래
신용카드 사기 거래를 검출하기 위해서는 TP / FN / FP / TN 중 비정상 사기 거래인데 정상이라고 판단하는 FN가 중요하다. 따라서 재현율을 계산하는 것이 중요하다.
3. RandomForest 분류 모델 생성하고 예측, 평가하기
# 필요한 라이브러리 가져오기
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
# 랜덤포레스트 모델 생성하기
rf_clf = RandomForestClassifier(n_estimators=300, max_depth=5, n_jobs=-1)
# 데이터를 X, y, train, test로 분류하기
X_card = creditcard.drop('Class', axis=1)
y_card = creditcard.Class
X_train, X_test, y_train, y_test = train_test_split(X_card, y_card, test_size=0.3, random_state=0)
# 모델 학습 후 예측 평가하기
rf_clf.fit(X_train, y_train)
rf_clf.score(X_test, y_test)
4. 모델의 다양한 평가 방법
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix, roc_auc_score
def print_eval_results(target, pred):
print('Accuracy(정확도):', round(accuracy_score(target, pred), 3))
print('Precision(정밀도):', round(precision_score(target, pred), 3))
print('Recall(재현율):{0:.3f}'.format(recall_score(target, pred), 3))
print('F1 Score:', round(f1_score(target, pred), 3))
print('AUC:', round(roc_auc_score(target, pred), 3))
print('Confusion Matrix(오차행렬)\n:', confusion_matrix(target, pred))
print_eval_results(y_test, rf_clf.predict(X_test)) #TP: 85289, FN: 7, FP: 43, TN: 104
5. DecisionTree, SVC, Xgboost 분류 모델 생성하고 예측하기
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC
import xgboost
from xgboost import XGBClassifier
dt = DecisionTreeClassifier(max_depth = 3)
svm = SVC()
xgb = XGBClassifier(n_estimators = 300, learning_rate = 0.1, max_depth = 4, n_jobs = -1)
dt.fit(X_train, y_train)
svm.fit(X_train, y_train)
xgb.fit(X_train, y_train)
6. 모델 평가하기
print('---DecisionTree---')
print(print_eval_results(y_test, dt.predict(X_test)))
print('---SVM---')
print(print_eval_results(y_test, svm.predict(X_test)))
print('---XGBoost---')
print(print_eval_results(y_test, xgb.predict(X_test)))
신용카드 사기 거래 검출 실습2: 전처리 수행
1. 히스토그래프를 통해 Amount Column 살펴보기
creditcard.Amount.plot(kind='hist', bins=100)
2. Outlier를 처리하기 위한 함수 생성하기
def get_outlier(df, column, weight):
data = df[df.Class != 1)[column] #Class가 1이 아닌 데이터 중 인자로 받은 column 데이터만 선택
q25 = data.quantile(0.25)
q75 = data.quantile(0.75)
iqr = q75 - q25
iqr_weight = iqr * weight #weight가 커질수록 outlier로 판단되는 값 감소, 작아질수록 증가
lowest = q25 - iqr_weight
highest = q75 + iqr_weight
outlier_index = data[(data < lowest) | (data > highest)].index
return outlier_index
3. Outlier 처리할 Column 선택하기
# 1. Class column과 가장 밀접한 연관이 있는 column 선택
corr = creditcard.corr()
import seaborn as sns
import matplotlib.pyplot as plt
plt.figure(figsize=(9,9))
sns.heatmap(corr, cmap = 'RdBu')
print(corr['Class'].sort_values())
# 2. 프로토타이핑한 모델에서 피처의 중요도를 보고, 중요도가 높은 컬럼 선택
pd.DataFrame(rf_clf.feature_importances_, index=X_card.columns).sort_values(by=0, ascending=False)
4. 전처리 수행 함수 생성하기
from sklearn.preprocessing import StandardScaler
import numpy as np
sc = StandardScaler()
def get_preprocessed_df(df):
df_copy = df.copy()
# 전처리1: Time 컬럼 삭제
df_copy.drop('Time', axis=1, inplace=True)
# 전처리2: Amount
#df_copy.Amount = sc.fit_transform(df_copy.Amount.values.reshape(-1,1))
df_copy.Amount = np.log1p(df_copy.Amount)
# 전처리3: Outlier 제거
outlier_index = get_outlier(df_copy, 'V17', 1.5)
df_copy.drop(outlier_index, axis=0, inplace=True)
return df_copy
5. 전처리한 데이터로 모델 학습 후 평가하기
# 데이터 전처리
preprocessed_card = get_preprocessed_df(creditcard)
preprocessed_card
# 데이터 분할
X_card = preprocessed_card.drop('Class', axis=1)
y_card = preprocessed_card.Class
X_train, X_test, y_train, y_test = train_test_split(X_card, y_card, test_size=0.3, random_state=0)
# 패키지, 라이브러리 설치
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC
import xgboost
from xgboost import XGBClassifier
# 모델 생성
dt = DecisionTreeClassifier(max_depth = 3)
svm = SVC()
rf = RandomForestClassifier(n_estimators=300, n_jobs=-1)
xgb = XGBClassifier(n_estimators = 300, learning_rate = 0.1, max_depth = 4, n_jobs = -1)
# 모델 학습
dt.fit(X_train, y_train)
svm.fit(X_train, y_train)
rf.fit(X_train, y_train)
xgb.fit(X_train, y_train)
# 모델 평가
print('---DecisionTree---')
print(print_eval_results(y_test, dt.predict(X_test)))
print('---SVM---')
print(print_eval_results(y_test, svm.predict(X_test)))
print('---RandomForest---')
print(print_eval_results(y_test, rf.predict(X_test)))
print('---XGBoost---')
print(print_eval_results(y_test, xgb.predict(X_test)))
신용카드 사기 거래 검출 실습3: Over Sampling - SMOTE
1. 필요한 패키지, 라이브러리 불러오기
!pip install imbalanced-learn
from imblearn.over_sampling import SMOTE
smote = SMOTE(random_state=100)
2. Over Sampling한 데이터로 모델 학습 후 평가하기
# SMOTE: train 데이터에만 적용
X_train_over, y_train_over = smote.fit_resample(X_train, y_train)
y_train_over.value_counts()
# 패키지, 라이브러리 설치
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC
import xgboost
from xgboost import XGBClassifier
# 모델 생성
dt = DecisionTreeClassifier(max_depth = 3)
svm = SVC()
rf = RandomForestClassifier(n_estimators=300, n_jobs=-1)
xgb = XGBClassifier(n_estimators = 300, learning_rate = 0.1, max_depth = 4, n_jobs = -1)
# 모델 학습
dt.fit(X_train, y_train)
svm.fit(X_train, y_train)
rf.fit(X_train, y_train)
xgb.fit(X_train, y_train)
# 모델 평가
print('---DecisionTree---')
print(print_eval_results(y_test, dt.predict(X_test)))
print('---SVM---')
print(print_eval_results(y_test, svm.predict(X_test)))
print('---RandomForest---')
print(print_eval_results(y_test, rf.predict(X_test)))
print('---XGBoost---')
print(print_eval_results(y_test, xgb.predict(X_test)))