写在前面的话

本篇是决策树算法的项目实战

假如你还不知道决策树算法,你能够挑选和韩梅梅同学一同边相亲边学习决策树(手动狗头):

  • 鬼话系列 | 决策树(上)—相亲?怎样说?
  • 鬼话系列 | 决策树(中)—相亲?怎样说?

由于前面现已有了本次项意图数据剖析部分,其实主要是数据清洗O m e % A [ e a和可视化探究。

所以咱们就直接接着往下了,数据Y f ] v p ! J 3 7剖析部分错过的同学花几分钟补一下课

《吊打剖析师》实战—经典重现,你会怎样挑选?

列一下咱们的整个流程,咱们心里也有个预备

  • 数据清洗
  • 可视化探究
  • 特征工程
  • 模型练习
  • 模型调参

3,2,1 开端

可能咱们有点忘掉咱们现在y ] a y L的数据,先来看一下:

《大话机器学习算法》决策树—实战项目
文章首发:大众号『知秋小一』

总共有19个列,在原有的根底上现已新增了7列数据

再来看详细的数据字段:

《大话机器学习算法》决策树—实战项目
文章首发:大众号『知秋小一』

前891条数据是练习集数据,剩下的为测验集数据

一共19个字段,其间很多字段是咱们s # g s [ m处理往后的

预备好了吗,开端特征工程了

特征工程

小一哥,特征工程听起来很巨大上,详细是干什么的呢?

特征工7 T T M Z Y Q v程的方针是将数据处理成模型所需求的,然后直接在模型练习的时分丢进去

另外特征工程也需求对数据进行相应的转化,z c k r ^ 8以调高模型的泛化才干

哦豁,听着如同还挺费事?

比前面的清洗工作简略很多,毕竟咱们现已掌握了数据的根本特征

对对对,最费事的现已过去了,那特征工程详细都包含哪些操作m C + V J Q D呢?

一般的特征处理包含:无量纲化、特征独热编码,以及接连数据变离散等操作。

不能眼高手低,一同来实战一下

无量纲化

无量纲化使不同标准的数据转化到同一标准,常见的无量* 7 } j r X e /纲化方法有标准化和区间缩放法。

标准化的前提是特征值遵守正态散布,标准化后,其转化成标准正态散布。

区间缩放法使用了边界值信息,将特征的取值区间缩放到某个特点的范围,例如[0, 1]等。

在现在的数据会集,接连数据有乘客票价和年纪,票价散布很不均匀咱们现已知道,需求进行标准化

"""进行特征标准化"""
scaler=preproceq H : - bssing.StO 8 x * ! WandardScaler()
#对超高票价进行从头赋值
df_data.loc[df_data['Fare']>300,'Fare']=300
#对票价进行标准化
fare_slp * 6 _ pale_parm=scaler.fit(df_data[['Fare']])
df_ Y P Bdata['Fare_scaled']=scaler.fit_transform(df_data['Fare'].values.E l F z p , $ 0reshape(-1,1),fare_slale_parm)
接连数据离[ ^ 6 E = B D C散化

还有一个接连型数据是乘客年纪,上节咱们知道了此次事件中儿童定义是15岁,所以咱们大可将乘客分为儿童,青年和晚年

考虑到晚年人存活的比例并不明显,小一@ J r Y将青年分为青年女士和青年男士

《大话机器学习算法》决策树—实战项目
文章首发:大众号『知秋小一』

还有乘客的姓名长度、家庭成员数是咱们后边衍生出来的接连性特征,相同~ u l b V的道理,将其接连化

姓名长度能够经过分段来处理,w 3 v 6 y q S l r例如长度为0-20,20-30等

家庭成员数能够经过人数来分段

家庭成员数的分段标准是上一节可视化中家庭成员u * W 1数,依据不同` R 3 _ d 8 S成员数的存活程度进行散布

#对Namelen字段进行处理
df_data['Namelen']=pd.cut(df_data['Namelen'],bins=o @ e R[0,20,30,40,50,100],labe[ B P ? 3 zls=[0,1,2,3,4])
#对Num] , - t e t 8bers字段进行处理,分别为一个人、两个人、三个人和多个人
df_data['Numbersx z r f C + ?']=pd.cX v B J E , z _ ~ut(df_data[''],bins=[0,1,2,3,20],labels=[0,1,2,3])
独热编码

这个操作很有必要,咱们留意看

在核算机中需求核算不同特征之间的尺度,例如性别中的male和female,核算机是无法直接核算两个特n ; k q p征,可是你假如将male表明1,female表明2,下次核算机会到了就会直接用2-1=1表明间隔

这样做的长处是核算机能够识别,并且能够快速的核算

在咱们的字段中,乘客性别、船舱等级、客舱是否为空还有方0 T ( T才的年纪标识都需求进行独热编码

"""进行特征编码"""
forfea( W 6 O &turein['Sex','Embarked','Can U & ) L L b I AbinType','AgeType',]:
le=preprocessing.LabelEncoder()
le.fit(df_d^ ^ E J , ^ata[feature])
df_d0 2 + J 9ata[feature]=le.transform(df_data[feature])

特征工程暂时就这些,还记得上节结尾的小问题吗?

可视化显现分明Age 和Numbers 对成果影响很大,这儿B 3 F m 0 k P怎样得分这么低?

咱们在特征工程之后用相同的代码再比较一下

《大话机器学习算法》决策树—实战项目
文章首发:大众号『知秋小一』

果然,交融F y = 9 K后的Numbers特征是优于任一个的,年纪分段后重要度也提升了

没什么问题之后,咱们取出相应的数据就能够开端建模了

现在的数据长这样,一同康康

《大话机器学习算法》决策树—实战项目
文章首发:大众号『知秋小一』

模型练习

在Python中,根本常用的算Q W X # L ]法都在sklearn 包里边。

咱们直接两行代码调用

#决策树模型
fromsklearn.treeimporp c Q M ttDecisionTreeClassifier
clf=DecisionTreeClassifier(criteF B Y O = 3rion='enQ F O 7 0 b Ptropy')

这儿的clf 便是咱们建立的决策树模型,咱们只需求将数据放在模型中进行练习即可

《大话机器学习算法》决策树—实战项目
文章首发:大众号『知秋小一』2 8 D ) F

需求留意的是咱们前面一直是针对测验集和练习集的整个数据,这儿需求进行分类

使用练K ` k x m Y s E习集练习模型,使} l 4 P Q p N &用测验集输出测验成果

