{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":84896,"databundleVersionId":10305135,"sourceType":"competition"}],"dockerImageVersionId":30918,"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":"2025-04-02T07:07:51.259342Z","iopub.execute_input":"2025-04-02T07:07:51.259698Z","iopub.status.idle":"2025-04-02T07:07:51.648167Z","shell.execute_reply.started":"2025-04-02T07:07:51.259668Z","shell.execute_reply":"2025-04-02T07:07:51.64706Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_train = pd.read_csv('/kaggle/input/playground-series-s4e12/train.csv')\ndf_test = pd.read_csv('/kaggle/input/playground-series-s4e12/test.csv')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T07:07:55.004123Z","iopub.execute_input":"2025-04-02T07:07:55.004658Z","iopub.status.idle":"2025-04-02T07:08:05.623208Z","shell.execute_reply.started":"2025-04-02T07:07:55.004596Z","shell.execute_reply":"2025-04-02T07:08:05.622407Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_train.info()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T07:08:09.377135Z","iopub.execute_input":"2025-04-02T07:08:09.377509Z","iopub.status.idle":"2025-04-02T07:08:10.083701Z","shell.execute_reply.started":"2025-04-02T07:08:09.377477Z","shell.execute_reply":"2025-04-02T07:08:10.082816Z"},"collapsed":true,"jupyter":{"outputs_hidden":true}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_test.info()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T07:08:18.993573Z","iopub.execute_input":"2025-04-02T07:08:18.99389Z","iopub.status.idle":"2025-04-02T07:08:19.446564Z","shell.execute_reply.started":"2025-04-02T07:08:18.993861Z","shell.execute_reply":"2025-04-02T07:08:19.445642Z"},"collapsed":true,"jupyter":{"outputs_hidden":true}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_train.nunique()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T07:08:23.879393Z","iopub.execute_input":"2025-04-02T07:08:23.879724Z","iopub.status.idle":"2025-04-02T07:08:25.068335Z","shell.execute_reply.started":"2025-04-02T07:08:23.879688Z","shell.execute_reply":"2025-04-02T07:08:25.067296Z"},"collapsed":true,"jupyter":{"outputs_hidden":true}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_test.nunique()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T07:08:29.304139Z","iopub.execute_input":"2025-04-02T07:08:29.304517Z","iopub.status.idle":"2025-04-02T07:08:30.02916Z","shell.execute_reply.started":"2025-04-02T07:08:29.304487Z","shell.execute_reply":"2025-04-02T07:08:30.028204Z"},"collapsed":true,"jupyter":{"outputs_hidden":true}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_train.isna().sum()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T07:08:38.624027Z","iopub.execute_input":"2025-04-02T07:08:38.624409Z","iopub.status.idle":"2025-04-02T07:08:39.288031Z","shell.execute_reply.started":"2025-04-02T07:08:38.624374Z","shell.execute_reply":"2025-04-02T07:08:39.287084Z"},"collapsed":true,"jupyter":{"outputs_hidden":true}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_test.isna().sum()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T07:08:43.553795Z","iopub.execute_input":"2025-04-02T07:08:43.554214Z","iopub.status.idle":"2025-04-02T07:08:43.996651Z","shell.execute_reply.started":"2025-04-02T07:08:43.554152Z","shell.execute_reply":"2025-04-02T07:08:43.995788Z"},"collapsed":true,"jupyter":{"outputs_hidden":true}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"看來NA值不少，若直接刪除，會少很多資料\n\n先將離散型資料、連續型資料欄位分開，再補值","metadata":{}},{"cell_type":"code","source":"numerics = ['int16', 'int32', 'int64', 'float16', 'float32', 'float64']\ndf_train_num = df_train.select_dtypes(include = numerics)\ndf_train_num.columns","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T07:08:54.344478Z","iopub.execute_input":"2025-04-02T07:08:54.34481Z","iopub.status.idle":"2025-04-02T07:08:54.38773Z","shell.execute_reply.started":"2025-04-02T07:08:54.34478Z","shell.execute_reply":"2025-04-02T07:08:54.386901Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_test_num = df_test.select_dtypes(include = numerics)\ndf_test_num.columns","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T07:08:57.693997Z","iopub.execute_input":"2025-04-02T07:08:57.694351Z","iopub.status.idle":"2025-04-02T07:08:57.71277Z","shell.execute_reply.started":"2025-04-02T07:08:57.694321Z","shell.execute_reply":"2025-04-02T07:08:57.711637Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# df_train_num.isna().sum()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-01T09:17:11.663568Z","iopub.execute_input":"2025-04-01T09:17:11.66389Z","iopub.status.idle":"2025-04-01T09:17:11.71657Z","shell.execute_reply.started":"2025-04-01T09:17:11.663866Z","shell.execute_reply":"2025-04-01T09:17:11.715711Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_train_cate = df_train.drop(df_train_num.columns,axis = 1)\ndf_train_cate.columns","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T07:09:05.853265Z","iopub.execute_input":"2025-04-02T07:09:05.853592Z","iopub.status.idle":"2025-04-02T07:09:06.002235Z","shell.execute_reply.started":"2025-04-02T07:09:05.853564Z","shell.execute_reply":"2025-04-02T07:09:06.001428Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_test_cate = df_test.drop(df_test_num.columns,axis = 1)\ndf_test_cate.columns","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T07:09:08.523937Z","iopub.execute_input":"2025-04-02T07:09:08.524329Z","iopub.status.idle":"2025-04-02T07:09:08.638985Z","shell.execute_reply.started":"2025-04-02T07:09:08.524295Z","shell.execute_reply":"2025-04-02T07:09:08.637919Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# df_train_cate.isna().sum()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-01T09:17:18.957716Z","iopub.execute_input":"2025-04-01T09:17:18.958076Z","iopub.status.idle":"2025-04-01T09:17:19.591058Z","shell.execute_reply.started":"2025-04-01T09:17:18.958044Z","shell.execute_reply":"2025-04-01T09:17:19.590027Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# df_train_num.isna().sum()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-01T09:17:24.189906Z","iopub.execute_input":"2025-04-01T09:17:24.190304Z","iopub.status.idle":"2025-04-01T09:17:24.243707Z","shell.execute_reply.started":"2025-04-01T09:17:24.19027Z","shell.execute_reply":"2025-04-01T09:17:24.242701Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"先處理數值型欄位的NA值","metadata":{}},{"cell_type":"code","source":"# library & dataset\nimport seaborn as sns\nimport matplotlib.pyplot as plt\n# df = sns.load_dataset('iris')\n\n# sns.boxplot( y=df_train[\"Premium Amount\"], data = df_train_num )\nplt.figure(figsize = (14, 10), dpi = 72)\nplt.subplots_adjust(left = 0.1, bottom = 0.1, right = 0.9, top = 0.9, wspace = 0.5, hspace = 0.3)\n\nplt.subplot(331)\nsns.boxplot(y = df_train[\"Age\"])\nplt.subplot(332)\nsns.boxplot(y = df_train[\"Annual Income\"])\nplt.subplot(333)\nsns.boxplot(y = df_train[\"Number of Dependents\"])\nplt.subplot(334)\nsns.boxplot(y = df_train[\"Health Score\"])\nplt.subplot(335)\nsns.boxplot(y = df_train[\"Previous Claims\"])\nplt.subplot(336)\nsns.boxplot(y = df_train[\"Vehicle Age\"])\nplt.subplot(337)\nsns.boxplot(y = df_train[\"Credit Score\"])\nplt.subplot(338)\nsns.boxplot(y = df_train[\"Insurance Duration\"])\nplt.subplot(339)\nsns.boxplot(y = df_train[\"Premium Amount\"])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T07:09:20.298915Z","iopub.execute_input":"2025-04-02T07:09:20.299271Z","iopub.status.idle":"2025-04-02T07:09:23.040904Z","shell.execute_reply.started":"2025-04-02T07:09:20.299237Z","shell.execute_reply":"2025-04-02T07:09:23.03968Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"由圖可知，Annual Income、Previous Claims、Premium Amount有離群值，而Premium Amount為預測目標，暫不處理\n\n其他欄位，用RandomForestRegressor並自訂函數來處理NA值","metadata":{}},{"cell_type":"code","source":"from sklearn.ensemble import RandomForestRegressor\nfrom sklearn.experimental import enable_iterative_imputer\nfrom sklearn.impute import IterativeImputer\ndef fillna(data,col):\n    df_train_num1 = pd.DataFrame(data[col])\n    impute = IterativeImputer(estimator = RandomForestRegressor(), random_state = 0)\n    impute.fit(df_train_num1)\n    # display(pd.DataFrame(impute.transform(df_train_num1)))\n    data[col] = pd.DataFrame(impute.transform(df_train_num1))\n    return data[col]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T07:25:11.958785Z","iopub.execute_input":"2025-04-02T07:25:11.959368Z","iopub.status.idle":"2025-04-02T07:25:12.779587Z","shell.execute_reply.started":"2025-04-02T07:25:11.959333Z","shell.execute_reply":"2025-04-02T07:25:12.77854Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for i in df_train_num:\n    if i == 'id':\n        continue\n    df_train[i] = fillna(df_train_num,i)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T07:28:27.606865Z","iopub.execute_input":"2025-04-02T07:28:27.607232Z","iopub.status.idle":"2025-04-02T07:28:28.483563Z","shell.execute_reply.started":"2025-04-02T07:28:27.607204Z","shell.execute_reply":"2025-04-02T07:28:28.482619Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_train_num","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T07:29:12.693941Z","iopub.execute_input":"2025-04-02T07:29:12.694316Z","iopub.status.idle":"2025-04-02T07:29:12.712707Z","shell.execute_reply.started":"2025-04-02T07:29:12.694282Z","shell.execute_reply":"2025-04-02T07:29:12.711667Z"},"collapsed":true,"jupyter":{"outputs_hidden":true}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_train","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T07:28:52.24913Z","iopub.execute_input":"2025-04-02T07:28:52.249534Z","iopub.status.idle":"2025-04-02T07:28:53.270841Z","shell.execute_reply.started":"2025-04-02T07:28:52.249504Z","shell.execute_reply":"2025-04-02T07:28:53.269925Z"},"collapsed":true,"jupyter":{"outputs_hidden":true}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for i in df_test_num:\n    if i == 'id':\n        continue\n    df_test[i] = fillna(df_test_num,i)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T07:30:22.349284Z","iopub.execute_input":"2025-04-02T07:30:22.349625Z","iopub.status.idle":"2025-04-02T07:30:22.872066Z","shell.execute_reply.started":"2025-04-02T07:30:22.349596Z","shell.execute_reply":"2025-04-02T07:30:22.871136Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_test","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T07:30:25.651834Z","iopub.execute_input":"2025-04-02T07:30:25.652228Z","iopub.status.idle":"2025-04-02T07:30:25.676909Z","shell.execute_reply.started":"2025-04-02T07:30:25.652159Z","shell.execute_reply":"2025-04-02T07:30:25.675785Z"},"collapsed":true,"jupyter":{"outputs_hidden":true}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"接著處理離散型欄位的NA值，填入出現最多次的值","metadata":{}},{"cell_type":"code","source":"print(df_test['Customer Feedback'].mode())\nprint(df_test['Marital Status'].mode())\nprint(df_test['Occupation'].mode())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T07:32:25.254068Z","iopub.execute_input":"2025-04-02T07:32:25.254457Z","iopub.status.idle":"2025-04-02T07:32:25.454113Z","shell.execute_reply.started":"2025-04-02T07:32:25.254423Z","shell.execute_reply":"2025-04-02T07:32:25.45305Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_test['Customer Feedback'] = df_test['Customer Feedback'].fillna('Average')\ndf_test['Marital Status'] = df_test['Marital Status'].fillna('Single')\ndf_test['Occupation'] = df_test['Occupation'].fillna('Employed')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T07:32:39.11942Z","iopub.execute_input":"2025-04-02T07:32:39.119759Z","iopub.status.idle":"2025-04-02T07:32:39.282215Z","shell.execute_reply.started":"2025-04-02T07:32:39.119732Z","shell.execute_reply":"2025-04-02T07:32:39.281141Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(df_train['Customer Feedback'].mode())\nprint(df_train['Marital Status'].mode())\nprint(df_train['Occupation'].mode())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T07:32:54.429036Z","iopub.execute_input":"2025-04-02T07:32:54.429422Z","iopub.status.idle":"2025-04-02T07:32:54.679688Z","shell.execute_reply.started":"2025-04-02T07:32:54.429388Z","shell.execute_reply":"2025-04-02T07:32:54.678506Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_train['Customer Feedback'] = df_train['Customer Feedback'].fillna('Average')\ndf_train['Marital Status'] = df_train['Marital Status'].fillna('Single')\ndf_train['Occupation'] = df_train['Occupation'].fillna('Employed')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T07:32:59.273617Z","iopub.execute_input":"2025-04-02T07:32:59.273958Z","iopub.status.idle":"2025-04-02T07:32:59.516986Z","shell.execute_reply.started":"2025-04-02T07:32:59.273932Z","shell.execute_reply":"2025-04-02T07:32:59.515695Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"確認NA值的情況","metadata":{}},{"cell_type":"code","source":"df_train.isna().sum()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T07:35:29.969317Z","iopub.execute_input":"2025-04-02T07:35:29.96971Z","iopub.status.idle":"2025-04-02T07:35:30.682019Z","shell.execute_reply.started":"2025-04-02T07:35:29.96968Z","shell.execute_reply":"2025-04-02T07:35:30.680999Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_test.isna().sum()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T07:35:35.289057Z","iopub.execute_input":"2025-04-02T07:35:35.289406Z","iopub.status.idle":"2025-04-02T07:35:35.769389Z","shell.execute_reply.started":"2025-04-02T07:35:35.289378Z","shell.execute_reply":"2025-04-02T07:35:35.768473Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_test_cate.isna().sum()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T07:37:21.044362Z","iopub.execute_input":"2025-04-02T07:37:21.044704Z","iopub.status.idle":"2025-04-02T07:37:21.475039Z","shell.execute_reply.started":"2025-04-02T07:37:21.044674Z","shell.execute_reply":"2025-04-02T07:37:21.4741Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"處理完NA值，接著將離散型資料encode，在此使用Frequency作為encode的依據(Frequency Encoding)，而在encode之前，先更新自行建立的DataFrame","metadata":{}},{"cell_type":"code","source":"df_train_num = df_train.select_dtypes(include = numerics)\n# df_train_num.columns\ndf_test_num = df_test.select_dtypes(include = numerics)\n# df_test_num.columns\ndf_train_cate = df_train.drop(df_train_num.columns,axis = 1)\n# df_train_cate.columns\ndf_test_cate = df_test.drop(df_test_num.columns,axis = 1)\n# df_test_cate.columns","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T07:40:20.326981Z","iopub.execute_input":"2025-04-02T07:40:20.327339Z","iopub.status.idle":"2025-04-02T07:40:20.743328Z","shell.execute_reply.started":"2025-04-02T07:40:20.327313Z","shell.execute_reply":"2025-04-02T07:40:20.742527Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for i in df_train_cate:\n    enc_nom_1 = (df_train_cate.groupby(i).size()) / len(df_train_cate)\n    # print(enc_nom_1)\n    df_train[i] = df_train_cate[i].apply(lambda x : enc_nom_1[x])\ndf_train","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T08:03:21.239113Z","iopub.execute_input":"2025-04-02T08:03:21.239516Z","iopub.status.idle":"2025-04-02T08:03:58.800627Z","shell.execute_reply.started":"2025-04-02T08:03:21.239482Z","shell.execute_reply":"2025-04-02T08:03:58.799766Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for i in df_test_cate:\n    enc_nom_1 = (df_test_cate.groupby(i).size()) / len(df_test_cate)\n    # print(enc_nom_1)\n    df_test[i] = df_test_cate[i].apply(lambda x : enc_nom_1[x])\ndf_test","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T08:04:15.446653Z","iopub.execute_input":"2025-04-02T08:04:15.446989Z","iopub.status.idle":"2025-04-02T08:04:40.077247Z","shell.execute_reply.started":"2025-04-02T08:04:15.44696Z","shell.execute_reply":"2025-04-02T08:04:40.076248Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"trainX = df_train.drop('Premium Amount',axis = 1)\ntrainY = df_train['Premium Amount']\ntestX = df_test","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T08:04:44.321862Z","iopub.execute_input":"2025-04-02T08:04:44.322238Z","iopub.status.idle":"2025-04-02T08:04:44.458374Z","shell.execute_reply.started":"2025-04-02T08:04:44.322162Z","shell.execute_reply":"2025-04-02T08:04:44.457535Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"encode後，使用RandomForestRegressor作預測","metadata":{}},{"cell_type":"code","source":"from sklearn import svm, ensemble, metrics\nforest = ensemble.RandomForestRegressor(n_estimators = 20) \n# max_features 特徵數、max_depth 樹的深度\nforest.fit(trainX, trainY)\npredictions = forest.predict(testX)\n#metrics.accuracy_score(testY, predictions)\npredictions = pd.DataFrame(predictions)\npredictions","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T08:05:57.34892Z","iopub.execute_input":"2025-04-02T08:05:57.349298Z","iopub.status.idle":"2025-04-02T08:13:12.237315Z","shell.execute_reply.started":"2025-04-02T08:05:57.349266Z","shell.execute_reply":"2025-04-02T08:13:12.234859Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"ans = pd.DataFrame(testX['id'])\nans['Premium Amount'] = predictions\nans.to_csv(\"submission_forest_fillnadifferent.csv\",index = False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-02T08:13:54.049799Z","iopub.execute_input":"2025-04-02T08:13:54.050158Z","iopub.status.idle":"2025-04-02T08:13:55.096364Z","shell.execute_reply.started":"2025-04-02T08:13:54.050124Z","shell.execute_reply":"2025-04-02T08:13:55.095291Z"}},"outputs":[],"execution_count":null}]}