数据挖掘导论——分类与预测(三)

简介: 数据挖掘导论——分类与预测

年龄与PClass以及存活率的关系:

f,ax=plt.subplots(1,3,figsize=(20,8))
sns.distplot(data[data['Pclass']==1].Fare,ax=ax[0])
ax[0].set_title('Fares in Pclass 1')
sns.distplot(data[data['Pclass']==2].Fare,ax=ax[1])
ax[1].set_title('Fares in Pclass 2')
sns.distplot(data[data['Pclass']==3].Fare,ax=ax[2])
ax[2].set_title('Fares in Pclass 3')
plt.show()

651a14ad166e49dba227603fff16b4e8.png

综上,我们可以发现如下规律:


性别:与男性相比,女性的生存机会很高。

Pclass:第一类乘客有明显的生存率更高的趋势。而pclass3存活率很低。对于女性来说,从pclass1生存的机会几乎是100%。。

年龄:小于5-10岁的儿童存活率高。年龄在15到35岁之间的乘客死亡很多。

港口:港口也有影响,有一些港口的死亡率也很大!

家庭:有1-2的兄弟姐妹、配偶或父母而不是独自一人或有一个大家庭旅行,有更大的概率存活。


四、数据清洗


接下来将依据特征之间的相关性关系进行数据清洗。首先做出相关性热图。


sns.heatmap(data.corr(),annot=True,cmap='RdYlGn',linewidths=0.2)
fig=plt.gcf()
fig.set_size_inches(10,8)
plt.show()

9a42fcf7dc6c4cafa4f8670218b49269.png

1、年龄


年龄是连续的特征,在机器学习模型中存在连续变量的问题。此时,我们需要对连续值进行离散化来分组。由于乘客的最大年龄是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)

d81d1e8449734a299f561304520c500a.png

分组结果大概如下:


data['Age_band'].value_counts().to_frame().style.background_gradient(cmap='summer')


cb7d27ab1c6f4044a12110ba1da90644.png

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

5826d2d753cd4fa28ba219ecd3d4a048.png


可以发现生存率随年龄的增加而减少。

2、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


并作图表示


sns.factorplot('Family_Size','Survived',data=data)
sns.factorplot('Alone','Survived',data=data)
plt.show()


eabcd03b937249fa88a97f41602d9ab1.png

9e72040eca8f430ab7ccde9574fc5779.png


family_size = 0:意味着passeneger是孤独的。显然,如果你是单独或family_size = 0,那么生存的机会很低。家庭规模4以上,机会也减少。这是模型的一个重要特性。让我们进一步研究这个问题。


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

d23492108afa4ebfb06c27794f3ec1e1.png


3、船票价格

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


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

6a0ad4637bf24b72907877f5cba28a10.png

不妨将其分段表示

data['Fare_cat']=0
data.loc[data['Fare']<=7.925,'Fare_cat']=0
data.loc[(data['Fare']>7.925)&(data['Fare']<=15),'Fare_cat']=1
data.loc[(data['Fare']>15)&(data['Fare']<=31.275),'Fare_cat']=2
data.loc[(data['Fare']>31.275)&(data['Fare']<=513),'Fare_cat']=3


将结果进行可视化


sns.factorplot('Fare_cat','Survived',data=data,hue='Sex')
plt.show()

71ff73401939456594cf5f21e7150d58.png

显然,随着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)

4、去掉不必要的特征:


名称:我们不需要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='RdYlGn',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()

完成数据清洗后,我们重新绘制相关性热图

33f90061af1f48bf92287cdbfecde43a.png


五、进行建模


根据要求,我们需要使用Logistic Regression以及Gradient Boosting Classifier分别对结果进行预测。

首先为了方便数据处理,将训练集和测试集合并,完成数据清洗后再进行重新拆分:


train,test=train_test_split(data,test_size=200,random_state=0,stratify=data['Survived'])
train_X=train[train.columns[1:]]
train_Y=train[train.columns[:1]]
test_X=test[test.columns[1:]]
test_Y=test[test.columns[:1]]
X=data[data.columns[1:]]
Y=data['Survived']

分别用Logistic Regression以及Gradient Boosting Classifier进行训练,并统计Accuracy,Recall和F1-Score

model1 = LogisticRegression()
model1.fit(train_X,train_Y)
prediction1=model1.predict(test_X)
model2=ensemble.GradientBoostingClassifier()
model2.fit(train_X,train_Y)
prediction2=model2.predict(test_X)
print('The accuracy of the Logistic Regression is',metrics.accuracy_score(prediction1,test_Y))
print('The recall of the Logistic Regression is',metrics.recall_score(prediction1,test_Y))
print('The F1-score of the Logistic Regression is',metrics.f1_score(prediction1,test_Y))
print('The accuracy of the Gradient Boosting Classifier is',metrics.accuracy_score(prediction2,test_Y))
print('The recall of the Gradient Boosting Classifier is',metrics.recall_score(prediction2,test_Y))
print('The F1-score of the Gradient Boosting Classifier is',metrics.f1_score(prediction2,test_Y))

最终结果:

69172b4c10d14014827f64789233243b.png



相关文章
|
6月前
|
机器学习/深度学习 人工智能 算法
04 机器学习 - 数据挖掘与机器学习导论
04 机器学习 - 数据挖掘与机器学习导论
99 0
|
5月前
|
机器学习/深度学习 算法 数据挖掘
【数据挖掘】SVM原理详解及对iris数据集分类实战(超详细 附源码)
【数据挖掘】SVM原理详解及对iris数据集分类实战(超详细 附源码)
121 1
|
5月前
|
机器学习/深度学习 存储 算法
【数据挖掘】KNN算法详解及对iris数据集分类实战(超详细 附源码)
【数据挖掘】KNN算法详解及对iris数据集分类实战(超详细 附源码)
95 0
【数据挖掘】KNN算法详解及对iris数据集分类实战(超详细 附源码)
|
机器学习/深度学习 数据采集 算法
数据挖掘导论——综合实验(下)
数据挖掘导论——综合实验
157 0
数据挖掘导论——综合实验(下)
|
机器学习/深度学习 数据可视化 数据挖掘
数据挖掘导论——综合实验(上)
数据挖掘导论——综合实验
108 0
数据挖掘导论——综合实验(上)
|
数据挖掘
数据挖掘导论——分类与预测(二)
数据挖掘导论——分类与预测
156 0
数据挖掘导论——分类与预测(二)
|
数据挖掘
数据挖掘导论——分类与预测(一)
数据挖掘导论——分类与预测
219 0
数据挖掘导论——分类与预测(一)
|
数据可视化 数据挖掘 Linux
数据挖掘导论——可视化分析实验
数据挖掘导论——可视化分析实验
117 0
数据挖掘导论——可视化分析实验

热门文章

最新文章