欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【机器学习】泰坦尼克号 -3 -数据清洗

程序员文章站 2022-05-02 15:09:25
...

特征工程和数据清洗

当我们得到一个具有特征的数据集时,是不是所有的特性都很重要?可能有许多冗余的特征应该被消除,我们还可以通过观察或从其他特征中提取信息来获得或添加新特性。

年龄特征:

正如我前面提到的,年龄是连续的特征,在机器学习模型中存在连续变量的问题。

如果我说通过性别来组织或安排体育运动,我们可以很容易地把他们分成男女分开。

如果我说按他们的年龄分组,你会怎么做?如果有30个人,可能有30个年龄值。

我们需要对连续值进行离散化来分组。

好的,乘客的最大年龄是80岁。所以我们将范围从0-80成5箱。所以80/5=16。

data['Age_band']=0
data.loc[data['Age']<=16,'Age_band']=0
data.loc[(data['Age']>16)&(data['Age']<=32),'Age_band']=1
data.loc[(data['Age']>32)&(data['Age']<=48),'Age_band']=2
data.loc[(data['Age']>48)&(data['Age']<=64),'Age_band']=3
data.loc[data['Age']>64,'Age_band']=4
data.head(2)

【机器学习】泰坦尼克号 -3 -数据清洗

data['Age_band'].value_counts().to_frame().style.background_gradient(cmap='summer')#checking the number of passenegers in each band

【机器学习】泰坦尼克号 -3 -数据清洗

sns.factorplot('Age_band','Survived',data=data,col='Pclass')
plt.show()

【机器学习】泰坦尼克号 -3 -数据清洗
生存率随年龄的增加而减少,不论Pclass。

Family_size:家庭总人数

光看兄弟姐妹和老人孩子看不太直接,咱们直接看全家的人数

data['Family_Size']=0
data['Family_Size']=data['Parch']+data['SibSp']#family size
data['Alone']=0
data.loc[data.Family_Size==0,'Alone']=1#Alone

f,ax=plt.subplots(1,2,figsize=(18,6))
sns.factorplot('Family_Size','Survived',data=data,ax=ax[0])
ax[0].set_title('Family_Size vs Survived')
sns.factorplot('Alone','Survived',data=data,ax=ax[1])
ax[1].set_title('Alone vs Survived')
plt.close(2)
plt.close(3)
plt.show()

【机器学习】泰坦尼克号 -3 -数据清洗
family_size = 0意味着passeneger是孤独的。显然,如果你是单独或family_size = 0,那么生存的机会很低。家庭规模4以上,机会也减少。这看起来也是模型的一个重要特性。让我们进一步研究这个问题。

sns.factorplot('Alone','Survived',data=data,hue='Sex',col='Pclass')
plt.show()

【机器学习】泰坦尼克号 -3 -数据清洗

船票价格

因为票价也是连续的特性,所以我们需要将它转换为数值。

pandas.qcut

data['Fare_Range']=pd.qcut(data['Fare'],4)
data.groupby(['Fare_Range'])['Survived'].mean().to_frame().style.background_gradient(cmap='summer_r')

【机器学习】泰坦尼克号 -3 -数据清洗

如上所述,我们可以清楚地看到,船票价格增加生存的机会增加。

data['Fare_cat']=0
data.loc[data['Fare']<=7.91,'Fare_cat']=0
data.loc[(data['Fare']>7.91)&(data['Fare']<=14.454),'Fare_cat']=1
data.loc[(data['Fare']>14.454)&(data['Fare']<=31),'Fare_cat']=2
data.loc[(data['Fare']>31)&(data['Fare']<=513),'Fare_cat']=3
sns.factorplot('Fare_cat','Survived',data=data,hue='Sex')
plt.show()

【机器学习】泰坦尼克号 -3 -数据清洗
显然,随着fare_cat增加,存活的几率增加。随着性别的变化,这一特性可能成为建模过程中的一个重要特征。

将字符串值转换为数字
因为我们不能把字符串一个机器学习模型

data['Sex'].replace(['male','female'],[0,1],inplace=True)
data['Embarked'].replace(['S','C','Q'],[0,1,2],inplace=True)
data['Initial'].replace(['Mr','Mrs','Miss','Master','Other'],[0,1,2,3,4],inplace=True)

去掉不必要的特征

名称>我们不需要name特性,因为它不能转换成任何分类值

年龄——>我们有age_band特征,所以不需要这个

票号–>这是任意的字符串,不能被归类

票价——>我们有fare_cat特征,所以不需要

船仓号——>这个也不要没啥含义

passengerid -->不能被归类

data.drop(['Name','Age','Ticket','Fare','Cabin','Fare_Range','PassengerId'],axis=1,inplace=True)
sns.heatmap(data.corr(),annot=True,cmap='spring_r',linewidths=0.2,annot_kws={'size':20})
fig=plt.gcf()
fig.set_size_inches(18,15)
plt.xticks(fontsize=14)
plt.yticks(fontsize=14)
plt.show()

【机器学习】泰坦尼克号 -3 -数据清洗

现在以上的相关图,我们可以看到一些正相关的特征。他们中的一些人sibsp和family_size和干燥family_size和一些负面的孤独和family_size。