"""分离练习集和测% y S c ~验集"""
train_data=df_data[df_data['Survived'].notnull()].drop(['PassengerId'],axis=1)
test_datV ) Y Z x S z U 6a=df_data[df_data['Survived'].isnull()].drop(['Survived'],axis=1)
#分离练习集特征和标签
y=train_data['Survived']
X=train_data.drop(['Survived'],axi+ E g & O c & ws=1)

直接经过kE l f H L [ R ( g 折穿插验证检查一! # * @ ` : d ? _下模型的准确率

《大话机器学习算法》决策树—实战项目
文章首发:大众号『知秋小一』

接近80%,这仅仅咱们的一个根底模型,咱们并没有进行任何的参数设置

你能够看到,在创立模型的时分,咱们并没有设置参数,仅仅选用了信息增益算法进行节点划分,l + 9 #仅此而已

那,还能不能再次提升准确率呢?

往下看便是了,暖男都给你们预备好了

模型调参

z Q # X : y { 一想,模型调参的意图是什么?

嗯,是剪枝,经过设置相应的参数到达剪枝的意图,这儿的剪枝指的是预剪枝

知己知彼才干百V % O s K i战不E E U @ E殆,先了解一下参数的含义

《大话机器学习算法》决策树—实战项目
文章首发:大众号『知秋小一z U .

这个是sklearn 中决策树的参数对应表

在应用过程中,咱们能够经过设置一个字典提早声明参数的范围

#设置参数
parameters={
'criterion':['gini','entropy'],
'max_depth':range(2,10),
'min_impurity_d. z @ 9 C y x &ecrease':np.linspace(0,1,10),
'min_samples_splij n ; P 5t':range(2,30,2),
'class_weight':['balanced',None]
}

skl_ C y S v i * E Nearn中提供了网格查找1 & s的方法,供咱们寻找最优参数

在查找过程中,咱们设置了5折穿插验证,以确保猜测成果的稳定性

"""经过网格查找寻找最优参数"""
gB y E A / m 1 }ird_clf=GridSeaT w y @ ZrchCV(DecisionTreeClaG ? ` : P ~ a ssifier(),parameters,cv=i 7 n5,return_train_score=True)
#模型练习
g/ s S D f ?ird_clf.fit(X,y)
#成果猜测
pred_labels=gird_clf.predict(test_data| / d % ;.drop(['PassengerId'# 6 @ F ^ . #],axi5 ~ ( J h Y } js=1))

在进行调参之后,模型的准确率提高了,并且相应的参数S K P w咱们也能够看到

假如你觉得这& Z ` I { D ` 1个准确率能够,那就能够直接去进行猜测了

《大话机器学习算法》决策树—实战项目
文章首发:大b A K G ^ (众号『知秋小一』

不要忘了决策树最大的长处:可视化

咱们经过graphviz 进行成果的可视化显x s : , k

#将dot成果进行可视化
tree.export_graphviz(girdm V } z ) Z_clf.best_estimator_,featur% P y i /e_names=X.columns,out_file='titanic_tree.dot',filled=True)
#在cmd下t u x使用dot-Tpngtitanic_p f ? W b F `tree.dot-otree.png转化成果为png图片

最终咱们的决策树是这样的

《大话机器学习算法》决策树—实战项目
文章首发:大众9 2 e ~ W L号『知秋小一』

嗯,有, 4 , C $点过拟合了,这个能够经过树的深度去再次优化,这个问题就留给咱们了

关于f N b Q b o ] T源码

请在原文链接中获取本节内容的源码

原文链接:鬼话系列 | 决策树(下篇)

写在后边的话

有一个小技巧送给咱们:学习算法,每学完一个就做个项R ? 2 P n i S目,算法学完了,项目经验也有了,win-win啊。

还有一点很重要,比如说分类算法,决策树仅仅其间一种,后边还有其他分类算法

那你完全能够用不同的算法去建立模型,对同一份数据进行猜测,这样对比着了解会更高效。

我是小一,咱们小* r v | l节见。

C ] w创不易,欢迎点赞噢

文章首发:大众号【知秋小一】

文章同步:6HU网,简书,csdn

欢迎三连支持小一,持续g L s %更新中