资讯专栏INFORMATION COLUMN

titanic 特征工程

wind5o / 3448人阅读

摘要:新增特征,先把空缺值填充为,再提取中的首字母构成乘客的甲板号。新增特征,统计每个乘客的共票号数。为了使处于这两种反常组中的样本能够被正确分类,对测试集中处于反常组中的样本的,,进行惩罚修改。选取特征,转换为数值变量,划分训练集和测试集

1.新增Title

从姓名中提取乘客的称呼,归纳为六类。
["Capt", "Col", "Major", "Dr", "Rev"]映射为Officer,这些都是工作人员;
["Don", "Sir", "the Countess", "Dona", "Lady"]映射为Royaltythe Countess是伯爵夫人,这几类称呼都是尊称,表明了这些乘客的社会地位很高还有贵族;
["Mme", "Ms", "Mrs"]映射为Miss,这些称呼只能看出性别是女性;
["Mr"]映射为Mr
["Master","Jonkheer"]映射为Master

Title_Dict.update(dict.fromkeys(["Capt", "Col", "Major", "Dr", "Rev"], "Officer"))
Title_Dict.update(dict.fromkeys(["Don", "Sir", "the Countess", "Dona", "Lady"], "Royalty"))
Title_Dict.update(dict.fromkeys(["Mme", "Ms", "Mrs"], "Mrs"))
Title_Dict.update(dict.fromkeys(["Mlle", "Miss"], "Miss"))
Title_Dict.update(dict.fromkeys(["Mr"], "Mr"))
Title_Dict.update(dict.fromkeys(["Master","Jonkheer"], "Master"))


2.将Parch和SibSp合并为FamilySize,这个特征描述了家庭成员的数量。接着按生存概率给FamiliSize分组。[2,4]的分为一组,(4,7]分为一组,大于7的分为一组,是FamilyLable特征。

>
>

3.新增Deck特征,先把Cabin空缺值填充为"Unknown",再提取Cabin中的首字母构成乘客的甲板号。


4.新增TicketGroup特征,统计每个乘客的共票号数。按生存率把TicketGroup分为三类:[2,4]一类,(4,8] && 1一类,(8,)一类。

5.数据清洗
1)Age缺失量为263,缺失量较大,用Sex, Title, Pclass三个特征构建随机森林模型,填充年龄缺失值。

from sklearn.ensemble import RandomForestRegressor
age_df = all_data[["Age", "Pclass","Sex","Title"]]
age_df=pd.get_dummies(age_df)
known_age = age_df[age_df.Age.notnull()].as_matrix()
unknown_age = age_df[age_df.Age.isnull()].as_matrix()
y = known_age[:, 0]
X = known_age[:, 1:]
rfr = RandomForestRegressor(random_state=0, n_estimators=100, n_jobs=-1)
rfr.fit(X, y)
predictedAges = rfr.predict(unknown_age[:, 1::])
all_data.loc[ (all_data.Age.isnull()), "Age" ] = predictedAges 

2)Embarked缺失量为2,缺失Embarked信息的乘客的Pclass均为1,且Fare均为80。因为Embarked为C且Pclass为1的乘客的Fare中位数为80,所以缺失值填充为C。

all_data["Embarked"] = all_data["Embarked"].fillna("C")
all_data.groupby(by=["Pclass","Embarked"]).Fare.median()

3) Fare缺失量为1,缺失Fare信息的乘客的Embarked为S,Pclass为3,所以用Embarked为S,Pclass为3的乘客的Fare中位数填充。

all_data.groupby(by=["Pclass","Embarked"]).Fare.median()
fare=all_data[(all_data["Embarked"] == "S") & (all_data["Pclass"] == 3)].Fare.median()
all_data["Fare"]=all_data["Fare"].fillna(fare)

4) 把姓氏相同的乘客划分为同一组,从人数大于一的组中分别提取出每组的妇女儿童和成年男性,发现绝大部分女性和儿童组的平均存活率都为1或0,即同组的女性和儿童要么全部幸存,要么全部遇难。

all_data["Surname"]=all_data["Name"].apply(lambda x:x.split(",")[0].strip())
Surname_Count = dict(all_data["Surname"].value_counts())
all_data["FamilyGroup"] = all_data["Surname"].apply(lambda x:Surname_Count[x])
Female_Child_Group=all_data.loc[(all_data["FamilyGroup"]>=2) & ((all_data["Age"]<=12) | (all_data["Sex"]=="female"))]
Male_Adult_Group=all_data.loc[(all_data["FamilyGroup"]>=2) & (all_data["Age"]>12) & (all_data["Sex"]=="male")]

因为普遍规律是女性和儿童幸存率高,成年男性幸存较低,所以我们把不符合普遍规律的反常组选出来多带带处理。把女性和儿童组中幸存率为0的组设置为遇难组,把成年男性组中存活率为1的设置为幸存组,推测处于遇难组的女性和儿童幸存的可能性较低,处于幸存组的成年男性幸存的可能性较高。

Female_Child=pd.DataFrame(Female_Child_Group.groupby("Surname")["Survived"].mean().value_counts())
Female_Child.columns=["GroupCount"]
Female_Child
sns.barplot(x=Female_Child.index, y=Female_Child["GroupCount"]).set_xlabel("AverageSurvived")

为了使处于这两种反常组中的样本能够被正确分类,对测试集中处于反常组中的样本的Age,Title,Sex进行惩罚修改。

Female_Child_Group=Female_Child_Group.groupby("Surname")["Survived"].mean()
Dead_List=set(Female_Child_Group[Female_Child_Group.apply(lambda x:x==0)].index)
print(Dead_List)
Male_Adult_List=Male_Adult_Group.groupby("Surname")["Survived"].mean()
Survived_List=set(Male_Adult_List[Male_Adult_List.apply(lambda x:x==1)].index)
print(Survived_List)

train=all_data.loc[all_data["Survived"].notnull()]
test=all_data.loc[all_data["Survived"].isnull()]
test.loc[(test["Surname"].apply(lambda x:x in Dead_List)),"Sex"] = "male"
test.loc[(test["Surname"].apply(lambda x:x in Dead_List)),"Age"] = 60
test.loc[(test["Surname"].apply(lambda x:x in Dead_List)),"Title"] = "Mr"
test.loc[(test["Surname"].apply(lambda x:x in Survived_List)),"Sex"] = "female"
test.loc[(test["Surname"].apply(lambda x:x in Survived_List)),"Age"] = 5
test.loc[(test["Surname"].apply(lambda x:x in Survived_List)),"Title"] = "Miss"

5) 选取特征,转换为数值变量,划分训练集和测试集

all_data=pd.concat([train, test])
all_data=all_data[["Survived","Pclass","Sex","Age","Fare","Embarked","Title","FamilyLabel","Deck","TicketGroup"]]
all_data=pd.get_dummies(all_data)
train=all_data[all_data["Survived"].notnull()]
test=all_data[all_data["Survived"].isnull()].drop("Survived",axis=1)
X = train.as_matrix()[:,1:]
y = train.as_matrix()[:,0]

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/43527.html

相关文章

  • 如何在 Titanic Kaggle Challenge 中获得0.8134分

    摘要:船上每位旅客的身份证明乘客等级。简单地用平均年龄或中位年龄替换它们可能不是最佳解决方案,因为年龄可能因乘客的类别和类别而不同。例如如果乘客是女性,则来自和来自王室,中位年龄为岁。失踪的年龄已被取代。此函数将值替换为表示。 由 Kaggle 主持的泰坦尼克号生存挑战赛是一项竞赛,其目标是基于一组描述乘客的变量,例如他的年龄,性别或乘客在船上的等级,来预测特定乘客是生存或死亡。 我一直在玩...

    mist14 评论0 收藏0
  • 如何为你的深度学习任务挑选最合适的 GPU?

    摘要:年月日,机器之心曾经推出文章为你的深度学习任务挑选最合适从性能到价格的全方位指南。如果你想要学习深度学习,这也具有心理上的重要性。如果你想快速学习深度学习,多个廉价的也很好。目前还没有适合显卡的深度学习库所以,只能选择英伟达了。 文章作者 Tim Dettmers 系瑞士卢加诺大学信息学硕士,热衷于开发自己的 GPU 集群和算法来加速深度学习。这篇博文最早版本发布于 2014 年 8 月,之...

    taohonghui 评论0 收藏0
  • titanic数据分析

    摘要:数据可视化仅按照性别划分,显然女性的生还数量明显高于男性是船舱等级,等级越高生还概率越大代表兄弟姐妹配偶的数量,只有一个兄弟姐妹配偶的乘客生还人数最多代表直系亲属即父母和子女的数量代表登船港口,港口的生存概率最高 1.总体预览 showImg(https://segmentfault.com/img/bVbqODH); RangeIndex: 891 entries, 0 to 89...

    Jinkey 评论0 收藏0
  • 深度学习中如何选择一款合适的GPU卡的一些经验和建议分享

    摘要:文章翻译自深度学习是一个计算需求强烈的领域,的选择将从根本上决定你的深度学习研究过程体验。因此,今天就谈谈如何选择一款合适的来进行深度学习的研究。此外,即使深度学习刚刚起步,仍然在持续深入的发展。例如,一个普通的在上的售价约为美元。 文章翻译自:Which GPU(s) to Get for Deep Learning(http://t.cn/R6sZh27)深度学习是一个计算需求强烈的领域...

    孙吉亮 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<