{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":35332,"databundleVersionId":3723648,"sourceType":"competition"}],"dockerImageVersionId":30698,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"- 새로 노트북 열면 아래 코드를 줌, 실행하면 우리가 사용할 수 있는 인풋을 보여줌","metadata":{}},{"cell_type":"markdown","source":"# 0. Start & Prepare Data\n### -> how many rows to call?","metadata":{}},{"cell_type":"code","source":"import numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-05-18T08:03:06.165261Z","iopub.execute_input":"2024-05-18T08:03:06.165683Z","iopub.status.idle":"2024-05-18T08:03:06.177710Z","shell.execute_reply.started":"2024-05-18T08:03:06.165649Z","shell.execute_reply":"2024-05-18T08:03:06.176880Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pylab as plt\nimport seaborn as sns\nfrom tqdm import tqdm\nimport time\nfrom sklearn import metrics\nfrom sklearn import model_selection\nfrom sklearn import preprocessing\nfrom sklearn.preprocessing import LabelEncoder\nfrom sklearn import linear_model\nfrom sklearn import feature_selection\nfrom sklearn.model_selection import cross_val_predict, KFold\nfrom sklearn.metrics import mean_squared_error\nfrom scipy import stats\n\nfrom xgboost import XGBRegressor\nimport lightgbm as lgb\nimport plotly.graph_objects as go\nfrom plotly.subplots import make_subplots\npd.set_option(\"display.max_columns\", None)\n\nplt.style.use(\"ggplot\")","metadata":{"execution":{"iopub.status.busy":"2024-05-18T08:03:06.183157Z","iopub.execute_input":"2024-05-18T08:03:06.183776Z","iopub.status.idle":"2024-05-18T08:03:06.192025Z","shell.execute_reply.started":"2024-05-18T08:03:06.183715Z","shell.execute_reply":"2024-05-18T08:03:06.190539Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"call_rows = 30000\n# train_data, 30000행만 불러옴, df 변수에 저장\ndf = pd.read_csv(\"/kaggle/input/amex-default-prediction/train_data.csv\", nrows=call_rows)\n# train_label, 30000행만 불러옴, target 변수에 저장\ntrain_labels = pd.read_csv(\"/kaggle/input/amex-default-prediction/train_labels.csv\", nrows=call_rows)\ntest_df = pd.read_csv(\"/kaggle/input/amex-default-prediction/test_data.csv\", nrows=call_rows)\n\npd.set_option(\"display.max_columns\", 300)\n\ntrain_labels.head()","metadata":{"execution":{"iopub.status.busy":"2024-05-18T08:03:06.207446Z","iopub.execute_input":"2024-05-18T08:03:06.208194Z","iopub.status.idle":"2024-05-18T08:03:08.667885Z","shell.execute_reply.started":"2024-05-18T08:03:06.208146Z","shell.execute_reply":"2024-05-18T08:03:08.666595Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"col = list(df.columns) # 모든 칼럼\n\n# 객체형 칼럼 (대회 data 섹션에서 가져옴)\ncategorial_col = ['B_30', 'B_38', 'D_114', 'D_116', 'D_117', 'D_120', 'D_126', 'D_63', 'D_64', 'D_66', 'D_68']\n\n# categorial df만 보기위해 가져옴\ndf_cat = df[categorial_col]\n\n#describe로 평균, std, max, quantile 볼 수 있음\nprint(df_cat.describe())\n\n#D_63, D_64는 NaN 이라서 따로 분류\nprint(df_cat.describe(include='object'))\n\n# 전체보기 20행만\ndf_cat.head(5)","metadata":{"execution":{"iopub.status.busy":"2024-05-18T08:03:08.670133Z","iopub.execute_input":"2024-05-18T08:03:08.670862Z","iopub.status.idle":"2024-05-18T08:03:08.742136Z","shell.execute_reply.started":"2024-05-18T08:03:08.670818Z","shell.execute_reply":"2024-05-18T08:03:08.740701Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(df_cat[\"D_64\"].unique())  # unique 쓰면 categorial 한 열에 어떤 항목이 있는지 보임\nprint(df_cat[\"D_68\"].unique())\nprint(df_cat[\"D_63\"].unique())\nprint(df_cat[\"D_66\"].isna().sum()) # D_66 NaN 개수\n# 결과로 나온 항목들 뜻을 chatgpt한테 추측해달라고 함","metadata":{"execution":{"iopub.status.busy":"2024-05-18T08:03:08.743944Z","iopub.execute_input":"2024-05-18T08:03:08.744992Z","iopub.status.idle":"2024-05-18T08:03:08.760515Z","shell.execute_reply.started":"2024-05-18T08:03:08.744942Z","shell.execute_reply":"2024-05-18T08:03:08.759111Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"- 정리하면, D_64에 있는 O,R,U,-1 은 각각 Open, Revolving, Unknown, -1(아마 결측치),\n- D_63에 있는 'CR', 'CO', 'CL', 'XZ', 'XM', 'XL'은 각각\n- Current, Charged Off, Closed, XZ, XM, XL -> 이건 무슨 말인지 모르겠음","metadata":{}},{"cell_type":"markdown","source":"# 2. Preprocessing\n### Drop N/A rows and columns -> 꼭 필요한건 아닐지도\n### Fill N/A -> 결측치가 있을 때 modeling 이 안돌아가면 사용, 혹은 평균을 채워넣었을 때 나아진다면 사용\n### df_mod, df_mod2를 왔다갔다하면서 modeling 할수있게 틀을 만들어 놓는 것에 집중","metadata":{}},{"cell_type":"code","source":"def column_deletion(df):\n    del_col = [] # 지우고 싶은 칼럼\n    for col in df.columns:\n        count = df[col].isna().sum() # 각 칼럼의 n/a 갯수\n        if count > call_rows*0.5:\n            del_col.append(col)\n            \n    df_deleted = df.drop(columns = del_col)\n    \n    return df_deleted\n\ndf_mod = column_deletion(df)\ndf_mod.info() # 160 columns","metadata":{"execution":{"iopub.status.busy":"2024-05-18T08:03:08.763473Z","iopub.execute_input":"2024-05-18T08:03:08.763896Z","iopub.status.idle":"2024-05-18T08:03:08.839708Z","shell.execute_reply.started":"2024-05-18T08:03:08.763861Z","shell.execute_reply":"2024-05-18T08:03:08.838448Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def row_deletion(df, limit_nan_count):\n    ### delete rows over limit_nan_count. Don't forget to add target before deleting\n    rows_list = df_mod.values.tolist()\n    nan_idx = []\n    for i in range(len(rows_list)):\n        count = pd.isna(rows_list[i]).sum()\n        if count > limit_nan_count: # 60개 카운트 넘는 row의 idx를 추가\n            nan_idx.append(i)\n    \n    df_mod2 = df_mod.drop(nan_idx)  # df_mod 에서 뺌\n    return df_mod2\n\ndf_temporary = row_deletion(df_mod, 60) # df (190개칼럼기준) 60개 이상 설정시 8개 빠짐\ndf_temporary.info()","metadata":{"execution":{"iopub.status.busy":"2024-05-18T08:03:08.841176Z","iopub.execute_input":"2024-05-18T08:03:08.841484Z","iopub.status.idle":"2024-05-18T08:03:10.440426Z","shell.execute_reply.started":"2024-05-18T08:03:08.841457Z","shell.execute_reply":"2024-05-18T08:03:10.439235Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# row 별 결측치 보기\nrows_list = df.values.tolist()\n\nnan = []\nfor i in range(len(rows_list)):\n    count = pd.isna(rows_list[i]).sum()\n    if count > 0:\n        nan.append(pd.isna(rows_list[i]).sum())\n\nprint(\"max : \", max(nan))\nprint(\"min : \", min(nan))\nprint(\"avg : \", sum(nan)/len(nan)) # 평균\nplt.plot(nan,\"g--\")\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-05-18T08:03:10.442517Z","iopub.execute_input":"2024-05-18T08:03:10.443111Z","iopub.status.idle":"2024-05-18T08:03:12.911092Z","shell.execute_reply.started":"2024-05-18T08:03:10.443063Z","shell.execute_reply":"2024-05-18T08:03:12.910141Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# row 별 결측치 보기\nrows_list = df_mod.values.tolist() # df_mod 는 필요없는 column를 지웠음\n\nnan = []\nfor i in range(len(rows_list)):\n    count = pd.isna(rows_list[i]).sum()\n    if count > 0:\n        nan_count = pd.isna(rows_list[i]).sum()\n        nan.append(nan_count)\n        if nan_count > 60: # 190개 중 60개 이상 비어있으면 프린트\n            print(f\"{nan_count},{i}-th person\")\n        \nplt.plot(nan,\"g--\")\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-05-18T08:03:12.912292Z","iopub.execute_input":"2024-05-18T08:03:12.913188Z","iopub.status.idle":"2024-05-18T08:03:15.348534Z","shell.execute_reply.started":"2024-05-18T08:03:12.913149Z","shell.execute_reply":"2024-05-18T08:03:15.347206Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# row 별 결측치 보기\n# 사람이 중요하다 # 필요없는 칼럼만 지우면 된다\n# Convert DataFrame to a list of rows\nrows_list = df_mod.values.tolist()\n\nnan = []\nnan_idx = []\nfor i in range(len(rows_list)):\n    count = pd.isna(rows_list[i]).sum()\n    if count > 60: # 60개 카운트 넘는 row의 idx를 추가하고\n        nan_idx.append(i)\n        print(f\"{count},{i}-th person\")\n    else:\n        nan.append(count) # 아닌 경우에만 nan에 추가\n\ndf_mod[\"target\"] = train_labels[\"target\"] # row 를 제거하는 과정이므로 column에 target 추가하고 같이 삭제\ndf_mod2 = df_mod.drop(nan_idx)  # df_mod 에서 뺌\n\nplt.plot(nan,\"g--\")\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-05-18T08:03:15.350132Z","iopub.execute_input":"2024-05-18T08:03:15.350473Z","iopub.status.idle":"2024-05-18T08:03:17.036408Z","shell.execute_reply.started":"2024-05-18T08:03:15.350442Z","shell.execute_reply":"2024-05-18T08:03:17.034820Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 1. EDA - boxplots (for float) , countplots (for boolean)\n#### 1. S_2, ID 빼버리고, D_63, D_64 를 10개 칼럼으로 바꾸고, LabelEncoder로 뭐 하지는 않음 ( 나중에 필요시 불리안을 정수로 바꿔줌 )\n#### 2. subplot 으로 확인 -> 몇가지 변수 ( 꽤많은 변수 )가 1과 0에 아주가깝게 몰려있지만 object 와 구별이 어려움 -> 어떻게 해석할것인지?","metadata":{}},{"cell_type":"code","source":"df_enc = pd.get_dummies(df.drop(columns = [\"S_2\",\"customer_ID\"]))\ndf_enc.head()\ndf_enc.info()","metadata":{"execution":{"iopub.status.busy":"2024-05-18T08:03:17.037880Z","iopub.execute_input":"2024-05-18T08:03:17.038340Z","iopub.status.idle":"2024-05-18T08:03:17.140672Z","shell.execute_reply.started":"2024-05-18T08:03:17.038298Z","shell.execute_reply":"2024-05-18T08:03:17.139213Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"lab_enc = LabelEncoder()\n#for cat_feat in df_enc.columns:\n #   df_float[cat_feat] = lab_enc.fit_transform(df_enc[cat_feat])\nfor col in df_enc.select_dtypes(include=['bool']).columns:\n    print(col) # change boolean into int or not?\ndf.info()\ndf_enc.info()\ndf_enc.columns","metadata":{"execution":{"iopub.status.busy":"2024-05-18T08:03:17.144583Z","iopub.execute_input":"2024-05-18T08:03:17.144969Z","iopub.status.idle":"2024-05-18T08:03:17.169769Z","shell.execute_reply.started":"2024-05-18T08:03:17.144939Z","shell.execute_reply":"2024-05-18T08:03:17.168525Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_enc['target'] = train_labels['target']\n\ndef subplotting(df_in):\n    # 196 = 4x49 = 4x7x7 = 28x7 or 49x4\n    # Create a 23x12 grid of subplots\n    fig, axes = plt.subplots(28, 7, figsize=(25, 50))\n\n    # Flatten the axes array for easy iteration [[..],[..],[..]] -> [.......]\n    axes = axes.flatten()\n\n    # Plotting boxplots for each column\n    for i, ax in enumerate(axes):\n        if i < df_in.shape[1]:  # Check to ensure there's enough data\n            if df_in.columns[i] in df_in.select_dtypes(include=['bool']).columns:\n                sns.countplot(x='target', hue=df_in.columns[i], data=df_in, ax=ax)\n            else:\n                sns.boxplot(x='target', y=df_enc.columns[i], data=df_in, ax=ax)\n            ax.set_title(f'{df_in.columns[i]}')\n            ax.set_xlabel('')\n            ax.set_ylabel('')\n        else:\n            ax.axis('off')  # Turn off empty subplots\n\n    # Adjust layout to prevent overlap\n    plt.tight_layout()\n    plt.show()\n\nsubplotting(df_enc)","metadata":{"execution":{"iopub.status.busy":"2024-05-18T08:03:17.171046Z","iopub.execute_input":"2024-05-18T08:03:17.171361Z","iopub.status.idle":"2024-05-18T08:03:52.286455Z","shell.execute_reply.started":"2024-05-18T08:03:17.171334Z","shell.execute_reply":"2024-05-18T08:03:52.285308Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(categorial_col)\n\nfor col in df_enc.columns:\n    if df_enc[col].between(0.03,0.97).sum() < 10 and col not in categorial_col:\n        print(col, end=\" \") # 결과가 1에 몰려있음 -> object로 볼것인지? scaler 쓸것인지? 그냥 쓸것인지 ?\n        \nsns.scatterplot(x = \"target\", y=df_enc[\"D_130\"],data=df_enc)","metadata":{"execution":{"iopub.status.busy":"2024-05-18T08:03:52.288140Z","iopub.execute_input":"2024-05-18T08:03:52.289064Z","iopub.status.idle":"2024-05-18T08:03:52.742947Z","shell.execute_reply.started":"2024-05-18T08:03:52.289018Z","shell.execute_reply":"2024-05-18T08:03:52.741764Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### \"D_130\" 은 분명히 categorial_col에도 없는 column 이지만 1,0에 상당히 근접한 데이터만 있음","metadata":{}},{"cell_type":"markdown","source":"---\n# 1. EDA - correlation heatmap with train data\n### 어떠한 변수들이 서로 관계가 있는지 (혹은 큰지)를 보기 위함\n### %Warning% 우리가 쓰는 target 은 boolean 이기 때문에 x = float -> y = boolean 일때 사용하는 적절한 correlation method 를 사용해야함. ex ) biserial_corr, t-test, anova, logistic regression","metadata":{}},{"cell_type":"code","source":"# Plot the correlation matrix as a heatmap\n\nfeat_d = [i for i in df_enc.columns if i.startswith(\"D_\")]\nfeat_s = [i for i in df_enc.columns if i.startswith(\"S_\")]\nfeat_p = [i for i in df_enc.columns if i.startswith(\"P_\")]\nfeat_b = [i for i in df_enc.columns if i.startswith(\"B_\")]\nfeat_r = [i for i in df_enc.columns if i.startswith(\"R_\")]\n\nprint(f'deliquency feature. size:{len(feat_d)}',feat_d,sep='\\n\\n',end=\"\\n\\n\")\nprint(f'spend feature. size:{len(feat_s)}',feat_s,sep='\\n\\n',end=\"\\n\\n\")\nprint(f'payment feature. size:{len(feat_p)}',feat_p,sep='\\n\\n',end=\"\\n\\n\")\nprint(f'balance feature. size:{len(feat_b)}',feat_b,sep='\\n\\n',end=\"\\n\\n\")\nprint(f'risk feature. size:{len(feat_r)}',feat_r,sep='\\n\\n',end=\"\\n\\n\")\n","metadata":{"execution":{"iopub.status.busy":"2024-05-18T08:03:52.744361Z","iopub.execute_input":"2024-05-18T08:03:52.745115Z","iopub.status.idle":"2024-05-18T08:03:52.757418Z","shell.execute_reply.started":"2024-05-18T08:03:52.745073Z","shell.execute_reply":"2024-05-18T08:03:52.756233Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig, ax = plt.subplots(figsize=(40, 40))\nsns.heatmap(df_enc[feat_d].corr(), annot=False, cmap='coolwarm', fmt=\".2f\", ax=ax)\nplt.title(\"Correlation Heatmap for Delinquency Feature\",size=50)\n","metadata":{"execution":{"iopub.status.busy":"2024-05-18T08:03:52.758922Z","iopub.execute_input":"2024-05-18T08:03:52.759345Z","iopub.status.idle":"2024-05-18T08:03:56.938544Z","shell.execute_reply.started":"2024-05-18T08:03:52.759303Z","shell.execute_reply":"2024-05-18T08:03:56.937275Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig, ax = plt.subplots(figsize=(15, 15))\nsns.heatmap(df_enc[feat_s].corr(), annot=True, cmap='coolwarm', fmt=\".2f\", ax=ax)\nplt.title(\"Correlation Heatmap for Spend Feature\",size=30)","metadata":{"execution":{"iopub.status.busy":"2024-05-18T08:03:56.939996Z","iopub.execute_input":"2024-05-18T08:03:56.940872Z","iopub.status.idle":"2024-05-18T08:03:58.787951Z","shell.execute_reply.started":"2024-05-18T08:03:56.940832Z","shell.execute_reply":"2024-05-18T08:03:58.786685Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig, ax = plt.subplots(figsize=(10, 10))\nsns.heatmap(df_enc[feat_p].corr(), annot=True, cmap='coolwarm', fmt=\".2f\", ax=ax)\nplt.title(\"Correlation Heatmap for Payment Feature\",size=20)","metadata":{"execution":{"iopub.status.busy":"2024-05-18T08:03:58.789467Z","iopub.execute_input":"2024-05-18T08:03:58.789896Z","iopub.status.idle":"2024-05-18T08:03:59.140666Z","shell.execute_reply.started":"2024-05-18T08:03:58.789857Z","shell.execute_reply":"2024-05-18T08:03:59.139162Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig, ax = plt.subplots(figsize=(40, 40))\nsns.heatmap(df_enc[feat_b].corr(), annot=True, cmap='coolwarm', fmt=\".2f\", ax=ax)\nplt.title(\"Correlation Heatmap for Balance Feature\",size=50)","metadata":{"execution":{"iopub.status.busy":"2024-05-18T08:03:59.141916Z","iopub.execute_input":"2024-05-18T08:03:59.142254Z","iopub.status.idle":"2024-05-18T08:04:05.055063Z","shell.execute_reply.started":"2024-05-18T08:03:59.142218Z","shell.execute_reply":"2024-05-18T08:04:05.054009Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig, ax = plt.subplots(figsize=(40, 40))\nsns.heatmap(df_enc[feat_r].corr(), annot=True, cmap='coolwarm', fmt=\".2f\", ax=ax)\nplt.title(\"Correlation Heatmap for Risk Feature\",size=50)","metadata":{"execution":{"iopub.status.busy":"2024-05-18T08:04:05.056306Z","iopub.execute_input":"2024-05-18T08:04:05.057012Z","iopub.status.idle":"2024-05-18T08:04:08.842047Z","shell.execute_reply.started":"2024-05-18T08:04:05.056976Z","shell.execute_reply":"2024-05-18T08:04:08.841048Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig, ax = plt.subplots(figsize=(40, 40))\nsns.heatmap(df_enc.corr(), annot=False, cmap='coolwarm', fmt=\".2f\", ax=ax)\nplt.title(\"Correlation Heatmap for EVERY Feature -> Worth it?\",size=50)","metadata":{"execution":{"iopub.status.busy":"2024-05-18T08:04:08.843475Z","iopub.execute_input":"2024-05-18T08:04:08.844045Z","iopub.status.idle":"2024-05-18T08:04:16.310317Z","shell.execute_reply.started":"2024-05-18T08:04:08.844009Z","shell.execute_reply":"2024-05-18T08:04:16.308897Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 1. EDA - correlation with target\n### target 이 binary 이므로 biserial correlation 사용했으나 NaN이 없어야하는 치명적인 문제 \n### -> drop N/A를 column-wise 하게 해주는 column_delete function 생성해서 해결, row-wise도 생성했지만 일단 사용하지않음\n### What to Check -> Correlation 자체가 0.02를 넘는 것도 찾기 힘듦. P-value 도 웬만해서 높아서 상당 변수가 개별로는 의미 없음","metadata":{}},{"cell_type":"code","source":"# Calculate Point-Biserial Correlation on \"R_28\"\ncorr, p_value = stats.pointbiserialr(df_enc['target'].astype(int), df_enc['R_17'])\nprint(f'Point-Biserial Correlation: {corr}, P-value: {p_value}') # result is sooooo bad.","metadata":{"execution":{"iopub.status.busy":"2024-05-18T08:04:16.312647Z","iopub.execute_input":"2024-05-18T08:04:16.313118Z","iopub.status.idle":"2024-05-18T08:04:16.328789Z","shell.execute_reply.started":"2024-05-18T08:04:16.313078Z","shell.execute_reply":"2024-05-18T08:04:16.327283Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"result_df = pd.DataFrame(columns=['Column','Correlation', 'P-value'])\ndf_enc_deleted = column_deletion(df_enc)          # delete NaN columns\ndf_filled = df_enc_deleted.fillna(df_enc.mean())       # Fill N/A with mean\n\nfor col in df_filled.columns:\n    corr, p_value = stats.pointbiserialr(df_filled['target'].astype(int), df_filled[col])\n    result_df.loc[len(result_df.index)] = [col, corr, p_value]\n\nprint(result_df)\n\ntarg = result_df[\"Correlation\"][:-1]\nidx = result_df[\"Column\"][:-1]\npval = result_df[\"P-value\"][:-1]\n\nfig = make_subplots(rows=1, cols=2)\nfig.add_trace(go.Bar(y=idx, x= targ.values, orientation='h',text = targ),row=1,col=1)\nfig.add_trace(go.Bar(y=idx, x= pval.values, orientation='h',text = targ),row=1,col=2)\n\nfig.update_layout(title = \"Correlation of variables with Target\",width = 750, height = 3500,\n                  paper_bgcolor='rgb(0,0,0,0)',plot_bgcolor='rgb(0,0,0,0)')\n","metadata":{"execution":{"iopub.status.busy":"2024-05-18T08:04:16.331150Z","iopub.execute_input":"2024-05-18T08:04:16.331697Z","iopub.status.idle":"2024-05-18T08:04:17.451184Z","shell.execute_reply.started":"2024-05-18T08:04:16.331645Z","shell.execute_reply":"2024-05-18T08:04:17.449987Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"---\n# 3. Modeling\n### 1. 어떤 데이터를 쓸것인지 선택하기. df, df_mod, df_mod2, df_enc, ...\n### 2. 적절한 model 선택 ? classification 문제에서 \"x_train 이 n개 있을 때 x_test 도 n개 있으면 y_test 를 1개 생성한다\" 라는 개념이 맞는지\n### 3. hyperparameter 를 boosting 에서는 어느 function 에 쓰는지 ? bagging에서는 언제 쓰는지 random forest 에서는 언제 쓰는지\n### 4. CV method 를 언제쓰는지? LOOCV, KNN, LPOUT, Hold-out 등등 너무많음.. 어떤 걸 써야할지 아니면 그냥 안쓸지..?\n### -> 데이터 많아서 안써도 될 것 같기는 하다\n### 5. Evaluation methods 대회에서 뭐더라 -> AMEX Metric 있음","metadata":{}},{"cell_type":"code","source":"X = df_filled.drop(columns=[\"target\"])\ny = df_filled[\"target\"]\n\n# Initialize LightGBM parameters\nparams = {\n    'objective': 'regression',\n    'metric': 'mse',  # Mean squared error\n    'verbosity': -1,\n    'seed': 86\n}\n\n# Initialize KFold cross-validator\nkf = KFold(n_splits=5, shuffle=True, random_state=42)\n\n# Initialize empty list to store MSE scores\nmse_scores = []\n\n# Perform 5-fold cross-validation\nfor train_idx, val_idx in kf.split(X):\n    X_train, X_val = X.iloc[train_idx], X.iloc[val_idx]\n    y_train, y_val = y.iloc[train_idx], y.iloc[val_idx]\n    \n    # Convert data to LightGBM Dataset format\n    lgb_train = lgb.Dataset(X_train, y_train)\n    lgb_val = lgb.Dataset(X_val, y_val, reference=lgb_train)\n    \n    # Train the model\n    model = lgb.train(params, lgb_train, valid_sets=[lgb_train, lgb_val])\n    \n    # Make predictions on the validation set\n    val_pred = model.predict(X_val, num_iteration=model.best_iteration)\n    \n    # Calculate MSE and append to mse_scores\n    mse = mean_squared_error(y_val, val_pred)\n    mse_scores.append(mse)\n\n# Calculate mean MSE across all folds\nmean_mse = sum(mse_scores) / len(mse_scores)\nprint(\"Mean MSE:\", mean_mse)\n","metadata":{"execution":{"iopub.status.busy":"2024-05-18T08:04:17.453078Z","iopub.execute_input":"2024-05-18T08:04:17.453831Z","iopub.status.idle":"2024-05-18T08:04:33.137183Z","shell.execute_reply.started":"2024-05-18T08:04:17.453786Z","shell.execute_reply":"2024-05-18T08:04:33.135991Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_test = pd.get_dummies(test_df.drop(columns = [\"S_2\",\"customer_ID\"]))\nX_test = column_deletion(X_test)\nX_train = pd.get_dummies(df.drop(columns = [\"S_2\",\"customer_ID\"]))\nX_train[\"target\"] = train_labels[\"target\"]\nX_train = column_deletion(X_train)\nY_test = X_train[\"target\"]\nX_train = X_train.drop(columns=\"target\")\n\nX_train = X_train.fillna(X_train.mean())\nX_test = X_test.fillna(X_test.mean())\n\nprint(X_train.shape)\nprint(Y_train.shape)\nprint(X_test.shape)","metadata":{"execution":{"iopub.status.busy":"2024-05-18T08:04:33.138901Z","iopub.execute_input":"2024-05-18T08:04:33.139615Z","iopub.status.idle":"2024-05-18T08:04:33.631370Z","shell.execute_reply.started":"2024-05-18T08:04:33.139571Z","shell.execute_reply":"2024-05-18T08:04:33.630205Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.linear_model import LogisticRegression\nlog_r= LogisticRegression(random_state=0)","metadata":{"execution":{"iopub.status.busy":"2024-05-18T08:07:50.814206Z","iopub.execute_input":"2024-05-18T08:07:50.814739Z","iopub.status.idle":"2024-05-18T08:07:50.823209Z","shell.execute_reply.started":"2024-05-18T08:07:50.814687Z","shell.execute_reply":"2024-05-18T08:07:50.822176Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"","metadata":{}}]}