{"metadata":{"kernelspec":{"name":"python3","display_name":"Python 3","language":"python"},"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":81933,"databundleVersionId":9643020,"sourceType":"competition"}],"dockerImageVersionId":30822,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd\nfrom sklearn.decomposition import PCA\nfrom sklearn.preprocessing import StandardScaler\nfrom sklearn.impute import SimpleImputer\nfrom sklearn.tree import DecisionTreeClassifier, plot_tree\nfrom sklearn.metrics import classification_report, accuracy_score\nfrom sklearn.model_selection import train_test_split\nimport matplotlib.pyplot as plt\n\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\")\n\n# 清洗欄位名稱\ntrain.columns = train.columns.str.strip().str.lower().str.replace(r'[^a-z0-9_]', '', regex=True)\ntest.columns = test.columns.str.strip().str.lower().str.replace(r'[^a-z0-9_]', '', regex=True)\n\n# 設定目標變數名稱\ntarget_column = 'sii'\nif target_column not in train.columns:\n    raise KeyError(f\"Target column '{target_column}' not found in the training dataset.\")\n\n# 檢查目標變數是否存在缺失值，並處理\nif train[target_column].isnull().sum() > 0:\n    train[target_column] = train[target_column].fillna(train[target_column].mode()[0])\n\n# 分離目標變數\ntrain_target = train[target_column]\n\n# 刪除目標變數列，保留特徵\ntrain_features = train.drop(columns=[target_column])\n\n# 過濾數值型資料\ntrain_numeric = train_features.select_dtypes(include=['float64', 'int64'])\ntest_numeric = test.select_dtypes(include=['float64', 'int64'])\n\n# 處理特徵數量不一致\nmissing_cols = set(train_numeric.columns) - set(test_numeric.columns)\nfor col in missing_cols:\n    test_numeric[col] = 0\n\n# 確保特徵順序一致\ntest_numeric = test_numeric[train_numeric.columns]\n\n# 處理缺失值（用均值填補）\nimputer = SimpleImputer(strategy='mean')\ntrain_numeric = pd.DataFrame(imputer.fit_transform(train_numeric), columns=train_numeric.columns)\ntest_numeric = pd.DataFrame(imputer.transform(test_numeric), columns=test_numeric.columns)\n\n# 標準化數據\nscaler = StandardScaler()\ntrain_scaled = scaler.fit_transform(train_numeric)\ntest_scaled = scaler.transform(test_numeric)\n\n# PCA 降維\npca = PCA(n_components=5)\ntrain_pca = pca.fit_transform(train_scaled)\ntest_pca = pca.transform(test_scaled)\n\n# 分割訓練集和驗證集\nX_train, X_val, y_train, y_val = train_test_split(train_pca, train_target, test_size=0.2, random_state=42)\n\n# 訓練 DecisionTreeClassifier\nclf = DecisionTreeClassifier(criterion='gini', max_depth=5, random_state=42)\nclf.fit(X_train, y_train)\n\n# 驗證集評估\ny_pred_val = clf.predict(X_val)\nprint(\"Accuracy on validation set:\", accuracy_score(y_val, y_pred_val))\nprint(\"\\nClassification Report on validation set:\")\nprint(classification_report(y_val, y_pred_val))\n\n# 測試集預測\ny_pred_test = clf.predict(test_pca)\n\n# 保存預測結果到 CSV\nsubmission = pd.DataFrame({'id': test['id'], 'sii': y_pred_test})\nsubmission.to_csv('submission.csv', index=False)\nprint(\"\\u2705 Predictions saved as 'submission.csv'\")\n\n# 繪製決策樹\nplt.figure(figsize=(16, 10))\nplot_tree(clf, feature_names=[f\"PC{i+1}\" for i in range(5)], class_names=clf.classes_.astype(str), filled=True)\nplt.title(\"Decision Tree Visualization\")\nplt.show()\n\n# 輸出 PCA 後的資料\nprint(\"PCA-transformed train set:\")\nprint(pd.DataFrame(train_pca, columns=[f\"PC{i+1}\" for i in range(5)]).head())\n\nprint(\"PCA-transformed test set:\")\nprint(pd.DataFrame(test_pca, columns=[f\"PC{i+1}\" for i in range(5)]).head())\n\n# 可視化解釋變異量比例\nplt.figure(figsize=(8, 5))\nplt.plot(range(1, 6), pca.explained_variance_ratio_, marker='o')\nplt.xlabel('Principal Component')\nplt.ylabel('Explained Variance Ratio')\nplt.title('Explained Variance by Principal Components')\nplt.show()\n\n\nsubmission = pd.read_csv('submission.csv')\nprint(submission.head())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-27T14:01:38.060229Z","iopub.execute_input":"2024-12-27T14:01:38.060808Z","iopub.status.idle":"2024-12-27T14:01:40.773659Z","shell.execute_reply.started":"2024-12-27T14:01:38.060766Z","shell.execute_reply":"2024-12-27T14:01:40.772247Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nfrom sklearn.decomposition import PCA\nfrom sklearn.preprocessing import StandardScaler\nfrom sklearn.impute import SimpleImputer\nfrom sklearn.ensemble import RandomForestClassifier\nfrom sklearn.metrics import classification_report, accuracy_score\nfrom sklearn.model_selection import train_test_split\nfrom imblearn.over_sampling import SMOTE\nimport matplotlib.pyplot as plt\n\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\")\n\n# 清洗欄位名稱\ntrain.columns = train.columns.str.strip().str.lower().str.replace(r'[^a-z0-9_]', '', regex=True)\ntest.columns = test.columns.str.strip().str.lower().str.replace(r'[^a-z0-9_]', '', regex=True)\n\n# 設定目標變數名稱\ntarget_column = 'sii'\nif target_column not in train.columns:\n    raise KeyError(f\"Target column '{target_column}' not found in the training dataset.\")\n\n# 檢查目標變數是否存在缺失值，並處理\nif train[target_column].isnull().sum() > 0:\n    train[target_column] = train[target_column].fillna(train[target_column].mode()[0])\n\n# 分離目標變數\ntrain_target = train[target_column]\n\n# 刪除目標變數列，保留特徵\ntrain_features = train.drop(columns=[target_column])\n\n# 過濾數值型資料\ntrain_numeric = train_features.select_dtypes(include=['float64', 'int64'])\ntest_numeric = test.select_dtypes(include=['float64', 'int64'])\n\n# 處理特徵數量不一致\nmissing_cols = set(train_numeric.columns) - set(test_numeric.columns)\nfor col in missing_cols:\n    test_numeric[col] = 0\n\n# 確保特徵順序一致\ntest_numeric = test_numeric[train_numeric.columns]\n\n# 處理缺失值（用均值填補）\nimputer = SimpleImputer(strategy='mean')\ntrain_numeric = pd.DataFrame(imputer.fit_transform(train_numeric), columns=train_numeric.columns)\ntest_numeric = pd.DataFrame(imputer.transform(test_numeric), columns=test_numeric.columns)\n\n# 標準化數據\nscaler = StandardScaler()\ntrain_scaled = scaler.fit_transform(train_numeric)\ntest_scaled = scaler.transform(test_numeric)\n\n# PCA 降維\npca = PCA(n_components=10)  # 增加主成分數量\ntrain_pca = pca.fit_transform(train_scaled)\ntest_pca = pca.transform(test_scaled)\n\n# 分割訓練集和驗證集\nX_train, X_val, y_train, y_val = train_test_split(train_pca, train_target, test_size=0.2, random_state=42)\n\n# 使用 SMOTE 平衡類別\nsmote = SMOTE(random_state=42)\nX_train_balanced, y_train_balanced = smote.fit_resample(X_train, y_train)\n\n# 訓練 RandomForestClassifier\nclf = RandomForestClassifier(random_state=42, n_estimators=100, max_depth=10)\nclf.fit(X_train_balanced, y_train_balanced)\n\n# 驗證集評估\ny_pred_val = clf.predict(X_val)\nprint(\"Accuracy on validation set:\", accuracy_score(y_val, y_pred_val))\nprint(\"\\nClassification Report on validation set:\")\nprint(classification_report(y_val, y_pred_val))\n\n# 測試集預測\ny_pred_test = clf.predict(test_pca)\n\n# 保存預測結果到 CSV\nsubmission = pd.DataFrame({'id': test['id'], 'sii': y_pred_test})\nprint(submission['sii'].value_counts())  # 檢查預測分佈\nsubmission.to_csv('submission.csv', index=False)\nprint(\"\\u2705 Predictions saved as 'submission.csv'\")\nsubmission = pd.read_csv('submission.csv')\nprint(submission.head())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-27T14:01:40.775452Z","iopub.execute_input":"2024-12-27T14:01:40.775769Z","iopub.status.idle":"2024-12-27T14:01:43.318496Z","shell.execute_reply.started":"2024-12-27T14:01:40.775744Z","shell.execute_reply":"2024-12-27T14:01:43.316822Z"}},"outputs":[],"execution_count":null}]}