年龄与PClass以及存活率的关系:
f,ax=plt.subplots(1,3,figsize=(20,8)) sns.distplot(data[data['Pclass']==1].Fare,ax=ax[0]) ax[0].set_title('Fares in Pclass 1') sns.distplot(data[data['Pclass']==2].Fare,ax=ax[1]) ax[1].set_title('Fares in Pclass 2') sns.distplot(data[data['Pclass']==3].Fare,ax=ax[2]) ax[2].set_title('Fares in Pclass 3') plt.show()
综上,我们可以发现如下规律:
性别:与男性相比,女性的生存机会很高。
Pclass:第一类乘客有明显的生存率更高的趋势。而pclass3存活率很低。对于女性来说,从pclass1生存的机会几乎是100%。。
年龄:小于5-10岁的儿童存活率高。年龄在15到35岁之间的乘客死亡很多。
港口:港口也有影响,有一些港口的死亡率也很大!
家庭:有1-2的兄弟姐妹、配偶或父母而不是独自一人或有一个大家庭旅行,有更大的概率存活。
四、数据清洗
接下来将依据特征之间的相关性关系进行数据清洗。首先做出相关性热图。
sns.heatmap(data.corr(),annot=True,cmap='RdYlGn',linewidths=0.2) fig=plt.gcf() fig.set_size_inches(10,8) plt.show()
1、年龄
年龄是连续的特征,在机器学习模型中存在连续变量的问题。此时,我们需要对连续值进行离散化来分组。由于乘客的最大年龄是80岁。所以我们不妨将范围从0-80成5组。步长为80/5=16。
data['Age_band']=0 data.loc[data['Age']<=16,'Age_band']=0 data.loc[(data['Age']>16)&(data['Age']<=32),'Age_band']=1 data.loc[(data['Age']>32)&(data['Age']<=48),'Age_band']=2 data.loc[(data['Age']>48)&(data['Age']<=64),'Age_band']=3 data.loc[data['Age']>64,'Age_band']=4 data.head(2)
分组结果大概如下:
data['Age_band'].value_counts().to_frame().style.background_gradient(cmap='summer')
sns.factorplot('Age_band','Survived',data=data,col='Pclass') plt.show()
可以发现生存率随年龄的增加而减少。
2、Family_size:家庭总人数
对于一个家庭而言,只看兄弟姐妹老人孩子的方式不太直接,可以直接看整个人数。
data['Family_Size']=0 data['Family_Size']=data['Parch']+data['SibSp']#family size data['Alone']=0 data.loc[data.Family_Size==0,'Alone']=1#Alone
并作图表示
sns.factorplot('Family_Size','Survived',data=data) sns.factorplot('Alone','Survived',data=data) plt.show()
family_size = 0:意味着passeneger是孤独的。显然,如果你是单独或family_size = 0,那么生存的机会很低。家庭规模4以上,机会也减少。这是模型的一个重要特性。让我们进一步研究这个问题。
sns.factorplot('Alone','Survived',data=data,hue='Sex',col='Pclass') plt.show()
3、船票价格
因为票价也是连续的特性,所以我们需要将它转换为数值。
data['Fare_Range']=pd.qcut(data['Fare'],4) data.groupby(['Fare_Range'])['Survived'].mean().to_frame().style.background_gradient(cmap='summer_r')
不妨将其分段表示
data['Fare_cat']=0 data.loc[data['Fare']<=7.925,'Fare_cat']=0 data.loc[(data['Fare']>7.925)&(data['Fare']<=15),'Fare_cat']=1 data.loc[(data['Fare']>15)&(data['Fare']<=31.275),'Fare_cat']=2 data.loc[(data['Fare']>31.275)&(data['Fare']<=513),'Fare_cat']=3
将结果进行可视化
sns.factorplot('Fare_cat','Survived',data=data,hue='Sex') plt.show()
显然,随着fare_cat增加,存活的大致几率增加。性别的变化也会引起存活率的变化,这一特性可能成为建模过程中的一个重要特征。此外,我们也需要将字符串值转换为数字 因为我们不能把字符串一个机器学习模型
data['Sex'].replace(['male','female'],[0,1],inplace=True) data['Embarked'].replace(['S','C','Q'],[0,1,2],inplace=True) data['Initial'].replace(['Mr','Mrs','Miss','Master','Other'],[0,1,2,3,4],inplace=True)
4、去掉不必要的特征:
名称:我们不需要name特性,因为它不能转换成任何分类值
年龄:我们有age_band特征,所以不需要这个
票号: 这是任意的字符串,不能被归类
票价: 我们有fare_cat特征,所以不需要
船仓号: 这个也不要没啥含义
passengerid :不能被归类
data.drop(['Name','Age','Ticket','Fare','Cabin','Fare_Range','PassengerId'],axis=1,inplace=True) sns.heatmap(data.corr(),annot=True,cmap='RdYlGn',linewidths=0.2,annot_kws={'size':20}) fig=plt.gcf() fig.set_size_inches(18,15) plt.xticks(fontsize=14) plt.yticks(fontsize=14) plt.show()
完成数据清洗后,我们重新绘制相关性热图
五、进行建模
根据要求,我们需要使用Logistic Regression以及Gradient Boosting Classifier分别对结果进行预测。
首先为了方便数据处理,将训练集和测试集合并,完成数据清洗后再进行重新拆分:
train,test=train_test_split(data,test_size=200,random_state=0,stratify=data['Survived']) train_X=train[train.columns[1:]] train_Y=train[train.columns[:1]] test_X=test[test.columns[1:]] test_Y=test[test.columns[:1]] X=data[data.columns[1:]] Y=data['Survived']
分别用Logistic Regression以及Gradient Boosting Classifier进行训练,并统计Accuracy,Recall和F1-Score
model1 = LogisticRegression() model1.fit(train_X,train_Y) prediction1=model1.predict(test_X) model2=ensemble.GradientBoostingClassifier() model2.fit(train_X,train_Y) prediction2=model2.predict(test_X) print('The accuracy of the Logistic Regression is',metrics.accuracy_score(prediction1,test_Y)) print('The recall of the Logistic Regression is',metrics.recall_score(prediction1,test_Y)) print('The F1-score of the Logistic Regression is',metrics.f1_score(prediction1,test_Y)) print('The accuracy of the Gradient Boosting Classifier is',metrics.accuracy_score(prediction2,test_Y)) print('The recall of the Gradient Boosting Classifier is',metrics.recall_score(prediction2,test_Y)) print('The F1-score of the Gradient Boosting Classifier is',metrics.f1_score(prediction2,test_Y))
最终结果: