0x00 前言
对于数据的使用,我们不管是需要了解数据质量、数据口径亦或是数据血缘,最终都将会走向对数据价值的探索上。因此,本篇尝试讨论数据挖掘中的特征分析。
本篇将会以一个具体的例子为主线,讨论一下特征分析的基本流程。
主题和数据是 Kaggle 中的入门级竞赛题《Titanic: Machine Learning from Disaster》。题目背景是预测一个人是否能够从灾难中存活。
0x01 特征总览
先整体看一下我们有哪些数据,给出的数据集如下表,总共 10 个字段,其中 survival 表明该乘客最终是否存活。
字段名 | 含义 | 描述 |
---|---|---|
survival | Survival | 0 = No, 1 = Yes |
pclass | Ticket class | 1 = 1st, 2 = 2nd, 3 = 3rd |
sex | Sex | |
Age | Age in years | |
sibsp | # of siblings / spouses aboard the Titanic | |
parch | # of parents / children aboard the Titanic | |
ticket | Ticket number | |
fare | Passenger fare | |
cabin | Cabin number | |
embarked | Port of Embarkation | C = Cherbourg, Q = Queenstown, S = Southampton |
接着看一下数据大致长什么样子:
train_df = pd.read_csv('../input/train.csv')
train_df.head()
[图片上传失败...(image-21a4ea-1523880516802)]
使用pandas的内置函数可以很方便地看到数据的分布情况,比如说 Age 的平均值和最小值。
train_df.describe(include='all')
[图片上传失败...(image-39fc5a-1523880516802)]
0x02 特征描述
接下来要做的内容会包括:
- 特征是否有意义:比如userid这种属于用户的唯一标识,并不具备分析的价值。
- 找出特征的数据类型:比如说该特征是否是 categorical features?
- 缺失值情况:缺失值占了多少,是否80%以上都是缺失值?
上面说的是一些基本的分析内容,分析完成之后会有相应的处理方式,比如说特征选择、特征变换、缺失值处理等,这里我们不再描述具体的步骤。
0x03 特征影响
在做各种特征工程之前,我们值得对不同特征的影响力做一些分析。
根据直觉,我们假设这些特征会对最终一个人是否获救有比较大的影响:
- Pclass(仓位):头等舱的人更容易被优先照顾?
- Sex(性别):女士优先,因此更容易先上船?
- Age(年龄):老人和小孩优先?
有了这些假设之后,我们分别对这些特征进行分析:
我们通过下面语句,先看一下不同 Pclass 获救的情况。
train_df[['Pclass', 'Survived']].groupby(['Pclass'], as_index=False).mean().sort_values(by='Survived', ascending=False)
Id | Pclass | Survived |
---|---|---|
0 | 1 | 0.629630 |
1 | 2 | 0.472826 |
2 | 3 | 0.242363 |
我们通过下面语句,看一下不同 Sex 获救的情况。
train_df[["Sex", "Survived"]].groupby(['Sex'], as_index=False).mean().sort_values(by='Survived', ascending=False)
Id | Sex | Survived |
---|---|---|
0 | female | 0.742038 |
1 | male | 0.188908 |
分析 Age 的时候,需要对 Age 做一个简单的分段,我们直接使用 Pandas 的函数将 Age 分为 7 段。(这样分不太合理,不错仅当说明。)
train_df['AgeBand'] = pd.cut(train_df['Age'], 7)
train_df[['AgeBand', 'Survived']].groupby(['AgeBand'], as_index=False).mean().sort_values(by='AgeBand', ascending=True)
Id | AgeBand | Survived |
---|---|---|
0 | (0.34, 11.789] | 0.573529 |
1 | (11.789, 23.157] | 0.359551 |
2 | (23.157, 34.526] | 0.399142 |
3 | (34.526, 45.894] | 0.417910 |
4 | (45.894, 57.263] | 0.411765 |
5 | (57.263, 68.631] | 0.346154 |
6 | (68.631, 80.0] | 0.142857 |
这些特征有影响吗
通过上面的分析,我们能够看出来一些现象:
- 仓位不同的乘客存活率差别较大,直观上来看,仓位越好,存活的越多。
- 女性存活率有74%,而男性只有18左右
- 儿童存活率较高,老人存活率低
也就是说,我们假设的三个特征都是有一定影响力的。当我们了解了不同特征对结果的影响之后,是不是可以进行了?
当然不是,还有特征组合的影响,比如说年龄的影响,目前看到的是20-50岁之间的存活率都差不多,但是会不会是说男性的其实很低,大部分存活的都是女性,然后女性拉高了整体的存活率?
四、特征组合
这就是特征组合了,我们以年龄和性别为组合特征来看一下影响
train_df['AgeBand'] = pd.cut(train_df['Age'], 7)
train_df[['AgeBand','Sex', 'Survived']].groupby(['AgeBand','Sex'], as_index=False).mean().sort_values(by='AgeBand', ascending=True)
|Id|AgeBand|Sex|Survived |
| --- |---|---|
|0|(0.34, 11.789]|female|0.593750 |
|1|(0.34, 11.789]|male|0.555556 |
|2|(11.789, 23.157]|female|0.753623 |
|3|(11.789, 23.157]|male|0.110092 |
|4|(23.157, 34.526]|female|0.772152 |
|5|(23.157, 34.526]|male|0.207792 |
|6|(34.526, 45.894]|female|0.764706 |
|7|(34.526, 45.894]|male|0.204819 |
|8|(45.894, 57.263]|female|0.826087 |
|9|(45.894, 57.263]|male|0.200000 |
|10|(57.263, 68.631]|female|1.000000|
|11|(57.263, 68.631]|male|0.105263 |
|12|(68.631, 80.0]|female|NaN |
|13|(68.631, 80.0]|male|0.142857 |
从表中可以明显看出,同年龄段,女性的存活率明显高于男性,比如说(34.526, 45.894]这个年龄段,女性在76%左右,男性只有20%。
0xFF 总结
我们简单地将机器学习流程分为:数据获取、特征工程、模型训练、模型评估、模型上线这几部分。
其中特征工程是十分重要的的一环,而在做特征工程的时候又不能生搬硬套各种处理方式,应该先做特征的分析,只有对特征的分析和理解到位,才能挖掘更多的价值。
个人主页:http://www.mdjs.info
文章可以转载, 但必须以超链接形式标明文章原始出处和作者信息
欢迎关注我的微信公众号:木东居士
image个人主页:http://www.mdjs.info
也可以关注我:木东居士。
文章可以转载, 但必须以超链接形式标明文章原始出处和作者信息
网友评论