{"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 pandas as pd \npd.set_option('display.max_rows', None)\n\nimport os\n\nimport pyarrow\nimport pyarrow.parquet\n\nfrom sklearn.model_selection import StratifiedKFold\nfrom sklearn.metrics import cohen_kappa_score\nfrom sklearn.preprocessing import LabelEncoder\nimport lightgbm as lgb\nfrom lightgbm.callback import log_evaluation, early_stopping\nimport xgboost as xgb\nfrom catboost import CatBoostRegressor\nfrom catboost.utils import eval_metric\nfrom time import time","metadata":{"execution":{"iopub.status.busy":"2024-10-02T02:44:03.387010Z","iopub.execute_input":"2024-10-02T02:44:03.387434Z","iopub.status.idle":"2024-10-02T02:44:03.394996Z","shell.execute_reply.started":"2024-10-02T02:44:03.387393Z","shell.execute_reply":"2024-10-02T02:44:03.393721Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for dirname, dirs, filenames in os.walk('/kaggle/input'):\n    dirs[:] = [d for d in dirs if 'series_' not in os.path.join(dirname, d)]\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-10-02T02:44:03.687859Z","iopub.execute_input":"2024-10-02T02:44:03.688279Z","iopub.status.idle":"2024-10-02T02:44:03.698938Z","shell.execute_reply.started":"2024-10-02T02:44:03.688240Z","shell.execute_reply":"2024-10-02T02:44:03.697478Z"},"trusted":true},"execution_count":null,"outputs":[]},{"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')\ndata_dict = pd.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/data_dictionary.csv')","metadata":{"execution":{"iopub.status.busy":"2024-10-02T02:44:04.702955Z","iopub.execute_input":"2024-10-02T02:44:04.703434Z","iopub.status.idle":"2024-10-02T02:44:04.770573Z","shell.execute_reply.started":"2024-10-02T02:44:04.703386Z","shell.execute_reply":"2024-10-02T02:44:04.769675Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"missing_counts_per_row = train.isna().sum(axis=1)\n\ntrain_cleaned = train[missing_counts_per_row != 78]\n\nprint(f\"削除した行数: {len(train) - len(train_cleaned)}\")\nprint(f\"現在のデータ数: {train_cleaned.shape[0]}\")\n\ntrain = train_cleaned\ntrain.info()","metadata":{"execution":{"iopub.status.busy":"2024-10-02T02:44:05.318340Z","iopub.execute_input":"2024-10-02T02:44:05.319379Z","iopub.status.idle":"2024-10-02T02:44:05.356768Z","shell.execute_reply.started":"2024-10-02T02:44:05.319302Z","shell.execute_reply":"2024-10-02T02:44:05.355564Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def missing_value_checker(df, name):\n    chk_null = df.isnull().sum()\n    chk_null_pct = chk_null / (df.index.max() + 1)\n    chk_null_tbl = pd.concat([chk_null[chk_null > 0], chk_null_pct[chk_null_pct > 0]], axis=1)\n    chk_null_tbl = chk_null_tbl.rename(columns={0: \"欠損数\",1: \"欠損割合\"})\n    print(name)\n    print(chk_null_tbl, end=\"\\n\\n\")\n    \n# missing_value_checker(train, \"train\")\n# missing_value_checker(test, \"test\")","metadata":{"execution":{"iopub.status.busy":"2024-10-02T02:44:06.351494Z","iopub.execute_input":"2024-10-02T02:44:06.352472Z","iopub.status.idle":"2024-10-02T02:44:06.359445Z","shell.execute_reply.started":"2024-10-02T02:44:06.352422Z","shell.execute_reply":"2024-10-02T02:44:06.358025Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# file_name = \"/kaggle/input/child-mind-institute-problematic-internet-use/series_train.parquet\"\n# loaded_table = pyarrow.parquet.read_table(file_name)\n# print(loaded_table)","metadata":{"execution":{"iopub.status.busy":"2024-10-02T02:44:06.757796Z","iopub.execute_input":"2024-10-02T02:44:06.758244Z","iopub.status.idle":"2024-10-02T02:44:06.766285Z","shell.execute_reply.started":"2024-10-02T02:44:06.758198Z","shell.execute_reply":"2024-10-02T02:44:06.765065Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = train\n\ntargets = df.columns[df.isnull().any()].tolist()\n\nfor target in targets:\n    if df[target].dtype == 'int' or df[target].dtype == 'int64':\n        # int 型の場合、最頻値で埋める\n        value = df[target].mode().iloc[0]\n        df[target] = df[target].fillna(value)\n    elif df[target].dtype == 'float' or df[target].dtype == 'float64':\n        # float 型の場合、平均値で埋める\n        value = df[target].mean()\n        df[target] = df[target].fillna(value)\n    elif df[target].dtype == 'object':\n        # object 型の場合、最頻値で埋める\n        value = df[target].mode().iloc[0]\n        df[target] = df[target].fillna(value)","metadata":{"execution":{"iopub.status.busy":"2024-10-02T02:44:07.070861Z","iopub.execute_input":"2024-10-02T02:44:07.071278Z","iopub.status.idle":"2024-10-02T02:44:07.136237Z","shell.execute_reply.started":"2024-10-02T02:44:07.071239Z","shell.execute_reply":"2024-10-02T02:44:07.134958Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"missing_value_checker(df, \"train_test\")\ntrain = df","metadata":{"execution":{"iopub.status.busy":"2024-10-02T02:44:07.406893Z","iopub.execute_input":"2024-10-02T02:44:07.407615Z","iopub.status.idle":"2024-10-02T02:44:07.427499Z","shell.execute_reply.started":"2024-10-02T02:44:07.407566Z","shell.execute_reply":"2024-10-02T02:44:07.426541Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for column in train.columns:\n    if column != 'id' and train[column].dtype == 'object':\n        le = LabelEncoder()\n        # 文字列データを数値に変換し、元のデータフレームに代入\n        train[column] = le.fit_transform(train[column])","metadata":{"execution":{"iopub.status.busy":"2024-10-02T02:44:07.759212Z","iopub.execute_input":"2024-10-02T02:44:07.759709Z","iopub.status.idle":"2024-10-02T02:44:07.785933Z","shell.execute_reply.started":"2024-10-02T02:44:07.759633Z","shell.execute_reply":"2024-10-02T02:44:07.784599Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"feature_names = list(filter(lambda x: x not in ['id', 'sii'] and not x.startswith('PCIAT'), train.columns))\nprint(feature_names)","metadata":{"execution":{"iopub.status.busy":"2024-10-02T02:44:09.094373Z","iopub.execute_input":"2024-10-02T02:44:09.095445Z","iopub.status.idle":"2024-10-02T02:44:09.105305Z","shell.execute_reply.started":"2024-10-02T02:44:09.095393Z","shell.execute_reply":"2024-10-02T02:44:09.104180Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X = train[feature_names].astype(np.float32).values\n\ny_split = train['sii'].astype(int).values\ny = train['sii'].astype(np.float32).values\noof = train['sii'].astype(int).values","metadata":{"execution":{"iopub.status.busy":"2024-10-02T02:44:09.479372Z","iopub.execute_input":"2024-10-02T02:44:09.479837Z","iopub.status.idle":"2024-10-02T02:44:09.494325Z","shell.execute_reply.started":"2024-10-02T02:44:09.479794Z","shell.execute_reply":"2024-10-02T02:44:09.493273Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def quadratic_weighted_kappa(y_true, y_pred):\n    if isinstance(y_pred, xgb.QuantileDMatrix):\n        y_true, y_pred = y_pred, y_true\n        y_true = (y_true.get_label() + a).clip(0, 3).round()\n        y_pred = (y_pred + a).clip(0, 3).round()\n        qwk = cohen_kappa_score(y_true, y_pred, weights=\"quadratic\")\n        return 'QWK', qwk\n\n    else:\n        y_true = (y_true + a).clip(0, 3).round()\n        y_pred = (y_pred + a).clip(0, 3).round()\n        qwk = cohen_kappa_score(y_true, y_pred, weights=\"quadratic\")\n        return 'QWK', qwk, True\ndef qwk_obj(y_true, y_pred):\n    labels = y_true + a\n    preds = y_pred + a\n    preds = preds.clip(0, 3)\n    f = 1/2*np.sum((preds-labels)**2)\n    g = 1/2*np.sum((preds-a)**2 + b)\n    df = preds - labels\n    dg = preds - a\n    grad = (df/g - f*dg/g**2) * len(labels)\n    hess = np.ones(len(labels))\n    return grad, hess\n\n\n# a = 2.948\n# b = 1.092\na = 0\nb = 1","metadata":{"execution":{"iopub.status.busy":"2024-10-02T02:44:11.062649Z","iopub.execute_input":"2024-10-02T02:44:11.063102Z","iopub.status.idle":"2024-10-02T02:44:11.074696Z","shell.execute_reply.started":"2024-10-02T02:44:11.063057Z","shell.execute_reply":"2024-10-02T02:44:11.073519Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class Predictor:\n    def __init__(self, models: list):\n        self.models = models\n    def predict(self, X):\n        n_models = len(self.models)\n        predicted = None\n        n = 0.76\n        for i, model in enumerate(self.models):\n            if i == 0:\n                predicted = n*model.predict(X)\n            else:\n                predicted += (1-n)*model.predict(X)\n        return predicted\n\ntarget_column = 'sii'\nlabel_encoder = LabelEncoder().fit(train['sii'])\n\ncolumns = feature_names\n# モデルの設定\ninput_dim = len(columns)\noutput_dim = len(label_encoder.classes_)\nid_col = test[\"id\"]\n\n# Stratified K-Foldの設定\nskf = StratifiedKFold(n_splits=10, shuffle=True, random_state=42)\ny_test_pred_all = []\nscore_all = []\nmodels = []\noof = []\ncallbacks = [log_evaluation(period=25), early_stopping(stopping_rounds=75,first_metric_only=True)]\n\n# Training and evaluation on each fold\nfor i_fold, (train_idx, val_idx) in enumerate(skf.split(X, y_split)):\n    print(f\"Running fold {i_fold + 1}...\")\n    X_train_fold, X_val_fold = X[train_idx], X[val_idx]\n    y_train_fold, y_val_fold, y_val_fold_int = y[train_idx], y[val_idx], y_split[val_idx]\n    \n    # LightGBM model\n    lightgbm = lgb.LGBMRegressor(\n#         device='gpu',\n        objective=qwk_obj,\n        metrics='None',\n        learning_rate=0.05,\n        max_depth=5,\n        num_leaves=10,\n        colsample_bytree=0.5,\n        reg_alpha=0.1,\n        reg_lambda=0.8,\n        n_estimators=1024,\n        extra_trees=True,\n        class_weight='balanced',\n        random_state=42,\n        verbosity=-1\n    )\n    \n    start = time()\n    eval_set = [(X_train_fold, y_train_fold), (X_val_fold, y_val_fold)]\n    lightgbm.fit(\n        X_train_fold,\n        y_train_fold,\n        eval_names=['train', 'valid'],\n        eval_set=eval_set,\n        eval_metric=quadratic_weighted_kappa,\n        callbacks=callbacks,\n    )\n    print(f\"LightGBM training time: {time() - start:.2f} seconds\")\n    \n    # XGBoost model\n    \n    xgboost = xgb.XGBRegressor(\n        objective=qwk_obj,\n        learning_rate=0.05,\n        max_depth=8,\n        colsample_bytree=0.5,\n        reg_alpha=1.0,\n        reg_lambda=0.1,\n        n_estimators=1024,\n        random_state=42,\n        tree_method=\"hist\",\n#         device='gpu',\n    )\n    \n    xgb_callbacks = [\n        xgb.callback.EvaluationMonitor(period=25),\n        xgb.callback.EarlyStopping(75, metric_name=\"QWK\", maximize=True, save_best=True)\n    ]\n    \n    start = time()\n    xgboost.fit(\n        X_train_fold,\n        y_train_fold,\n        eval_set=eval_set,\n        eval_metric=quadratic_weighted_kappa,\n        callbacks=xgb_callbacks,\n        verbose=0\n    )\n    \n    print(f\"XGBoost training time: {time() - start:.2f} seconds\")\n    \n    # Ensemble model\n    model = Predictor([lightgbm, xgboost])\n    models.append(model)\n    \n    # Predictions and scoring\n    predictions_fold = model.predict(X_val_fold)\n    predictions_fold = predictions_fold + a  # Ensure variable `a` is defined\n    predictions_fold = predictions_fold.clip(0, 3).round()\n    score = cohen_kappa_score(y_val_fold_int, predictions_fold, weights='quadratic')\n    print(f\"Fold {i_fold + 1} Kappa Score: {score:.4f}\")\n    score_all.append(score)\n\n# Average score across folds\nmean_score = np.mean(score_all)\nprint(f\"Mean Kappa Score: {mean_score:.4f}\")","metadata":{"execution":{"iopub.status.busy":"2024-10-02T02:44:11.907670Z","iopub.execute_input":"2024-10-02T02:44:11.908081Z","iopub.status.idle":"2024-10-02T02:44:56.784320Z","shell.execute_reply.started":"2024-10-02T02:44:11.908041Z","shell.execute_reply":"2024-10-02T02:44:56.783166Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = test\n\ntargets = df.columns[df.isnull().any()].tolist()\n\nfor target in targets:\n    if df[target].dtype == 'int' or df[target].dtype == 'int64':\n        # int 型の場合、最頻値で埋める\n        value = df[target].mode().iloc[0]\n        df[target] = df[target].fillna(value)\n    elif df[target].dtype == 'float' or df[target].dtype == 'float64':\n        # float 型の場合、平均値で埋める\n        value = df[target].mean()\n        df[target] = df[target].fillna(value)\n    elif df[target].dtype == 'object':\n        # object 型の場合、最頻値で埋める\n        value = df[target].mode().iloc[0]\n        df[target] = df[target].fillna(value)\n        \nmissing_value_checker(df, \"train_test\")\ntest = df","metadata":{"execution":{"iopub.status.busy":"2024-10-02T02:45:18.804448Z","iopub.execute_input":"2024-10-02T02:45:18.804951Z","iopub.status.idle":"2024-10-02T02:45:18.854762Z","shell.execute_reply.started":"2024-10-02T02:45:18.804902Z","shell.execute_reply":"2024-10-02T02:45:18.853681Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for column in test.columns:\n    if column != 'id' and test[column].dtype == 'object':\n        le = LabelEncoder()\n        # 文字列データを数値に変換し、元のデータフレームに代入\n        test[column] = le.fit_transform(test[column])","metadata":{"execution":{"iopub.status.busy":"2024-10-02T02:45:19.543728Z","iopub.execute_input":"2024-10-02T02:45:19.544629Z","iopub.status.idle":"2024-10-02T02:45:19.556562Z","shell.execute_reply.started":"2024-10-02T02:45:19.544574Z","shell.execute_reply":"2024-10-02T02:45:19.555428Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"probabilities = []\nfor model in models:\n    proba= model.predict(test[feature_names])+ a\n    probabilities.append(proba)\n\npredictions = np.mean(probabilities, axis=0)\n\npredictions = np.round(predictions.clip(0, 3))\n\nprint(predictions)","metadata":{"execution":{"iopub.status.busy":"2024-10-02T02:45:19.911931Z","iopub.execute_input":"2024-10-02T02:45:19.913113Z","iopub.status.idle":"2024-10-02T02:45:20.080331Z","shell.execute_reply.started":"2024-10-02T02:45:19.913059Z","shell.execute_reply":"2024-10-02T02:45:20.079142Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission = pd.DataFrame(id_col)\nsubmission[\"sii\"] = predictions\nsubmission['sii']=submission['sii'].astype(float)\nsubmission.to_csv(\"submission.csv\",index=None)\n\ndisplay(submission.head())","metadata":{"execution":{"iopub.status.busy":"2024-10-02T02:45:20.244184Z","iopub.execute_input":"2024-10-02T02:45:20.244648Z","iopub.status.idle":"2024-10-02T02:45:20.260344Z","shell.execute_reply.started":"2024-10-02T02:45:20.244602Z","shell.execute_reply":"2024-10-02T02:45:20.259021Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}