{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"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","execution":{"iopub.status.busy":"2023-05-30T06:43:03.206760Z","iopub.execute_input":"2023-05-30T06:43:03.207202Z","iopub.status.idle":"2023-05-30T06:43:03.221358Z","shell.execute_reply.started":"2023-05-30T06:43:03.207172Z","shell.execute_reply":"2023-05-30T06:43:03.220021Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_data = pd.read_csv('/kaggle/input/amex-default-prediction/train_data.csv', nrows=100000)\ntrain_labels = pd.read_csv('/kaggle/input/amex-default-prediction/train_labels.csv', nrows=100000)\ntest_data = pd.read_csv('/kaggle/input/amex-default-prediction/test_data.csv', nrows=100000)","metadata":{"execution":{"iopub.status.busy":"2023-05-30T06:43:03.244782Z","iopub.execute_input":"2023-05-30T06:43:03.245300Z","iopub.status.idle":"2023-05-30T06:43:10.848196Z","shell.execute_reply.started":"2023-05-30T06:43:03.245248Z","shell.execute_reply":"2023-05-30T06:43:10.847057Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 从测试数据集中提取客户ID列\ntest_ids = pd.read_csv('/kaggle/input/amex-default-prediction/test_data.csv', nrows=100000)['customer_ID']","metadata":{"execution":{"iopub.status.busy":"2023-05-30T06:59:55.686930Z","iopub.execute_input":"2023-05-30T06:59:55.687380Z","iopub.status.idle":"2023-05-30T07:00:00.124380Z","shell.execute_reply.started":"2023-05-30T06:59:55.687346Z","shell.execute_reply":"2023-05-30T07:00:00.123075Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print('训练数据集大小:', train_data.shape)\nprint('训练标签集大小:', train_labels.shape)\nprint('测试数据集大小:', test_data.shape)\n\nprint('\\n训练数据集前5行:\\n', train_data.head())\nprint('\\n训练标签集前5行:\\n', train_labels.head())\nprint('\\n测试数据集前5行:\\n', test_data.head())","metadata":{"execution":{"iopub.status.busy":"2023-05-30T06:43:10.850572Z","iopub.execute_input":"2023-05-30T06:43:10.851114Z","iopub.status.idle":"2023-05-30T06:43:10.883871Z","shell.execute_reply.started":"2023-05-30T06:43:10.851075Z","shell.execute_reply":"2023-05-30T06:43:10.882284Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 删除不必要的特征，例如客户ID。这些特征对于建模没有任何帮助，因此我们需要将它们从数据集中删除。\ntrain_data.drop(['customer_ID', 'S_2'], axis=1, inplace=True)\ntrain_labels.drop(['customer_ID'], axis=1, inplace=True)\ntest_data.drop(['customer_ID', 'S_2'], axis=1, inplace=True)","metadata":{"execution":{"iopub.status.busy":"2023-05-30T06:43:10.885287Z","iopub.execute_input":"2023-05-30T06:43:10.885677Z","iopub.status.idle":"2023-05-30T06:43:11.003968Z","shell.execute_reply.started":"2023-05-30T06:43:10.885615Z","shell.execute_reply":"2023-05-30T06:43:11.002702Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 处理缺失值，缺失值是一个普遍的问题。缺失值可能会导致建模不准确，因此我们需要处理它们。在本项目中，我们将使用中位数来填充缺失值。\ntrain_data.fillna(train_data.median(numeric_only=True), inplace=True)\ntest_data.fillna(test_data.median(numeric_only=True), inplace=True)","metadata":{"execution":{"iopub.status.busy":"2023-05-30T06:43:11.006672Z","iopub.execute_input":"2023-05-30T06:43:11.007002Z","iopub.status.idle":"2023-05-30T06:43:12.013168Z","shell.execute_reply.started":"2023-05-30T06:43:11.006973Z","shell.execute_reply":"2023-05-30T06:43:12.012098Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 查看训练数据集中的缺失值\nprint(train_data.isnull().sum())\n# 查看测试数据集中的缺失值\nprint(test_data.isnull().sum())","metadata":{"execution":{"iopub.status.busy":"2023-05-30T06:43:12.014796Z","iopub.execute_input":"2023-05-30T06:43:12.015125Z","iopub.status.idle":"2023-05-30T06:43:12.202553Z","shell.execute_reply.started":"2023-05-30T06:43:12.015097Z","shell.execute_reply":"2023-05-30T06:43:12.201388Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 将数据中的非数字类型值转换为数字类型\ntrain_data = train_data.apply(pd.to_numeric, errors='coerce')\ntest_data = test_data.apply(pd.to_numeric, errors='coerce')","metadata":{"execution":{"iopub.status.busy":"2023-05-30T06:43:12.204020Z","iopub.execute_input":"2023-05-30T06:43:12.204352Z","iopub.status.idle":"2023-05-30T06:43:13.072502Z","shell.execute_reply.started":"2023-05-30T06:43:12.204324Z","shell.execute_reply":"2023-05-30T06:43:13.071352Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 处理异常值\n# 异常值是指与大多数数据值相比显著偏离的值。异常值可能会对建模产生负面影响，\n# 因此我们需要处理它们。在本项目中，我们将使用箱线图来检测和删除异常值。\n\nfrom sklearn.impute import SimpleImputer\n\n# 使用SimpleImputer类填充NaN值\nimputer = SimpleImputer(strategy='median')\ntrain_data = imputer.fit_transform(train_data)\ntest_data = imputer.transform(test_data)\n\n# 使用箱线图检测和删除异常值\ndef remove_outliers(data):\n    Q1 = np.percentile(data, 25)\n    Q3 = np.percentile(data, 75)\n    IQR = Q3 - Q1\n    lower_bound = Q1 - 1.5 * IQR\n    upper_bound = Q3 + 1.5 * IQR\n    return data[(data > lower_bound) & (data < upper_bound)]\n\n# 将数据集转换为DataFrame对象\ntrain_data = pd.DataFrame(train_data)\ntest_data = pd.DataFrame(test_data)\n\n# 删除异常值\nfor column in train_data.columns:\n    train_data[column] = remove_outliers(train_data[column])\n    test_data[column] = remove_outliers(test_data[column])","metadata":{"execution":{"iopub.status.busy":"2023-05-30T06:43:13.074152Z","iopub.execute_input":"2023-05-30T06:43:13.074706Z","iopub.status.idle":"2023-05-30T06:43:30.330870Z","shell.execute_reply.started":"2023-05-30T06:43:13.074614Z","shell.execute_reply":"2023-05-30T06:43:30.329880Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(len(train_data.columns))\nprint(len(test_data.columns))","metadata":{"execution":{"iopub.status.busy":"2023-05-30T06:43:30.332554Z","iopub.execute_input":"2023-05-30T06:43:30.333143Z","iopub.status.idle":"2023-05-30T06:43:30.339454Z","shell.execute_reply.started":"2023-05-30T06:43:30.333109Z","shell.execute_reply":"2023-05-30T06:43:30.338238Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 删除所有值为NaN的列\ntrain_data = train_data.dropna(axis=1, how='all')\ntest_data = test_data.dropna(axis=1, how='all')","metadata":{"execution":{"iopub.status.busy":"2023-05-30T06:43:30.341082Z","iopub.execute_input":"2023-05-30T06:43:30.341445Z","iopub.status.idle":"2023-05-30T06:43:30.690125Z","shell.execute_reply.started":"2023-05-30T06:43:30.341415Z","shell.execute_reply":"2023-05-30T06:43:30.689115Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 将训练数据集和测试数据集的列进行重新索引\ntest_data = test_data.reindex(columns=train_data.columns)","metadata":{"execution":{"iopub.status.busy":"2023-05-30T06:43:30.694188Z","iopub.execute_input":"2023-05-30T06:43:30.694530Z","iopub.status.idle":"2023-05-30T06:43:30.736441Z","shell.execute_reply.started":"2023-05-30T06:43:30.694501Z","shell.execute_reply":"2023-05-30T06:43:30.735299Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"feature_names = train_data.columns","metadata":{"execution":{"iopub.status.busy":"2023-05-30T06:43:30.738337Z","iopub.execute_input":"2023-05-30T06:43:30.738707Z","iopub.status.idle":"2023-05-30T06:43:30.750173Z","shell.execute_reply.started":"2023-05-30T06:43:30.738670Z","shell.execute_reply":"2023-05-30T06:43:30.748948Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 使用标准化进行特征缩放\nfrom sklearn.preprocessing import StandardScaler\n\nscaler = StandardScaler()\ntrain_data = scaler.fit_transform(train_data)\ntest_data = scaler.transform(test_data)","metadata":{"execution":{"iopub.status.busy":"2023-05-30T06:43:30.751743Z","iopub.execute_input":"2023-05-30T06:43:30.752391Z","iopub.status.idle":"2023-05-30T06:43:31.300702Z","shell.execute_reply.started":"2023-05-30T06:43:30.752348Z","shell.execute_reply":"2023-05-30T06:43:31.299186Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.impute import SimpleImputer\n\n# 使用平均值填充NaN值\nimputer = SimpleImputer(strategy='mean')\ntrain_data = imputer.fit_transform(train_data)\ntest_data = imputer.transform(test_data)","metadata":{"execution":{"iopub.status.busy":"2023-05-30T06:43:31.302391Z","iopub.execute_input":"2023-05-30T06:43:31.302874Z","iopub.status.idle":"2023-05-30T06:43:31.802518Z","shell.execute_reply.started":"2023-05-30T06:43:31.302830Z","shell.execute_reply":"2023-05-30T06:43:31.801332Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(len(train_data[0]))\nprint(len(test_data[0]))","metadata":{"execution":{"iopub.status.busy":"2023-05-30T06:43:31.803860Z","iopub.execute_input":"2023-05-30T06:43:31.804307Z","iopub.status.idle":"2023-05-30T06:43:31.810149Z","shell.execute_reply.started":"2023-05-30T06:43:31.804269Z","shell.execute_reply":"2023-05-30T06:43:31.809337Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\n\n# X_train, X_test, y_train, y_test = train_test_split(train_data, train_labels['target'], test_size=0.2, random_state=42)\ny = train_labels['target'].values\nX_train, X_test, y_train, y_test = train_test_split(train_data, y, test_size=0.2, random_state=42)","metadata":{"execution":{"iopub.status.busy":"2023-05-30T06:43:31.811563Z","iopub.execute_input":"2023-05-30T06:43:31.811911Z","iopub.status.idle":"2023-05-30T06:43:32.003067Z","shell.execute_reply.started":"2023-05-30T06:43:31.811882Z","shell.execute_reply":"2023-05-30T06:43:32.002062Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.ensemble import RandomForestClassifier\n\nrf = RandomForestClassifier(n_estimators=100, random_state=42)\nrf.fit(X_train, y_train)","metadata":{"execution":{"iopub.status.busy":"2023-05-30T06:43:32.004189Z","iopub.execute_input":"2023-05-30T06:43:32.004813Z","iopub.status.idle":"2023-05-30T06:48:54.602933Z","shell.execute_reply.started":"2023-05-30T06:43:32.004781Z","shell.execute_reply":"2023-05-30T06:48:54.601692Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(len(rf.feature_importances_))","metadata":{"execution":{"iopub.status.busy":"2023-05-30T06:48:54.604363Z","iopub.execute_input":"2023-05-30T06:48:54.604845Z","iopub.status.idle":"2023-05-30T06:48:54.648184Z","shell.execute_reply.started":"2023-05-30T06:48:54.604803Z","shell.execute_reply":"2023-05-30T06:48:54.647026Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 提取特征重要性\nfeature_importances = pd.DataFrame({'feature': feature_names, 'importance': rf.feature_importances_})\nfeature_importances = feature_importances.sort_values('importance', ascending=False).reset_index(drop=True)\n\n# 选择前50个最重要的特征\nselected_features = feature_importances['feature'][:50].tolist()\n\n# 从训练和测试数据集中选择所选特征\nX_train = X_train[:, [feature_names.tolist().index(feature) for feature in selected_features]]\nX_test = X_test[:, [feature_names.tolist().index(feature) for feature in selected_features]]\ntest_data = test_data[:, [feature_names.tolist().index(feature) for feature in selected_features]]","metadata":{"execution":{"iopub.status.busy":"2023-05-30T06:48:54.650211Z","iopub.execute_input":"2023-05-30T06:48:54.651020Z","iopub.status.idle":"2023-05-30T06:48:54.759870Z","shell.execute_reply.started":"2023-05-30T06:48:54.650979Z","shell.execute_reply":"2023-05-30T06:48:54.758719Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.linear_model import LogisticRegression\nfrom sklearn.svm import SVC\nfrom sklearn.model_selection import GridSearchCV\nfrom sklearn.metrics import accuracy_score, roc_auc_score, confusion_matrix, classification_report\n\n# 逻辑回归\nlr = LogisticRegression(random_state=42)\nlr_params = {'C': [0.01, 0.1, 1, 10]}\nlr_grid = GridSearchCV(lr, lr_params, cv=5, scoring='roc_auc')\nlr_grid.fit(X_train, y_train)\n\nlr_best = lr_grid.best_estimator_\nlr_pred = lr_best.predict(X_test)\nlr_pred_proba = lr_best.predict_proba(X_test)[:, 1]\n\nprint('逻辑回归模型性能:')\nprint('最优参数:', lr_grid.best_params_)\nprint('准确率:', accuracy_score(y_test, lr_pred))\nprint('ROC AUC得分:', roc_auc_score(y_test, lr_pred_proba))\nprint('混淆矩阵:\\n', confusion_matrix(y_test, lr_pred))\nprint('分类报告:\\n', classification_report(y_test, lr_pred))\n\n# SVM\n'''\nsvm = SVC(random_state=42, probability=True)\nsvm_params = {'C': [0.01, 0.1, 1, 10], 'gamma': [0.01, 0.1, 1, 10]}\nsvm_grid = GridSearchCV(svm, svm_params, cv=5, scoring='roc_auc')\nsvm_grid.fit(X_train, y_train)\n\nsvm_best = svm_grid.best_estimator_\nsvm_pred = svm_best.predict(X_test)\nsvm_pred_proba = svm_best.predict_proba(X_test)[:, 1]\n\nprint('SVM模型性能:')\nprint('最优参数:', svm_grid.best_params_)\nprint('准确率:', accuracy_score(y_test, svm_pred))\nprint('ROC AUC得分:', roc_auc_score(y_test, svm_pred_proba))\nprint('混淆矩阵:\\n', confusion_matrix(y_test, svm_pred))\nprint('分类报告:\\n', classification_report(y_test, svm_pred))\n'''","metadata":{"execution":{"iopub.status.busy":"2023-05-30T06:48:54.761140Z","iopub.execute_input":"2023-05-30T06:48:54.761471Z","iopub.status.idle":"2023-05-30T06:48:57.411473Z","shell.execute_reply.started":"2023-05-30T06:48:54.761442Z","shell.execute_reply":"2023-05-30T06:48:57.410004Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 使用整个训练数据集来训练最终模型\nlr_final = LogisticRegression(C=0.1, random_state=42)\nlr_final.fit(train_data[:, [feature_names.tolist().index(feature) for feature in selected_features]], train_labels['target'])\n\n# 对测试数据集进行预测\ntest_pred = lr_final.predict(test_data)\ntest_pred_proba = lr_final.predict_proba(test_data)[:, 1]\n\n# 保存预测结果\nsubmission = pd.DataFrame({'customer_ID': test_ids, 'target': test_pred_proba})\nsubmission.to_csv('/kaggle/working/submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2023-05-30T07:00:04.724169Z","iopub.execute_input":"2023-05-30T07:00:04.724605Z","iopub.status.idle":"2023-05-30T07:00:05.643072Z","shell.execute_reply.started":"2023-05-30T07:00:04.724570Z","shell.execute_reply":"2023-05-30T07:00:05.641912Z"},"trusted":true},"execution_count":null,"outputs":[]}]}