sklearn笔记整理——(二)决策树(decision tree)

决策树官网说明:
https://scikit-learn.org/stable/modules/tree.html

算法原理

将分类(回归)问题考虑成一棵树成长的过程,将特征作为节点,寻找最佳节点与最佳分支,并且防止过拟合。
决策树(DTs)是一种用于分类和回归的非参数监督学习方法。其目标是通过学习从数据特征中推断出的简单决策规则,创建一个预测目标变量值的模型。树可以看作是一个分段常数近似。
决策树学习的关键是如何选择最优划分属性。我们希望决策树的分支结点所包含的样本尽可能属于同一类别,即结点的“纯度”越高。
常用三种衡量指标:信息增益(使用划分后信息增益最大的属性作为划分属性,参考周.《机器学习》)、增益率、基尼指数(选择使得划分后基尼指数最小的属性作为最优划分属性)。
ID3:信息增益
C4.5:先找信息增益高于平均水平的属性,再从中选择增益率最高的。
CART:基尼系数

优势与劣势

优势:
1、容易理解、解释
2、不需要数据规范化
3、能够处理多输出问题
劣势:
1、决策树可能不稳定,因为数据中的微小变化可能导致生成完全不同的树。在集成中使用决策树可以缓解这个问题。
2、容易过拟合
3、生成的可能不是最优的决策树模型。一些限制可以通过集成算法得到提升。

评价标准

分类树:predict返回的分数,accuracy
回归树:mse均方误差(在sklearn中返回负的均方误差)

参数与接口

分类树:
https://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html#sklearn.tree.DecisionTreeClassifier
回归树:
https://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeRegressor.html#sklearn.tree.DecisionTreeRegressor

参数

criterion:entropy、gini,默认是gini。gini计算起来会比较快。
随机参数:random_state,splitter
剪枝参数:max_depth,max_samples_leaf,min_samples_split等
权重参数:class_weight,min_weight_fraction_leaf

接口

fit:拟合建模
score:分类树:accuracy;回归树:R平方。R平方为负数时,说明模型非常糟糕。
apply:返回每个测试样本所在叶子节点的索引
predict:返回预测的样本分类/回归结果

案例代码

泰坦尼克号幸存者预测
链接:https://pan.baidu.com/s/1w7by_YQCEm-073BeoPpupQ
提取码:fs4p
其实这是用jupyter notebook写的,为了放在一起,每个空行实际是一个cell。原始文件见网盘链接。

import pandas as pd
import numpy as np
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split,GridSearchCV,cross_val_score
import matplotlib.pyplot as plt

data = pd.read_csv(r'D:\机器学习实战\data.csv',index_col=0)
data.head()

data.info()

#处理缺失数据
data.drop(['Cabin','Name','Ticket'],inplace=True,axis=1)  #删除三列

data['Age'] = data['Age'].fillna(data['Age'].mean())
data = data.dropna()   #删除空行

#变量转换
data['Sex'] = (data['Sex']=='male').astype('int')  #将二分类变量变成0,1

labels = data['Embarked'].unique().tolist()
data['Embarked'] = data['Embarked'].apply(lambda x:labels.index(x))

data.tail()

#划分测试集与训练集
X = data.iloc[:,data.columns != 'Survived']
y = data.iloc[:,data.columns == 'Survived']
Xtrain,Xtest,Ytrain,Ytest = train_test_split(X,y,test_size=0.3)

for i in [Xtrain,Xtest,Ytrain,Ytest]:
    i.index = range(i.shape[0])

Xtest.head()

#建模
clf = DecisionTreeClassifier(random_state=20)
clf = clf.fit(Xtrain,Ytrain)
score_ = clf.score(Xtest,Ytest)
score_

#带交叉验证的预测accuracy
score = cross_val_score(clf,X,y,cv=10).mean()
score

#使用网格搜索调参
parameters = {
    'splitter':('best','random')
    ,'criterion':('gini','entropy')
    ,'max_depth':[*range(1,50,5)]
    ,'min_samples_leaf':[*np.linspace(0,0.2,20)]
}
clf = DecisionTreeClassifier(random_state=20)
GS = GridSearchCV(clf,parameters,cv=10)
GS.fit(Xtrain,Ytrain)

GS.best_params_

GS.best_score_


补充内容:关于CART,ID3,C4.5,C5.0。C5.0算法则是C4.5算法的修订版,适用于处理大数据集,采用Boosting方式提高模型准确率,又称为BoostingTrees,在软件上计算速度比较快,占用的内存资源较少。(C5.0是一个商业软件,对于公众是不可得到的。它是在C4.5算法做了一些改进。)
参考:https://blog.csdn.net/xlinsist/article/details/51468741?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-1&spm=1001.2101.3001.4242

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值