{"metadata":{"kernelspec":{"display_name":"Python 3 (ipykernel)","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.9.7"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":74571,"databundleVersionId":8671431,"sourceType":"competition"}],"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# !pip install imbalanced-learn","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\nfrom sklearn.linear_model import LogisticRegression\nfrom sklearn.metrics import accuracy_score, precision_score, recall_score, confusion_matrix, f1_score, roc_auc_score\nfrom lightgbm import LGBMClassifier\nfrom imblearn.over_sampling import SMOTE\nimport pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport warnings\nwarnings.filterwarnings(\"ignore\")","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = pd.read_csv(\"/kaggle/input/affel-ds2-credit-card/train.csv\")\ntest = pd.read_csv(\"/kaggle/input/affel-ds2-credit-card/test.csv\")","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.head()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test.head()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 170882 를 기점으로 그 뒤 시점으로 자름\n\ntrain[\"id\"].max(), test[\"id\"].min()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.head()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.info()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train[\"Class\"].value_counts(normalize=True)*100","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_preprocessed_df(df=None, train=True):\n    df_copy = df.copy()\n    amount_n = np.log1p(df_copy[\"Amount\"])\n    df_copy.insert(0, \"Amount_Scaled\", amount_n)\n    df_copy.drop([\"Time\", \"Amount\"], axis=1, inplace=True)\n    \n    outlier_index = get_outlier(df=df_copy, column=\"V14\", weight=1.5)\n    df_copy.drop(outlier_index, axis=0, inplace=True)\n    \n    return df_copy","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 사전 데이터 가공 후 학습과 테스트 데이터 세트를 반환하는 함수\n\ndef get_train_test_dataset(df=None):\n    df_copy = get_preprocessed_df(df)\n    \n    X_features = df_copy.iloc[:, :-1]\n    y_target = df_copy.iloc[:, -1]\n    \n    X_train, X_test, y_train, y_test = train_test_split(X_features, y_target,\n                                                        test_size=0.3, random_state=0, stratify=y_target)\n    \n    return X_train, X_test, y_train, y_test","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 평가 함수\n\ndef get_clf_eval(y_test, pred, pred_proba=None):\n    confusion = confusion_matrix(y_test, pred)\n    accuracy = accuracy_score(y_test, pred)\n    precision = precision_score(y_test, pred)\n    recall = recall_score(y_test, pred)\n    f1 = f1_score(y_test, pred)\n    \n    roc_auc = roc_auc_score(y_test, pred_proba)\n    \n    \n    print(\"오차 행렬\")\n    print(confusion)\n    print(f\"정확도: {accuracy:.4f}, 정밀도: {precision: .4f}, 재현율: {recall: .4f}, f1스코어: {f1:.4f}, roc-auc: {roc_auc:.4f}\")","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_model_train_eval(model, ftr_train=None, ftr_test=None, tgt_train=None, tgt_test=None):\n    model.fit(ftr_train, tgt_train)\n    pred = model.predict(ftr_test)\n    pred_proba = model.predict_proba(ftr_test)[:, 1]\n    get_clf_eval(tgt_test, pred, pred_proba)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_outlier(df=None, column=None, weight=1.5):\n    fraud = df[df[\"Class\"]==1][column]\n    quantile_25 = np.percentile(fraud.values, 25)\n    quantile_75 = np.percentile(fraud.values, 75)\n    \n    iqr = quantile_75 - quantile_25\n    iqr_weight = iqr * weight\n    lowest_val = quantile_25 - iqr_weight\n    highest_val = quantile_75 + iqr_weight\n    \n    outlier_index = fraud[(fraud < lowest_val) | (fraud > highest_val)].index\n    return outlier_index","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train, X_test, y_train, y_test = get_train_test_dataset(train)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"학습 데이터 레이블 값 비율\")\nprint(y_train.value_counts()/y_train.shape[0] * 100)\nprint()\nprint(\"테스트 데이터 레이블 값 비율\")\nprint(y_test.value_counts()/y_test.shape[0] * 100)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"smote = SMOTE(random_state=0)\n\nX_train_over, y_train_over = smote.fit_resample(X_train, y_train)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"SMOTE 적용 전 학습용 피처/레이블 데이터 세트: \", X_train.shape, y_train.shape)\nprint(\"\\nSMOTE 적용 후 학습용 피처/레이블 데이터 세트: \", X_train_over.shape, y_train_over.shape)\nprint(\"\\nSMOTE 적용 후 레이블 값 분포: \\n\", pd.Series(y_train_over).value_counts(normalize=True))","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"lr_clf = LogisticRegression(max_iter=1000)\nlgbm_clf = LGBMClassifier(n_estimators=1000, num_leaves=64, n_jobs=-1, boost_from_average=False)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"get_model_train_eval(model = lr_clf, ftr_train=X_train, ftr_test=X_test, tgt_train=y_train, tgt_test=y_test)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"get_model_train_eval(model = lr_clf, ftr_train=X_train_over, ftr_test=X_test, tgt_train=y_train_over, tgt_test=y_test)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"get_model_train_eval(model = lgbm_clf, ftr_train=X_train, ftr_test=X_test, tgt_train=y_train, tgt_test=y_test)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"get_model_train_eval(model = lgbm_clf, ftr_train=X_train_over, ftr_test=X_test, tgt_train=y_train_over, tgt_test=y_test)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission = pd.read_csv(\"/kaggle/input/affel-ds2-credit-card/sample_submission.csv\")","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test[\"Amount_Scaled\"] = np.log1p(test[\"Amount\"])","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test.drop([\"Time\", \"Amount\"], axis=1, inplace=True)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"lgbm_pred = lgbm_clf.predict(test)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"lgbm_pred_proba = lgbm_clf.predict_proba(test)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test[\"Class\"] = lgbm_pred","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test.Class.value_counts()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"del submission[\"Class\"]","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test[\"Class\"] = lgbm_pred_proba","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission = submission.merge(test[[\"id\", \"Class\"]], on=\"id\")","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission.to_csv(\"./submission.csv\", index=False)","metadata":{},"execution_count":null,"outputs":[]}]}