{"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":30775,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"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 matplotlib.pyplot as plt\nimport missingno as msno\nimport re\nimport os\nfrom colorama import Fore, Style\n\nfrom concurrent.futures import ThreadPoolExecutor\nfrom tqdm import tqdm\nfrom IPython.display import clear_output\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 catboost import CatBoostRegressor\nimport xgboost as xgb\nfrom sklearn.ensemble import VotingRegressor\nfrom sklearn.model_selection import *\nfrom sklearn.metrics import *\n\nSEED = 42\nn_splits = 5","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-10-07T09:09:12.497483Z","iopub.execute_input":"2024-10-07T09:09:12.498053Z","iopub.status.idle":"2024-10-07T09:09:12.509805Z","shell.execute_reply.started":"2024-10-07T09:09:12.497985Z","shell.execute_reply":"2024-10-07T09:09:12.508378Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\n\ntrain = 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\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)\n    return df.describe().values.reshape(-1), filename.split('=')[1]\n\ndef load_time_series(dirname) -> pd.DataFrame:\n    ids = os.listdir(dirname)\n    \n    with ThreadPoolExecutor() as executor:\n        results = list(tqdm(executor.map(lambda fname: process_file(fname, dirname), ids), total=len(ids)))\n    \n    stats, indexes = zip(*results)\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\n        \ntrain_ts = load_time_series(\"/kaggle/input/child-mind-institute-problematic-internet-use/series_train.parquet\")\ntest_ts = load_time_series(\"/kaggle/input/child-mind-institute-problematic-internet-use/series_test.parquet\")\ntime_series_cols = train_ts.columns.tolist()\ntime_series_cols.remove(\"id\")\n\ntrain = pd.merge(train, train_ts, how=\"left\", on='id')\ntest = pd.merge(test, test_ts, how=\"left\", on='id')\n\ntrain = train.drop('id',axis=1)\ntest = test.drop('id',axis=1)\n\nfeaturesCols = ['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\n\ntrain = train[featuresCols]\n#train = train.dropna(subset='sii')\n\ncat_c = ['Basic_Demos-Enroll_Season','CGAS-Season','Physical-Season','Fitness_Endurance-Season','FGC-Season',\n 'BIA-Season','PAQ_A-Season','PAQ_C-Season','SDS-Season','PreInt_EduHx-Season']\n\ndef update(df):\n    \n    global cat_c\n    for c in cat_c : \n        df[c] = df[c].fillna('Missing')\n        df[c] = df[c].astype('category')\n        \n    return df\n        \n# train = update(train)\n# test = update(test)\n\ndef create_mapping(column, dataset):\n    unique_values = dataset[column].unique()\n    return {value: idx for idx, value in enumerate(unique_values)}\n    \nfor col in cat_c:\n    all_values = pd.concat([train[col], test[col]]).unique()\n    mapping = {value: idx for idx, value in enumerate(all_values)}\n\n    train[col] = train[col].replace(mapping).astype(int)\n    test[col] = test[col].replace(mapping).astype(int)","metadata":{"execution":{"iopub.status.busy":"2024-10-07T09:09:12.512654Z","iopub.execute_input":"2024-10-07T09:09:12.513263Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for i in train.columns.to_list():\n    if i.startswith('stat_'):\n        print(f\"{train.columns.to_list().index(i)},{i}\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\"\"\"\n59,stat_0\n154,stat_95\n\"\"\"\nfor i in range(59,154,5):\n    train[f\"stat_mean{i}\"] = train.iloc[:, i:i+5].mean(axis=1)\n#     train[f\"stat_sum{i}\"] = train.iloc[:, i:i+5].sum(axis=1)\n\ntrain[f\"stat_mean_all\"] = train.iloc[:, 59:154].mean(axis=1)\n# train[f\"stat_sum_all\"] = train.iloc[:, 59:154].sum(axis=1)\n\n# ---------------------------------------------------------------- #\nfor i in range(58,153,5):\n    test[f\"stat_mean{i+1}\"] = test.iloc[:, i:i+5].mean(axis=1)\n#     test[f\"stat_sum{i+1}\"] = test.iloc[:, i:i+5].sum(axis=1)\n\ntest[f\"stat_mean_all\"] = test.iloc[:, 58:153].mean(axis=1)\n# test[f\"stat_sum_all\"] = test.iloc[:, 58:153].sum(axis=1)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nfrom lightgbm import LGBMRegressor, LGBMClassifier\n\ndef fill_missing_with_lgbm(train, test, target_column, n_estimators=500, random_state=42):\n    \"\"\"\n    使用LightGBM模型填补train和test的某个特征中的缺失值：\n    1. 先合并train和test，\n    2. 训练模型补全缺失值，\n    3. 再拆分出补全后的train和test。\n    \n    参数:\n    train (pd.DataFrame): 训练集数据框\n    test (pd.DataFrame): 测试集数据框\n    target_column (str): 需要填补缺失值的目标特征（列名称）\n    model_type (str): 'regression' 或 'classification' 来指定模型类型\n    n_estimators (int): LightGBM基学习器数量\n    random_state (int): 随机种子\n    \n    返回:\n    train_filled, test_filled: 两个DataFrame（train和test的缺失值已被填充）\n    \"\"\"\n    global cat_c\n    if target_column in cat_c:\n        model_type = 'classification'\n    else:\n        model_type = 'regression'\n    \n    # 1. 添加标记列来标识 train 和 test\n    train['is_train'] = 1\n    test['is_train'] = 0\n\n    # 合并train和test数据集\n    df = pd.concat([train, test], ignore_index=True)\n\n    # 2. 找出不包含目标列的特征列\n    features_columns = df.columns[df.columns != target_column].tolist()\n\n    # 提取缺失值的行和不缺失的行\n    df_missing = df[df[target_column].isnull()]  # 缺失值部分\n    df_not_missing = df[~df[target_column].isnull()]  # 不缺失部分\n\n    if df_missing.empty or df_not_missing.empty:\n        print(f\"No missing data in '{target_column}' column or all data are missing.\")\n        return train, test\n\n    # 3. 准备训练集和特征\n    X_train = df_not_missing[features_columns]  # 非缺失值行的特征\n    y_train = df_not_missing[target_column]     # 非缺失值行的目标列\n\n    # 4. 初始化 LGBM 模型\n    if model_type == 'regression':\n        model = LGBMRegressor(n_estimators=n_estimators, random_state=random_state)\n    elif model_type == 'classification':\n        model = LGBMClassifier(n_estimators=n_estimators, random_state=random_state)\n    else:\n        raise ValueError(\"model_type should be either 'regression' or 'classification'.\")\n\n    # 5. 训练模型\n    model.fit(X_train, y_train)\n\n    # 6. 使用模型预测缺失值\n    X_pred = df_missing[features_columns]\n    y_pred = model.predict(X_pred)\n\n    # 7. 用预测值填充缺失值部分\n    df.loc[df[target_column].isnull(), target_column] = y_pred\n\n    # 8. 将数据集重新拆分为原来的 train 和 test\n    train_filled = df[df['is_train'] == 1].drop(columns=['is_train'])\n    test_filled = df[df['is_train'] == 0].drop(columns=['is_train'])\n\n    return train_filled, test_filled\n\n\ntianbu_cols = ['CGAS-CGAS_Score','Physical-BMI','Physical-Height','Physical-Weight', \\\n               'Physical-Diastolic_BP','Physical-HeartRate','Physical-Systolic_BP', \\\n               'SDS-SDS_Total_Raw','SDS-SDS_Total_T','PreInt_EduHx-computerinternet_hoursday']\n\nfor col in tianbu_cols:\n    print(\"开始填补特征：\"+ col)\n    train, test = fill_missing_with_lgbm(train, test, col)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"FGC_cols = [\n  'FGC-FGC_CU',\n  'FGC-FGC_CU_Zone',\n  'FGC-FGC_GSND',\n  'FGC-FGC_GSND_Zone',\n  'FGC-FGC_GSD',\n  'FGC-FGC_GSD_Zone',\n  'FGC-FGC_PU',\n  'FGC-FGC_PU_Zone',\n  'FGC-FGC_SRL',\n  'FGC-FGC_SRL_Zone',\n  'FGC-FGC_SRR',\n  'FGC-FGC_SRR_Zone',\n  'FGC-FGC_TL',\n  'FGC-FGC_TL_Zone'\n]\nfor col in FGC_cols:\n    print(\"开始填补特征：\"+ col)\n    train, test = fill_missing_with_lgbm(train, test, col)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = update(train)\ntest = update(test)\n\ntrain = train.dropna(subset='sii')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def create_interaction_features(df, feature_pairs):\n    global cat_c\n    for feature1, feature2 in feature_pairs:\n        if(feature1 not in cat_c or feature2 not in cat_c):\n            print(\"feature1:\" + feature1 + \",feature2:\" + feature2)\n            new_feature_name = f\"{feature1}_x_{feature2}\"\n            df[new_feature_name] = df[feature1] * df[feature2]\n    return df","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"feature_pairs = [\n    ('PreInt_EduHx-computerinternet_hoursday', 'Basic_Demos-Age'),\n    ('Basic_Demos-Age', 'SDS-SDS_Total_T'),\n    ('FGC-FGC_SRR_Zone', 'SDS-SDS_Total_T'),\n    ('BIA-BIA_BMC', 'Physical-HeartRate'),\n    ('BIA-BIA_Fat', 'Physical-HeartRate'),\n    ('BIA-BIA_Fat', 'Physical-BMI'),\n    ('PreInt_EduHx-Season', 'Fitness_Endurance-Season'),\n    ('SDS-SDS_Total_T', 'Physical-Systolic_BP'),\n    ('Basic_Demos-Sex', 'FGC-FGC_PU_Zone'),\n    ('BIA-BIA_DEE', 'PreInt_EduHx-computerinternet_hoursday'),\n    ('BIA-BIA_SMM', 'PreInt_EduHx-computerinternet_hoursday'),\n]\n\n\ntrain = create_interaction_features(train, feature_pairs)\ntest = create_interaction_features(test, feature_pairs)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test = test.drop(['sii'], axis=1)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\n\ndef quadratic_weighted_kappa(y_true, y_pred):\n    return cohen_kappa_score(y_true, y_pred, weights='quadratic')\n\ndef threshold_Rounder(oof_non_rounded, thresholds):\n    return np.where(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)))\n\ndef 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)\n\ndef TrainML(model_class, test_data, n_splits = 5):\n    \n    X = train.drop(['sii'], axis=1)\n    y = train['sii']\n\n    SKF = StratifiedKFold(n_splits=n_splits, shuffle=True, random_state=SEED)\n    \n    models = []\n    \n    train_S = []\n    test_S = []\n    \n    oof_non_rounded = np.zeros(len(y), dtype=float) \n    oof_rounded = np.zeros(len(y), dtype=int) \n    test_preds = np.zeros((len(test_data), n_splits))\n\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]\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        clear_output(wait=True)\n        models.append(model)\n\n    print(f\"Mean Train QWK --> {np.mean(train_S):.4f}\")\n    print(f\"Mean Validation QWK ---> {np.mean(test_S):.4f}\")\n\n    KappaOPtimizer = minimize(evaluate_predictions,\n                              x0=[0.5, 1.5, 2.5], args=(y, oof_non_rounded), \n                              method='Nelder-Mead') # Nelder-Mead | # Powell\n    assert KappaOPtimizer.success, \"Optimization did not converge.\"\n    \n    oof_tuned = threshold_Rounder(oof_non_rounded, KappaOPtimizer.x)\n    tKappa = quadratic_weighted_kappa(y, oof_tuned)\n\n    print(f\"----> || Optimized QWK SCORE :: {Fore.CYAN}{Style.BRIGHT} {tKappa:.3f}{Style.RESET_ALL}\")\n\n    tpm = test_preds.mean(axis=1)\n    tpTuned = threshold_Rounder(tpm, KappaOPtimizer.x)\n    \n    submission = pd.DataFrame({\n        'id': sample['id'],\n        'sii': tpTuned\n    })\n    \n    TRAIN_qwk = np.mean(train_S)\n    TEST_qwk = np.mean(test_S)\n    tKappa\n    \n    scores = [TRAIN_qwk,TEST_qwk, tKappa]\n\n    return submission, models, X, scores","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\n\nParams = {'learning_rate': 0.04603534510792164, 'max_depth': 12, 'num_leaves': 478, 'min_data_in_leaf': 13,\n          'feature_fraction': 0.8935304204489449, 'bagging_fraction': 0.7840117449237969, 'bagging_freq': 4,\n          'lambda_l1': 6.596560434072009, 'lambda_l2': 2.680080551210706e-06} \n\nLight = lgb.LGBMRegressor(**Params,random_state=SEED, verbose=-1,n_estimators=200)\nSubmission, models_train1, X, s = TrainML(Light,test)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"importance_df = pd.DataFrame(np.sum([model.feature_importances_ for model in models_train1], axis=0), index=X.columns, columns=['importance']).sort_values('importance',ascending=True)\nimportance_df\n\nfig = plt.figure(figsize=(10, 30))\nplt.barh(importance_df.index, importance_df[\"importance\"], align=\"center\")\nplt.title(\"Feature Importance\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"IMPOTTANCE_TH = 0\ndrop_fes = importance_df[importance_df[\"importance\"]<=IMPOTTANCE_TH].index.to_list()\ndrop_fes","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = train.drop(columns=drop_fes)\ntest = test.drop(columns=drop_fes)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 获取各自列的集合\ntrain_columns = set(train.columns)\ntest_columns = set(test.columns)\n\n# 查找只在 train 中但不在 test 中的列\ntrain_only = train_columns - test_columns\n\n# 查找只在 test 中但不在 train 中的列\ntest_only = test_columns - train_columns\n\n# 输出差异列\nprint(f\"Columns only in train: {train_only}\")\nprint(f\"Columns only in test: {test_only}\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"best_params_lgbm = {'num_leaves': 60, 'learning_rate': 0.011747572224219955, 'n_estimators': 993,  'min_child_weight': 0.0025036281384857462, 'subsample': 0.8252622287203014, 'colsample_bytree': 0.6648896193058901, 'reg_alpha': 0.7153672744430527, 'reg_lambda': 0.12158717311465662}\nbest_params_xgb = {'learning_rate': 0.007356059931165658, 'max_depth': 3, 'n_estimators': 957, 'subsample': 0.6555266544650088, 'colsample_bytree': 0.7712019245727745}\nbest_params_catboost = {'iterations': 804, 'learning_rate': 0.007849710402582562, 'depth': 6, 'l2_leaf_reg': 7.31183636902306, 'subsample': 0.5630297785016092, 'random_strength': 1.7097065892440113, 'bagging_temperature': 0.026593521316435192, 'border_count': 12}","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# %%time\n# # LightGBM\n# Light = lgb.LGBMRegressor(**best_params_lgbm, random_state=SEED, verbose=-1)\n# Submission_lgbm, lgbm_models, _, lgbm_score, _ = TrainML(Light, test)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # XGBoost\n# XGBoost = xgb.XGBRegressor(**best_params_xgb, random_state=SEED,enable_categorical=True)\n# Submission_xgb, xgb_models, _, xgb_score, _ = TrainML(XGBoost, test)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # CatBoost\n# CatBoost = CatBoostRegressor(**best_params_catboost, random_state=SEED, verbose=0,cat_features=cat_c)\n# Submission_cat, cat_models, _, cat_score, _ = TrainML(CatBoost, test)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\nfrom sklearn.ensemble import VotingRegressor\n\n\n# VotingRegressorのパラメータ最適化（weights調整）\ndef voting_objective(trial):\n    # 最適化された各モデルを作成\n    best_xgb = xgb.XGBRegressor(**best_params_xgb, random_state=SEED,enable_categorical=True)\n    best_lgbm = LGBMRegressor(**best_params_lgbm, random_state=SEED, verbose=-1)\n    best_catboost = CatBoostRegressor(**best_params_catboost, random_state=SEED, verbose=0,cat_features=cat_c)\n    # 各モデルの重みを調整\n    weights = [\n        trial.suggest_uniform('lgbm_weight', 0.1, 1.0),\n        trial.suggest_uniform('xgb_weight', 0.1, 1.0),\n        trial.suggest_uniform('catboost_weight', 0.1, 1.0),\n    ]\n    # VotingRegressorの作成\n    voting_model = VotingRegressor(estimators=[\n        ('lightgbm', best_lgbm),\n        ('xgboost', best_xgb),\n        ('catboost', best_catboost)\n    ], weights=weights)\n    \n    # クロスバリデーションまたは評価関数\n    Submission, models, _, test_qwk, train_qwk = TrainML(voting_model, test)\n    return test_qwk\n\n# VotingRegressorの最適化\n# study_voting = optuna.create_study(direction='maximize')\n# study_voting.optimize(voting_objective, n_trials=200)\n\n","metadata":{"jupyter":{"source_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n# voting_parameters = {'lgbm_weight': 0.5365766827837293, \n#              'xgb_weight': 0.423179512372225, \n#              'catboost_weight': 0.13226982416943922}\n# CV 0.4145454658381026\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n# # 最適なVotingRegressorで最終トレーニング\n# best_voting_model = VotingRegressor(estimators=[\n#     ('lightgbm',  LGBMRegressor(**best_params_lgbm, random_state=SEED, verbose=-1)),\n#     ('xgboost', xgb.XGBRegressor(**best_params_xgb, random_state=SEED,enable_categorical=True)),\n#     ('catboost', CatBoostRegressor(**best_params_catboost, random_state=SEED, verbose=0,cat_features=cat_c))\n# ], weights=[\n#     voting_parameters['lgbm_weight'],\n#     voting_parameters['xgb_weight'],\n#     voting_parameters['catboost_weight']\n# ])\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# #ランダムステートをfor文で回して\n# submissions = []\n\n# for SEED in range(42, 52):\n#     Light = lgb.LGBMRegressor(**best_params_lgbm, random_state=SEED, verbose=-1)\n#     _Submission, _models, _, scores = TrainML(Light, test)\n#     submissions.append(_Submission)\n\n# # 最初のデータフレームを基に、id列を維持しつつscore列の平均を計算\n# average_submission = submissions[0][['id']].copy()\n# average_submission['sii'] = pd.concat([df['sii'] for df in submissions], axis=1).mean(axis=1)\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # 統合モデルでトレーニング\n# Submission, models, _, score = TrainML(best_voting_model, test)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## cvの分割数について","metadata":{}},{"cell_type":"code","source":"lgbm_scores = []\nfor split in range(2,10):\n    Light = lgb.LGBMRegressor(**best_params_lgbm, random_state=SEED, verbose=-1)\n    Submission_lgbm, lgbm_models, _, score = TrainML(Light, test, split)\n    lgbm_scores.append(score)\n    ","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"xgb_scores = []\nfor split in range(2,10):\n    XGBoost = xgb.XGBRegressor(**best_params_xgb, random_state=SEED,enable_categorical=True)\n    Submission_xgb, xgb_models, _, score = TrainML(XGBoost, test, split)\n    xgb_scores.append(score)\n    ","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"catboost_scores = []\nfor split in range(2,10):\n    CatBoost = CatBoostRegressor(**best_params_catboost, random_state=SEED, verbose=0,cat_features=cat_c)\n    Submission_cat, cat_models, _, score = TrainML(CatBoost, test, split)\n    catboost_scores.append(score)\n    \n    ","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig, axs = plt.subplots(3, 1, figsize=(10, 18))\n\nmetrics = ['train_qwk', 'valid_qwk', 'optimize_qwk']\n\nfor i in range(3):\n    axs[i].plot([score[i] for score in lgbm_scores], label='LGBM Scores', marker='o')\n    axs[i].plot([score[i] for score in xgb_scores], label='XGB Scores', marker='o')\n    axs[i].plot([score[i] for score in catboost_scores], label='CatBoost Scores', marker='o')\n    axs[i].set_title(f'{metrics[i]} Across Iterations')\n    axs[i].set_xlabel('Iteration')\n    axs[i].set_ylabel('Score')\n    axs[i].legend()\n    axs[i].grid(True)\n\n# Adjust layout for clarity\nplt.tight_layout()\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Submission","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# %%time\n# Submission.to_csv('submission.csv', index=False)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}