Titanic学习之Name中的title提取

'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我感觉还是挺可观的。

猜你喜欢

转载自blog.csdn.net/weixin_38267719/article/details/80917467
今日推荐