{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"scrolled":true},"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 in \n\n# data analysis and wrangling\nimport pandas as pd\npd.set_option('display.max_columns', None)\nimport numpy as np\nimport random as rnd\n\n# visualization\nimport seaborn as sns\nimport matplotlib.pyplot as plt\n%matplotlib inline\n\n# machine learning\nfrom sklearn.linear_model import LogisticRegression\nfrom sklearn.svm import SVC, LinearSVC\nfrom sklearn.ensemble import RandomForestClassifier\nfrom sklearn.neighbors import KNeighborsClassifier\nfrom sklearn.naive_bayes import GaussianNB\nfrom sklearn.linear_model import Perceptron\nfrom sklearn.linear_model import SGDClassifier\nfrom sklearn.tree import DecisionTreeClassifier\n\n# Input data files are available in the \"../input/\" directory.\n# For example, running this (by clicking run or pressing Shift+Enter) will list the files in the input directory\n\nimport os\nprint(os.listdir(\"../input\"))\n\n# Any results you write to the current directory are saved as output.","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true},"cell_type":"code","source":"train = pd.read_csv('../input/train.csv')\ntest = pd.read_csv('../input/test.csv')\ncombine = [train,test]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"1ab1984c89eeac65444ac4b5b69eb040f7dc81a7"},"cell_type":"code","source":"train.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"101adb919da841ab21585d3892ae07973237fea9"},"cell_type":"code","source":"train.describe().drop(['count'],axis = 0).drop(['PassengerId'],axis = 1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"scrolled":true,"_uuid":"bb62494a8c1584bd78a1dbd8346199cf3e6198b2"},"cell_type":"code","source":"train.describe(include = ['O'])","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"5ed7b25a2d3c6e5b5445272dd57828730db1a4cf"},"cell_type":"markdown","source":"male:577/891   about 64.76%"},{"metadata":{"_uuid":"105d0dd2e1f4e3094ce15b000e78ed72d2947460"},"cell_type":"markdown","source":"**Analyze by pivoting features : **\n---\n\n* pcalss:所在的船舱层\n* sex:性别\n* sibsp:同船兄弟\\姐妹\\配偶\n* parch:同船父母\\子女\n"},{"metadata":{"_uuid":"26e86424c4b11e484fc4fd1c57f11ed3246bee5d"},"cell_type":"markdown","source":"pclass(1 = Upper, 2 = Middle, 3 = Lower)\n---\n\n位于顶层的乘客生还率最高,显然最高层最利于从甲板上逃生"},{"metadata":{"trusted":true,"scrolled":true,"_uuid":"b593a7d8526bd648c43959135e1b11b56acee44d"},"cell_type":"code","source":"train[['Pclass','Survived']].groupby(['Pclass'],as_index = False).mean().sort_values(by='Survived',ascending = False)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"7d079c1da1c21cbeba94ab2dda6ecbbf9d22460d"},"cell_type":"markdown","source":"sex\n---\n\n女性的生还率明显高于男性(这很绅士)\n\n男性生还率仅有18.89%"},{"metadata":{"trusted":true,"scrolled":true,"_uuid":"ae96e9d994787d48b6c97d7d3ebcb4026837037d"},"cell_type":"code","source":"train[['Sex','Survived']].groupby(['Sex'],as_index = False).mean().sort_values(by='Survived',ascending = False)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"c9f527b2c8828996a3453151e5450f7dac437397"},"cell_type":"markdown","source":"sibsp\n---\n那些只有一个兄弟/姐妹/配偶的生还率最高,可能两人能彼此鼓励活下去,人数过多则牵挂过多,耽误的逃生"},{"metadata":{"trusted":true,"_uuid":"484c1e19b9075f35f40bc6fdb24c8ef1034ef415"},"cell_type":"code","source":"train[['SibSp','Survived']].groupby(['SibSp'],as_index = False).mean().sort_values(by='Survived',ascending = False)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"f7b18e253be41f0972e072dbfb5c24674938955a"},"cell_type":"markdown","source":"\nparch\n---\nparch = 3(很可能是四口之家)的生还率最高"},{"metadata":{"trusted":true,"_uuid":"873d0fd81b97ea0fdf9f53467bf2ddf2124110d1"},"cell_type":"code","source":"train[[\"Parch\", \"Survived\"]].groupby(['Parch'], as_index=False).mean().sort_values(by='Survived', ascending=False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"2cc6fed4e82decf97bc6932e736ff01d117a3b03"},"cell_type":"markdown","source":"**Clear the dataset**\n---"},{"metadata":{"_uuid":"ea2235b4fab21f65608efd6e1956275a06743c24"},"cell_type":"markdown","source":"删除无用数据\n---"},{"metadata":{"trusted":true,"_uuid":"1061d20c13cfff5f088346b866917bda259155fb"},"cell_type":"code","source":"train = train.drop(['Cabin','Ticket'],axis = 1)\ntest = test.drop(['Cabin','Ticket'],axis = 1)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"b1ee636a24832a6f5bcf3b31033a63e3b65ea03a"},"cell_type":"markdown","source":"创建新的特征\n---\n* 根据乘客的**称谓**划分类别(Mrs,Miss,Mr,Dr,etc)"},{"metadata":{"trusted":true,"_uuid":"f883fecb1616e889889d514bf4c440a3cad2a011"},"cell_type":"code","source":"combine = [train,test]\nfor data in combine:\n    data['Title'] = data.Name.str.extract(' ([A-Za-z]+)\\.', expand=False) #使用正则提取称谓,即\\(Mr).\\格式","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"863fd0e968cb0166d018d28db9669c9a12402158"},"cell_type":"code","source":"pd.crosstab(train['Title'],train['Sex']) #交叉表查看称谓与性别","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"d81bc7ee77783ddf52543b22f8a397d95cc00c92"},"cell_type":"code","source":"for data in combine:\n    data['Title'] = data['Title'].replace(['Lady', 'Countess','Capt', 'Col',\n                                           'Don', 'Dr', 'Major', 'Rev', 'Sir', 'Jonkheer', 'Dona'], 'Rare')\n    data['Title'] = data['Title'].replace('Mlle', 'Miss')\n    data['Title'] = data['Title'].replace('Ms', 'Miss')\n    data['Title'] = data['Title'].replace('Mme', 'Mrs')\n    \ntrain[['Title', 'Survived']].groupby(['Title'], as_index=False).mean()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"b5d1634d54769aff4701831627b86d2b95ddeb7f"},"cell_type":"code","source":"title_map = {'Master':0,'Miss':1,'Mr':2,'Mrs':3,'Rare':4}\nfor data in combine:\n    data['Title'] = data['Title'].map(title_map)\n    data['Title'] = data['Title'].fillna(5) #缺失值标记为5","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"scrolled":true,"_uuid":"dc78da7786d3155d88f469b1a6804e2803f48833"},"cell_type":"code","source":"train['Title'].value_counts()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"6c59abe4a5f25a76366cfa863c631dddfd0e4853"},"cell_type":"code","source":"train = train.drop(['Name', 'PassengerId'], axis=1)\ntest = test.drop(['Name'], axis=1)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"5203fa569d34eea27592f13b1f51a633d1201f06"},"cell_type":"markdown","source":"性别\n---\n男性1, 女性2"},{"metadata":{"trusted":true,"_uuid":"80505e242f3a372fd7ca0c4d899115204328a530"},"cell_type":"code","source":"sex_map = {'male':1,'female':2}\ncombine = [train,test]\nfor data in combine:\n    data['Sex'] = data['Sex'].map(sex_map).astype(int)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"3cad5e063d5e4b18f0e9b76c8c78728c088415f5"},"cell_type":"code","source":" data['Sex'] = data['Sex'].astype(int)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"4e1fae1bdf9cab21fd4d1a89edfc551b367a1282"},"cell_type":"markdown","source":"将Age\\Fare分类\n---\n* 处理空值"},{"metadata":{"trusted":true,"scrolled":true,"_uuid":"9ae578c3e09c773054245f98c1b10dcd19a7fb4d"},"cell_type":"code","source":"train.isnull().sum()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"5575be12aa2abd39e221b0267d5f2a6dcc803bb5"},"cell_type":"code","source":"test.isnull().sum()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"8185059db283e16543563d5d79786c79fba0c7c8"},"cell_type":"code","source":"combine = [train,test]\nfor data in combine:\n    data['Fare'] = data['Fare'].fillna(32.20)\n    data['Embarked'] = data['Embarked'].fillna('S')","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"f2582c61e30de52fb3ca31cebe59dafa865d2cf6"},"cell_type":"markdown","source":"* 根据性别,pclass猜测年龄"},{"metadata":{"trusted":true,"_uuid":"3cc7894b3d8f6bad7b09cd2072c42d13092fee76"},"cell_type":"code","source":"guess_ages = np.zeros((2,3))\nfor dataset in combine:\n    for i in range(2):\n        for j in range(0, 3):\n            guess_df = dataset[(dataset['Sex'] == i+1) & \\\n                                  (dataset['Pclass'] == j+1)]['Age'].dropna()\n\n            # age_mean = guess_df.mean()\n            # age_std = guess_df.std()\n            # age_guess = rnd.uniform(age_mean - age_std, age_mean + age_std)\n\n            age_guess = guess_df.median()\n\n            # Convert random age float to nearest .5 age\n            guess_ages[i,j] = int( age_guess/0.5 + 0.5 ) * 0.5\n            \n    for i in range(2):\n        for j in range(0, 3):\n            dataset.loc[ (dataset.Age.isnull()) & (dataset.Sex == i+1) & (dataset.Pclass == j+1),\\\n                    'Age'] = guess_ages[i,j]\n\n    dataset['Age'] = dataset['Age'].astype(int)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"e2a38fdbcc9f55ce7bf8eb92edf1e70f2913ca01"},"cell_type":"markdown","source":"* 分类"},{"metadata":{"trusted":true,"_uuid":"dab2b47c1c8b9e7348c63901ad9c73dc8b8c96e8"},"cell_type":"code","source":"train['AgeBand'] = pd.cut(train['Age'],5)\ntrain[['AgeBand','Survived']].groupby(['AgeBand'], as_index=False).mean().sort_values(by='AgeBand', ascending=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"0244c25e49cf4c5d9edf1e30f072fc322fc96651"},"cell_type":"code","source":"def age_band(x):\n    if x<=16:\n        return 0\n    elif x>16 and x<= 32:\n        return 1\n    elif x>32 and x<=48:\n        return 2\n    elif x>48 and x<= 64:\n        return 3\n    else:return 4\n    \nfor data in combine:\n    data['Age'] = data['Age'].map(age_band)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"86c65eca61e23d242a7b2c52cace5e9bb729eb0e"},"cell_type":"code","source":"train['FareBand'] = pd.qcut(train['Fare'],4)\ntrain[['FareBand', 'Survived']].groupby(['FareBand'], as_index=False).mean().sort_values(by='FareBand', ascending=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"1d232cea61767ed4bdb496cb419d5b5d9beb8e2c"},"cell_type":"code","source":"for dataset in combine:\n    #Fare分级\n    dataset.loc[ dataset['Fare'] <= 7.91, 'Fare'] = 0\n    dataset.loc[(dataset['Fare'] > 7.91) & (dataset['Fare'] <= 14.454), 'Fare'] = 1\n    dataset.loc[(dataset['Fare'] > 14.454) & (dataset['Fare'] <= 31), 'Fare']   = 2\n    dataset.loc[ dataset['Fare'] > 31, 'Fare'] = 3\n    dataset['Fare'] = dataset['Fare'].astype(int)\n    \n    #Embarked\n    dataset['Embarked'] = dataset['Embarked'].map( {'S': 0, 'C': 1, 'Q': 2} ).astype(int)\n\n\n    \n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"ecd84d825ba50b8437f211b1451e766aee8ae638"},"cell_type":"code","source":"train = train.drop(['AgeBand','FareBand'],axis = 1)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"21d09eadf36a0ce1bfd8da619d1ae2645c0b8b86"},"cell_type":"markdown","source":"Predict\n---"},{"metadata":{"trusted":true,"_uuid":"b72285058c7a8ceb995f2058f18acf108d8cb070"},"cell_type":"code","source":"X_train = train.drop(\"Survived\", axis=1)\nY_train = train[\"Survived\"]\nX_test  = test.drop(\"PassengerId\", axis=1).copy()\nX_train.shape, Y_train.shape, X_test.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"2c0e98508c7b30feaeda056a58dee6c865d3d13b"},"cell_type":"code","source":"logreg = LogisticRegression()\nlogreg.fit(X_train, Y_train)\nY_pred = logreg.predict(X_test)\nacc_log = round(logreg.score(X_train, Y_train) * 100, 3)\nacc_log","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"213788bd36c4bba4a73ba7f6036c13c9ad58863e"},"cell_type":"code","source":"random_forest = RandomForestClassifier(n_estimators=90)\nrandom_forest.fit(X_train, Y_train)\nY_pred = random_forest.predict(X_test)\nacc_random_forest = round(random_forest.score(X_train, Y_train) * 100, 2)\nacc_random_forest","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"a27fe004c5344aa63ce6c863fc6ddf40c0145b6e"},"cell_type":"code","source":"submission = pd.DataFrame({\n        \"PassengerId\": test[\"PassengerId\"],\n        \"Survived\": Y_pred\n    })\nsubmission.to_csv('submission.csv', index=False)","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.6","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}