From b3666a6950a3a564c9493e94d5541a268b63a868 Mon Sep 17 00:00:00 2001 From: sunxueqing <13205444+sunxueqing@user.noreply.gitee.com> Date: Sat, 15 Jul 2023 03:26:00 +0000 Subject: [PATCH] =?UTF-8?q?=E6=B3=B0=E5=9D=A6=E5=B0=BC=E5=85=8B=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: sunxueqing <13205444+sunxueqing@user.noreply.gitee.com> --- .../homeworks/泰坦尼克号.ipynb | 2275 +++++++++++++++++ 1 file changed, 2275 insertions(+) create mode 100644 共享民宿平台担保交易房子评分的影响研究/homeworks/泰坦尼克号.ipynb diff --git a/共享民宿平台担保交易房子评分的影响研究/homeworks/泰坦尼克号.ipynb b/共享民宿平台担保交易房子评分的影响研究/homeworks/泰坦尼克号.ipynb new file mode 100644 index 0000000..f119138 --- /dev/null +++ b/共享民宿平台担保交易房子评分的影响研究/homeworks/泰坦尼克号.ipynb @@ -0,0 +1,2275 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "import itertools\n", + "from scipy import stats,integrate\n", + "plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签\n", + "plt.rcParams['axes.unicode_minus']=False #用来正常显示负号" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "## 1 数据预处理" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/plain": " PassengerId Survived Pclass \\\n0 1 0 3 \n1 2 1 1 \n2 3 1 3 \n3 4 1 1 \n4 5 0 3 \n\n Name Sex Age SibSp \\\n0 Braund, Mr. Owen Harris male 22.0 1 \n1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 \n2 Heikkinen, Miss. Laina female 26.0 0 \n3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 \n4 Allen, Mr. William Henry male 35.0 0 \n\n Parch Ticket Fare Cabin Embarked \n0 0 A/5 21171 7.2500 NaN S \n1 0 PC 17599 71.2833 C85 C \n2 0 STON/O2. 3101282 7.9250 NaN S \n3 0 113803 53.1000 C123 S \n4 0 373450 8.0500 NaN S ", + "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS
\n
" + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# 导入,读取数据\n", + "titanic_df = pd.read_csv('train.csv')\n", + "titanic_df.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "数据集的属性列表:\n", + "- PassengerId – 乘客编号,每个ID对应与唯一的乘客\n", + "- Pclass – 船舱等级,1 一等舱,2 二等舱,3 三等舱\n", + "- Sex – 乘客性别,0 男性,1 女性\n", + "- Age – 乘客年龄\n", + "- SibSp - 同辈亲属数量(比如兄弟姐妹或者配偶)\n", + "- Parch – 非同辈亲属数量(比如父母和子女)\n", + "- Fare – 船票价格\n", + "- Embarked – 上船的港口,0S (South Ampton), 1C (Cherbourg), 2Q (Queenstown)\n", + "\n", + "数据集的标签:\n", + "- Survived – 该乘客是否幸存, 0 遇难,1幸存" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "RangeIndex: 891 entries, 0 to 890\n", + "Data columns (total 12 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 PassengerId 891 non-null int64 \n", + " 1 Survived 891 non-null int64 \n", + " 2 Pclass 891 non-null int64 \n", + " 3 Name 891 non-null object \n", + " 4 Sex 891 non-null object \n", + " 5 Age 714 non-null float64\n", + " 6 SibSp 891 non-null int64 \n", + " 7 Parch 891 non-null int64 \n", + " 8 Ticket 891 non-null object \n", + " 9 Fare 891 non-null float64\n", + " 10 Cabin 204 non-null object \n", + " 11 Embarked 889 non-null object \n", + "dtypes: float64(2), int64(5), object(5)\n", + "memory usage: 83.7+ KB\n" + ] + } + ], + "source": [ + "# 观察数据完整性\n", + "titanic_df.info()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "有三个属性存在数据缺失:**Age,Cabin 和 Embarked\n", + "**" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/plain": " PassengerId Survived Pclass Age SibSp \\\ncount 891.000000 891.000000 891.000000 714.000000 891.000000 \nmean 446.000000 0.383838 2.308642 29.699118 0.523008 \nstd 257.353842 0.486592 0.836071 14.526497 1.102743 \nmin 1.000000 0.000000 1.000000 0.420000 0.000000 \n25% 223.500000 0.000000 2.000000 20.125000 0.000000 \n50% 446.000000 0.000000 3.000000 28.000000 0.000000 \n75% 668.500000 1.000000 3.000000 38.000000 1.000000 \nmax 891.000000 1.000000 3.000000 80.000000 8.000000 \n\n Parch Fare \ncount 891.000000 891.000000 \nmean 0.381594 32.204208 \nstd 0.806057 49.693429 \nmin 0.000000 0.000000 \n25% 0.000000 7.910400 \n50% 0.000000 14.454200 \n75% 0.000000 31.000000 \nmax 6.000000 512.329200 ", + "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
PassengerIdSurvivedPclassAgeSibSpParchFare
count891.000000891.000000891.000000714.000000891.000000891.000000891.000000
mean446.0000000.3838382.30864229.6991180.5230080.38159432.204208
std257.3538420.4865920.83607114.5264971.1027430.80605749.693429
min1.0000000.0000001.0000000.4200000.0000000.0000000.000000
25%223.5000000.0000002.00000020.1250000.0000000.0000007.910400
50%446.0000000.0000003.00000028.0000000.0000000.00000014.454200
75%668.5000001.0000003.00000038.0000001.0000000.00000031.000000
max891.0000001.0000003.00000080.0000008.0000006.000000512.329200
\n
" + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# 观察数据基本统计信息\n", + "titanic_df.describe()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "
\n", + "\n", + "## 1.1 属性分析\n", + "\n", + "- PassengerId – 随机赋予的乘客编号;理论上与该乘客是否存活不存在任何关联关系,所以**删除PassengerId属性**\n", + "- Name - 乘客姓名,同上,无关属性\n", + "- Pclass – 船舱等级;与是否存活下来有关\n", + "- Sex – 乘客性别;与是否存活下来有关\n", + "- Age – 乘客年龄;与是否存活下来有关\n", + "- SibSp - 同辈亲属数量;与是否存活下来有关\n", + "- Parch – 非同辈亲属数量;与是否存活下来有关\n", + "- Fare – 船票价格;与是否存活下来有关\n", + "- Embarked – 上船的港口,0S (South Ampton), 1C (Cherbourg), 2Q (Queenstown)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/plain": " Survived Pclass Sex Age SibSp Parch Ticket Fare \\\n0 0 3 male 22.0 1 0 A/5 21171 7.2500 \n1 1 1 female 38.0 1 0 PC 17599 71.2833 \n2 1 3 female 26.0 0 0 STON/O2. 3101282 7.9250 \n3 1 1 female 35.0 1 0 113803 53.1000 \n4 0 3 male 35.0 0 0 373450 8.0500 \n\n Cabin Embarked \n0 NaN S \n1 C85 C \n2 NaN S \n3 C123 S \n4 NaN S ", + "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
SurvivedPclassSexAgeSibSpParchTicketFareCabinEmbarked
003male22.010A/5 211717.2500NaNS
111female38.010PC 1759971.2833C85C
213female26.000STON/O2. 31012827.9250NaNS
311female35.01011380353.1000C123S
403male35.0003734508.0500NaNS
\n
" + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# 从数据集中删除PassengerId,Name变量\n", + "titanic_df.drop(['PassengerId','Name'], axis=1, inplace=True)\n", + "# 观察更新后的数据\n", + "titanic_df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/plain": "
", + "image/png": "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\n" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "titanic_df[\"Embarked\"] = titanic_df[\"Embarked\"].dropna(0)\n", + "\n", + "f, ax = plt.subplots(figsize = (8, 6))\n", + "sns.countplot(x=\"Embarked\", data=titanic_df,hue=\"Survived\") # hue=\"Survived\"\n", + "ax.set_xticklabels([\"South Ampton\",\"Cherbourg\",\"Queenstown\"])\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/plain": " Embarked Survived\n0 C 0.553571\n1 Q 0.389610\n2 S 0.336957", + "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
EmbarkedSurvived
0C0.553571
1Q0.389610
2S0.336957
\n
" + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# 分析不同码头上船的乘客们的生存几率\n", + "titanic_df[['Embarked', 'Survived']].groupby(['Embarked'], as_index=False).mean().sort_values(by='Embarked', ascending=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "#### Age | 存在多项缺失值,由于年龄是数值型数据,运用随机森林进行预测填充" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "from sklearn.ensemble import RandomForestRegressor" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "E:\\anaconda3\\lib\\site-packages\\seaborn\\distributions.py:2557: FutureWarning: `distplot` is a deprecated function and will be removed in a future version. Please adapt your code to use either `displot` (a figure-level function with similar flexibility) or `histplot` (an axes-level function for histograms).\n", + " warnings.warn(msg, FutureWarning)\n" + ] + }, + { + "data": { + "text/plain": "
", + "image/png": "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\n" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "age_df = titanic_df[[\"Age\", \"Fare\", \"Parch\", \"SibSp\", \"Pclass\"]].copy() # .copy()用于复制原始数据 挑选数值型字段\n", + "\n", + "# 分割有缺失值的数据集\n", + "age_df_notnull = age_df.loc[age_df.Age.notnull()]\n", + "age_df_isnull = age_df.loc[age_df.Age.isnull()]\n", + "\n", + "# 利用非缺失数据建模\n", + "x = age_df_notnull.iloc[:, 1:]\n", + "y = age_df_notnull.values[:, 0]\n", + "x_test = age_df_isnull.values[:, 1:]\n", + "\n", + "rfr = RandomForestRegressor(n_estimators=1000, n_jobs=-1)\n", + "rfr.fit(x, y)\n", + "y_pred = rfr.predict(x_test)\n", + "\n", + "titanic_df.loc[titanic_df[\"Age\"].isnull(), \"Age\"] = y_pred\n", + "sns.distplot(titanic_df[\"Age\"].dropna(), kde=True, bins=50, fit=stats.gamma)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "### 对Age属性的进一步处理尝试:划分为多个年龄段" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
AgeLevelSurvived
0(0.34, 20.315]0.428571
1(20.315, 40.21]0.369732
2(40.21, 60.105]0.398601
3(60.105, 80.0]0.217391
\n", + "
" + ], + "text/plain": [ + " AgeLevel Survived\n", + "0 (0.34, 20.315] 0.428571\n", + "1 (20.315, 40.21] 0.369732\n", + "2 (40.21, 60.105] 0.398601\n", + "3 (60.105, 80.0] 0.217391" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "titanic_df['AgeLevel'] = pd.cut(titanic_df['Age'], 4)\n", + "titanic_df[['AgeLevel', 'Survived']].groupby(['AgeLevel'], as_index=False).mean().sort_values(by='AgeLevel', ascending=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
SurvivedPclassSexAgeSibSpParchTicketFareCabinEmbarked
003male110A/5 211717.2500NaNS
111female110PC 1759971.2833C85C
213female100STON/O2. 31012827.9250NaNS
311female11011380353.1000C123S
403male1003734508.0500NaNS
\n", + "
" + ], + "text/plain": [ + " Survived Pclass Sex Age SibSp Parch Ticket Fare \\\n", + "0 0 3 male 1 1 0 A/5 21171 7.2500 \n", + "1 1 1 female 1 1 0 PC 17599 71.2833 \n", + "2 1 3 female 1 0 0 STON/O2. 3101282 7.9250 \n", + "3 1 1 female 1 1 0 113803 53.1000 \n", + "4 0 3 male 1 0 0 373450 8.0500 \n", + "\n", + " Cabin Embarked \n", + "0 NaN S \n", + "1 C85 C \n", + "2 NaN S \n", + "3 C123 S \n", + "4 NaN S " + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "titanic_df.loc[titanic_df['Age'] <= 20.315, 'Age'] = 0\n", + "titanic_df.loc[(titanic_df['Age'] > 20.315) & (titanic_df['Age'] <= 40.21), 'Age'] = 1\n", + "titanic_df.loc[(titanic_df['Age'] > 40.21) & (titanic_df['Age'] <= 60.105), 'Age'] = 2\n", + "titanic_df.loc[titanic_df['Age'] > 60.105, 'Age'] = 3\n", + "titanic_df['Age'] = titanic_df['Age'].astype(int)\n", + "titanic_df.drop(['AgeLevel'], axis=1, inplace=True)\n", + "titanic_df.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "### Pclass | 船舱等级,可以看出等级越高,存活率越高,成正相关" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "titanic_df[['Pclass', 'Survived']].groupby(['Pclass'], as_index=False).mean()\n", + "\n", + "f, ax = plt.subplots(figsize = (8, 6))\n", + "sns.countplot(x=\"Pclass\", hue=\"Survived\", data=titanic_df)\n", + "ax.set_xticklabels([\"一等舱\",\"二等舱\",\"三等舱\"])\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "### Sex | 性别,可以看出女性存活率比男性高" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/plain": "
", + "image/png": "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\n" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "titanic_df[[\"Sex\", \"Survived\"]].groupby(['Sex'], as_index=False).mean()\n", + "\n", + "f, ax = plt.subplots(figsize = (8, 6))\n", + "sns.countplot(x=\"Sex\", hue=\"Survived\", data=titanic_df)\n", + "ax.set_xticklabels([\"男性\",\"女性\"])\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "### SibSp + Parch | 家属们" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
SurvivedPclassSexAgeTicketFareCabinEmbarkedIsAlone
003male1A/5 211717.2500NaNS1
111female1PC 1759971.2833C85C1
213female1STON/O2. 31012827.9250NaNS0
311female111380353.1000C123S1
403male13734508.0500NaNS0
\n", + "
" + ], + "text/plain": [ + " Survived Pclass Sex Age Ticket Fare Cabin Embarked \\\n", + "0 0 3 male 1 A/5 21171 7.2500 NaN S \n", + "1 1 1 female 1 PC 17599 71.2833 C85 C \n", + "2 1 3 female 1 STON/O2. 3101282 7.9250 NaN S \n", + "3 1 1 female 1 113803 53.1000 C123 S \n", + "4 0 3 male 1 373450 8.0500 NaN S \n", + "\n", + " IsAlone \n", + "0 1 \n", + "1 1 \n", + "2 0 \n", + "3 1 \n", + "4 0 " + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Family = SibSp + Parch\n", + "titanic_df['FamilySize'] = titanic_df['SibSp'] + titanic_df['Parch']\n", + "titanic_df['IsAlone'] = 0\n", + "titanic_df.loc[titanic_df['FamilySize'] == 1, 'IsAlone'] = 1\n", + "\n", + "# 删除原有的列 Parch & SibSp\n", + "titanic_df.drop(['SibSp'], axis=1, inplace=True)\n", + "titanic_df.drop(['Parch'], axis=1, inplace=True)\n", + "titanic_df.drop(['FamilySize'], axis=1, inplace=True)\n", + "titanic_df.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "### Fare | 使用分位数对数据进行划分,可以得到大小基本相等的bin,转换为数值型数据" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/plain": " FareLevel Survived\n0 (-0.001, 7.91] 0.197309\n1 (7.91, 14.454] 0.303571\n2 (14.454, 31.0] 0.454955\n3 (31.0, 512.329] 0.581081", + "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
FareLevelSurvived
0(-0.001, 7.91]0.197309
1(7.91, 14.454]0.303571
2(14.454, 31.0]0.454955
3(31.0, 512.329]0.581081
\n
" + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "titanic_df['FareLevel'] = pd.qcut(titanic_df['Fare'], 4)\n", + "titanic_df[['FareLevel', 'Survived']].groupby(['FareLevel'], as_index=False).mean().sort_values(by='FareLevel', ascending=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/plain": " Survived Pclass Sex Age SibSp Parch Ticket Fare Cabin \\\n0 0 3 male 22.0 1 0 A/5 21171 0 NaN \n1 1 1 female 38.0 1 0 PC 17599 3 C85 \n2 1 3 female 26.0 0 0 STON/O2. 3101282 1 NaN \n3 1 1 female 35.0 1 0 113803 3 C123 \n4 0 3 male 35.0 0 0 373450 1 NaN \n\n Embarked 男性 女性 港口S 港口C 港口Q 一等舱 二等舱 三等舱 \n0 S 0 1 0 0 1 0 0 1 \n1 C 1 0 1 0 0 1 0 0 \n2 S 1 0 0 0 1 0 0 1 \n3 S 1 0 0 0 1 1 0 0 \n4 S 0 1 0 0 1 0 0 1 ", + "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
SurvivedPclassSexAgeSibSpParchTicketFareCabinEmbarked男性女性港口S港口C港口Q一等舱二等舱三等舱
003male22.010A/5 211710NaNS01001001
111female38.010PC 175993C85C10100100
213female26.000STON/O2. 31012821NaNS10001001
311female35.0101138033C123S10001100
403male35.0003734501NaNS01001001
\n
" + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "titanic_df.loc[titanic_df['Fare'] <= 7.91, 'Fare'] = 0\n", + "titanic_df.loc[(titanic_df['Fare'] > 7.91) & (titanic_df['Fare'] <= 14.454), 'Fare'] = 1\n", + "titanic_df.loc[(titanic_df['Fare'] > 14.454) & (titanic_df['Fare'] <= 31.0), 'Fare'] = 2\n", + "titanic_df.loc[titanic_df['Fare'] > 31.0, 'Fare'] = 3\n", + "titanic_df['Fare'] = titanic_df['Fare'].astype(int)\n", + "titanic_df.drop(['FareLevel'], axis=1, inplace=True)\n", + "titanic_df.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "### OneHotEncoder | 将类别型变量全部onehot" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "ename": "ValueError", + "evalue": "columns overlap but no suffix specified: Index(['男性', '女性'], dtype='object')", + "output_type": "error", + "traceback": [ + "\u001B[1;31m---------------------------------------------------------------------------\u001B[0m", + "\u001B[1;31mValueError\u001B[0m Traceback (most recent call last)", + "\u001B[1;32m\u001B[0m in \u001B[0;36m\u001B[1;34m()\u001B[0m\n\u001B[0;32m 2\u001B[0m \u001B[0msex_dummies_titanic\u001B[0m \u001B[1;33m=\u001B[0m \u001B[0mpd\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0mget_dummies\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mtitanic_df\u001B[0m\u001B[1;33m[\u001B[0m\u001B[1;34m'Sex'\u001B[0m\u001B[1;33m]\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m 3\u001B[0m \u001B[0msex_dummies_titanic\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0mcolumns\u001B[0m \u001B[1;33m=\u001B[0m \u001B[1;33m[\u001B[0m\u001B[1;34m'男性'\u001B[0m\u001B[1;33m,\u001B[0m \u001B[1;34m'女性'\u001B[0m\u001B[1;33m]\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[1;32m----> 4\u001B[1;33m \u001B[0mtitanic_df\u001B[0m \u001B[1;33m=\u001B[0m \u001B[0mtitanic_df\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0mjoin\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0msex_dummies_titanic\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0m\u001B[0;32m 5\u001B[0m \u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m 6\u001B[0m \u001B[0membark_dummies_titanic\u001B[0m \u001B[1;33m=\u001B[0m \u001B[0mpd\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0mget_dummies\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mtitanic_df\u001B[0m\u001B[1;33m[\u001B[0m\u001B[1;34m'Embarked'\u001B[0m\u001B[1;33m]\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n", + "\u001B[1;32mE:\\anaconda3\\lib\\site-packages\\pandas\\core\\frame.py\u001B[0m in \u001B[0;36mjoin\u001B[1;34m(self, other, on, how, lsuffix, rsuffix, sort)\u001B[0m\n\u001B[0;32m 7873\u001B[0m \"\"\"\n\u001B[0;32m 7874\u001B[0m return self._join_compat(\n\u001B[1;32m-> 7875\u001B[1;33m \u001B[0mother\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mon\u001B[0m\u001B[1;33m=\u001B[0m\u001B[0mon\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mhow\u001B[0m\u001B[1;33m=\u001B[0m\u001B[0mhow\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mlsuffix\u001B[0m\u001B[1;33m=\u001B[0m\u001B[0mlsuffix\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mrsuffix\u001B[0m\u001B[1;33m=\u001B[0m\u001B[0mrsuffix\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0msort\u001B[0m\u001B[1;33m=\u001B[0m\u001B[0msort\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0m\u001B[0;32m 7876\u001B[0m )\n\u001B[0;32m 7877\u001B[0m \u001B[1;33m\u001B[0m\u001B[0m\n", + "\u001B[1;32mE:\\anaconda3\\lib\\site-packages\\pandas\\core\\frame.py\u001B[0m in \u001B[0;36m_join_compat\u001B[1;34m(self, other, on, how, lsuffix, rsuffix, sort)\u001B[0m\n\u001B[0;32m 7896\u001B[0m \u001B[0mright_index\u001B[0m\u001B[1;33m=\u001B[0m\u001B[1;32mTrue\u001B[0m\u001B[1;33m,\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m 7897\u001B[0m \u001B[0msuffixes\u001B[0m\u001B[1;33m=\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mlsuffix\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mrsuffix\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m,\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[1;32m-> 7898\u001B[1;33m \u001B[0msort\u001B[0m\u001B[1;33m=\u001B[0m\u001B[0msort\u001B[0m\u001B[1;33m,\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0m\u001B[0;32m 7899\u001B[0m )\n\u001B[0;32m 7900\u001B[0m \u001B[1;32melse\u001B[0m\u001B[1;33m:\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n", + "\u001B[1;32mE:\\anaconda3\\lib\\site-packages\\pandas\\core\\reshape\\merge.py\u001B[0m in \u001B[0;36mmerge\u001B[1;34m(left, right, how, on, left_on, right_on, left_index, right_index, sort, suffixes, copy, indicator, validate)\u001B[0m\n\u001B[0;32m 87\u001B[0m \u001B[0mvalidate\u001B[0m\u001B[1;33m=\u001B[0m\u001B[0mvalidate\u001B[0m\u001B[1;33m,\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m 88\u001B[0m )\n\u001B[1;32m---> 89\u001B[1;33m \u001B[1;32mreturn\u001B[0m \u001B[0mop\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0mget_result\u001B[0m\u001B[1;33m(\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0m\u001B[0;32m 90\u001B[0m \u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m 91\u001B[0m \u001B[1;33m\u001B[0m\u001B[0m\n", + "\u001B[1;32mE:\\anaconda3\\lib\\site-packages\\pandas\\core\\reshape\\merge.py\u001B[0m in \u001B[0;36mget_result\u001B[1;34m(self)\u001B[0m\n\u001B[0;32m 669\u001B[0m \u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m 670\u001B[0m llabels, rlabels = _items_overlap_with_suffix(\n\u001B[1;32m--> 671\u001B[1;33m \u001B[0mself\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0mleft\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0m_info_axis\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mself\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0mright\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0m_info_axis\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mself\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0msuffixes\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0m\u001B[0;32m 672\u001B[0m )\n\u001B[0;32m 673\u001B[0m \u001B[1;33m\u001B[0m\u001B[0m\n", + "\u001B[1;32mE:\\anaconda3\\lib\\site-packages\\pandas\\core\\reshape\\merge.py\u001B[0m in \u001B[0;36m_items_overlap_with_suffix\u001B[1;34m(left, right, suffixes)\u001B[0m\n\u001B[0;32m 2094\u001B[0m \u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m 2095\u001B[0m \u001B[1;32mif\u001B[0m \u001B[1;32mnot\u001B[0m \u001B[0mlsuffix\u001B[0m \u001B[1;32mand\u001B[0m \u001B[1;32mnot\u001B[0m \u001B[0mrsuffix\u001B[0m\u001B[1;33m:\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[1;32m-> 2096\u001B[1;33m \u001B[1;32mraise\u001B[0m \u001B[0mValueError\u001B[0m\u001B[1;33m(\u001B[0m\u001B[1;34mf\"columns overlap but no suffix specified: {to_rename}\"\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0m\u001B[0;32m 2097\u001B[0m \u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m 2098\u001B[0m \u001B[1;32mdef\u001B[0m \u001B[0mrenamer\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mx\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0msuffix\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m:\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n", + "\u001B[1;31mValueError\u001B[0m: columns overlap but no suffix specified: Index(['男性', '女性'], dtype='object')" + ] + } + ], + "source": [ + "# one-hot编码\n", + "sex_dummies_titanic = pd.get_dummies(titanic_df['Sex'])\n", + "sex_dummies_titanic.columns = ['男性', '女性']\n", + "titanic_df = titanic_df.join(sex_dummies_titanic)\n", + "\n", + "embark_dummies_titanic = pd.get_dummies(titanic_df['Embarked'])\n", + "embark_dummies_titanic.columns = ['港口S', '港口C','港口Q']\n", + "titanic_df = titanic_df.join(embark_dummies_titanic)\n", + "\n", + "class_dummies_titanic = pd.get_dummies(titanic_df['Pclass'])\n", + "class_dummies_titanic.columns = ['一等舱', '二等舱', '三等舱']\n", + "titanic_df = titanic_df.join(class_dummies_titanic)\n", + "\n", + "age_dummies_titanic = pd.get_dummies(titanic_df['Age'])\n", + "age_dummies_titanic.columns = ['孩子', '少年', '中年','老人']\n", + "titanic_df = titanic_df.join(age_dummies_titanic)\n", + "\n", + "fare_dummies_titanic = pd.get_dummies(titanic_df['Fare'])\n", + "fare_dummies_titanic.columns = ['便宜票价', '普通票价', '高级票价','豪华票价']\n", + "titanic_df = titanic_df.join(fare_dummies_titanic)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "del titanic_df['Sex']\n", + "del titanic_df['Embarked']\n", + "del titanic_df['IsAlone']\n", + "del titanic_df['Pclass']\n", + "del titanic_df['Age']\n", + "del titanic_df['Fare']\n", + "del titanic_df['Cabin']\n", + "del titanic_df['Ticket']" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "## 2 使用清理后的数据" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "from sklearn.model_selection import train_test_split\n", + "from sklearn.metrics import precision_recall_curve, roc_auc_score, roc_curve\n", + "from sklearn.metrics import accuracy_score, mean_squared_error, r2_score, confusion_matrix\n", + "from sklearn.model_selection import GridSearchCV # 参数调优" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Survived男性女性港口S港口C港口Q一等舱二等舱三等舱孩子少年中年老人便宜票价普通票价高级票价豪华票价
000100100101001000
111010010001000001
211000100101000100
311000110001000001
400100100101000100
\n", + "
" + ], + "text/plain": [ + " Survived 男性 女性 港口S 港口C 港口Q 一等舱 二等舱 三等舱 孩子 少年 中年 老人 便宜票价 普通票价 \\\n", + "0 0 0 1 0 0 1 0 0 1 0 1 0 0 1 0 \n", + "1 1 1 0 1 0 0 1 0 0 0 1 0 0 0 0 \n", + "2 1 1 0 0 0 1 0 0 1 0 1 0 0 0 1 \n", + "3 1 1 0 0 0 1 1 0 0 0 1 0 0 0 0 \n", + "4 0 0 1 0 0 1 0 0 1 0 1 0 0 0 1 \n", + "\n", + " 高级票价 豪华票价 \n", + "0 0 0 \n", + "1 0 1 \n", + "2 0 0 \n", + "3 0 1 \n", + "4 0 0 " + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dataset = titanic_df\n", + "# 观察数据\n", + "dataset.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Survived男性女性港口S港口C港口Q一等舱二等舱三等舱孩子少年中年老人便宜票价普通票价高级票价豪华票价
count891.000000891.000000891.000000891.000000891.000000891.000000891.000000891.000000891.000000891.000000891.000000891.000000891.000000891.000000891.000000891.000000891.000000
mean0.3838380.3524130.6475870.1885520.0864200.7227830.2424240.2065100.5510660.2278340.5858590.1604940.0258140.2502810.2435470.2570150.249158
std0.4865920.4779900.4779900.3913720.2811410.4478760.4287900.4050280.4976650.4196700.4928500.3672700.1586680.4334180.4294630.4372330.432769
min0.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.000000
25%0.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.000000
50%0.0000000.0000001.0000000.0000000.0000001.0000000.0000000.0000001.0000000.0000001.0000000.0000000.0000000.0000000.0000000.0000000.000000
75%1.0000001.0000001.0000000.0000000.0000001.0000000.0000000.0000001.0000000.0000001.0000000.0000000.0000000.5000000.0000001.0000000.000000
max1.0000001.0000001.0000001.0000001.0000001.0000001.0000001.0000001.0000001.0000001.0000001.0000001.0000001.0000001.0000001.0000001.000000
\n", + "
" + ], + "text/plain": [ + " Survived 男性 女性 港口S 港口C 港口Q \\\n", + "count 891.000000 891.000000 891.000000 891.000000 891.000000 891.000000 \n", + "mean 0.383838 0.352413 0.647587 0.188552 0.086420 0.722783 \n", + "std 0.486592 0.477990 0.477990 0.391372 0.281141 0.447876 \n", + "min 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n", + "25% 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n", + "50% 0.000000 0.000000 1.000000 0.000000 0.000000 1.000000 \n", + "75% 1.000000 1.000000 1.000000 0.000000 0.000000 1.000000 \n", + "max 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 \n", + "\n", + " 一等舱 二等舱 三等舱 孩子 少年 中年 \\\n", + "count 891.000000 891.000000 891.000000 891.000000 891.000000 891.000000 \n", + "mean 0.242424 0.206510 0.551066 0.227834 0.585859 0.160494 \n", + "std 0.428790 0.405028 0.497665 0.419670 0.492850 0.367270 \n", + "min 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n", + "25% 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n", + "50% 0.000000 0.000000 1.000000 0.000000 1.000000 0.000000 \n", + "75% 0.000000 0.000000 1.000000 0.000000 1.000000 0.000000 \n", + "max 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 \n", + "\n", + " 老人 便宜票价 普通票价 高级票价 豪华票价 \n", + "count 891.000000 891.000000 891.000000 891.000000 891.000000 \n", + "mean 0.025814 0.250281 0.243547 0.257015 0.249158 \n", + "std 0.158668 0.433418 0.429463 0.437233 0.432769 \n", + "min 0.000000 0.000000 0.000000 0.000000 0.000000 \n", + "25% 0.000000 0.000000 0.000000 0.000000 0.000000 \n", + "50% 0.000000 0.000000 0.000000 0.000000 0.000000 \n", + "75% 0.000000 0.500000 0.000000 1.000000 0.000000 \n", + "max 1.000000 1.000000 1.000000 1.000000 1.000000 " + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# 继续观察数据基本统计信息\n", + "dataset.describe()" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "# 获得数据集的特征(输入变量)和输出\n", + "x = np.array(dataset.iloc[:, 1:])\n", + "y = np.array(dataset.iloc[:, 0])\n", + "# 分割数据集\n", + "x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=33)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "# 绘制混淆矩阵函数\n", + "def plot_confusion_matrix(cm, classes,\n", + " normalize=False,\n", + " title='Confusion matrix',\n", + " cmap=plt.cm.Blues):\n", + " plt.figure()\n", + " plt.imshow(cm, interpolation='nearest', cmap=cmap)\n", + " plt.title(title)\n", + " plt.colorbar()\n", + " tick_marks = np.arange(len(classes))\n", + " plt.xticks(tick_marks, classes, rotation=45)\n", + " plt.yticks(tick_marks, classes)\n", + "\n", + " fmt = '.2f' if normalize else 'd'\n", + " thresh = cm.max() / 2.\n", + " for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):\n", + " plt.text(j, i, format(cm[i, j], fmt),\n", + " horizontalalignment=\"center\",\n", + " color=\"white\" if cm[i, j] > thresh else \"black\")\n", + "\n", + " plt.tight_layout()\n", + " plt.ylabel('True label')\n", + " plt.xlabel('Predicted label')\n", + " plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "# 模型性能评估\n", + "def model_performance_evaluation(model_name, test, pred):\n", + " print(model_name, '| 准确率: %.4f' % accuracy_score(test, pred))\n", + " print(model_name,'| 均方误差: %.4f' % mean_squared_error(test, pred))\n", + " print(model_name, '| R2-score: %.4f' % r2_score(test, pred))\n", + " print(model_name, '| 混淆矩阵:\\n', confusion_matrix(test, pred))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "## 3 对数几率回归模型" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "from sklearn.linear_model import LogisticRegression" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "# 模型参数组合\n", + "param_lr = {'penalty':['l1','l2'], 'C':[1,1e+2,1e+4], 'max_iter':[1e+2,1e+3,1e+4]}" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "LogisticRegression(C=1, class_weight=None, dual=False, fit_intercept=True,\n", + " intercept_scaling=1, max_iter=100.0, multi_class='ovr', n_jobs=1,\n", + " penalty='l1', random_state=None, solver='liblinear', tol=0.0001,\n", + " verbose=0, warm_start=False)" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# 建模、训练和预测\n", + "base_line_model = LogisticRegression() # 默认 penalty='l2'\n", + "lr = GridSearchCV(estimator=base_line_model, param_grid=param_lr, cv=5, n_jobs=3)\n", + "lr.fit(x_train, y_train)\n", + "y_pred_lr = lr.predict(x_test)\n", + "lr.best_estimator_" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "对数几率回归模型在训练集上的性能 -- \n", + "LogisticRegression | 准确率: 0.7865\n", + "LogisticRegression | 均方误差: 0.2135\n", + "LogisticRegression | R2-score: 0.0957\n", + "LogisticRegression | 混淆矩阵:\n", + " [[323 62]\n", + " [ 71 167]]\n", + "\n", + "\n", + "\n", + "对数几率回归模型在测试集上的性能 -- \n", + "LogisticRegression | 准确率: 0.8134\n", + "LogisticRegression | 均方误差: 0.1866\n", + "LogisticRegression | R2-score: 0.2144\n", + "LogisticRegression | 混淆矩阵:\n", + " [[140 24]\n", + " [ 26 78]]\n" + ] + } + ], + "source": [ + "# 模型性能评估\n", + "print(\"对数几率回归模型在训练集上的性能 -- \")\n", + "model_performance_evaluation('LogisticRegression', y_train, lr.predict(x_train))\n", + "print(\"\\n\"*2)\n", + "print(\"对数几率回归模型在测试集上的性能 -- \")\n", + "model_performance_evaluation('LogisticRegression', y_test, y_pred_lr)" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# 绘制混淆矩阵\n", + "cnf_matrix = confusion_matrix(y_test, y_pred_lr)\n", + "np.set_printoptions(precision=2) # 设置打印数量的阈值\n", + "class_names = [0, 1]\n", + "plot_confusion_matrix(cnf_matrix, classes=class_names, title='Confusion matrix')" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "该支持向量机模型的AUC值为 0.8018292682926829\n" + ] + }, + { + "data": { + "image/png": "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vpmHHnqImpoaFi5c2OUz011KJoalK6vJyjA+NkOJQSSZ1q1bx+WXX86VV17JFVdcwfLly6Ov5eXlkZOTA0AwGKSgoIBXXnmFuro61q1bx4YNG8jLyyMzM7PLCRogMzOTyy67jLfeeosXXniB3NzcA449d+5cTj/9dMrLy7nnnnu47777KC8vZ9GiRZxyyins2bMHCA/lHDZsGGvWrGHBggW88cYblJeX89prr7FgwQJeffVVAB5//HHmzJnDH//4R2bNmsUtt9zCm2++yd69exk2bBhZWX0bxHnFFVcwd+5cbr11/y3vO+zcuZPFixczb948vvrVr3b73l27drFo0SIWLlzIpz/9aVpaWvoUS1+l3HDVcDNSNadOLWTkCDUjiezzvadX8c6HDQP6mTPGF/Ddj8/s9vUpU6bwy1/+koyMDK699lp++9vfcsMNN5Cdnc2aNWv44x//yOrVq7nwwgvZvn07P/3pTzn++OOZO3cuP/vZz1i3bh2nn34669at48knn4xeGZhZlw7Vg3WunnPOOcyZM4dt27bx3nvvMXnyZA4//HDee+89tmzZQm5uLqtXr+axxx5jzZo1VFVVcckll7Bt2zYmTpxIVVUVBQUFnHrqqfzlL3/hkUceYcWKFVx55ZW8++67fOUrX2HYsGH9qrff/e53tLe388orr3D11Vezdu1apk2bdkC5hx9+mM997nNceuml0UT4wQcfHPDeZ599lm9961ssXLiQr33tazzzzDN84hOf6FdssUi5xLBySwObduzhmgUHVrKIJFZLSwuf+9zneOihh1i1ahVPPfUUe/bsIT8/n5tvvpmTTz6Zc845h5qaGjZs2MC3v/1tVq9eTU1NDW+//Ta33XYbU6dO5f777+/SXNTa2trrX+g33HADGzZs4JZbbqGpqYmpU6fy6KOPUldXx8033wzA9OnTKSkpIRAIMGPGDB555BFqa2ujn1FfX8/111/PKaecQmFhIRs3buTOO+9kzZo13Hrrrdx00000Nzd3Oe6ePXu48sor+fWvf91tbBUVFVx00UUAnHHGGbz88ssHTQxjxoyhqqqK+vp6Nm3axBFHHMF///d/H/Deq6++OvqerVu3MnZsfOdupVxiiDYjzdRoJJHOevrLPl6GDRvG1VdfzYUXXsiIESPYtm0bV155JU8//XSXcm1tbXz3u9/l4Ycf5tvf/jbZ2dnccMMNLF++nJycHCZPntylfH19PUVFPe/GuHr1ah599FHuvvtu7rvvPq666iq+8pWvMGLECJqbm/nyl79MKBTikUceISsri2uvvZbMzEy+8Y1vRD/j5z//efT+D37wA6688koKCwtpbW2luLiY+++/nzfffJMPP/wwWi43N7fHpADQ1NTEhAkTACgoKGDdunUHLXfaaaexZMkSfvzjHzN9+nRGjx7d43tfffVVdu7cycknn9zj8Q9VSiWGfc1Ip0wZw6gROckOR0SABQsW8Mtf/pK8vDyKi4sZN24cL730UpcyGzdu5MYbb2Tt2rWsWLGCf/zjH7z//vucf/75ACxatKhL+ZUrV3LiiSd2e8xdu3Zx//33c/vtt3PFFVewa9cu/v3f/53s7Gyuu+46nn76aVpaWrjvvvuYN28emzZt4rbbbiMYDLJz507+5V/+hR/+8IfccsstQLit/6STTuKSSy4B4NJLL+Xxxx/nM5/5DA0NDdErkFjl5+dH+ziCwWCX/pPObrjhBu677z4KCgq4++67efDBB7t9744dO7jmmmt44okn+hRLf6RUYninuoGN23fztflTkh2KiES8/fbbBINB2traeOmll/j+979PQUEBzz33XLTMqaeeykUXXcRrr73GokWLmDlzJtnZ2XzkIx/hqaee4qabboqWbWtr44knnuDaa6894FhVVVUUFhby1FNP8f777/PlL38ZCDevNDY2MmHCBK699lrcncLCQi677DIaGxu5+eabqampiTbJVFVV8cUvfpGSkhKuueYaLrjgAiZOnMjpp59OTk4OW7dupbm5mfvuu4+2tjYuvPDCPtXJCSecwMsvv8zJJ5/MihUrKCsrO2i53bt3U1lZycknn8zrr7/OWWedddD3trS0cNFFF3HHHXdw5JFH9imWfnH3Qf9TWlrq7u53PfOuT75+iW8PNvtQ9cILLyQ7hEFDdeH+zjvvuLt7Q0NDUo6/YsUKnzdvntfW1np1dbXfcMMN0df+7d/+zZ955pno41Ao5A899JDPnDnTFy9e7OvXr/cLLrjA58yZ42+++Wa03Pe+9z3/5je/GX1cX1/vs2fP9paWFr/++uv9rrvuOiCOH/3oR/6b3/zG3Q+si02bNvkXvvAFd3dvamryK664wt944w3/5Cc/6StXrjzo9/r973/vP/nJTw762u7du/3S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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# 绘制ROC曲线并计算AUC值\n", + "auc_lr = roc_auc_score(y_test, y_pred_lr)\n", + "print(f\"该支持向量机模型的AUC值为 {auc_lr}\")\n", + "fpr_lr, tpr_lr, thresholds = roc_curve(y_test, y_pred_lr)\n", + "plt.plot(fpr_lr, tpr_lr, label=\"对数几率模型: \"+str(round(auc_lr, 3)))\n", + "plt.xlabel('False Positive Rate')\n", + "plt.ylabel('True Positive Rate')\n", + "plt.title('ROC')\n", + "plt.xlim([0,1])\n", + "plt.ylim([0,1.1])\n", + "plt.grid()\n", + "plt.legend(loc='lower right')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "## 4 决策树" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "from sklearn.tree import DecisionTreeClassifier, export_graphviz\n", + "params_dt = {'criterion':['entropy','gini'], 'splitter':['best', 'random']}" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "DecisionTreeClassifier(class_weight=None, criterion='entropy', max_depth=None,\n", + " max_features=None, max_leaf_nodes=None,\n", + " min_impurity_decrease=0.0, min_impurity_split=None,\n", + " min_samples_leaf=1, min_samples_split=2,\n", + " min_weight_fraction_leaf=0.0, presort=False, random_state=None,\n", + " splitter='best')" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "base_line_model = DecisionTreeClassifier()\n", + "dtc = GridSearchCV(estimator=base_line_model, param_grid=params_dt, cv=5, n_jobs=3)\n", + "dtc.fit(x_train, y_train)\n", + "y_pred_dt = dtc.predict(x_test)\n", + "dtc.best_estimator_" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "决策树模型在 训练集 上的性能 -- \n", + "DecisionTree | 准确率: 0.8411\n", + "DecisionTree | 均方误差: 0.1589\n", + "DecisionTree | R2-score: 0.3269\n", + "DecisionTree | 混淆矩阵:\n", + " [[350 35]\n", + " [ 64 174]]\n", + "\n", + "\n", + "\n", + "决策树模型在 测试集 上的性能 -- \n", + "DecisionTree | 准确率: 0.8470\n", + "DecisionTree | 均方误差: 0.1530\n", + "DecisionTree | R2-score: 0.3558\n", + "DecisionTree | 混淆矩阵:\n", + " [[151 13]\n", + " [ 28 76]]\n" + ] + } + ], + "source": [ + "# 模型性能评估\n", + "print(\"决策树模型在 训练集 上的性能 -- \")\n", + "model_performance_evaluation('DecisionTree', y_train, dtc.predict(x_train))\n", + "print(\"\\n\"*2)\n", + "\n", + "print(\"决策树模型在 测试集 上的性能 -- \")\n", + "model_performance_evaluation('DecisionTree', y_test, y_pred_dt)" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# 计算混淆矩阵\n", + "cnf_matrix = confusion_matrix(y_test, y_pred_dt)\n", + "np.set_printoptions(precision=2) # 设置打印数量的阈值\n", + "class_names = [0, 1]\n", + "# 绘制混淆矩阵\n", + "plot_confusion_matrix(cnf_matrix, classes=class_names, title='Confusion matrix')" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "该支持向量机模型的AUC值为 0.825750469043152\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYYAAAERCAYAAAB/4wAeAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAA7NElEQVR4nO3deXhV1bn48e+beYZMJCRhCgmBIJNarlDBoFIFJ9Q6W6uC/NRbbe2kotdah9ba1rZORVtrrbMXKwhWvVZNtVVQEBmSkIEpZJ6Tk4FMZ/3+OIeEQIaTcIac5P08T56cYe29370I5z17rb3WEmMMSiml1BE+ng5AKaXU8KKJQSmlVA+aGJRSSvWgiUEppVQPmhiUUkr1oIlBKaVUD5oYlOqHiNwvIo0iUiEixSLyI/vrN4lIqYiUich/H1V+nohkiUiJiDzsuciVGjpNDEoN7EljzDjgm8CdIjIH+BVwBrAQeFBEZoiIH7AOWANMBs4SkW95KGalhkwTg1IOMsYcADYD5wLvG2PyjDH7gPeA84DTgRZjzAZjTBuwHjjLQ+EqNWR+ng5AKW8hIhOBU4FwYMtRbxViu0I4DOQe9frzQKi74lPKWfSKQamBfU9EKoB84NfAPqD1qPfbgGBgLNB45EVjTLn9ikIpr6KJQamBPYntiqAReAdoBoKOej/Q/lq7/TEAInKGiFzrvjCVcg5NDEo5wBjTDPwFuBXbFcPko96eBOwHCoDko15fBMx2U4hKOY0mBqUc9xTwHeAj4FsikiYiU4FzsF1JfABMEZGzRCQMuAz42GPRKjVE2vmslIOMMQdE5BPgv4CfAJnYvlytMcbkAojIcuBPwDjgz8aYdz0UrlJDJroeg1JKqaNpU5JSSqkeNDEopZTqQRODUkqpHjQxKKWU6sEr7koaO3asSUlJ8XQYw0JTUxOhoTrLAmhdHE3ropvWRbdt27ZVGWNiB7udVySGuLg4tm7d6ukwhoXMzEwyMjI8HcawoHXRTeuim9ZFNxE5OJTttClJKaVUD5oYlFJK9aCJQSmlVA+aGJRSSvWgiUEppVQPmhiUUkr1oIlBKaVUD5oYlFJK9aCJQSmlVA+aGJRSSvWgiUEppVQPmhiUUkr1oIlBKaVUD5oYlFJK9aCJQSmlVA+aGJRSSvXgksQgInEi8mk/7/uLyCYR+UxEbnRFDEoppYbG6Su4iUgk8ALQ39p6twFbjTH3i8jfReR/jTEWZ8eilFKjSXNTA8V5X1N7YAfWsqwh70eMMU4MC0QkAhBggzEmo48ybwN3GWOyReTHwDZjzMfHlFkNrAaIjY095Y033nBqnN6qsbGRsLAwT4cxLGhddNO66DYa6qKzo53mmhKstQcIbDzI2JZCEjoOkWTK8RHbZ/ph40/wA9XbjDGnDnb/Tr9iMMY0AIhIf8VCgWL74wYgrpf9PAs8C5CWlmZ0DVcbXc+2m9ZFN62LbiOpLqydnZQezKdi33YOF+/Cv2oPUU17Seo8RIB0AtBhfCj2TaQqLI3i6BUEJpxE7NS5JEyeAQ/4D+m4Tk8MDmoEgoF6IMz+XCmlRiVjtVJVXkRZ/lc0HtqFb1UOYywFJLUfJFEOk2gvVyqxlAdN5avIxfiPn0nklLkkpsxmUlAIk5wYj6cSwzbgdGAdMAfY7KE4lFLKrerrqinJ+4r6gzuhPIvwhnwS2vYTi4VYe5lqxlAaOIXdURfgEzeTiEmzSZw2j/ERUYx3Q4wuTwwiciaQbox58qiXXwD+ISKLgHRgi6vjUEopdzrc0kRR3tfU7N9BZ3kWwbV5xB/eRzxVjLGXaTJBFAVMJj8qAxM7g7AJsxmfOo/ouCSiPRi7yxLDkY5nY8xHwEfHvHdQRJZiu2q4zxjT6ao4lFLKldrb2yjZl03lvq9pK9lNYM0eYpv3kWgtIcXeEdxm/Cjym0BxxDwOxEwnJGkWcSnzGJeUQprP8BtO5qmmJIwxJYDeaqSU8grWTitlRXupKPiK5uLd+FXtIaqpgAkdh5gk7UwCrEYo8RlPZchUSqKWEZhwEtHJc0lInkmyf4CnT8FhHksMSik1HBljqK4opdTeEexTmU1EQz5J7QdIkBYS7OXKiaYiOJmvxy3ALz6dsVPmkpgyh6SQcJI8egYnThODUmrUamiopThvO/UHdmIqsgmry2N8235iqCPGXqaeMEoCppAzbjkyLp1we0dw3NjY4++zHyE0MSilRrzDh1s4lL+T2v1f016WRUhtLuNa9pNIORH2Ms0mkGL/SRyIXMi+2BmETphNfOrJRMdNYEz/47JGHE0MSqkRo6Ojg4aqYra99yKHS3YTWJNLdPNekjqLSbUPCGs3vhT7JlIenk5RzKUEJ55E7NR5xE9KI9XH18NnMDxoYlBKeR1jtVJWcpDy/K9oKtqNX1UOkY0FJHUUcqG0dpUrkXgqg5P5KuosAsbPJDp5HglTT2JyQBCTPRf+sKeJQSk1rNVUlVOcvx3LwR1IZQ4RDfkkth1gvDR2DfaqYixlQcnsjrmYChPJjAXLSJw2l4TQMV2dxcpxmhiUUsNCY2MDh/K+pv7ADjrLsgmrzyW+dT9x1BBlL2MhmOKAKeTHnAVx6YRPnE1C6snERMd3dRZnZmYydd4ZnjqNEUETg1LKrVrbWjmUv5ua/V/TXrqboNo8Ylv2kmQtY4Z9QFir8afIfyJFY7/BwZgZhCbNIi51HtHjpzB9GA4IG2k0MSilXKKz00rxgVwq927ncHEW/jV7iG4qIKmziBTpsJUxQolvAlVh0yiLupAge0dw3KQZTPXTjydP0ZpXSp0QYwzlpYcozd9O86Gd+FblMLaxgAntB5koh5loL1cmsVQGJbMzchF+CScRNWUuCSmzmRAYwgSPnoE6liYGpZTDamuqKcr7CkvhTqjIJrw+n4T2/cTTQPyRMkRQGphMdtQF+MSnM3bSHBJSTyY+IrKrjBreNDEopY7T1NTEofwd1O3fTmdZDiH1ecQd3kcClUTayzQTSJH/FPZHLWbfuO6O4MiYBCJH2YCwkUYTg1KjWFtbO4f2ZVF9ZGbQ2lxim/eSZC1lulhtZYwvJX4TKBszh+KY6QQnziI+dR7RiSlM0wFhI5ImBqVGgc5OKyWH9lKxdzstRbvwq95DVONeJnYWMlXamYptZtBS33iqQqdSGXUuAQn2EcGTZzLZP0AHhI0imhiUGkGMMVSU22YGbTq0C6nMYazFNjPoBGnu6uStlCgqgpLZNfY0/MbPJHLyHBJS55IYHNa1jKQavTQxKOWl6upqKcrbTkPhTlr3fsGOz37O+Lb9xFHbNetnA6GUBE4hL/JcJC6dMZPmkDBtHrFjYruWkVTqWJoYlBrmmltaOJS3k5oDX9NZlk1wXS5xLftIMBWcZB8Q1mICKPGfRFHUAgpjpxOWZJsZdGzcRCK0I1gNkiYGpYaJ9o4ODu3bY1sisngXgTW5xDTvJclaTJp9ZtAO40OJXxJVEemURl9CcNIs4lJOZvfeYpacebaHz0CNFJoYlHIza6eVkuJCygq22TuCc4lsLGBCx0GSpZVke7lSGUdVyFR22GcGjUmeS3zyLCYGBHUNGjtC9pe7+zTUCKaJQSkXMcZQVVlBSf52LIU7kcpsIhoKSGo/QJJYupZ/rGYs5UFTyIldgW/8TMZOnktC6hzGh47tmj1UKXfSxKCUE9TXN1BU8DV1B3ZgLc8mtD6fhNZ9xFPd1cnbSDAlAVPYF3smMm4G4ZNmkzDtFKIj44n2aPRK9aSJQalBaDncyqGC3VTv/5qO0iyCanMZ17KPJFPKTHtHcJvxo9h/IqWRp1IcM52QpFnEp55M5PhkpmlHsPICmhiU6kV7RydFB/Ko3Lud1uLd+NfkEtNcwITOIqYdNTNoqW8CNeEpVEWfR2DiLMZNnUfspBlM8fX38BkoNXSaGNSoZrUaSksOUVawnaaiXfhV2mYGndhxkCnSwhR7uQqJpiJ4KrsiFxGQMJOoKXMZP3UOSYEhXX0FSo0UmhjUqGCMobqmhuK8r2go3IlU5BDekE9i234Spb5rtG89YZQGJpMbcx6+8TMZM2kO41PnMS48inEePQOl3EcTgxpxGhobKcrfQe2BHVjLsgipyye+dT+JVHQt/9hCICX+kyiMWUThuBmET5zN+NSTGROdyBjtB1CjnCYG5bXaOjrIy95Bzf7ttJVk2WYGbdnHBGsJ6fYBYe3G1zYgbMwsymKmE5I0m7jUeUQlpDJVl4hUqleaGNSw19HRyaHCfVTu3U5L8W4CqvcQ1VTAos5DBEtbV7lSn3iqQlPYGfUtAhNnEpM8j7gpM5nkF8gkD8avlLfRxKCGDWMMJWUllOdvp/HQLnwqcxjTWMCE9gNMkaaujuAqiaQiKJnNPtOJnr6QyMlzGZ8ym/HBETogTCkn0MSgPKKqtpZi+8ygpjyH8IY8Elr3kyi1XR3BFkIoDZzCvqhv4ROXToR9iciYMbHEABWZmczOyPDgWSg1MmliUC5laWqmsGA3dfu/pqMsi5A62xKRSaacGPuAsMP4U+I/idLo0yiJnUHYRNvMoOGxEwnXjmCl3M4liUFEngNmAP8wxjzUy/uRwMtAOJBljLnZFXEo9znc1k7hvj1U7/+a1uIsgmr3ENO8j4nWImYeNTNoqV8itRHTqYy5mJCkWcRNnUdk0jSSffU7ilLDhdP/N4rIJYCvMWahiDwtIqnGmPxjin0HeMkY84qIvCwipxpjtjo7FuV8nZ1WiooOUlHwFc1HzQw6sbOQaXK4q1y5jKMqJJldURkEJpxETPI8xk05iQkBwV2riCmlhicxxjh3hyKPA+8ZY/4hIt8Gwo0xzx9T5hpgGvA74G3g28aYimPKrAZWA8TGxp7yxhtvODVOb9XY2EhYWJjLj2OMoaGxkdaag/jWHySsqZBxbYVMsh4iSixd5WoJp8h3ItVBEzkcNgmJnERA1CQkINTlMbqrLryB1kU3rYtuS5Ys2WaMOXWw27ni+j0UKLY/bgBSeinzb+A84HZgD1B7bAFjzLPAswBpaWkmQzsZAcjMzMTZdVFT38ChvB00HPwaa3k2YfaZQcdLdVeZJoIoDZjCwTFLKByXTsTE2YyfdgqRkfFEOjUax7miLryV1kU3rYsT54rE0AgE2x+HAb2NIvoFcLMxpkFEfgjcgD0JKNdpbDlMYcFuavfvoL00m5C6PYxr2ccEU0qUvSO4HV9K/CZSEXUyZbHphE6YRXzKyUTETSFFB4QpNSq4IjFsA04HNgNzgNxeyoQAs0RkM/BfwD9dEMeo1dreQeGBAqr2fkVrSRYBNXuIbtrHZOsh0qUdAKsRSn3HUxMxlR1R5xGcdBLjpp5M1ITpTPIL0AFhSo1irkgM64FPRSQBWAZcKSIPGWPuParML4HngUnA58CrLohjxOu0GoqKD1Gev53m4l34VeXYOoI7DpIqLaTay1VKNJXByWRHLcQ/4SSip8wlLnk2iYGhXWMGlFLqCKcnBnvzUAawFHjUGFMG7DimzBfATGcfe6QyxlBRVUNR/ldU7fyQf+18iQhLPoltB5gkdV3f7hsIozQomYKY8/CNTydy8hziUk4mNjyqaxUxpZQaiEOJwT7uIAGoAcqNMdb+yhtjagG9jWgI6iyNFObtoO7gTqxlWYTV5xHfup8kKogDTgEOE0CJ/2RKY75JSZy9Izh1HhFRSUTogDCl1AkaMDGIyJ3Axdj6BX4FnANc5+K4Rrzm1jYOFuRQvf9r2kt2E2yfGXSiKWH2kQFh+FDql0TN2FlU2ZeILKo3nHnBFST7+Hr4DJRSI5UjVwwXGGNOE5GPjTEvi8gtLo9qBGnrsLK/ooGa3R9wuHgX/tW5RDcXMKnzEDOktatcmU8c1eFT2R211L5E5FyiJ6YzwT+ox4CwksxM0KSglHIhRxJDg4hcBwSJyBlAnWtD8k5Wq+FQbTO5ZRbyyi3kljeSW9bAvsomfuLzEv/P7x0AamQsFcHJ5I69BP+EmURNnkvc1DnEB0cQ7+FzUEopcCwxXA/cjW0Q2kXASlcGNNwZY6iwtHYnAPvvvPJGWto7u8pNiAomLS6cb82I4bvbN9MYdyb+l64lakwcUR6MXymlBjJgYrBPVXHHkecikuzSiIaR+uZ2csst5JZbyCuz/y63UNfc3lUmNjyQtLhwrpo/kenx4UyLDyd1XBihgfaqPfAf2FwN878DY+I8dCZKKeU4RzqfXzTGfOeol14CFrouJM/5aE85n++tJre8kbwyC2UN3ZPChQf5kRYXzvJZ420JIM72ExUa0P9Os9eDXxCkfsu1wSullJP0mRhEZCIwBZgpIovtL4cC7X1t480aDrez8oWtBPj6kBoXxsKUaNLibFcA0+PDiY8IQgZ7K6jVCtlvQ+pSCNRJvZRS3qG/K4YpQAYQaf8tQAtwo8uj8oCckgaMgbXXnsKS6eOcs9NDW6CxDNJXOGd/SinlBn0mBmPMv4B/icgkY8wDbozJI3JKGwCYMT7CeTvNXg++gTDtHOftUymlXGzA6TKNMT2uEERkRK63nlNqITLEn7iIQOfssEczUrhz9qmUUm7gSOfzg8CF2KbQBmgCZrsyKE/IKWtgxviIwfcj9KXoS7CUQPrPnbM/pZRyE0cm2D8d211IX2BLCJUujcgDOjqt5JZZnNyMtAF8A2Dauc7bp1JKuYGjK6/MwXbFMBtG3kSdB6qbaO2wOi8xWK22xDD1LAhyYrJRSik3cCQxXA20Af8D3AI86NKIPCC71LaG8YzxTuoLKN4GDUUwc4Vz9qeUUm7UZ2IQEV8ROQeYbozZaoz5Gtv0GMZNsblNTmkDfj5CyjgnjTXIXg8+/pC2zDn7U0opN+qv8/kVbB3NYSJyMbAXWAV8CKxzQ2xuk1PaQMq4MAL9nDBrqTG2u5GmnglBY058f0op5Wb9JYYJxpiFYrtNZz/wNLDIGFPnlsjcKKe0gYVTY5yzs5KvoL4QltztnP0ppZSb9ZcYgkRkAbYRzzXAv4F0EcEY85lbonODmqY2yhtande/kLVem5GUUl6tv8SwA1h91OOb7I8NMGISg1NHPBtj619IzoDgyBPfn1JKeUB/U2Lc4M5APMWpiaH0a6grhDPuPPF9KaWUhzg6jmHEyi5tIDY8kJgwJ0yFkbUefPwgbfmJ70sppTxk1CeGnFInjXg2xjaobcoZEKJrtCmlvNeoTgxtHVYKKizO6Xgu2wm1+yH9ohPfl1JKedCoTgx7Kxtp7zSkO+OKIWs9iC9MP//E96WUUh404OyqACJyEpAIFAKHjDGNLo3KTZzW8XzkbqQpiyE0+sQDU0opDxrwikFEngB+DvwSSMY2InpEyCltIMDPh+SY0BPbUfluqNmnzUhKqRHBkaakWcaYS4E6Y8w7wIiZ5yGn1MK0uDD8fE+wRS17g60ZacYFzglMKaU8yJFPxEoRuQ+IFJHvAmUujsktjDHklDYwI94JzUhZ62Hy6RDqpGk1lFLKgxxJDNcB9cDn2K4WRsTAt0pLK9VNbSfev1CRDdX52oyklBoxHOl8Pg941hjT4upg3CnbWR3P2RtAfLQZSSk1YjhyxTAVeFNEXhGRK0VkwJ5aEXlORD4TkXsHKPe0iHjkEzXHvjjPCd+qmrUeJn0TwsadeFBKKTUMDJgYjDG/MsYsB/4fkAoc7K+8iFwC+BpjFgIJIpLaR7lFQLwxZuPgwz5xOaUNJI4NZkyI/9B3UpEDVbnajKSUGlEGbEoSkQuBZdjGMXwBLBpgkwzgDfvjj4DTgfxj9ukP/An4h4hcZIzZ0MtxV2Of3TU2NpbMzMyBQh2UrXubGRfsc0L7nXTgNSYjfF4bQ5uT4+tLY2Oj0+vCW2lddNO66KZ1ceIc6WOYCTxmjMkfsKRNKFBsf9wApPRS5jogG3gUuE1EJhpjnji6gDHmWeBZgLS0NJORkeHg4Qd2uL2T8v97n0vnTyEjI23oO3rqLpi0kIXnXOy02AaSmZmJM+vCm2lddNO66KZ1ceIcaUr65SCSAkAjEGx/HNbHMeZh69AuA14Clgxi/ycsv7yRTqs5sY7nylyozIH0FU6LSymlhgNXzJW0DVvzEcAc4EAvZQqwjaIGOJUB+i2czSlTYWRvAETvRlJKjTh9NiWJyGPGmB+KyMfYVm0D2zKfxhhzZj/7XA98KiIJ2PomrhSRh4wxR9+h9BzwFxG5EvAHvn0iJzFY2aUNhAT4MikqZOg7yVoPE0+DiPFOi0sppYaD/lZw+6H996CaeYwxDSKSASwFHrU3F+04powFuGywwTpLdmkDafHh+PjI0HZQlQ8VWXDur5wbmFJKDQMumXbbGFNrjHnDnhSGla6pME6oGWm97bc2IymlRqBBJwYROX3gUsNXcV0LlsMdJ96/MOG/YEyi8wJTSqlhwpFptz845qVfuigWt+ge8TzEVduq90LZLh3UppQasfrrfJ6N7bbSRBG5zv5yKHDYHYG5ypE7ktKGOqvqkWYkTQxKqRGqvysG6eV3NXC5SyNysZzSBiZFhxAW6NDidcfL3gBJ34AxSc4NTCmlhon+7kraAewQkTRjzN/cGJNLndAaDDX7oXQHfOsh5wallFLDiCMjn9e4IxB3aGrt4GBN89A7nrPtUzppM5JSagRzye2qw9WeMgvGwIyhdjxnr4eEk2HsRKfGpZRSw4krRj4PWyc0FUbtASjZDksfcG5QSik1zDh95PNwllPaQHiQH0mRwQMXPlb227bf2oyklBrhRlVT0pGOZ5EhTIWRvR7Gz4XIyU6OSimlhhdHBrj5iEiEiPiJyBIRGWIDvWdZrYY9ZZah9S/UFULxNpi5wulxKaXUcOPIFcMbwGnA74BVwFsujchFCmuaaW7rHFr/gjYjKaVGEUcSQ4wx5v+AVGPMNXQvwuNVTqjjOXs9xM+GqOQBiyqllLdzJDFYRGQ9sE1ElgMW14bkGjmlDfgIpMUPsimpvgiKvtRmJKXUqOHIvBCXAenGmK9EZA5whYtjconsUgtTYkIJ8vcd5IZHmpFWOD0mpZQajhy5YugAThWR3wHfAJpcG5JrDHkNhuwNEDcLoqc6PyillBqGHEkMzwPxwHtAov25V6lvaae4rmXwiaGhBA5t1k5npdSo4khTUpIx5jv2x++LSKYL43GJPfaO5/TBJoYjzUjav6CUGkUcSQylInI3sAXbbaslrg3J+YZ8R1L2Bhg3E2JSXRCVUkoNT440JV0PNACXAnX2514lp9RCZIg/cRGBjm9kKYPCz7UZSSk16vQ3iV48cDvQDPzBGOOVt6kC5JTZOp4HNRVGzkbAaDOSUmrU6e+K4UUgC9tVwtNuicYFOjqt5JZZBt+MlLUeYqdDbJpL4lJKqeGqv8QQYIx52RjzJDDBXQE524HqJlo7rIPreLaUw8H/6NgFpdSo1F/nc6yIXI1tDYZx9scAGGNecXlkTpJdamsBG9QVwx5tRlJKjV79JYbXgdReHpveiw9POaUN+PsKKePCHN8oaz3ETLM1JSml1CjT30I9P3dnIK6SU9rA1NgwAvwcXHqisdLWjLToxzCUdRuUUsrLjfiFenJKGwbXv7BnIxir3qaqlBq1RnRiqGlqo7yhdXD9C1nrIToF4ma6LC6llBrORnRiGPSI56YqOPBv291I2oyklBqlRklicHANhj2bwHRqM5JSalRzZK4kROQkbDOrFgKHjDGNLo3KSbJLGxgXHkh0mINTYWRvsK3SFj/LtYEppdQwNuAVg4g8Afwc+CWQDAw4hkFEnhORz0Tk3gHKxYnIdkeDHayc0kGMeG6ugX3/0mYkpdSo50hT0ixjzKVAnTHmHWBMf4VF5BLA1xizEEgQkf6mJv0NLlpDuq3DSkHFIBKDNiMppRTgWFNSpYjcB0SKyHeBsgHKZwBv2B9/BJwO5B9bSETOxLYaXK/7E5HVwGqA2NhYMjMzHQi1W2FDJ+2dBmqLyMwcKGSYtfN5QoLi2ZJbC3mDO5Y7NTY2DrouRiqti25aF920Lk6cI4nhOmwf0J9ju1q4foDyoUCx/XEDkHJsAREJAO4DVgDre9uJMeZZ4FmAtLQ0k5GR4UCo3d7cVgTs4NKz/ovUuAE6n5tr4JOdsOC/yViyZFDHcbfMzEwGWxcjldZFN62LbloXJ86RpqTLgFpsC/XU2Z/3p5Hu5qGwPo5xF/CUMabOoSiHIKe0gQA/H6bEhA5cOPddsHbopHlKKYVjiUHsP8HAJcDiAcpvw9Z8BDAHONBLmbOB/7YvEzpXRP7sSLCDkVPWQFpcOH6+Dpxi9noYOxES5jk7DKWU8joDNiUZY1446ulaERlobYb1wKcikgAsA64UkYeMMV13KBljupKLiGQaY1YNLuwBYyan1MLZM8YNXLilDvZ+DKfdrHcjKaUUDiQGETn6CiEc6HeuCGNMg4hkAEuBR40xZcCOfspnOBLoYFRYWqlpanPsjqTcd8HaDukXOzsMpZTySo50Ph/dG9sG3DrQBsaYWrrvTHK77MFMhZG9HsZMgMSTXRuUUkp5CUeakrxu+u2uqTDiB0gMh+th70cwf7U2IymllJ0jI5/fdUcgzpRTaiFxbDBjQvz7L5j7HnS26d1ISil1FEfuStolIl41HDintMGxifOy10NEIiSe4vKYlFLKWziSGL4BvCYiX4jIxyLykauDOhGH2zvZV9k4cP/C4QYo+NA2BYbPiJ5kVimlBsWRPobhPRT4GHnlFqzGgY7nvPehs1XnRlJKqWP0+VXZ25qPjnB4cZ7s9RCeAEnzXR+UUkp5kf7aUL7vtiicKKfUQkiAL5OiQvou1GqB/A8g/UJtRlJKqWP015R0mojkHfOaAMYYM82FMZ2Q7NIG0uLD8fHp5/ZTbUZSSqk+9ZcYtnhb/4JtKowGLpiT0H/B7A0QFg8TTnNPYEop5UX6a0dZ57YonKS4rgXL4Y7++xfammzNSDMu0GYkpZTqRZ+fjMaYp9wZiDPklFoASO9vDEPe+9DRAjNXuCcopZTyMiPqK/ORO5LS+psKI3sDhI6DiQvcFJVSSnmXEZcYJkeHEBbYR9dJWzPk/5+9GcnXvcEppZSXGHGJod/+hYIPoL1Zm5GUUqofIyYxNLV2cLCmuf/EkLUeQmJg4kK3xaWUUt5mxCSGPWUWTH9TYbS32DqeZ1wAvo4sQ6GUUqPTiEkM3VNh9HFHUsE/ob1Jm5GUUmoAIyoxRAT5kTg2uPcCWeshJBomne7WuJRSytuMqMQwfXwE0ttKbO2HIe89mH6+NiMppdQARkRisFoNe8ospPfVv7D3Q2hr1LmRlFLKASMiMRTWNNPc1tl3/0LWegiOhCmL3RqXUkp5oxGRGPpdg6GjFXLftTcjDbAGtFJKqZGTGHwEpsX1csWw9yNos0D6CrfHpZRS3mhEJIbsUgvJsWEE+fcyzUX2BggaC8lnuD0upZTyRiMiMfQ5FUZHK+z5B0w/T5uRlFLKQV6fGOpb2imua+m943lfJrTWazOSUkoNgtcnhn47nrM3QOAYSM5wb1BKKeXFRkxiOG4MQ0cb7NkE05eDX4AHIlNKKe80IhJDVGgA48IDe76x/xM4rM1ISik1WCMgMViYMT78+Kkwst+CwAiYusQzgSmllJdySWIQkedE5DMRubeP98eIyLsi8oGIvCUiQ2rr6ei0kltuYcaxS3l2tsOedyBtGfgF9r6xUkqpXjk9MYjIJYCvMWYhkCAiqb0UuwZ4zBizFCgDzh3KsfZXNdHWYT2+43n/J9BSq81ISik1BK6YajQDeMP++CPgdCD/6ALGmKePehoLVBy7ExFZDawGiI2NJTMz87gDbS7pAKCpOJdMS0HX69Ny/8g432A+K/bDWnb8dt6ssbGx17oYjbQuumlddNO6OHGuSAyhQLH9cQOQ0ldBEVkARBpjNh/7njHmWeBZgLS0NJORkXHc9pvf3YO/7z6uXL6EAD/7xU9nB2y5AdLPZ/FZ3zrBUxl+MjMz6a0uRiOti25aF920Lk6cKxJDI3BktZww+miuEpEo4Ang0qEeKKe0gamxYd1JAeDAp9BSo81ISik1RK5IDNuwNR9tBuYAuccWsHc2vwHcbYw5ONQD5ZQ2cHpKTM8Xs9dDQBiknDXU3SrlNdrb2ykqKmLMmDHk5OR4OpxhYTTWRVBQEElJSfj7O2fqH1ckhvXApyKSACwDrhSRh4wxR9+htBI4BbhHRO4B/miMeX0wB6lubKXC0tqz47mzA3I2wbRzwL+PJT6VGkGKiooIDw8nOjqaiIg+FqoaZSwWC+HhfazNMgIZY6iurqaoqIgpU6Y4ZZ9OTwzGmAYRyQCWAo8aY8qAHceU+SPwxxM5Tk6pBThmKoyD/4HmKl2pTY0ahw8fZvLkyTQ2Nno6FOUhIkJ0dDSVlZVO26dLFkA2xtTSfWeSS3TPkXTUN4PsDeAfAilLXXlopYaVXtc5V6OKs/8GvHbkc05pA+PCA4kOsw9gs3ZCzkZbM1JAiGeDU2oU27Rpk17BeDmvTQzZx67BcPAzaKrQZiSl3KigoIC33nqrx2tPP/10r4lh3759XHXVVRhj6OjooKysjIsuughjDFarlc7OTgBee+01fvvb3x63/WeffcaaNWtccyKqB5c0JblaW4eVvZWNZKSN634xewP4BUPqyBu7oNRwNXbsWO655x4SEhL44osv+Pvf/86uXbu44oor8PHx4Qc/+AEXXXQRBw4c4PLLLyckJISpU6cyb9482tvbaW5uJi4ujlNOOYXLL7+c6667Dh8fHyIjI3n22Wf5z3/+Q2dnJy+99BK+vr74+/tjtVrx8XH8O+3KlSvJyclh+fLl3Htvr7P0UFtbyzXXXIPFYmHmzJmsXbuW+vp6rrzySjo6OggLC+P1118nIMA2e8+tt97KsmXLuOCCC5xSj8ONV14xFFQ00t5pSE+wXzFYOyHnbUhdCgGhng1OqVEkJiaG119/nY8++ojbbruNjz/+mG984xts3LiRK664gurqagA6Ozt56qmnePXVV3nwwQe5/vrrWbx4Ma+99hq/+c1veOGFF7j66qvZtGkT9957L7/+9a9JTU3lhRdeoLa2lksvvZTvfe97PP/887z//vsOx/f3v/+dzs5OPvvsM0pKSsjPz++13Isvvsi1117Lp59+isViYevWrbz88sv88Ic/5IMPPiA+Pp733nsPgE8//ZSysrIRmxTAS68YutdgsHc8H9oCjeUwc4XnglLKw36+MYvskgan7jM9IYKfXTCz3zKzZs3ipJNO6nre0tJCUFAQQNc3+5iYGP785z8TGGjrE8zOzqatra2ryenxxx/nO9/5DhdddBEff/wxaWlpVFVV8dhjj5GQkMD9999PaWkpmzZtYtmyZV3HWbVqFS+//HKfsWVmZnL55ZcDcOaZZ/Lvf/+b1NTjp2+Ljo4mNzeXuro6Dh06xMSJEzn11FO73q+srGTcuHG0t7dz0003sXz5cjZs2MBFF43MpmuvTQyBfj5MjrZfHWStB78gSD3Ho3EpNRrt3buXBx54gIaGBpqamti+fTvnnXcelZWVdHZ2IiJ897vf5fTTT+fXv/41QNd7dXV1AKxatYq0tDSMMWzcuJF33nmH559/nscff5xVq1ZxzTXX8NOf/rTHcYODg/tNCgBNTU0kJiYCEBERQUFBQa/lTj/9dN555x0ef/xxpk+fTmRkZNd7n3/+ObW1tZx22mk899xzpKen89Of/pQnnniCwsJCbrvttqFW3bDlnYmhrIG0+HD8fH3AarU1I6WcDYFhng5NKY8Z6Ju9qzz66KNcfPHFrFixgsLCQhYtWkRKSgoffPBBj3LV1dVcf/31XH/99Vx55ZWceuqp/PjHP+af//wnu3fvBuDtt99m7Nix3HDDDezevZvQ0FD+9a9/8f3vf5+XX36512/7/QkLC6OlpQWwTa5ntVp7LbdmzRrWrl1LREQEjz32GM8//zyrV6+mpqaG2267jTfffBOA7du3s3r1auLj47n22mu55557RmRi8Lo+BmOMbXGeI2swFH0BllKYebFnA1NqFNqyZQu7du1ixYoVGGO4/fbb+ctf/sL+/fuP+zYfHR1NXFwc9957LyUlJaxdu5a//e1v/Pa3v2XJEtuCWiLCrbfeSlhYGOHh4Zxyyin4+voSGxvL97///UHHd8opp/Dvf/8bgB07djB58uReyzU3N7Nr1y46OzvZsmULIkJbWxuXX345v/zlL5k0aRIAKSkp7Nu3D4CtW7d2vT7SeN0VQ4WllZqmtu6BbVnrwTfQNn5BKeVW4eHh/OpXv6KxsZGbb76ZOXPmcNZZZzF79mzOOecc3n//fe644w7mzZvH7Nmzuf3225k/fz6333479fX1XXMaZWVlERcXx4UXXsi6desoLi5m48aNbNy4EYvFQkRERNdVxRGO9DGsWLGCRYsWUVJSwrvvvsvmzZvJzs7mlVde4aGHHuoqd/fdd3PDDTdw8OBBFixYwFVXXcVzzz3Htm3bePjhh3n44Ye55ZZbWLlyJTfeeCOvvfYa7e3trFu3zjUV62nGmGH/M23aNHPER3vKzaQ7N5nNe6uM6ew05rczjHnlKjNafPzxx54OYdjQujAmOzvbGGNMQ0ODR+N46KGHzJNPPtnjtZaWFvO73/3OfPnll6a4uNhkZGSYTz75xBhjzKuvvmqeeeYZY4wxeXl55pZbbjFZWVnGGGNeeeUV88c//rHHvtra2syCBQvMSy+9NGAsx9ZFTU2Nef31101paemQz88bHPlbOBqw1QzhM9frrhiO3JE0fXwEFG+FhmI4+37PBqXUKHfPPfcc91pQUBA/+MEPup5//PHHXY+vvPLKrsepqak8/XT32l1XXXXVcfvy9/fnk08+wc9v8B9ZkZGRXXcmKcd4XR9DTqmFxLHBjAn2tzcjBWgzklKjwFCSghoaL0wM9qkwjLGNdp56FgSN8XRYSik1YnhVYjjc3sm+ykbbwLbibdBQpHMjKaWUk3lVYsgrt2A19jUYst4CH39IW+bpsJRSakTxqsTQtQZDfDhkvw1Tz4TgsZ4NSik1Ih2Z7XU08rLEYCE0wJeJh3OhvlCbkZQaxn7yk5/w9ttvdz2/7777yMzM5J577uGRRx7BYrFwzjnn9PoB/N577xEXF8epp57KvHnzmD9//nFl2tvbux7/4Q9/4LXXXut63tHR0fW4oKCAq666CqvVitVq5fzzzwfgvPPO63oN4Nvf/jZxcXGcf/75xMbGcv/99/PCCy9QVlbG0qVLe+xzpPOqxJBdapsKw2fPBvDxg+nLPR2SUqNaQUEB1113HatWrWLlypVs27at673Q0NCuaaobGxuJiIjgs88+o6KigoKCAg4cOEBoaCi+vr49PqABfH19ueaaa9i6dSsff/wxwcHHr+G+cOFCFi9eTEZGBn/4wx9Yu3YtGRkZLFu2jAULFnRNhREUFERgYCB5eXksWbKEL774goyMDDZv3sySJUv4/PPPAVi3bh3z589n06ZNzJkzhwcffJAvv/ySw4cPExgYOOi7olauXMnChQt7DKQ7Vm1tLcuXL2fRokXcfPPNfW5bX1/PsmXLWLp0KRdffDFtbW2DimWwvOb+L2MMOaUNXDh7vO021eQMCI4caDOlRo9374KyXc7dZ/wsWPZIn29PnTqVv/71r/j4+HDnnXfy2muvsWbNGvz9/cnLy2PTpk3s2bOHyy67jOrqap588knmzp3LwoULeeqppygoKGDx4sUUFBSwfv36risDEemxXGVvS1eee+65zJ8/n6qqKvbu3UtycjITJkxg7969FBcXExwczJ49e3jjjTfIy8sjNzeXq666iqqqKpKSksjNzSUiIoJvfvOb/POf/+SVV15hx44drFq1ipycHG666aau2WAH6+jpvm+99Vby8/N7nefpyHTfV199dVciLCwsPG7bDz74gB/+8IcsXbqUW265hffee48LL7xwSLE5wmsSQ3FdC5bDHXwztBjqDsLin3g6JKVGvba2Nq699lpeeOEFsrKy2LBhAy0tLYSFhXH//fdz2mmnce6551JWVsaBAwf40Y9+xJ49eygrK2Pnzp08/PDDpKSk8Mwzz/RoLmpvbx/wG/qaNWs4cOAADz74IE1NTaSkpPD6669TUVHB/fffD8D06dOJj48nPDyc9PR0XnnlFcrLy7v2UVdXx913382CBQuIiYnh4MGDPPLII+Tl5fHQQw9x33330dra2uO4rp7u+29/+9tx2956661d2xyZAtyVvCYxHJlnfl7jv+zNSOd5OCKlhpl+vtm7SmBgILfeeiuXXXYZISEhVFVVsWrVKjZu3NijXEdHBz/72c948cUX+dGPfoS/vz9r1qxh27ZtBAQEkJyc3KN8XV0dsbGx/R57z549vP766zz22GOsXbuW1atXc9NNNxESEkJrays33ngjVquVV155BT8/P+688058fX17jMb+05/+1PX4V7/6FatWrSImJob29nbi4uJ45pln+PLLLykpKekq5+rpvvvb9ugpwF3JaxJDTqkFEUPcofdgymIIifJ0SEopYMmSJfz1r38lNDSUuLg4xo8fz6efftqjzMGDB7n33nvJz89nx44dfP311+zfv59LLrkEoGvxnSN2797dY6GcY9XX1/PMM8/wi1/8gpUrV1JfX89vf/tb/P39ueuuu9i4cSNtbW2sXbuWRYsWcejQIR5++GEaGxupra3lxz/+Mb/5zW948MEHAVtb/ze+8Y2u6Tiuvvpq1q1bx7e//W0aGhq6rkAcdSLTffe17bFTgLuSFyWGBs4aU45P3X5YdIenw1FK2e3cuZPGxkY6Ojr49NNPeeCBB4iIiODDDz/sKvPNb36Tyy+/nM2bN7Ns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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# 绘制ROC曲线并计算AUC值\n", + "auc_dt = roc_auc_score(y_test, y_pred_dt)\n", + "print(f\"该支持向量机模型的AUC值为 {auc_dt}\")\n", + "fpr_dt, tpr_dt, thresholds = roc_curve(y_test, y_pred_dt)\n", + "plt.plot(fpr_dt, tpr_dt, label=\"决策树: \"+str(round(auc_dt, 3)))\n", + "plt.plot(fpr_lr, tpr_lr, label=\"对数几率模型: \"+str(round(auc_lr, 3)))\n", + "plt.xlabel('False Positive Rate')\n", + "plt.ylabel('True Positive Rate')\n", + "plt.title('ROC')\n", + "plt.xlim([0,1])\n", + "plt.ylim([0,1.1])\n", + "plt.grid()\n", + "plt.legend(loc='lower right')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "## 5 神经网络" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "from sklearn.neural_network import MLPClassifier\n", + "params_mlp = {'solver':['sgd', 'lbfgs'], 'alpha': [1e-3, 1e-4], 'learning_rate_init':[1e-3, 1e-4] }" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "MLPClassifier(activation='relu', alpha=0.001, batch_size='auto', beta_1=0.9,\n", + " beta_2=0.999, early_stopping=False, epsilon=1e-08,\n", + " hidden_layer_sizes=(6, 6, 6), learning_rate='constant',\n", + " learning_rate_init=0.001, max_iter=1000, momentum=0.9,\n", + " nesterovs_momentum=True, power_t=0.5, random_state=None,\n", + " shuffle=True, solver='lbfgs', tol=0.0001, validation_fraction=0.1,\n", + " verbose=False, warm_start=False)" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# 神经网络训练模型\n", + "base_line_model = MLPClassifier(solver='lbfgs', alpha=1e-5, hidden_layer_sizes=(6, 6, 6), max_iter=1000)\n", + "mlp = GridSearchCV(estimator=base_line_model, param_grid=params_mlp, cv=5, n_jobs=3)\n", + "mlp.fit(x_train, y_train)\n", + "y_pred_nn = mlp.predict(x_test)\n", + "mlp.best_estimator_" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "神经网络模型在 训练集 上的性能 -- \n", + "Neural Network | 准确率: 0.8411\n", + "Neural Network | 均方误差: 0.1589\n", + "Neural Network | R2-score: 0.3269\n", + "Neural Network | 混淆矩阵:\n", + " [[340 45]\n", + " [ 54 184]]\n", + "\n", + "\n", + "\n", + "神经网络模型在 测试集 上的性能 -- \n", + "Neural Network | 准确率: 0.8209\n", + "Neural Network | 均方误差: 0.1791\n", + "Neural Network | R2-score: 0.2458\n", + "Neural Network | 混淆矩阵:\n", + " [[145 19]\n", + " [ 29 75]]\n" + ] + } + ], + "source": [ + "# 模型性能评估\n", + "print(\"神经网络模型在 训练集 上的性能 -- \")\n", + "model_performance_evaluation('Neural Network', y_train, mlp.predict(x_train))\n", + "print(\"\\n\"*2)\n", + "\n", + "print(\"神经网络模型在 测试集 上的性能 -- \")\n", + "model_performance_evaluation('Neural Network', y_test, y_pred_nn)" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# 计算混淆矩阵\n", + "cnf_matrix = confusion_matrix(y_test, y_pred_nn)\n", + "np.set_printoptions(precision=2) # 设置打印数量的阈值\n", + "class_names = [0, 1]\n", + "# 绘制混淆矩阵\n", + "plot_confusion_matrix(cnf_matrix, classes=class_names, title='Confusion matrix')" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "神经网络的AUC值为 0.8026500938086304\n" + ] + }, + { + "data": { + "image/png": "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F198wfz58yksLGTs2LE8+uijmEwm/P39efTRR2lqarK/7tNPP81ll13GsmXL8Pb25vrrr2flypX2x5977jn++9//ct5557FmzRruvvtu/va3v7FkyRICAgI4++yz7W3r6+u5+uqru3wfqamprFixAoCzzz6brVu3dtouNDSUQ4cOUVlZSW5uLmPGjOn0uUuWLGHu3Lls2bKFnTt3cuaZg+tzyCVnDEqpvwJTgC+01h3Oy5RSwcD7tuPXAFdorZuOb9etlmYoPgBzbgasZTC0hrkTR3DX9o0kj07Gy93rp7wVIQaNrr7Zu0ppaSmXX345JpOJBx98EHd3d95//32HMwaAiy66iOTkZG6++WZefvll7r77bn75y19yyinWucG///3vfP/995x66qkATJs2jcDAQGbPns0555zDb3/7W9577z2++eYbAO677z4uu+wy1q5dy9SpU/n444/5zW9+w+rVq/n222+59957ueSSS5g7dy6+vr688847Xb6P2tpaRo0aBUBQUBBGo7HTdvPnz+fzzz/nxRdfZPLkyYSEhJzwuVprPvjgAzw9PXF3H1w7Rvb6GYNS6hLAXWs9D4hRSnU8H4Orgee01kuBQuDckzpYmRFaGu3zC2mGEoJ8PGjwOExVY5UMIwnhYlu3bmXNmjWMHTuWa665hpaWlg5nDFprKioquPjiixk1ahS33norp59+OnfeeScxMTHMnz+fdevWMXfuXPvrHjlyBC8vL5555hm+/PJLoqOjefvtt+2PV1dXc9VVV2E2m3n55ZfZuXMnBQUFbNu2DYvFwqFDh6iurnb6fQQEBFBfXw9ATU1NpxPjAGvWrGHt2rU8/PDDTJ48mTfeeOOEz1VK8fLLLzNv3jzWr1/f477tT644Y0gGPrTd3gjMBwztG2itX2n3azhQfPyLKKVuAW4BCA8PJzU1tcOBIoq2kAjsOtZATcUmvk6vZ1KwG2/veAsf5UPzkWZSj3Z83mBWU1PTaV8MR9IX1vIP1dXVtLS09OiDsLcsXrwYgGeffZbp06dTX1/PX/7yF1544QV+9atf8c9//pPa2lpqampYunQpM2bMYOrUqYSGhnLFFVdw66238sADDzB27Fiqq6tpaGigpaWFu+66iyeeeILs7GweeeQRvvjiC+655x48PT2pqakhKCiI22+/nZiYGDw9PZk3bx7BwcGsWbOG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w3FdXe7773//e4fn3n777fbntJYAd6XBkxhsK573+Nbhhjtnjzm7nwMSYmDp6pu9q3h7e3P77bdz+eWX4+fnR2lpKatXr2bdunUO7Zqbm/ntb3/L22+/zW9+8xs8PT1Zs2YNe/bswcvLiwkTJji0r6ysJDw8vMtjHzx4kA8++IDnnnuOtWvXcsstt3DzzTfj5+dHY2MjN910ExaLhXfffRcPDw/uu+8+3N3dHVZj//nPf7bffvrpp1m9ejVhYWGYzWYiIyN57bXX2LVrF/n5+fZ2ri733dVz25cAd6VBlBjSsaAoD8zljMjTZRhJiAFi0aJFvPnmm/j7+xMZGUl0dDRpaWkObbKzs3nooYcwGAzs3buX//73v2RmZnLJJZcA2DffaZWenu6wUc7xqqqqeO211/j973/PqlWrqKqq4tlnn8XT05P777+fdevW0dTUxNq1a0lKSiI3N5cnnniCmpoaKioquOeee/jjH//IY489BljH+k8//XR7OY6VK1fy0Ucfcdlll2EymexnIM76KeW+T/Tc40uAu9LgSQxF+/jWJxrlVcF5E87t72iEEDY//vgjNTU1NDc3k5aWxu9+9zuCgoL45ptv7G3OOussVqxYwfbt21m+fDlTp07F09OT0047jc8++4yHH37Y3ra5uZl//etf3HdfxzOgQ4cOERYWxmeffUZmZiY33XQTYB1eqa6uZtSoUdx3331orQkLC7Pv4/zII49QWFhoH5I5dOgQN9xwA1FRUdxxxx1ceumlxMbGsmDBAry8vCgpKaGxsZG1a9fS3NzM5Zdf3qM+aS33PXfuXPbu3UtCQkKn7VrLfc+dO5cdO3awZMmSTp/bWQlwlzqZynt9/TNp0iTd/PwMfedzZ+hT3pyuy+vLf0oRwkFNKoq2kb7o/+qqe/fu1UlJSbqoqEgXFBToNWvW2B/73//9X/3ll1/af7dYLPqtt97SU6dO1eedd54+evSovvTSS/WcOXP0rl277O0effRRfdddd9l/r6ys1DNnztRNTU36gQce0M8880yHOJ5//nn93nvvaa079kVubq6+/vrrtdZa19bW6lWrVumdO3fqCy+8UKenp3f6vj755BP90ksvdfpYXV2dXrlyZZf9UlVVpadPn67vuusuPXnyZF1ZWan379+vH3zwQYd2O3bs0ImJidrf318vWbJEV1dXd/rcV155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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# 绘制ROC曲线并计算AUC值\n", + "auc_nn = roc_auc_score(y_test, y_pred_nn)\n", + "print(f\"神经网络的AUC值为 {auc_nn}\")\n", + "fpr_nn, tpr_nn, thresholds = roc_curve(y_test, y_pred_nn)\n", + "plt.plot(fpr_nn, tpr_nn, label=\"神经网络: \"+str(round(auc_nn, 3)))\n", + "plt.plot(fpr_dt, tpr_dt, label=\"决策树: \"+str(round(auc_dt, 3)))\n", + "plt.plot(fpr_lr, tpr_lr, label=\"对数几率模型: \"+str(round(auc_lr, 3)))\n", + "plt.xlabel('False Positive Rate')\n", + "plt.ylabel('True Positive Rate')\n", + "plt.title('ROC')\n", + "plt.xlim([0,1])\n", + "plt.ylim([0,1.1])\n", + "plt.grid()\n", + "plt.legend(loc='lower right')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "# 6、支持向量机\n" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "SVC(C=100, cache_size=200, class_weight=None, coef0=0.0,\n", + " decision_function_shape='ovr', degree=3, gamma=1, kernel='rbf',\n", + " max_iter=-1, probability=False, random_state=None, shrinking=True,\n", + " tol=0.001, verbose=False)" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from sklearn import svm\n", + "params_svm = {'kernel':['rbf','linear'], 'gamma':[10,1,0.1,1e-2], 'C':[1,100,1e4]}\n", + "# 支持向量机训练模型\n", + "base_line_model = svm.SVC() # 默认 kernel='rbf'\n", + "svc = GridSearchCV(estimator=base_line_model, param_grid=params_svm, cv=5, n_jobs=3)\n", + "svc.fit(x_train, y_train)\n", + "y_pred_svm = svc.predict(x_test)\n", + "svc.best_estimator_" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "支持向量机模型在 训练集 上的性能 -- \n", + "Support Vector Machinen | 准确率: 0.8411\n", + "Support Vector Machinen | 均方误差: 0.1589\n", + "Support Vector Machinen | R2-score: 0.3269\n", + "Support Vector Machinen | 混淆矩阵:\n", + " [[348 37]\n", + " [ 62 176]]\n", + "\n", + "\n", + "\n", + "支持向量机模型在 测试集 上的性能 -- \n", + "Support Vector Machine | 准确率: 0.8507\n", + "Support Vector Machine | 均方误差: 0.1493\n", + "Support Vector Machine | R2-score: 0.3715\n", + "Support Vector Machine | 混淆矩阵:\n", + " [[151 13]\n", + " [ 27 77]]\n" + ] + } + ], + "source": [ + "# 模型性能评估\n", + "print(\"支持向量机模型在 训练集 上的性能 -- \")\n", + "model_performance_evaluation('Support Vector Machinen', y_train, svc.predict(x_train))\n", + "print(\"\\n\"*2)\n", + "print(\"支持向量机模型在 测试集 上的性能 -- \")\n", + "model_performance_evaluation('Support Vector Machine', y_test, y_pred_svm)" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "该支持向量机模型的AUC值为 0.8305581613508443\n" + ] + }, + { + "data": { + "image/png": "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fPIJbm5uvPzyy1x00UVceOGFRERE8NVXXwHWmcUTJkxg8+bNJCQksHbtWjZt2kRCQgJ33nknCxYsqCtp8d577zF+/HiqqqrYt28fR44c4ZZbbiEuLo6pUzt+afqqVauYMWNGk0tP6ysqKmLRokXMmjWLW2+9tcVts7KyuPjii9m1axdz5szp1GU3u0Kvv1z1pCEZJ3yI8AmzPpAaDwOmUvrzYSwGg6zUJs4eX94P2Qc79zXDx8JFf2nx6czMTOLj49m1a1ddeYrXXnuNp556invvvZc333yTkpISAF588UVefvll7r//flasWMEdd9zBJ598wvbt2+sme9VeNXTllVfy8ssv8+yzz3LixAlWrFjBSy+9RFiY9f95aWkp+/btY8mSJVx55ZWYTCYmTZrE888/z+OPP85NN93Uobf5a6qmnjp1qsm2aWlpTSqpLuxFV0b2+iOGopp6pTBKCyBrPwydi2HzZpx8fPA+77zuDlGIPmvkyJHceOONpKSk1E1wW758Of/5z39Yvnw5b775Jk5OTnzyySf897//ZebMmWRnZxMVFcUf//hHDAYD3t7e/PGPf2xQevuJJ57gqquuYuHChbi7u3PDDTfUTY4DeOaZZ/jll19YtGgR69ev55577uEf//gH8+fPx8fHh7lz59a1LS8vZ+XKla2+j+aqpjanuaqpzW07f/58pk2bVldJdXovG852yBGDUup1YCTwX611k+MypZQ/8IFt/yZgmda6qnG7tuQayzC7ZBPlY1tf4UQCoNFRszB9fRc+c+fgJMNI4mzRyjd7R8nPz+fqq6/GYDDwwAMP4OzszAcffNDgiAGsE8vi4uK45ZZbePHFF7nnnnv47W9/y9ixYwF4++232bdvX10V1TFjxuDr68vkyZO54IIL+MMf/sD7779fN6ntvvvu46qrrmLDhg2MHj2af//73/zud79j9erV/Pjjj/z+97/niiuuYNq0aQ6vmtrSto0rqfYmnX7EoJS6AnDWWs8A+iulmh6PwUrgGa31AiAbOKMl1b47cQTlVMPY2lIYqfHg4U9pehXmkhL8LpSV2oRwpB9++IH169cTFRXFtddei9lsbnLEoLWmqKiIyy+/nMjISG699VamTJnCHXfcQf/+/Zk5cyaff/450+rNNUpNTcXNzY0nn3ySzZs3ExERwTvvvFP3vNForKs/9OKLL7Jr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0yYuuuiiuv2sXr261clrzVU+ba6cdnNVUydPtl/+n5eXR2hoKNXV1dxyyy0sWrSITz/9lMsuu6zNPuyNemViSCxMBIsLE92coCQdQ+F4lLs7Puef392hCXHWSU1N5U9/+hMGg4HS0lJ+/vlnLr74YvLy8jCbzSiluOGGG5g5cyZ//etfAeqeKy4uBmD16tXExsaitebzzz/niy++4I033uD5559n9erVrFy5kt///vcN9uvoqqm1fvrpJ4qKipg2bRqvv/46o0aN4ve//z0vvPACp06d4vbbbz/TruuxemViyK44jqfTAFxOfIfWYNyXhs/sWTh5e3d3aEJ0m7a+2TvKk08+yeWXX86SJUs4deoUs2bNIiYmpklJiIKCAm688UZuvPFGli9fzuTJk7n33nv5+uuvOXToEACfffYZAQEB3HTTTRw6dAhvb2++/fZb7rzzTt57771mv+23pqNVU/38/HjmmWd44403WLNmDYWFhdx+++3861//AuDnn39mzZo1hIeHc+211/LAAw/0ycTQ684xVNeYKec0EZ6DITWe8sooavIL8F0oJbaF6Go7d+7k4MGDLFmyBK01d9xxB//4xz84ceJEk2/zQUFBhIWF8eCDD5KZmcmGDRt4++23efrpp5kzZw5gLVW9du1afHx88PX1ZdKkSTg7OxMSEsKdd97Z4fgmTZpUt+jO/v37iY6ObrZdWVkZBw8exGw2s3PnTpRSVFVVsXTpUh5//HGioqIAiImJ4fjx4wDs2bOn7vG+ptcdMfycmYZyKSU2cBjs/ReGgrEotyx8zvKaOUJ0B19fX5544glMJhO33nor48ePZ968eYwbN46FCxeyZcsW7r77biZOnMi4ceO44447mDp1KnfccQclJSUcPWqdqHr48GHCwsJYvHgxH3/8MRkZGXz++ed8/vnnGI1G/Pz86o4qarXnHMOSJUuYNWsWmZmZfPnll+zYsYMjR46wcePGBgXy1q1bx0033URaWhrTp0/nmmuu4fXXX2fv3r089thjPPbYY9x2222sWrWKm2++mQ8++IDq6mo+/vhjx3RsdzuTkqxd/VO/7PZfv/tEj3lzjP7s25e05SE/nTTjXH1qrb3Ebl8npabtpC96TtntRx99VP/tb39r8Fh5ebl+9tln9e7du3VGRoaOi4vT3333ndZa6/fff1+/8sorWmutk5KS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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# 绘制ROC曲线并计算AUC值\n", + "auc_svm = roc_auc_score(y_test, y_pred_svm)\n", + "print(f\"该支持向量机模型的AUC值为 {auc_svm}\")\n", + "fpr_svm, tpr_svm, thresholds = roc_curve(y_test, y_pred_svm)\n", + "plt.plot(fpr_svm, tpr_svm, label=\"支持向量机: \"+str(round(auc_svm, 3)))\n", + "plt.plot(fpr_nn, tpr_nn, label=\"神经网络: \"+str(round(auc_nn, 3)))\n", + "plt.plot(fpr_dt, tpr_dt, label=\"决策树: \"+str(round(auc_dt, 3)))\n", + "plt.plot(fpr_lr, tpr_lr, label=\"对数几率模型: \"+str(round(auc_lr, 3)))\n", + "plt.xlabel('False Positive Rate')\n", + "plt.ylabel('True Positive Rate')\n", + "plt.title('ROC')\n", + "plt.xlim([0,1])\n", + "plt.ylim([0,1.1])\n", + "plt.grid()\n", + "plt.legend(loc='lower right')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "## 由上述结果可以看到,决支持向量机的分类准确率最高,所以接下来我们使用决策树模型将结果填入submission" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "## 七、使用SVM对测试集进行训练,并写入submission文件" + ] + }, + { + "cell_type": "code", + "execution_count": 96, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "写入完成!\n" + ] + } + ], + "source": [ + "test_df=pd.read_csv(\"test.csv\")\n", + "test_df.drop(['PassengerId','Name','Cabin'], axis=1, inplace=True)\n", + "test_df.Fare=test_df.Fare.fillna(test_df.Fare.mean())\n", + "age_df = test_df[[\"Age\", \"Fare\", \"Parch\", \"SibSp\", \"Pclass\"]].copy() # .copy()用于复制原始数据 挑选数值型字段\n", + "# 分割有缺失值的数据集\n", + "age_df_notnull = age_df.loc[age_df.Age.notnull()]\n", + "age_df_isnull = age_df.loc[age_df.Age.isnull()]\n", + "# 利用非缺失数据建模\n", + "x = age_df_notnull.iloc[:, 1:]\n", + "y = age_df_notnull.values[:, 0]\n", + "x_test = age_df_isnull.values[:, 1:]\n", + "\n", + "rfr = RandomForestRegressor(n_estimators=1000, n_jobs=-1)\n", + "rfr.fit(x, y)\n", + "y_pred = rfr.predict(x_test)\n", + "\n", + "test_df.loc[test_df[\"Age\"].isnull(), \"Age\"] = y_pred\n", + "test_df.loc[test_df['Age'] <= 20.315, 'Age'] = 0\n", + "test_df.loc[(test_df['Age'] > 20.315) & (test_df['Age'] <= 40.21), 'Age'] = 1\n", + "test_df.loc[(test_df['Age'] > 40.21) & (test_df['Age'] <= 60.105), 'Age'] = 2\n", + "test_df.loc[test_df['Age'] > 60.105, 'Age'] = 3\n", + "test_df['Age'] = test_df['Age'].astype(int)\n", + "\n", + "test_df[\"Embarked\"] = test_df[\"Embarked\"].dropna(0)\n", + "test_df.loc[test_df['Fare'] <= 7.91, 'Fare'] = 0\n", + "test_df.loc[(test_df['Fare'] > 7.91) & (test_df['Fare'] <= 14.454), 'Fare'] = 1\n", + "test_df.loc[(test_df['Fare'] > 14.454) & (test_df['Fare'] <= 31.0), 'Fare'] = 2\n", + "test_df.loc[test_df['Fare'] > 31.0, 'Fare'] = 3\n", + "test_df['Fare'] = test_df['Fare'].astype(int)\n", + "\n", + "test_df['FamilySize'] = test_df['SibSp'] + test_df['Parch']\n", + "test_df['IsAlone'] = 0\n", + "test_df.loc[test_df['FamilySize'] == 1, 'IsAlone'] = 1\n", + "# 删除原有的列 Parch & SibSp\n", + "test_df.drop(['SibSp'], axis=1, inplace=True)\n", + "test_df.drop(['Parch'], axis=1, inplace=True)\n", + "test_df.drop(['FamilySize'], axis=1, inplace=True)\n", + "\n", + "# one-hot编码\n", + "sex_dummies_titanic = pd.get_dummies(test_df['Sex'])\n", + "sex_dummies_titanic.columns = ['男性', '女性']\n", + "test_df = test_df.join(sex_dummies_titanic)\n", + "\n", + "embark_dummies_titanic = pd.get_dummies(test_df['Embarked'])\n", + "embark_dummies_titanic.columns = ['港口S', '港口C','港口Q']\n", + "test_df = test_df.join(embark_dummies_titanic)\n", + "\n", + "class_dummies_titanic = pd.get_dummies(test_df['Pclass'])\n", + "class_dummies_titanic.columns = ['一等舱', '二等舱', '三等舱']\n", + "test_df = test_df.join(class_dummies_titanic)\n", + "\n", + "age_dummies_titanic = pd.get_dummies(test_df['Age'])\n", + "age_dummies_titanic.columns = ['孩子', '少年', '中年','老人']\n", + "test_df = test_df.join(age_dummies_titanic)\n", + "\n", + "fare_dummies_titanic = pd.get_dummies(test_df['Fare'])\n", + "fare_dummies_titanic.columns = ['便宜票价', '普通票价', '高级票价','豪华票价']\n", + "\n", + "drop_items=['Sex','Embarked','IsAlone','Pclass','Age','Fare','Ticket']\n", + "test_df.drop(drop_items, axis=1, inplace=True)\n", + "test_df = test_df.join(fare_dummies_titanic)\n", + "result=svc.predict(test_df)\n", + "submission= pd.read_csv(\"gender_submission.csv\")\n", + "submission['Survived']=result\n", + "submission.to_csv(\"gender_submission.csv\",index=None)\n", + "print(\"写入完成!\")" + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} \ No newline at end of file