0 问题概述
根据给出的乘客特征(年龄、舱室等级、登陆港口等),预测乘客是否幸存,属于典型的分类问题。
数据文件:
train.csv 训练集,包含1-891个记录
test.csv 测试集,包含892-1309的记录,不包含是否生存的label
gender_submission.csv 提交样例,测试集对应的是否生存label
1 训练集、测试集数据对比分析
1.1 特征缺失值情况对比
image.png
存在两个特殊情况,数据缺失补全时应特别注意;
Cabin特征存在大比例的缺失,可以将其忽略;
所有特征在训练集、测试集中的缺失情况基本一致,无需据此删除任何特征。
1.2 特征数据分布情况对比
image.png
通过绘图对所有10个特征在训练集、测试集中的分布情况进行对比,未发现任何明显差异,无需据此删除任何特征。
1 特征工程
1.1 离散特征处理
1)name
乘客姓名作为一个整体时这些信息价值不大,此时它的作用和PassengerId相当。
但是,name中包含的Mrs, Miss, Mr and Master.信息很有价值,可以将name切分为first_name, last_name, mid_name三部分。这里只保留mid_name,其余两个暂时不用。
def name_split(data):
first_name, last_name, mid_name = [], [], []
for name in data['Name']:
name = re.split(r'[,.]\s*', name)
first_name.append(name[0])
mid_name.append(name[1])
last_name.append(name[2])
#data['first_name'] = first_name
data['mid_name'] = mid_name
#data['last_name'] = last_name
print(data['mid_name'].value_counts()) # 输出mid_name中的非重复元素
return data
>>
Mr 517
Miss 182
Mrs 125
Master 40
Dr 7
Rev 6
Mlle 2
Major 2
Col 2
Lady 1
Capt 1
Ms 1
Mme 1
Sir 1
Jonkheer 1
the Countess 1
Don 1
可以看出,mid_name中共含有十多个非重复元素。查找资料发现,称谓的说明包含了这些称谓的解释。
Dr.= doctor 医生/博士
Rev.= reverend,用于基督教的牧师,如the Rev. Mr.Smith
Dona,是西班牙语对女子的称谓,相当于英语的 Lady
Don,n. (置于男士名字前的尊称)先生,堂
Master,小男孩,相当于汉语的"少爷"。
jonkheer是贵族
Col,Colonel,上校
capt船长; captain (陆军)上尉; (海军) 上校
major, 陆军少校意思有少校人意思
The Countless,女伯爵
Mlle,小姐
Mme是Madame的简写,(用于已婚妇女姓名前的尊称)太太
方法1:利用专业知识对离散的字符特征进行分组
根据常识,称谓中一般包含以下三方面的信息:
【年龄】:Mrs, Miss, Mr and Master等。称谓中的年龄信息基本和age特征同步。
【性别】:基本和sex特征同步;
【社会等级】:尊贵的人/平民。👉尊贵的人:jonkheer、The Countless
【职业】:可分为船员、牧师、军人、医生等。
检查测试集中的称谓是否和训练集中一致:一致√
print(data['mid_name'].value_counts())
>>
Mr 757
Miss 260
Mrs 197
Master 61
Rev 8
Dr 8
Col 4
Ms 2
Major 2
Mlle 2
Mme 1
Don 1
Dona 1
Lady 1
the Countess 1
Sir 1
Jonkheer 1
Capt 1
featureGroupbyList(data, 'mid_name', [['Mme', 'Ms', 'Mrs'],
['Mlle', 'Miss'],
['Mr'],
['Master'],
['other'],
['Capt', 'Col', 'Dr', 'Major', 'Rev']],
"mid_nameGroup", ['Mrs', 'Miss', 'Mr', 'Master', 'Royalty', 'officer'])
因此,参考Titanic Kaggle Challenge,对'mid_name'进行分组:
1)以基数较多的Mr、Miss、Mrs和Master 为四个独立类别;
2)从剩余基数较少的mid_name中归纳出Royalty、officer两个新类。
归类结果的基数分布、label分布
方法2:利用特征数据-label标签之间的相关程度进行分组
这种方法忽略midname各取值的现实意义,完全根据label列的表现进行分组。
--1)考虑子图1中特征基数影响,将特征分为['Mr']、['Miss', 'Mrs', 'Master']、其他 三类。
用字符标识,onehot处理,训练集正常0.83,测试集降低为0.53588;
用数值标识,试验发现,离散特征标识的数值大小,对SVM模型的预测结果有显著影响!!!
当数值依次为-1、1、0时,训练集0.83,测试集0.636。
--2)忽略子图1中特征基数的影响,按照子图3中存活率比例,将所有特征划分为三类:
featureGroupbyList(data, 'mid_name', [['Lady', 'Mlle', 'Mme', 'Ms', 'Sir', 'the Countless'],
['other'],
['Capt', 'Don', 'Jonkheer', 'Major', 'Mr', 'Rev']],
"mid_nameGroup", ['high', 'medium', 'low'])
对Group后的新特征进行可视化,结果与预期基本一致
结果表明:
第二种方法不如第一种方法,应该依靠特征的实际意义进行处理。
另计:👉标识的数值依次为2、1000、0时,训练集0.83,测试集0.79904,竟然刷新了个人最高分,说明这个特征是有益的,且数值标识value有显著影响。
2)Pclass座舱等级
该特征虽然是用123数字表示,它本质是离散特征,应该进行onehot处理。</