{"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":"nvidiaTeslaT4","dataSources":[{"sourceId":81933,"databundleVersionId":9643020,"sourceType":"competition"}],"dockerImageVersionId":30786,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport os\nfrom concurrent.futures import ThreadPoolExecutor\nfrom tqdm import tqdm\nfrom sklearn.decomposition import PCA\nfrom sklearn.cluster import KMeans\nfrom sklearn.metrics import silhouette_score\nfrom sklearn.preprocessing import LabelEncoder,StandardScaler\nfrom lightgbm import LGBMRegressor,LGBMClassifier,plot_importance\nfrom xgboost import XGBRegressor,XGBClassifier\nfrom catboost import CatBoostClassifier,CatBoostRegressor\nimport numpy as np\nfrom keras.models import Sequential\nfrom keras.layers import Conv2D, Flatten, Dense,Conv1D,BatchNormalization,MaxPooling1D,Input,Reshape\nfrom sklearn.feature_selection import SelectKBest, f_regression\nfrom scipy.optimize import minimize\nfrom sklearn.metrics import cohen_kappa_score\nfrom sklearn.model_selection import StratifiedKFold,cross_val_score,GridSearchCV,train_test_split\nfrom sklearn.ensemble import VotingRegressor,RandomForestRegressor, GradientBoostingRegressor\nfrom IPython.display import clear_output\nimport random\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-10-19T18:14:18.722443Z","iopub.execute_input":"2024-10-19T18:14:18.722815Z","iopub.status.idle":"2024-10-19T18:14:18.731343Z","shell.execute_reply.started":"2024-10-19T18:14:18.722780Z","shell.execute_reply":"2024-10-19T18:14:18.730324Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def load_single_parquet(dir,file_name):\n    file_path = os.path.join(dir, file_name, 'part-0.parquet')\n   # print(file_path)\n    df = pd.read_parquet(file_path, engine='pyarrow')\n    #df.mean()\n    #df.max()\n    df.drop('step', axis=1, inplace=True)\n    return df.describe().values.reshape(-1), file_name.split('=')[1]\n\ndef load_parquet(dir):\n    file_names = os.listdir(dir)\n    with ThreadPoolExecutor() as executor:\n        results  = list(tqdm(executor.map(lambda file_name: load_single_parquet(dir, file_name), file_names), total=len(file_names), desc=\"Loading Parquet files\"))\n    data, ids = zip(*results)\n    df = pd.DataFrame(data,columns=[f\"columns {i}\" for i in range(data[0].shape[0])])\n    df['id'] = ids\n    return df","metadata":{"execution":{"iopub.status.busy":"2024-10-19T18:14:18.732977Z","iopub.execute_input":"2024-10-19T18:14:18.733322Z","iopub.status.idle":"2024-10-19T18:14:18.746660Z","shell.execute_reply.started":"2024-10-19T18:14:18.733288Z","shell.execute_reply":"2024-10-19T18:14:18.745760Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def loadData():\n    data_train_parquet = load_parquet('/kaggle/input/child-mind-institute-problematic-internet-use/series_train.parquet')\n    data_test_parquet = load_parquet('/kaggle/input/child-mind-institute-problematic-internet-use/series_test.parquet')\n\n    train = pd.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/train.csv')\n    test = pd.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/test.csv')\n    data_train = pd.merge(train, data_train_parquet,how ='left' , on='id')\n    data_test = pd.merge(test, data_test_parquet,how ='left' , on='id')\n    \n    data_train = data_train.drop(data_train[data_train['sii'].isna()].index)\n\n    return data_train,data_test\ndef getX_y(data_train,data_test):\n    X = data_train.drop(['id', 'sii'], axis=1)\n    y = data_train['sii']\n    X_test_raw = data_test.drop(['id'], axis=1)\n    ids_test = data_test['id']\n    columns_drop = [column for column in X.columns if column not in X_test_raw.columns]\n    X.drop(columns_drop, axis=1,inplace = True)\n    return X,y,X_test_raw,ids_test\ndef reprocessing(X,X_test_raw):\n    led = LabelEncoder()\n    for col in X.columns:\n        if X[col].dtype == 'object':\n            X[col] = led.fit_transform(X[col])\n            X_test_raw[col] = led.transform(X_test_raw[col])\n            print(col)\n    \n    for col in X.columns:\n        X[col] = X[col].fillna(X[col].mean())\n        X_test_raw[col] = X_test_raw[col].fillna(X_test_raw[col].mean())\n    return X,X_test_raw\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-10-19T18:14:18.748412Z","iopub.execute_input":"2024-10-19T18:14:18.748704Z","iopub.status.idle":"2024-10-19T18:14:18.759590Z","shell.execute_reply.started":"2024-10-19T18:14:18.748672Z","shell.execute_reply":"2024-10-19T18:14:18.758794Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def scaler(X_train, X_test):\n    scaler = StandardScaler()\n    for col in X_train.columns:\n        X_train[col] = scaler.fit_transform(X_train[[col]])\n        X_test[col] = scaler.transform(X_test[[col]])\n\n    return X_train, X_test\ndef encoding(X,X_test,encodeDim=50):\n    #X,X_test = scaler(X,X_test)\n    cnn_encoder = None\n    cnn_decoder = None\n    \n    cnn_encoder = Sequential()\n    cnn_encoder.add(Input(shape=(X.shape[1],)))\n    cnn_encoder.add(Dense(encodeDim*2, activation='relu'))\n    cnn_encoder.add(Dense(encodeDim*3, activation='relu'))\n\n    # Decoder\n    cnn_decoder = Sequential()\n    cnn_decoder.add(cnn_encoder)\n    cnn_decoder.add(Dense(encodeDim*3, activation='relu'))\n    cnn_decoder.add(Dense(encodeDim*2, activation='relu'))\n    cnn_decoder.add(Dense(X.shape[1], activation='sigmoid'))\n\n    cnn_decoder.compile(optimizer='adam', loss='mse')\n    \n    #X_scaled, X_test_raw_scaled = scaler(X, X_test)\n    \n    cnn_decoder.fit(X, X , epochs=100, batch_size=32)\n    X_encoder = cnn_encoder.predict(X)\n    X_test_encoded = cnn_encoder.predict(X_test)\n    clear_output(wait = True)\n    return pd.DataFrame(X_encoder), pd.DataFrame(X_test_encoded)\ndef getKbest(X, X_test,y,k=70):\n    selector = SelectKBest(score_func=f_regression, k=k)\n    X_Kbest= selector.fit_transform(X, y)\n    X_test_Kbest = selector.transform(X_test)\n    X_Kbest = pd.DataFrame(X_Kbest)\n    X_test_Kbest = pd.DataFrame(X_test_Kbest)\n    return X_Kbest,X_test_Kbest\n\ndef getMerge(X1,X1_test,X2,X2_test):\n    X_merge = X1.copy()\n    X_test_merge = X1_test.copy()\n    for i in range(X2.shape[1]):\n        X_merge[i+X1.shape[1]] = X2[i]\n        X_test_merge[i+X1.shape[1]] = X2_test[i]\n    X_merge.columns = range(X_merge.shape[1])\n    X_test_merge.columns = range(X_test_merge.shape[1]) \n    return X_merge, X_test_merge\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-10-19T18:14:18.760621Z","iopub.execute_input":"2024-10-19T18:14:18.760904Z","iopub.status.idle":"2024-10-19T18:14:18.775244Z","shell.execute_reply.started":"2024-10-19T18:14:18.760864Z","shell.execute_reply":"2024-10-19T18:14:18.774398Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#best: cat with 1000: 0.5182481751824818\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)))\ndef evaluate_predictions(thresholds, y_true, oof_non_rounded):\n    rounded_p = threshold_Rounder(oof_non_rounded, thresholds)\n    return -cohen_kappa_score(y_true, rounded_p, weights='quadratic')","metadata":{"execution":{"iopub.status.busy":"2024-10-19T18:14:18.777280Z","iopub.execute_input":"2024-10-19T18:14:18.778051Z","iopub.status.idle":"2024-10-19T18:14:18.789303Z","shell.execute_reply.started":"2024-10-19T18:14:18.778005Z","shell.execute_reply":"2024-10-19T18:14:18.788474Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#without scale: 0.46314577737468166\n#with scale before: 0.44403983834057903\n#with two side scale: 0.4396940138523161","metadata":{"execution":{"iopub.status.busy":"2024-10-19T18:14:18.790297Z","iopub.execute_input":"2024-10-19T18:14:18.790655Z","iopub.status.idle":"2024-10-19T18:14:18.801511Z","shell.execute_reply.started":"2024-10-19T18:14:18.790612Z","shell.execute_reply":"2024-10-19T18:14:18.800701Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def trainML():\n    df_train,df_test = loadData()\n    X,y,X_test_raw, ids_test = getX_y(df_train,df_test)\n    X, X_test_raw = reprocessing(X,X_test_raw)\n    X_encoding,X_test_encoding = encoding(X,X_test_raw)\n    X_k, X_test_k = getKbest(X,X_test_raw,y)\n    X_new,X_test = getMerge(X_encoding,X_test_encoding,X_k,X_test_k)\n    print(X_new.shape)\n    print(X_test.shape)\n    kf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)\n    y_test_pred_final = np.zeros(len(X_test))\n    y_val_pred_final = np.zeros(len(X_new))\n    \n    # K-Fold cross-validation\n    for fold, (train_idx, val_idx) in enumerate(kf.split(X_new, y)):\n        print(f\"Training fold {fold + 1}\")\n        \n        X_train, X_val = X_new.iloc[train_idx], X_new.iloc[val_idx]\n        y_train, y_val = y.iloc[train_idx], y.iloc[val_idx]\n        \n        # Khởi tạo các mô hình\n        voting_model = VotingRegressor([\n            ('cat', CatBoostRegressor(n_estimators=1500)),\n            ('lgb', LGBMRegressor(n_estimators=1500)),\n            ('xgb', XGBRegressor(n_estimators=1500)),\n        ])\n        voting_model.fit(X_train, y_train)\n        \n        # Huấn luyện VotingRegressor trên tập huấn luyện\n        voting_model.fit(X_train, y_train)\n        \n        # Dự đoán cho tập validation\n        y_val_pred = voting_model.predict(X_val)\n        \n        # Lưu kết quả dự đoán của từng fold cho tập validation\n        y_val_pred_final[val_idx] = y_val_pred\n        \n        # Dự đoán trên tập test\n        y_test_pred = voting_model.predict(X_test)\n        \n        # Cộng dồn dự đoán của từng fold\n        y_test_pred_final += y_test_pred / kf.n_splits\n        clear_output(wait = True)\n    \n    # Sau khi hoàn tất K-fold, tối ưu Kappa\n    KappaOPtimizer = minimize(evaluate_predictions,\n                              x0=[0.5, 1.5, 2.5], args=(y, y_val_pred_final),\n                              method='Nelder-Mead')\n    \n    # Dự đoán cho tập validation\n    y_val_pred_rounded = np.round(y_val_pred_final, 0)\n    mse = cohen_kappa_score(y, y_val_pred_rounded, weights='quadratic')\n    print(f\"Validation Kappa Score rounded: {mse}\")\n    \n    # Áp dụng tối ưu hóa cho tập validation\n    y_optimize = threshold_Rounder(y_val_pred_final, KappaOPtimizer.x)\n    mse_optimized = cohen_kappa_score(y, y_optimize, weights='quadratic')\n    print(f\"Validation Kappa Score after optimization: {mse_optimized}\")\n    \n    # Áp dụng tối ưu hóa cho tập test\n    y_test_optimized = threshold_Rounder(y_test_pred_final, KappaOPtimizer.x)\n\n    sample = pd.DataFrame()\n    # Lưu kết quả ra file submission\n    sample['sii'] = y_test_optimized\n    sample['id'] = ids_test\n    return pd.DataFrame(sample)\n    #sample.to_csv('submission.csv', index=False)\n","metadata":{"execution":{"iopub.status.busy":"2024-10-19T18:14:18.879639Z","iopub.execute_input":"2024-10-19T18:14:18.880312Z","iopub.status.idle":"2024-10-19T18:14:18.892777Z","shell.execute_reply.started":"2024-10-19T18:14:18.880278Z","shell.execute_reply":"2024-10-19T18:14:18.891914Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sub1 = trainML()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-10-19T18:14:18.894387Z","iopub.execute_input":"2024-10-19T18:14:18.894727Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sub2 = trainML()\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sub3 = trainML()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\nsub1 = sub1.sort_values(by='id').reset_index(drop=True)\nsub2 = sub2.sort_values(by='id').reset_index(drop=True)\nsub3 = sub3.sort_values(by='id').reset_index(drop=True)\n\ncombined = pd.DataFrame({\n    'id': sub1['id'],\n    'sii_1': sub1['sii'],\n    'sii_2': sub2['sii'],\n    'sii_3': sub3['sii']\n})\n\ndef majority_vote(row):\n    return row.mode()[0]\n\ncombined['final_sii'] = combined[['sii_1', 'sii_2', 'sii_3']].apply(majority_vote, axis=1)\n\nfinal_submission = combined[['id', 'final_sii']].rename(columns={'final_sii': 'sii'})\n\nfinal_submission.to_csv('submission.csv', index=False)\n\nprint(\"Majority voting completed and saved to 'Final_Submission.csv'\")","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}