{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.14","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":81933,"databundleVersionId":9643020,"sourceType":"competition"}],"dockerImageVersionId":30786,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:53:30.650916Z","iopub.execute_input":"2024-11-23T08:53:30.652072Z","iopub.status.idle":"2024-11-23T08:53:36.453325Z","shell.execute_reply.started":"2024-11-23T08:53:30.651983Z","shell.execute_reply":"2024-11-23T08:53:36.451843Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Basic Preprocess","metadata":{}},{"cell_type":"code","source":"import numpy as np\nimport polars as pl\nimport pandas as pd\nfrom sklearn.base import clone\nfrom copy import deepcopy\nimport optuna\nfrom scipy.optimize import minimize\nimport os\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n\nimport re\nfrom colorama import Fore, Style\n\nfrom tqdm import tqdm\nfrom IPython.display import clear_output\nfrom concurrent.futures import ThreadPoolExecutor\n\nimport warnings\nwarnings.filterwarnings('ignore')\npd.options.display.max_columns = None\n\nimport lightgbm as lgb\nfrom catboost import CatBoostRegressor, CatBoostClassifier\nfrom xgboost import XGBRegressor\nfrom sklearn.ensemble import VotingRegressor\nfrom sklearn.model_selection import *\nfrom sklearn.metrics import *\n\nSEED = 42\nn_splits = 5","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:53:36.455574Z","iopub.execute_input":"2024-11-23T08:53:36.456121Z","iopub.status.idle":"2024-11-23T08:53:39.902570Z","shell.execute_reply.started":"2024-11-23T08:53:36.456080Z","shell.execute_reply":"2024-11-23T08:53:39.901383Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# parquet 데이터 처리\ndef process_file(filename, dirname):\n    df = pd.read_parquet(os.path.join(dirname, filename, 'part-0.parquet')) #파일 경로 생성 후 읽기\n    df.drop('step', axis=1, inplace=True) # step 열을 삭제\n    return df.describe().values.reshape(-1), filename.split('=')[1] #기술통계 계산 후 1차원 배열 반환 , 파일 ID 반환\n\ndef load_time_series(dirname) -> pd.DataFrame:\n    ids = os.listdir(dirname) #디렉토리의 모든 파일 및 하위 디렉토리 이름을 가져오기\n\n    \n    with ThreadPoolExecutor() as executor: #process_file 파일 처리를 병렬로 실행\n        results = list(tqdm(executor.map(lambda fname: process_file(fname, dirname), ids), total=len(ids)))\n        \n    stats, indexes = zip(*results) # 파일의 통계정보, 파일 추출 ID\n    \n    df = pd.DataFrame(stats, columns=[f\"Stat_{i}\" for i in range(len(stats[0]))]) #통계 정보 데이터프레임\n    df['id'] = indexes\n    \n    return df","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:53:39.903922Z","iopub.execute_input":"2024-11-23T08:53:39.904505Z","iopub.status.idle":"2024-11-23T08:53:39.915442Z","shell.execute_reply.started":"2024-11-23T08:53:39.904466Z","shell.execute_reply":"2024-11-23T08:53:39.913773Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"ids = os.listdir(\"/kaggle/input/child-mind-institute-problematic-internet-use/series_train.parquet\")\n# 파일 및 디렉토리 이름의 리스트를 반환 > id\nprint(len(ids))\nids[:5]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:53:39.918729Z","iopub.execute_input":"2024-11-23T08:53:39.919169Z","iopub.status.idle":"2024-11-23T08:53:39.956386Z","shell.execute_reply.started":"2024-11-23T08:53:39.919131Z","shell.execute_reply":"2024-11-23T08:53:39.955105Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"filename = \"id=0745c390\" # 파일명\ndirname = \"/kaggle/input/child-mind-institute-problematic-internet-use/series_train.parquet\" # 상위 디렉토리 경로\nparquet_path = os.path.join(dirname, filename, 'part-0.parquet')\nprint(parquet_path)\n\ndf = pd.read_parquet(parquet_path) #파일 읽기\ndf ","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:53:39.957832Z","iopub.execute_input":"2024-11-23T08:53:39.958298Z","iopub.status.idle":"2024-11-23T08:53:40.081650Z","shell.execute_reply.started":"2024-11-23T08:53:39.958253Z","shell.execute_reply":"2024-11-23T08:53:40.080540Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df.drop('step', axis=1, inplace=True) # step 열 드랍\ndf","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:53:40.082990Z","iopub.execute_input":"2024-11-23T08:53:40.083356Z","iopub.status.idle":"2024-11-23T08:53:40.106684Z","shell.execute_reply.started":"2024-11-23T08:53:40.083321Z","shell.execute_reply":"2024-11-23T08:53:40.105597Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df.describe() #기술통계량","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:53:40.108163Z","iopub.execute_input":"2024-11-23T08:53:40.108503Z","iopub.status.idle":"2024-11-23T08:53:40.178183Z","shell.execute_reply.started":"2024-11-23T08:53:40.108469Z","shell.execute_reply":"2024-11-23T08:53:40.176830Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df.shape","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:53:40.180066Z","iopub.execute_input":"2024-11-23T08:53:40.180533Z","iopub.status.idle":"2024-11-23T08:53:40.187677Z","shell.execute_reply.started":"2024-11-23T08:53:40.180481Z","shell.execute_reply":"2024-11-23T08:53:40.186566Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"ret_first = df.describe().values.reshape(-1) # 2차원 배열 > 1차원 배열\nprint(ret_first.shape)\nret_first","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:53:40.189017Z","iopub.execute_input":"2024-11-23T08:53:40.189392Z","iopub.status.idle":"2024-11-23T08:53:40.241253Z","shell.execute_reply.started":"2024-11-23T08:53:40.189356Z","shell.execute_reply":"2024-11-23T08:53:40.240161Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"filename ","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:53:40.245587Z","iopub.execute_input":"2024-11-23T08:53:40.245935Z","iopub.status.idle":"2024-11-23T08:53:40.253263Z","shell.execute_reply.started":"2024-11-23T08:53:40.245898Z","shell.execute_reply":"2024-11-23T08:53:40.251954Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"ret_right = filename.split('=')[1] # '=' 문자를 기준으로 분리\nret_right","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:53:40.254977Z","iopub.execute_input":"2024-11-23T08:53:40.255444Z","iopub.status.idle":"2024-11-23T08:53:40.271095Z","shell.execute_reply.started":"2024-11-23T08:53:40.255393Z","shell.execute_reply":"2024-11-23T08:53:40.269849Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"dirname = \"/kaggle/input/child-mind-institute-problematic-internet-use/series_test.parquet\"\nids = os.listdir(dirname)\nwith ThreadPoolExecutor() as executor:  # 병렬 처리\n    results = list(tqdm(executor.map(lambda fname: process_file(fname, dirname), ids), total=len(ids)))\n\nprint(len(results))\nresults[0]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:53:40.272503Z","iopub.execute_input":"2024-11-23T08:53:40.273205Z","iopub.status.idle":"2024-11-23T08:53:40.559809Z","shell.execute_reply.started":"2024-11-23T08:53:40.273148Z","shell.execute_reply":"2024-11-23T08:53:40.558764Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"len(results[0][0]), results[0][1] # 첫 번째 파일에 대한 통계 배열 길이 , 첫 번째 파일 ID 값","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:53:40.561357Z","iopub.execute_input":"2024-11-23T08:53:40.561797Z","iopub.status.idle":"2024-11-23T08:53:40.569346Z","shell.execute_reply.started":"2024-11-23T08:53:40.561747Z","shell.execute_reply":"2024-11-23T08:53:40.568254Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 데이터셋 로드","metadata":{}},{"cell_type":"code","source":"train = pd.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/train.csv')\ntest = pd.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/test.csv')\nsample = pd.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/sample_submission.csv')\n\ntrain.shape, test.shape, sample.shape","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:53:40.570710Z","iopub.execute_input":"2024-11-23T08:53:40.571112Z","iopub.status.idle":"2024-11-23T08:53:40.657540Z","shell.execute_reply.started":"2024-11-23T08:53:40.571066Z","shell.execute_reply":"2024-11-23T08:53:40.656447Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%%time \n\ntrain_ts = load_time_series(\"/kaggle/input/child-mind-institute-problematic-internet-use/series_train.parquet\")\ntrain_ts.shape","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:53:40.659222Z","iopub.execute_input":"2024-11-23T08:53:40.659661Z","iopub.status.idle":"2024-11-23T08:55:13.905550Z","shell.execute_reply.started":"2024-11-23T08:53:40.659611Z","shell.execute_reply":"2024-11-23T08:55:13.904260Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_ts.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:13.906806Z","iopub.execute_input":"2024-11-23T08:55:13.907166Z","iopub.status.idle":"2024-11-23T08:55:13.986579Z","shell.execute_reply.started":"2024-11-23T08:55:13.907130Z","shell.execute_reply":"2024-11-23T08:55:13.985360Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%%time\n\ntest_ts = load_time_series(\"/kaggle/input/child-mind-institute-problematic-internet-use/series_test.parquet\")\ntest_ts.shape","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:13.988008Z","iopub.execute_input":"2024-11-23T08:55:13.988464Z","iopub.status.idle":"2024-11-23T08:55:14.195847Z","shell.execute_reply.started":"2024-11-23T08:55:13.988414Z","shell.execute_reply":"2024-11-23T08:55:14.194458Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_ts","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:14.197272Z","iopub.execute_input":"2024-11-23T08:55:14.197616Z","iopub.status.idle":"2024-11-23T08:55:14.265863Z","shell.execute_reply.started":"2024-11-23T08:55:14.197580Z","shell.execute_reply":"2024-11-23T08:55:14.264832Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"time_series_cols = train_ts.columns.tolist() # 칼럼 이름 리스트로 반환\ntime_series_cols.remove(\"id\") #리스트에서 id값 제거\nlen(time_series_cols)\ntime_series_cols","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:14.267122Z","iopub.execute_input":"2024-11-23T08:55:14.267451Z","iopub.status.idle":"2024-11-23T08:55:14.276419Z","shell.execute_reply.started":"2024-11-23T08:55:14.267417Z","shell.execute_reply":"2024-11-23T08:55:14.275166Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"len(time_series_cols) # stat값 96개","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:14.278006Z","iopub.execute_input":"2024-11-23T08:55:14.278477Z","iopub.status.idle":"2024-11-23T08:55:14.288408Z","shell.execute_reply.started":"2024-11-23T08:55:14.278424Z","shell.execute_reply":"2024-11-23T08:55:14.287223Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 데이터 합치기","metadata":{}},{"cell_type":"code","source":"#  id 기준으로 왼쪽 병합\ntrain = pd.merge(train, train_ts, how=\"left\", on='id')\ntest = pd.merge(test, test_ts, how=\"left\", on='id')\ntrain.shape, test.shape","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:14.289755Z","iopub.execute_input":"2024-11-23T08:55:14.290187Z","iopub.status.idle":"2024-11-23T08:55:14.323668Z","shell.execute_reply.started":"2024-11-23T08:55:14.290151Z","shell.execute_reply":"2024-11-23T08:55:14.322393Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train.head(10)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:14.325047Z","iopub.execute_input":"2024-11-23T08:55:14.325384Z","iopub.status.idle":"2024-11-23T08:55:14.493178Z","shell.execute_reply.started":"2024-11-23T08:55:14.325350Z","shell.execute_reply":"2024-11-23T08:55:14.492099Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"- 모든 id에 대한 stat값 존재하는 것 X","metadata":{}},{"cell_type":"code","source":"# id칼럼 제거\ntrain = train.drop('id', axis=1)\ntest = test.drop('id', axis=1)\ntrain.shape, test.shape","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:14.494457Z","iopub.execute_input":"2024-11-23T08:55:14.494778Z","iopub.status.idle":"2024-11-23T08:55:14.508596Z","shell.execute_reply.started":"2024-11-23T08:55:14.494745Z","shell.execute_reply":"2024-11-23T08:55:14.507083Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:14.510484Z","iopub.execute_input":"2024-11-23T08:55:14.510926Z","iopub.status.idle":"2024-11-23T08:55:14.707122Z","shell.execute_reply.started":"2024-11-23T08:55:14.510887Z","shell.execute_reply":"2024-11-23T08:55:14.705987Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# PCIAT 관련 칼럼 제거","metadata":{}},{"cell_type":"markdown","source":"- 인터넷 사용습관 설문\n- PCIAT > 부모가 평가하는 자녀의 인터넷 중독 정도.\n- PCIAT 점수가 곧 SII로 보임\n- test 데이터 존재 X","metadata":{}},{"cell_type":"code","source":"train.columns","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:14.708376Z","iopub.execute_input":"2024-11-23T08:55:14.708692Z","iopub.status.idle":"2024-11-23T08:55:14.716470Z","shell.execute_reply.started":"2024-11-23T08:55:14.708660Z","shell.execute_reply":"2024-11-23T08:55:14.715138Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"pciat_columns = train.filter(regex='^PCIAT').columns\npciat_columns","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:14.717946Z","iopub.execute_input":"2024-11-23T08:55:14.718354Z","iopub.status.idle":"2024-11-23T08:55:14.738072Z","shell.execute_reply.started":"2024-11-23T08:55:14.718317Z","shell.execute_reply":"2024-11-23T08:55:14.736833Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"featuresCols = ['Basic_Demos-Enroll_Season', 'Basic_Demos-Age', 'Basic_Demos-Sex',\n                'CGAS-Season', 'CGAS-CGAS_Score', 'Physical-Season', 'Physical-BMI',\n                'Physical-Height', 'Physical-Weight', 'Physical-Waist_Circumference',\n                'Physical-Diastolic_BP', 'Physical-HeartRate', 'Physical-Systolic_BP',\n                'Fitness_Endurance-Season', 'Fitness_Endurance-Max_Stage',\n                'Fitness_Endurance-Time_Mins', 'Fitness_Endurance-Time_Sec',\n                'FGC-Season', 'FGC-FGC_CU', 'FGC-FGC_CU_Zone', 'FGC-FGC_GSND',\n                'FGC-FGC_GSND_Zone', 'FGC-FGC_GSD', 'FGC-FGC_GSD_Zone', 'FGC-FGC_PU',\n                'FGC-FGC_PU_Zone', 'FGC-FGC_SRL', 'FGC-FGC_SRL_Zone', 'FGC-FGC_SRR',\n                'FGC-FGC_SRR_Zone', 'FGC-FGC_TL', 'FGC-FGC_TL_Zone', 'BIA-Season',\n                'BIA-BIA_Activity_Level_num', 'BIA-BIA_BMC', 'BIA-BIA_BMI',\n                'BIA-BIA_BMR', 'BIA-BIA_DEE', 'BIA-BIA_ECW', 'BIA-BIA_FFM',\n                'BIA-BIA_FFMI', 'BIA-BIA_FMI', 'BIA-BIA_Fat', 'BIA-BIA_Frame_num',\n                'BIA-BIA_ICW', 'BIA-BIA_LDM', 'BIA-BIA_LST', 'BIA-BIA_SMM',\n                'BIA-BIA_TBW', 'PAQ_A-Season', 'PAQ_A-PAQ_A_Total', 'PAQ_C-Season',\n                'PAQ_C-PAQ_C_Total', 'SDS-Season', 'SDS-SDS_Total_Raw',\n                'SDS-SDS_Total_T', 'PreInt_EduHx-Season',\n                'PreInt_EduHx-computerinternet_hoursday', 'sii']\n\nfeaturesCols += time_series_cols # featuresCols에 time_series_cols 칼럼 추가\n\nlen(featuresCols)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:14.739682Z","iopub.execute_input":"2024-11-23T08:55:14.740178Z","iopub.status.idle":"2024-11-23T08:55:14.755410Z","shell.execute_reply.started":"2024-11-23T08:55:14.740125Z","shell.execute_reply":"2024-11-23T08:55:14.753939Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"removed_cols = []\n\n# featuresCols에 포함되지 않은 컬럼들을 removed_cols 리스트에 저장\nfor col in train.columns:\n    if col not in featuresCols:\n        removed_cols.append(col)\n        \nprint(len(removed_cols))\nremoved_cols","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:14.762380Z","iopub.execute_input":"2024-11-23T08:55:14.763401Z","iopub.status.idle":"2024-11-23T08:55:14.776774Z","shell.execute_reply.started":"2024-11-23T08:55:14.763355Z","shell.execute_reply":"2024-11-23T08:55:14.775581Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# featuresCols에 포함된 칼럼만 남기고 드랍\ntrain = train[featuresCols]\ntrain.shape","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:14.778573Z","iopub.execute_input":"2024-11-23T08:55:14.779088Z","iopub.status.idle":"2024-11-23T08:55:14.792210Z","shell.execute_reply.started":"2024-11-23T08:55:14.779013Z","shell.execute_reply":"2024-11-23T08:55:14.791075Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 라벨링 X 행 드랍","metadata":{}},{"cell_type":"code","source":"# subset: optional Labels along other axis to consider, e.g. if you are dropping rows these would be a list of columns to include.\ntrain = train.dropna(subset='sii') # sii 컬럼에 결측치가 있는 행 삭제\ntrain.shape","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:14.793713Z","iopub.execute_input":"2024-11-23T08:55:14.794506Z","iopub.status.idle":"2024-11-23T08:55:14.805981Z","shell.execute_reply.started":"2024-11-23T08:55:14.794449Z","shell.execute_reply":"2024-11-23T08:55:14.804858Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"cat_c = ['Basic_Demos-Enroll_Season', 'CGAS-Season', 'Physical-Season', 'Fitness_Endurance-Season', \n          'FGC-Season', 'BIA-Season', 'PAQ_A-Season', 'PAQ_C-Season', 'SDS-Season', 'PreInt_EduHx-Season']\n\nlen(cat_c) # season 관련 칼럼","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:14.807375Z","iopub.execute_input":"2024-11-23T08:55:14.807808Z","iopub.status.idle":"2024-11-23T08:55:14.821677Z","shell.execute_reply.started":"2024-11-23T08:55:14.807717Z","shell.execute_reply":"2024-11-23T08:55:14.820627Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 카테고리 칼럼 값 대체","metadata":{}},{"cell_type":"code","source":"def update(df):\n    for c in cat_c: \n        df[c] = df[c].fillna('Missing') # 결측치를 'Missing' 문자열로 대체\n        df[c] = df[c].astype('category') # 카테고리 타입으로 변경\n    return df","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:14.822985Z","iopub.execute_input":"2024-11-23T08:55:14.823363Z","iopub.status.idle":"2024-11-23T08:55:14.837429Z","shell.execute_reply.started":"2024-11-23T08:55:14.823328Z","shell.execute_reply":"2024-11-23T08:55:14.836122Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train[cat_c].info()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:14.838878Z","iopub.execute_input":"2024-11-23T08:55:14.839380Z","iopub.status.idle":"2024-11-23T08:55:14.867936Z","shell.execute_reply.started":"2024-11-23T08:55:14.839319Z","shell.execute_reply":"2024-11-23T08:55:14.866762Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 결측값 대체 후 데이터타입 변경 > update\ntrain = update(train)\ntest = update(test)\n\ntrain.shape, test.shape","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:14.869568Z","iopub.execute_input":"2024-11-23T08:55:14.870124Z","iopub.status.idle":"2024-11-23T08:55:14.908856Z","shell.execute_reply.started":"2024-11-23T08:55:14.870062Z","shell.execute_reply":"2024-11-23T08:55:14.907712Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train[cat_c].info() # 결측값 사라짐","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:14.910391Z","iopub.execute_input":"2024-11-23T08:55:14.910841Z","iopub.status.idle":"2024-11-23T08:55:14.928828Z","shell.execute_reply.started":"2024-11-23T08:55:14.910786Z","shell.execute_reply":"2024-11-23T08:55:14.927199Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def create_mapping(column, dataset): \n    unique_values = dataset[column].unique() #칼럼들의 고유값 저장\n    # 고유한 값(value)을 키로, 그에 대응하는 인덱스(idx)를 값으로 하는 딕셔너리(mapping)를 생성\n    return {value: idx for idx, value in enumerate(unique_values)}\n\n\"\"\"This Mapping Works Fine For me I also Check Each Values in Train and test Using Logic. There no Data Lekage.\"\"\"","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:14.931316Z","iopub.execute_input":"2024-11-23T08:55:14.931791Z","iopub.status.idle":"2024-11-23T08:55:14.945813Z","shell.execute_reply.started":"2024-11-23T08:55:14.931647Z","shell.execute_reply":"2024-11-23T08:55:14.944473Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train['CGAS-Season'].value_counts()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:14.947244Z","iopub.execute_input":"2024-11-23T08:55:14.947610Z","iopub.status.idle":"2024-11-23T08:55:14.963987Z","shell.execute_reply.started":"2024-11-23T08:55:14.947575Z","shell.execute_reply":"2024-11-23T08:55:14.962703Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train['CGAS-Season'].unique()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:14.965473Z","iopub.execute_input":"2024-11-23T08:55:14.965827Z","iopub.status.idle":"2024-11-23T08:55:14.981168Z","shell.execute_reply.started":"2024-11-23T08:55:14.965791Z","shell.execute_reply":"2024-11-23T08:55:14.979947Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"mapping = create_mapping('CGAS-Season', train) # CGAS-Season 칼럼 매핑\nmapping","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:14.982549Z","iopub.execute_input":"2024-11-23T08:55:14.982956Z","iopub.status.idle":"2024-11-23T08:55:14.999405Z","shell.execute_reply.started":"2024-11-23T08:55:14.982907Z","shell.execute_reply":"2024-11-23T08:55:14.998187Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train['CGAS-Season'].replace(mapping).astype(int).value_counts() # replace 컬럼의 값들을 mapping 딕셔너리로 치환","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:15.000941Z","iopub.execute_input":"2024-11-23T08:55:15.001296Z","iopub.status.idle":"2024-11-23T08:55:15.019734Z","shell.execute_reply.started":"2024-11-23T08:55:15.001263Z","shell.execute_reply":"2024-11-23T08:55:15.018353Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# cat_c 리스트에 포함된 모든 카테고리 칼럼 매핑 후 데이터타입 정수형으로\nfor col in cat_c:\n    mapping_train = create_mapping(col, train)\n    mapping_test = create_mapping(col, test)\n    \n    train[col] = train[col].replace(mapping_train).astype(int)\n    test[col] = test[col].replace(mapping_test).astype(int)\n\nprint(f'Train Shape : {train.shape} || Test Shape : {test.shape}')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:15.021445Z","iopub.execute_input":"2024-11-23T08:55:15.021933Z","iopub.status.idle":"2024-11-23T08:55:15.070181Z","shell.execute_reply.started":"2024-11-23T08:55:15.021872Z","shell.execute_reply":"2024-11-23T08:55:15.068870Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:15.071763Z","iopub.execute_input":"2024-11-23T08:55:15.072143Z","iopub.status.idle":"2024-11-23T08:55:15.184178Z","shell.execute_reply.started":"2024-11-23T08:55:15.072107Z","shell.execute_reply":"2024-11-23T08:55:15.182950Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"missing_columns = train.isna().sum()\nmissing_columns = missing_columns[missing_columns > 0].sort_values(ascending=False)\n\n# 데이터프레임 형태로 변환\nmissing_columns = pd.DataFrame(missing_columns, columns=['Missing_Values']).reset_index()\nmissing_columns.columns = ['Column', 'missing_Values']\nmissing_columns","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:15.185622Z","iopub.execute_input":"2024-11-23T08:55:15.186356Z","iopub.status.idle":"2024-11-23T08:55:15.205431Z","shell.execute_reply.started":"2024-11-23T08:55:15.186315Z","shell.execute_reply":"2024-11-23T08:55:15.204122Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train['PreInt_EduHx-computerinternet_hoursday'].unique()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:15.206802Z","iopub.execute_input":"2024-11-23T08:55:15.207241Z","iopub.status.idle":"2024-11-23T08:55:15.215493Z","shell.execute_reply.started":"2024-11-23T08:55:15.207203Z","shell.execute_reply":"2024-11-23T08:55:15.214442Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:15.217240Z","iopub.execute_input":"2024-11-23T08:55:15.217653Z","iopub.status.idle":"2024-11-23T08:55:15.333192Z","shell.execute_reply.started":"2024-11-23T08:55:15.217612Z","shell.execute_reply":"2024-11-23T08:55:15.331816Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 모델링","metadata":{}},{"cell_type":"markdown","source":"Cohen's Kappa는 두 평가자 간의 일치도를 평가하는 지표로, 값은 **-1 (완전 불일치)**부터 **1 (완전 일치)**까지 범위를 가집니다. 0은 우연히 일치한 정도를 의미","metadata":{}},{"cell_type":"code","source":"def quadratic_weighted_kappa(y_true, y_pred):\n    return cohen_kappa_score(y_true, y_pred, weights='quadratic')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:15.334510Z","iopub.execute_input":"2024-11-23T08:55:15.334865Z","iopub.status.idle":"2024-11-23T08:55:15.339506Z","shell.execute_reply.started":"2024-11-23T08:55:15.334832Z","shell.execute_reply":"2024-11-23T08:55:15.338451Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def threshold_Rounder(oof_non_rounded, thresholds):\n    return np.where(oof_non_rounded < thresholds[0], 0, # oof_non_rounded 값 thresholds[0]보다 작으면 0으로 반환\n                    np.where(oof_non_rounded < thresholds[1], 1,\n                             np.where(oof_non_rounded < thresholds[2], 2, 3))) # > 0,1,2,3 중 하나의 값으로 반환","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:15.340802Z","iopub.execute_input":"2024-11-23T08:55:15.341169Z","iopub.status.idle":"2024-11-23T08:55:15.352539Z","shell.execute_reply.started":"2024-11-23T08:55:15.341135Z","shell.execute_reply":"2024-11-23T08:55:15.351327Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def evaluate_predictions(thresholds, y_true, oof_non_rounded):\n    rounded_p = threshold_Rounder(oof_non_rounded, thresholds)\n    return -quadratic_weighted_kappa(y_true, rounded_p)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:15.354254Z","iopub.execute_input":"2024-11-23T08:55:15.354679Z","iopub.status.idle":"2024-11-23T08:55:15.366058Z","shell.execute_reply.started":"2024-11-23T08:55:15.354630Z","shell.execute_reply":"2024-11-23T08:55:15.364836Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def TrainML(model_class, test_data): # 모델, test 데이터\n\n    # 데이터 준비\n    X = train.drop(['sii'], axis=1)\n    y = train['sii']\n    \n    # K-Fold 교차 검증 > 5\n    SKF = StratifiedKFold(n_splits=n_splits, shuffle=True, random_state=SEED)\n    \n    train_S = [] #각 Fold에서의 Train QWK 점수를 저장\n    test_S = [] #각 Fold에서의 Validation QWK 점수를 저장.\n    \n    oof_non_rounded = np.zeros(len(y), dtype=float) # 각 Fold의 검증 데이터에 대한 예측값을 연속형 형태로 저장\n    oof_rounded = np.zeros(len(y), dtype=int) # 각 Fold의 검증 데이터에 대한 예측값을 범주형(0,1,,,) 형태로 저장\n    test_preds = np.zeros((len(test_data), n_splits)) #각 Fold에서 테스트 데이터에 대한 예측값 저장.\n\n    # K-fold 루프 시작\n    for fold, (train_idx, test_idx) in enumerate(tqdm(SKF.split(X, y), desc=\"Training Folds\", total=n_splits)):\n        X_train, X_val = X.iloc[train_idx], X.iloc[test_idx] # 학습용, 검증용 X\n        y_train, y_val = y.iloc[train_idx], y.iloc[test_idx] # 학습용, 검증용 y\n\n        model = clone(model_class) # clone > 모델 객체를 복제(원본 모델을 변경 X).\n        model.fit(X_train, y_train) # 학습\n\n        y_train_pred = model.predict(X_train) #학습데이터 예측\n        y_val_pred = model.predict(X_val) # 검증데이터 예측\n\n        oof_non_rounded[test_idx] = y_val_pred # 검증 데이터의 연속형 예측값 저장\n        y_val_pred_rounded = y_val_pred.round(0).astype(int) # 반올림 후 정수형 변환\n        oof_rounded[test_idx] = y_val_pred_rounded # 검증 데이터의 정수형 예측값 저장.\n\n        train_kappa = quadratic_weighted_kappa(y_train, y_train_pred.round(0).astype(int)) # 학습 데이터의 QWK 점수 계산.\n        val_kappa = quadratic_weighted_kappa(y_val, y_val_pred_rounded) # 검증 데이터의 QWK 점수 계산.\n\n        train_S.append(train_kappa) #  학습 데이터 QWK 점수 리스트.\n        test_S.append(val_kappa) #  검증 데이터 QWK 점수 리스트.\n        \n        test_preds[:, fold] = model.predict(test_data) # 테스트 데이터를 현재 Fold 모델로 예측 후 저장\n        \n        print(f\"Fold {fold+1} - Train QWK: {train_kappa:.4f}, Validation QWK: {val_kappa:.4f}\") # 현재 fold QWK 점수 출력.\n        \n        # https://ipython.org/ipython-doc/dev/api/generated/IPython.display.html#IPython.display.clear_output\n        clear_output(wait=True) # 이전 출력 내용을 지우고 새롭게 업데이트\n\n    print(f\"Mean Train QWK --> {np.mean(train_S):.4f}\") # 평균 학습 QWK\n    print(f\"Mean Validation QWK ---> {np.mean(test_S):.4f}\") # 평균 검증 QWK\n\n    KappaOPtimizer = minimize(evaluate_predictions,\n                              x0=[0.5, 1.5, 2.5], args=(y, oof_non_rounded), \n                              method='Nelder-Mead') # 최적 Threshold\n    assert KappaOPtimizer.success, \"Optimization did not converge.\" # 최적화가 성공적으로 완료되었는지 확인. 실패 시 에러 메시지 출력\n    \n    oof_tuned = threshold_Rounder(oof_non_rounded, KappaOPtimizer.x) # 최적 Threshold 사용해 oof_non_rounded 정수형으로\n    tKappa = quadratic_weighted_kappa(y, oof_tuned) # 최종 OOF QWK 점수 계산\n\n    print(f\"----> || Optimized QWK SCORE :: {Fore.CYAN}{Style.BRIGHT} {tKappa:.3f}{Style.RESET_ALL}\") # 최적화된 QWK 점수를 출력\n\n    tpm = test_preds.mean(axis=1) # 모든 Fold 예측값 평균 >  테스트 데이터의 최종 연속형 예측값\n    tpTuned = threshold_Rounder(tpm, KappaOPtimizer.x) # 최적 Threshold 적용해 테스트 데이터의 최종 정수형 예측값 생성.\n    \n    submission = pd.DataFrame({\n        'id': sample['id'],\n        'sii': tpTuned\n    }) #제출파일 생성\n\n    return submission,model","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:15.367593Z","iopub.execute_input":"2024-11-23T08:55:15.368048Z","iopub.status.idle":"2024-11-23T08:55:15.385886Z","shell.execute_reply.started":"2024-11-23T08:55:15.367989Z","shell.execute_reply":"2024-11-23T08:55:15.384676Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%%time\n\nParams7 = {'learning_rate': 0.03884249148676395, 'max_depth': 12, 'num_leaves': 413, 'min_data_in_leaf': 14,\n           'feature_fraction': 0.7987976913702801, 'bagging_fraction': 0.7602261703576205, 'bagging_freq': 2, \n           'lambda_l1': 4.735462555910575, 'lambda_l2': 4.735028557007343e-06} # CV : 0.4094 | LB : 0.471 파라미터 설정\n\nLight = lgb.LGBMRegressor(**Params7,random_state=SEED, verbose=-1,n_estimators=200)  #모델생성\n# Submission, model = TrainML(Light, test)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:15.387521Z","iopub.execute_input":"2024-11-23T08:55:15.388050Z","iopub.status.idle":"2024-11-23T08:55:15.406185Z","shell.execute_reply.started":"2024-11-23T08:55:15.387986Z","shell.execute_reply":"2024-11-23T08:55:15.404835Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"#### TrainML() - single fold","metadata":{}},{"cell_type":"code","source":"# param\nmodel_class = Light\ntest_data = test","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:15.407690Z","iopub.execute_input":"2024-11-23T08:55:15.408231Z","iopub.status.idle":"2024-11-23T08:55:15.425058Z","shell.execute_reply.started":"2024-11-23T08:55:15.408178Z","shell.execute_reply":"2024-11-23T08:55:15.424010Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X = train.drop(['sii'], axis=1)\ny = train['sii']\nX.shape, y.shape","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:15.426596Z","iopub.execute_input":"2024-11-23T08:55:15.427100Z","iopub.status.idle":"2024-11-23T08:55:15.445440Z","shell.execute_reply.started":"2024-11-23T08:55:15.427021Z","shell.execute_reply":"2024-11-23T08:55:15.444198Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"SKF = StratifiedKFold(n_splits=n_splits, shuffle=True, random_state=SEED)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:15.447111Z","iopub.execute_input":"2024-11-23T08:55:15.447826Z","iopub.status.idle":"2024-11-23T08:55:15.454639Z","shell.execute_reply.started":"2024-11-23T08:55:15.447767Z","shell.execute_reply":"2024-11-23T08:55:15.453109Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_S = []\ntest_S = []\n\noof_non_rounded = np.zeros(len(y), dtype=float) \noof_rounded = np.zeros(len(y), dtype=int) \ntest_preds = np.zeros((len(test_data), n_splits))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:15.456545Z","iopub.execute_input":"2024-11-23T08:55:15.457060Z","iopub.status.idle":"2024-11-23T08:55:15.468236Z","shell.execute_reply.started":"2024-11-23T08:55:15.456986Z","shell.execute_reply":"2024-11-23T08:55:15.467148Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"fold = 0 #fold 변수 초기화\n\n#인덱스 추출\ntrain_idx, test_idx = next(SKF.split(X, y))\ntrain_idx.shape, test_idx.shape","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:15.469411Z","iopub.execute_input":"2024-11-23T08:55:15.469862Z","iopub.status.idle":"2024-11-23T08:55:15.493392Z","shell.execute_reply.started":"2024-11-23T08:55:15.469803Z","shell.execute_reply":"2024-11-23T08:55:15.492084Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X_train, X_val = X.iloc[train_idx], X.iloc[test_idx]\ny_train, y_val = y.iloc[train_idx], y.iloc[test_idx]\nprint(X_train.shape, y_train.shape)\nprint(X_val.shape, y_val.shape)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:15.495518Z","iopub.execute_input":"2024-11-23T08:55:15.496001Z","iopub.status.idle":"2024-11-23T08:55:15.508455Z","shell.execute_reply.started":"2024-11-23T08:55:15.495947Z","shell.execute_reply":"2024-11-23T08:55:15.507237Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model = clone(model_class) #모델 복제\nmodel","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:15.510131Z","iopub.execute_input":"2024-11-23T08:55:15.510586Z","iopub.status.idle":"2024-11-23T08:55:15.535363Z","shell.execute_reply.started":"2024-11-23T08:55:15.510532Z","shell.execute_reply":"2024-11-23T08:55:15.533907Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%%time\n# 훈련\nmodel.fit(X_train, y_train)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:15.536721Z","iopub.execute_input":"2024-11-23T08:55:15.537972Z","iopub.status.idle":"2024-11-23T08:55:18.947785Z","shell.execute_reply.started":"2024-11-23T08:55:15.537907Z","shell.execute_reply":"2024-11-23T08:55:18.946222Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 예측\ny_train_pred = model.predict(X_train)\ny_val_pred = model.predict(X_val)\ny_val_pred[:5]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:18.949183Z","iopub.execute_input":"2024-11-23T08:55:18.949529Z","iopub.status.idle":"2024-11-23T08:55:19.053369Z","shell.execute_reply.started":"2024-11-23T08:55:18.949493Z","shell.execute_reply":"2024-11-23T08:55:19.052123Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"oof_non_rounded[test_idx] = y_val_pred\ny_val_pred_rounded = y_val_pred.round(0).astype(int)\noof_rounded[test_idx] = y_val_pred_rounded\ny_val_pred_rounded[:5]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:19.054992Z","iopub.execute_input":"2024-11-23T08:55:19.055355Z","iopub.status.idle":"2024-11-23T08:55:19.065334Z","shell.execute_reply.started":"2024-11-23T08:55:19.055321Z","shell.execute_reply":"2024-11-23T08:55:19.064097Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_kappa = quadratic_weighted_kappa(y_train, y_train_pred.round(0).astype(int))\nval_kappa = quadratic_weighted_kappa(y_val, y_val_pred_rounded)\nval_kappa","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:19.067578Z","iopub.execute_input":"2024-11-23T08:55:19.067933Z","iopub.status.idle":"2024-11-23T08:55:19.088086Z","shell.execute_reply.started":"2024-11-23T08:55:19.067898Z","shell.execute_reply":"2024-11-23T08:55:19.086401Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_S.append(train_kappa)\ntest_S.append(val_kappa)\n\ntest_S","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:19.089622Z","iopub.execute_input":"2024-11-23T08:55:19.090128Z","iopub.status.idle":"2024-11-23T08:55:19.099673Z","shell.execute_reply.started":"2024-11-23T08:55:19.090076Z","shell.execute_reply":"2024-11-23T08:55:19.098490Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_preds[:, fold] = model.predict(test_data)\ntest_preds.shape","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:19.101215Z","iopub.execute_input":"2024-11-23T08:55:19.101662Z","iopub.status.idle":"2024-11-23T08:55:19.122741Z","shell.execute_reply.started":"2024-11-23T08:55:19.101607Z","shell.execute_reply":"2024-11-23T08:55:19.121625Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(f\"Fold {fold+1} - Train QWK: {train_kappa:.4f}, Validation QWK: {val_kappa:.4f}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:19.124090Z","iopub.execute_input":"2024-11-23T08:55:19.124414Z","iopub.status.idle":"2024-11-23T08:55:19.136288Z","shell.execute_reply.started":"2024-11-23T08:55:19.124381Z","shell.execute_reply":"2024-11-23T08:55:19.134969Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### TrainML() 5-fold and agg","metadata":{}},{"cell_type":"code","source":"# param\nmodel_class = Light\ntest_data = test\n\nX = train.drop(['sii'], axis=1)\ny = train['sii']\n\nSKF = StratifiedKFold(n_splits=n_splits, shuffle=True, random_state=SEED)\n\ntrain_S = []\ntest_S = []\n\noof_non_rounded = np.zeros(len(y), dtype=float) \noof_rounded = np.zeros(len(y), dtype=int) \ntest_preds = np.zeros((len(test_data), n_splits))\n\nfor fold, (train_idx, test_idx) in enumerate(tqdm(SKF.split(X, y), desc=\"Training Folds\", total=n_splits)):\n    X_train, X_val = X.iloc[train_idx], X.iloc[test_idx]\n    y_train, y_val = y.iloc[train_idx], y.iloc[test_idx]\n\n    model = clone(model_class)\n    model.fit(X_train, y_train)\n\n    y_train_pred = model.predict(X_train)\n    y_val_pred = model.predict(X_val)\n\n    oof_non_rounded[test_idx] = y_val_pred\n    y_val_pred_rounded = y_val_pred.round(0).astype(int)\n    oof_rounded[test_idx] = y_val_pred_rounded\n\n    train_kappa = quadratic_weighted_kappa(y_train, y_train_pred.round(0).astype(int))\n    val_kappa = quadratic_weighted_kappa(y_val, y_val_pred_rounded)\n\n    train_S.append(train_kappa)\n    test_S.append(val_kappa)\n\n    test_preds[:, fold] = model.predict(test_data)\n\n    print(f\"Fold {fold+1} - Train QWK: {train_kappa:.4f}, Validation QWK: {val_kappa:.4f}\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:19.138236Z","iopub.execute_input":"2024-11-23T08:55:19.138583Z","iopub.status.idle":"2024-11-23T08:55:40.110287Z","shell.execute_reply.started":"2024-11-23T08:55:19.138548Z","shell.execute_reply":"2024-11-23T08:55:40.108613Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(f\"Mean Train QWK --> {np.mean(train_S):.4f}\")\nprint(f\"Mean Validation QWK ---> {np.mean(test_S):.4f}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:40.112322Z","iopub.execute_input":"2024-11-23T08:55:40.112800Z","iopub.status.idle":"2024-11-23T08:55:40.124905Z","shell.execute_reply.started":"2024-11-23T08:55:40.112755Z","shell.execute_reply":"2024-11-23T08:55:40.123677Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"- train 과 test 데이터의 성능 차이 존재","metadata":{}},{"cell_type":"code","source":"KappaOPtimizer = minimize(evaluate_predictions,\n                          x0=[0.5, 1.5, 2.5], args=(y, oof_non_rounded), \n                          method='Nelder-Mead') # Nelder-Mead | # Powell\nKappaOPtimizer","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:40.127144Z","iopub.execute_input":"2024-11-23T08:55:40.127573Z","iopub.status.idle":"2024-11-23T08:55:40.756219Z","shell.execute_reply.started":"2024-11-23T08:55:40.127536Z","shell.execute_reply":"2024-11-23T08:55:40.754922Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"KappaOPtimizer.success","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:40.757757Z","iopub.execute_input":"2024-11-23T08:55:40.758106Z","iopub.status.idle":"2024-11-23T08:55:40.765753Z","shell.execute_reply.started":"2024-11-23T08:55:40.758071Z","shell.execute_reply":"2024-11-23T08:55:40.764538Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"assert KappaOPtimizer.success, \"Optimization did not converge.\"","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:40.767405Z","iopub.execute_input":"2024-11-23T08:55:40.767730Z","iopub.status.idle":"2024-11-23T08:55:40.778218Z","shell.execute_reply.started":"2024-11-23T08:55:40.767697Z","shell.execute_reply":"2024-11-23T08:55:40.776626Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"oof_tuned = threshold_Rounder(oof_non_rounded, KappaOPtimizer.x)\noof_tuned","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:40.780472Z","iopub.execute_input":"2024-11-23T08:55:40.780872Z","iopub.status.idle":"2024-11-23T08:55:40.795020Z","shell.execute_reply.started":"2024-11-23T08:55:40.780835Z","shell.execute_reply":"2024-11-23T08:55:40.794086Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"tKappa = quadratic_weighted_kappa(y, oof_tuned)\ntKappa","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:40.796769Z","iopub.execute_input":"2024-11-23T08:55:40.797170Z","iopub.status.idle":"2024-11-23T08:55:40.821371Z","shell.execute_reply.started":"2024-11-23T08:55:40.797134Z","shell.execute_reply":"2024-11-23T08:55:40.820287Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(f\"----> || Optimized QWK SCORE :: {Fore.CYAN}{Style.BRIGHT} {tKappa:.3f}{Style.RESET_ALL}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:40.823550Z","iopub.execute_input":"2024-11-23T08:55:40.824081Z","iopub.status.idle":"2024-11-23T08:55:40.836372Z","shell.execute_reply.started":"2024-11-23T08:55:40.824003Z","shell.execute_reply":"2024-11-23T08:55:40.835327Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"tpm = test_preds.mean(axis=1)\ntpm","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:40.838006Z","iopub.execute_input":"2024-11-23T08:55:40.838386Z","iopub.status.idle":"2024-11-23T08:55:40.851664Z","shell.execute_reply.started":"2024-11-23T08:55:40.838351Z","shell.execute_reply":"2024-11-23T08:55:40.850552Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"tpTuned = threshold_Rounder(tpm, KappaOPtimizer.x)\ntpTuned","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:40.853487Z","iopub.execute_input":"2024-11-23T08:55:40.853828Z","iopub.status.idle":"2024-11-23T08:55:40.870202Z","shell.execute_reply.started":"2024-11-23T08:55:40.853794Z","shell.execute_reply":"2024-11-23T08:55:40.868656Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"submission = pd.DataFrame({\n    'id': sample['id'],\n    'sii': tpTuned\n})\nsubmission","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:40.872044Z","iopub.execute_input":"2024-11-23T08:55:40.872428Z","iopub.status.idle":"2024-11-23T08:55:40.900342Z","shell.execute_reply.started":"2024-11-23T08:55:40.872393Z","shell.execute_reply":"2024-11-23T08:55:40.899194Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"Submission = submission\nmodel = model","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:40.902290Z","iopub.execute_input":"2024-11-23T08:55:40.902649Z","iopub.status.idle":"2024-11-23T08:55:40.915989Z","shell.execute_reply.started":"2024-11-23T08:55:40.902614Z","shell.execute_reply":"2024-11-23T08:55:40.914755Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 피처중요도","metadata":{}},{"cell_type":"code","source":"feature_importance_df = pd.DataFrame({\n    'Feature': model.booster_.feature_name(),\n    'Importance': model.booster_.feature_importance(importance_type='gain')\n})\n\nfeature_importance_df = feature_importance_df.sort_values(by='Importance', ascending=False)\n\nplt.figure(figsize=(20, 40))\nsns.barplot(x='Importance', y='Feature', data=feature_importance_df.head(100)) \nplt.title(\"Top Feature Importance\")\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:40.917541Z","iopub.execute_input":"2024-11-23T08:55:40.917907Z","iopub.status.idle":"2024-11-23T08:55:44.457999Z","shell.execute_reply.started":"2024-11-23T08:55:40.917863Z","shell.execute_reply":"2024-11-23T08:55:44.456737Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 제출","metadata":{}},{"cell_type":"code","source":"Submission.to_csv('submission.csv', index=False)\nprint(Submission['sii'].value_counts())\n# sii 3 X","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:44.459464Z","iopub.execute_input":"2024-11-23T08:55:44.459923Z","iopub.status.idle":"2024-11-23T08:55:44.473830Z","shell.execute_reply.started":"2024-11-23T08:55:44.459875Z","shell.execute_reply":"2024-11-23T08:55:44.472542Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train.shape","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:44.475760Z","iopub.execute_input":"2024-11-23T08:55:44.476157Z","iopub.status.idle":"2024-11-23T08:55:44.483353Z","shell.execute_reply.started":"2024-11-23T08:55:44.476121Z","shell.execute_reply":"2024-11-23T08:55:44.482144Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test.shape","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-23T08:55:44.484560Z","iopub.execute_input":"2024-11-23T08:55:44.484863Z","iopub.status.idle":"2024-11-23T08:55:44.504141Z","shell.execute_reply.started":"2024-11-23T08:55:44.484832Z","shell.execute_reply":"2024-11-23T08:55:44.502911Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 파생 변수","metadata":{}},{"cell_type":"markdown","source":"- PAQ_A : 최근 7일동안의 활발한 활동 참여에 대한 점수 (청소년) 13~18세 \n- PAQ_C : 최근 7일동안의 활발한 활동 참여에 대한 점수 (어린이) 7~17세\n- -> 두 변수의 통일\n\n--------------------------------------------------------------\n- df = df.drop(season_cols, axis=1)  > season 관련 칼럼 드랍\n---------------------------------------------------------------\n- df['BMI_Age'] = df['Physical-BMI'] * df['Basic_Demos-Age'] : BMI와 연령 간 관계\n---------------------------------------------------------------\n- 인터넷 사용 시간 - 연령, BMI\n- df['Internet_Hours_Age'] = df['PreInt_EduHx-computerinternet_hoursday'] * df['Basic_Demos-Age']\n- df['BMI_Internet_Hours'] = df['Physical-BMI'] * df['PreInt_EduHx-computerinternet_hoursday']\n\n-----------------------------------------------------------------\n- 신체 체성분 칼럼\n- df['BFP_BMI'] = df['BIA-BIA_Fat'] / df['BIA-BIA_BMI'] : 체지방 / 체질량\n- df['FFMI_BFP'] = df['BIA-BIA_FFMI'] / df['BIA-BIA_Fat'] : 제지방량(신체에서 지방을 제거한 질량) / 체지방\n- df['FMI_BFP'] = df['BIA-BIA_FMI'] / df['BIA-BIA_Fat'] : 체지방량을 키의 제곱으로 나눈 값 / 체지방\n- df['LST_TBW'] = df['BIA-BIA_LST'] / df['BIA-BIA_TBW']  :지방을 제외한 연조직(근육, 장기, 피부 등)의 무게 / 총체수분량\n- df['BFP_BMR'] = df['BIA-BIA_Fat'] * df['BIA-BIA_BMR'] : 체지방량 / 기초대사량\n- df['BFP_DEE'] = df['BIA-BIA_Fat'] * df['BIA-BIA_DEE'] : 체지방량 / 일일에너지소비량\n- df['BMR_Weight'] = df['BIA-BIA_BMR'] / df['Physical-Weight'] : 기초대사량 /몸무게\n- df['DEE_Weight'] = df['BIA-BIA_DEE'] / df['Physical-Weight'] : 일일에너지소비량/몸무게\n- df['SMM_Height'] = df['BIA-BIA_SMM'] / df['Physical-Height'] : 골격근량 / 키\n- df['Muscle_to_Fat'] = df['BIA-BIA_SMM'] / df['BIA-BIA_FMI'] : 골격근량 / 체지방량을 키의 제곱으로 나눈 값\n- df['Hydration_Status'] = df['BIA-BIA_TBW'] / df['Physical-Weight'] : 총체수분량 / 몸무게 \n- df['ICW_TBW'] = df['BIA-BIA_ICW'] / df['BIA-BIA_TBW'] : 세포 내 수분/총 체수분량","metadata":{}},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}