请稍等...正在玩命加载中......

机器学习


随机森林算法在泰坦尼克号数据中分类

1、获取数据并查看数据结构,导入相关的库,并利用 read.csv 从本地读取 csv 格式数据集

import pandas as pd
from sklearn.tree import Decis ionTreeClassifier
from sklearn.model_ selection import train_ test_ split
from sklearn.model_ selection import GridSearchcV
from sklearn.model_ selection import cross_ val_ score
import matplotlib.pyplot as plt
data = pd.read_ csv(r"D: 10-DongHul00-CourselML 00-wflTaitanic_ data/data.csv",index_ col = 0)
data.info()

查看数据数据集的具体信息:

image-20210606230421707

从图中可以看出整个数据集有 891 个样本,11 列,其中第 0 列是标签,第 1-10 列是特征,共计 10 个特征。

其中特征列 Age,Cabin,Embarked 的非空值不是 889 个,说明这三列存在缺失值;特征列 Name,Sex,Cabin,

Embarked 的数据类型为 object,不能直接作为特征数据带入模型进行处理,需要进行特征编码。

2、数据的预处理

1.通过理解业务特征之间的关系,先删除跟标签完全无关的列

#删除缺失值过多的列,和观察判断来说和预测的y没有关系的列
data.drop( ["Cabin", "Name","Ticket"], inplace= True ,axis=1)
data.info( )

image-20210606230555213

此时,数据集的特征列为 7 个,还有特征列 Age,Embarked 存在缺失值,特征列 Sex,Embarked 数据类型

需要进行转换。

2.由于 Age 特征很重要,缺少的 20%左右,可采用均值进行填补;特征 Embarked 只缺少 2 个缺失值,

缺失值个数较少,可直接删除。

data["Age"] = data["Age"].fillna(data[ "Age"].mean())
data = data.dropna() #删除有缺失值得所有行
data.info()

image-20210606231009742

此时,整个数据集样本数从 891 个减少为 889 个,不存在缺失值,可进行下一步数据转换。

  1. 将分类变量转换为数值型变量,astype 能够将一个 pandas 对象转换为某种类型,和 apply(int(x))不同,

astype 可以将文本类转换为数字,用这个方式可以很便捷地将二分类特征转换为 0~1。

#将二分类变量转换为数值型变量,用0,1,分别代替
data["Sex"] = (data["Sex"]== "male").astype("int")

#将三分类变量转换为数值型变量,用0,1,2,分别代替
labels = data["Embarked"].unique().tolist()
data["Embarked"] = data["Embarked"].apply(lambda x: labels.index(x))

#查看处理后的数据集
data.head(20)

image-20210606231321396

3、划分数据集

1.按列名提取标签和特征矩阵,分别将特征矩阵命名为 x,标签命名为 y

X=data.iloc[:,data.columns!="Survived"]

У=data.iloc[:,data.columns=="Survived"]

2.按 3:7 的比例将数据集划分为训练集和测试集,划分完成之后的训练集有 622 个样本

from sklearn.model_ selection import train_ test_ split

Xtrain, Xtest, Ytrain ,Ytest=train_ test_ split(X, y, test_ size=0.3)
xtrain

image-20210606231804920

3.从上图可看出划分好之后的数据索引并没有按顺序排列,因此对数据索引进行修正

#修正测试集和训练集的索引
for i in [Xtrain,Xtest,Ytrain,Ytest]:
	i.index=range(i.shape[0])
#查看分好的训练集和测试集
Xtrain

image-20210606232110235

修正好之后的数据索引则是按顺序从 0-621,共 622 个训练样本。

4、建立初始模型:分别建立决策树和随机森林的两个初始模型,将模型的准确率分别命名为

Score_c0, Score_r0

clf = DecisionTreeClassifier( random_ state=0)
rfc= RandomForestclassifier (random_ state=0)
clf= clf.fit(Xtrain,Ytrain)
rfc = rfc.fit(Xtrain, Ytrain)
score_c0 = clf.score(Xtest, Ytest)
score_r0 = rfc.score(Xtest,Ytest)
print("Single Tree:{}".format(score_ с0)

	,"Random Forest:{}".format(score_ r0)

#不显示警告
import warnings
warnings.filterwarnings("ignore" )

image-20210606232551474

初始状态下,随机森林算法的准确率比决策树高一点点。

5、分别对决策树算法,随机森林算法模型进行调参

1.调整决策树算法的 max_depth 参数,画出对应学习曲线

import matplotlib.pyplot as plt
score_c=[]
for i in range(10):
	clf = DecisionTreeClassifier(max_ depth=i+1
								,criterion="entropy"
								,random_state=25
								,splitter="random"

clf = clf.fit(Xtrain, Ytrain)
score = clf. score(Xtest, Ytest)
score_c.append(score)
print (max(score_ _c), score_ _C.index(max(score_ c))+1)
plt.plot(range(1,11),score_ c, color="red",label="max_ depth")
plt.legend()
plt.show()

image-20210606233017736

考虑模型的复杂度和模型效果,从图中可以看到,当 max_depth=3 时,模型的准确率最高。

2.调整随机森林算法的 n_estimators 参数,画出对应学习曲线

scorel =[]
for i in range(0,200,10):
	rfc = RandomForestClassifier(n_ estimators=i+1,
								random_ state=90)
    rfc = rfc. fit(Xtrain, Ytrain)
    score I= rfc.score(Xtest, Ytest)
	scorel.append(score)
print (max( scorel), (scorel.index(max(scorel))*10)+1)
plt.figure(figsize=[20,5])
plt.plot(range(1,201, 10), scorel)
plt.show()

image-20210606233418892

在确定好的范围内,进一步细化学习曲线

scorel =[]
for i in range(135,145):
	rfc = RandomForestClassifier(n_ estimators=i,
								n_ jobs=-1,
								random_ state=90)
   rfc = rfc.fit(Xtrain, Ytrain)
   score = rfc.score(Xtest, Ytest)
   scorel.append(score)
print (max(scorel),([*range(135, 145)] [scorel.index(max(scorel))]))
plt.figure(figsize=[20,5])
plt.plot(range(135, 145), scorel)
plt.show()

image-20210606233724379

通过学习曲线调参方法,随机森林 n_estimators=144 时,准确率最高

6.实验结果

通过以上模型调参结果,总结出模型的最佳参数如下,通过交叉验证得出模型最终的结果:

clf = DecisionTreeClassifier(max_ depth=3, random_state=90)
score = cross_ _val_ score(clf,X,y, cv=10).mean()
score

image-20210606234056281

rfc = RandomForestClassifier estimators=144, random_state=90)
score = cross_ _val_ _score(rfc,x,y, cv=10).mean()
score

image-20210606234303799

从实验结果可知,随机森林算法模型准确率更高,效果更好。

更多知识欢迎关注微信公众号“ 51 学代码 ”


文章作者: JinJunzheng
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 JinJunzheng !
评论
评论
  目录