'Name'属性长这样,Braund, Mr. Owen Harris,中间这个称谓肯定是一个有用的属性,对其提取并新建属性Title的方法如下:
data_train['Title']=data_train['Name'].apply(lambda x: x.split(',')[1].split('.')[0].strip())
这样就在data_train中新建了一个特征Title
data_train中的Title有
Title_Capt 891 non-null uint8
Title_Col 891 non-null uint8
Title_Don 891 non-null uint8
Title_Dr 891 non-null uint8
Title_Girl 891 non-null uint8
Title_Jonkheer 891 non-null uint8
Title_Lady 891 non-null uint8
Title_Major 891 non-null uint8
Title_Master 891 non-null uint8
Title_Miss 891 non-null uint8
Title_Mlle 891 non-null uint8
Title_Mme 891 non-null uint8
Title_Mr 891 non-null uint8
Title_Mrs 891 non-null uint8
Title_Ms 891 non-null uint8
Title_Rev 891 non-null uint8
Title_Sir 891 non-null uint8
Title_mother 891 non-null uint8
Title_the Countess 891 non-null uint8
data_test中的Title则是
Title_Col 418 non-null uint8
Title_Dona 418 non-null uint8
Title_Dr 418 non-null uint8
Title_Girl 418 non-null uint8
Title_Master 418 non-null uint8
Title_Miss 418 non-null uint8
Title_Mr 418 non-null uint8
Title_Mrs 418 non-null uint8
Title_Ms 418 non-null uint8
Title_Rev 418 non-null uint8
Title_mother 418 non-null uint8
因此我们需要把train中没有用的Title用其他Title来代替
用Other来代替那些train中有而test中没有的Title,在图中可以发现Other的获救概率非常高,和Mrs获救概率一样,因此我直接用Mrs来代替Other,这样train中的Title类别数就和test中的一样了。
另外用在有年龄中Title=='Miss'且Age<=15和无年龄中Title=='Miss'且Parch!=0(表示有父母和孩子,如果有孩子就不是miss,如果有父母一起就说名miss年纪还比较小),因此这两种情况用Girl来标记,预计Girl的获救率会非常高。
我将Title=='Mrs'且Parch>2的用Mother来标记(父母最多两个,大于2的话那肯定就是mother吧),理论上mother会比普通的Mrs的生还概率高吧,但是事实并不是,mother_Survived_rate=0.363636,Mrs_Survived_rate=0.792000,居然生还率比Mrs低这么多,我感觉这肯定有问题。而且mother样本数量也就10个左右,参考价值并不大。
def girl_mother(aa):
if (aa.Age!=999)&(aa.Title=='Miss')&(aa.Age<=15):#有年纪的miss
return 'Girl'
elif (aa.Age==999)&(aa.Title=='Miss')&(aa.Parch!=0):#无年纪的miss
return 'Girl'
elif (aa.Title=='Mrs')&(aa.Parch>2):
return 'mother'
elif (aa.Title=='Jonkheer')|(aa.Title=='Major')|(aa.Title=='Mlle')|(aa.Title=='Mme')|(aa.Title=='Sir')|(aa.Title=='the Countess')|(aa.Title=='Lady')|(aa.Title=='Capt'):
return 'Mrs'
else:
return aa.Title
最后将Title属性数字化
dummies_Title = pd.get_dummies(data_test['Title'], prefix= 'Title')
在加了这个Title属性之后,交叉验证的结果明显提升,最终结果从0.76到了0.78。0.02我感觉还是挺可观的。