决策树与随机森林分类算法(Python实现)

一、原理:

决策树:能够利用一些决策结点,使数据根据决策属性进行路径选择,达到分类的目的。

一般决策树常用于DFS配合剪枝,被用于处理一些单一算法问题,但也能进行分类 。

也就是通过每一个结点的决策进行分类,那么关于如何设置这些结点的决策方式:

熵:描述一个集合内元素混乱程度的因素。

熵的衡量公式

?

公式中的熵值 Entropy 会随着集合中类别数量增加而快速增加,也就是说一个集合中类别越少,那么它的熵就小,整体就越稳定。

对于一个标记数据集,要合理的建立一棵决策树,就需要合理的决定决策结点来使决策树尽快的降低熵值。

如何选择合适的决策:

(1)信息增溢

对于当前的集合,对每一个决策属性都尝试设置为决策结点的目标,计算决策分类前的熵值 与 分类后的所有子集的熵值 的差。选择最大的,作为当前的决策目标。

此方式有一些确定,就是当面对一些决策变量的分类子集很多,而子集却很小的情况。这次办法虽然会很快的降低熵,但这并不是我们想要的。

(2)信息增溢率

这是对熵增溢的一种改进,把原本的前后熵值的差,增加:

决策分类前属性的熵和 与 决策分类后的的熵 的比值,如果比值很小,说明分类分很多,损失值就会很大。

(3)gini系数: 

gini系数和信息增溢率比较像

决策树的剪枝 :

预剪枝:设置max_depth来达到建树过程中的剪枝,表示树的最大深度

后剪枝:通过min_sample_split与min_sample_leaf来对已经建成的决策树进行剪枝,分别是结点的元素个数与子树的叶子结点个数

随机森林 :

构建多个决策树,从而得到更加符合期望的一些决策结果。以森林的结果众数来表示结果。

往往采用生成子数据集,取60%随机生成数据集

交叉验证:

几折交叉验证方式为,将训练数据进行几次对折,取一部分作为测试集,其他作为训练集。并将每个部分轮流作为测试集,最后得到一个平均评分。

网格超参数调优:

对分类器的参数进行调优评价,最后得到一个最优的参数组,并作为最终的分类器的参数。

二、实现 :

数据集:威斯康辛州乳腺癌数据集

import pandas as pd
df = pd.read_csv(‘文件所在路径\\breast_cancer.csv‘,encoding=‘gbk‘)
df.head()
df.res.value_counts()
y=df.res
y.head()
df=df.drop(index=0)#修正数据集
x=df.drop(‘res‘,axis=1)#去掉标签

?

数据标签分布较为均衡

#导入决策树
from sklearn.tree import DecisionTreeClassifier
#导入随机森林
from sklearn.ensemble import RandomForestClassifier
#导入集合分割,交叉验证,网格搜索
from sklearn.model_selection import train_test_split,cross_val_score,GridSearchCV
seed=5#随机种子
#分割训练集与测试集
xtrain,xtest,ytrain,ytest=train_test_split(x,y,test_size=0.3,random_state=seed)
#实例化随机森林
rfc=RandomForestClassifier()
#训练
rfc=rfc.fit(xtrain,ytrain)
测试评估
result=rfc.score(xtest,ytest)

?

print(‘所有树:%s‘%rfc.estimators_)
print(rfc.classes_)
print(rfc.n_classes)
print(‘判定结果:%s ‘%rfc.predict(xtest))
print(‘判定结果:%s‘%rfc.predict_proba(xtest)[:,:])
print(‘判定结果:%s ‘%rfc.predict_proba(xtest)[:,1])
#d1与d2结果相同
d1=np.array(pd.Series(rfc.predict_proba(xtest)[:,1]>0.5).map({False:0,True:1}))
d2=rfc.predict(xtest)
np.array_equal(d1,d2)
#导入评价模块
from sklearn.metrics import roc_auc_score,roc_curve,auc
#准确率
roc_auc_score(ytest,rfc.predict_proba(xtest)[:,1])
#结果:0.9935171385991058
print(‘各个feature的重要性:%s ‘%rfc.feature_importances_)
std=np.std([tree.feature_importances_ for tree in rfc.estimators_],axis=0)
从大到小排序
indices = np.argsort(importances)[::-1]
print(‘Feature Ranking:‘)
for f in range(min(20,xtrain.shape[1])):
    print("%2d)%-*s %f"%(f+1, 30, xtrain.columns[indices[f]],importances[indices[f]]))

?

绘图
#黑线是标准差
plt.figure()
plt.title("Feature importances")
plt.bar(range(xtrain.shap[1]), importances[indices], color=‘r‘, yerr=std[indices], align="center")
plt.xticks(range(xtrain.shap[1]), indices)
plt.xlim([-1, xtrain.shap[1]])
plt.show()

predictions_validation = rfc.predict_proba(xtest)[:,1]
fpr, tqr, _=roc_curve(ytest, predictions_validation)
roc_auc = auc(fpr, tqr)
plt.title(‘ROC Validation‘)
plt.plot(fpr, tqr, ‘b‘, label=‘AUC = %0.2f‘%roc_auc)
plt.legend(loc=‘lower right‘)
plt.plot([0, 1], [0, 1], ‘r--‘)
plt.xlim([0, 1])
plt.ylim([0, 1])
plt.ylabel(‘True Position Rate‘)
plt.xlabel(‘False Postion Rate‘)
plt.show()

?

?

‘‘‘交叉验证‘‘‘
‘‘‘
sklearn.model_selection.cross_val_score(estimator, X,yscoring=None, cv=None,                                        n_jobs=1,verbose=0,fit_params=None,pre_dispatch=‘2*n_jobs‘)
estimator:估计方法对象(分类器)
X:数据特征(Featrues)
y:数据标签(Labels)
soring:调用方法(包括accuracy和mean_squared_error等等)
cv:几折交叉验证(样本等分成几个部分,轮流作为验证集来验证模型)
n_jobs:同时工作的cpu个数(-1 代表全部)
‘‘‘
#两种分类器的比较
#决策树
clf = DecisionTreeClassifier(max_depth=None,min_samples_split=2,random_state=0)
scores = cross_val_score(clf, xtrain, ytrain)
print(scores.mean())
#0.932157394843962
#随机森林
clf = RandomForestClassifier()
scores = cross_val_score(clf, xtrain, ytrain)
print(scores.mean())
#0.9471958389868838

参数调优过程:

#参数调优
param_test1 = {‘n_estimators‘:range(25,500,25)}
gsearch1 = GridSearchCV(estimator = RandomForestClassifier(min_samples_split=100,
                                                          min_samples_leaf=20,
                                                          max_depth=8,random_state=10),
                       param_grid = param_test1,
                       scoring=‘roc_auc‘,
                       cv = 5)
gsearch1.fit(xtrain, ytrain)
‘‘‘调优结果‘‘‘
print(gsearch1.best_params_,gsearch1.best_score_)

param_test2 = {‘min_samples_split‘:range(60,200,20), ‘min_samples_leaf‘:range(10,110,10)}
gsearch2 = GridSearchCV(estimator = RandomForestClassifier(n_estimators=50,
                                                          max_depth=8,random_state=10),
                       param_grid = param_test2,
                       scoring=‘roc_auc‘,
                       cv = 5)
gsearch2.fit(xtrain, ytrain)
‘‘‘调优结果‘‘‘
print(gsearch2.best_params_,gsearch2.best_score_)

param_test3 = {‘max_depth‘:range(3,30,2)}
gsearch1 = GridSearchCV(estimator = RandomForestClassifier(min_samples_split=60,
                                                          min_samples_leaf=10,
                                                           n_estimators=50,
                                                          random_state=10),
                       param_grid = param_test3,
                       scoring=‘roc_auc‘,
                       cv = 5)
gsearch3.fit(xtrain, ytrain)
‘‘‘调优结果‘‘‘
print(gsearch3.best_params_,gsearch3.best_score_)

param_test4 = {‘criterion‘:[‘gini‘,‘entropy‘], ‘class_weight‘:[None, ‘balanced‘]}
gsearch4 = GridSearchCV(estimator = RandomForestClassifier(n_estimators=50,
                                                           min_samples_split=60,
                                                           min_samples_leaf=10,
                                                           max_depth=3,
                                                           random_state=10),
                       param_grid = param_test4,
                       scoring=‘roc_auc‘,
                       cv = 5)
gsearch4.fit(xtrain, ytrain)
‘‘‘调优结果‘‘‘
print(gsearch4.best_params_,gsearch4.best_score_)
#gini,None

#整合所有最优参数值,得到最优评分
best_score = roc_auc_score(ytest, gsearch4.best_estimator_.predict_proba(xtest)[:,1])
print(best_score)

?

原文地址:https://www.cnblogs.com/lzw265/p/12348598.html

时间: 2024-10-09 03:31:38

决策树与随机森林分类算法(Python实现)的相关文章

【Kaggle】用随机森林分类算法解决Biologial Response问题

Kaggle搞起来 Kaggle比赛多依靠机器来自动处理,机器学习几乎是必须要的技能.开始搞Kaggle需要的机器学习技能并不深入,只是需要对于机器学习的常见几个方法有基本了解即可,比如说对于一个问题,你可以认识到它是个classification的问题啊还是regression的问题啊,为什么机器可以根据你输入的一个矩阵来算出来分类结果啊. 其实有时候真的在于是不是愿意踏出那一步,一旦踏出了那一步,做与不做真的是天壤之别. hacker的方式就是通过不断的尝试来学习,所以,搞机器学习,不实践,

R语言︱决策树族——随机森林算法

笔者寄语:有一篇<有监督学习选择深度学习还是随机森林或支持向量机?>(作者Bio:SebastianRaschka)中提到,在日常机器学习工作或学习中,当我们遇到有监督学习相关问题时,不妨考虑下先用简单的假设空间(简单模型集合),例如线性模型逻辑回归.若效果不好,也即并没达到你的预期或评判效果基准时,再进行下换其他更复杂模型来实验. ---------------------------------------------- 一.随机森林理论介绍 1.1 优缺点 优点. (1)不必担心过度拟合

web安全之机器学习入门——3.2 决策树与随机森林算法

目录 简介 决策树简单用法 决策树检测P0P3爆破 决策树检测FTP爆破 随机森林检测FTP爆破 简介 决策树和随机森林算法是最常见的分类算法: 决策树,判断的逻辑很多时候和人的思维非常接近. 随机森林算法,利用多棵决策树对样本进行训练并预测的一种分类器,并且其输出的类别是由个别决策树输出的类别的众数决定. 决策树简单用法 使用sklearn自带的iris数据集 # -*- coding: utf-8 -*- from sklearn.datasets import load_iris from

机器学习与人工智障(5):决策树与随机森林

一.从LR到决策树 1.总体流程与核心问题 (1)决策树是基于树的结构进行决策: 每个"内部节点"对应于某个属性上的"测试" 每个分支对应于该测试的一种可能结果(即该属性上的每个取值) 每个叶节点对应于一个预测结果 (2)学习过程:通过对训练样本的分析来确定"划分属性"(即内部节点所对应的属性) (3)预测过程:将测试实例从根节点开始,沿着划分属性所构成的"判定测试序列"下行,直到叶节点 2.决策树的总体流程: (1):&qu

机器学习之路:python 综合分类器 随机森林分类 梯度提升决策树分类 泰坦尼克号幸存者

python3 学习使用随机森林分类器 梯度提升决策树分类 的api,并将他们和单一决策树预测结果做出对比 附上我的git,欢迎大家来参考我其他分类器的代码: https://github.com/linyi0604/MachineLearning 1 import pandas as pd 2 from sklearn.cross_validation import train_test_split 3 from sklearn.feature_extraction import DictVe

决策树与随机森林算法

决策树 决策树模型是一种树形结构,基于特征对实例进行分类或回归的过程.即根据某个特征把数据分划分到若干个子区域(子树),再对子区域递归划分,直到满足某个条件则停止划分并作为叶子节点,不满足条件则继续递归划分. 一个简单的决策树分类模型:红色框出的是特征. 决策树模型学习过程通常包3个步骤:特征选择.决策树的生成.决策树的修剪. 1.特征选择 选择特征顺序的不同将会产生不同决策树,选择好的特征能使得各个子集下标签更纯净.度量特征对产生子集的好坏有若干方法,如误差率,信息增益.信息增益比和基尼指数等

决策树与随机森林

文章部分图片来源于龙心尘老师课件. 首先,在了解树模型之前,自然想到树模型和线性模型有什么区别呢?其中最重要的是,树形模型是一个一个特征进行处理,之前线性模型是所有特征给予权重相加得到一个新的值.而树形模型更加接近人的思维方式.树模型拟合出来的函数其实是分区间的阶梯函数. 其次,需要了解几个重要的基本概念:根节点(最重要的特征):父节点与子节点是一对,先有父节点,才会有子节点:叶节点(最终标签). 一.决策树 决策树生成的数学表达式: 决策树的生成必须要解决两个问题: (1)  如何分裂训练数据

从决策树到随机森林

这里仅介绍分类决策树. 决策树:特征作为决策的判定标准,整个模型形如树形结构,因此,称之为决策树 对于分类决策树,他们可以认为是一组if-then规则的集合.决策树的每一个内部节点有特征组成,叶子节点代表了分类的结果.父节点和子节点之间是由有向边连接,表示了决策的结果. 在这里,有必要解释一下,为什么决策树的学习过程变成了三个步骤:特征选择.决策树生成和剪枝.而不是像LR或者SVM那样,具有显式的目标函数.首先,我们来看决策树:一个树形结构.如果要根据全局最优的策略,那么需要遍历数据集在所有的特

四、决策树、随机森林、GBDT、XGBoost

(本节课各种数学式子比较多.....^_^) 决策树 Decision Tree? 介绍? 熵 Entropy? 信息增益 Information Gain? 常见算法? 过度拟合 Overfitting? 剪枝 Prune? 增益率 GainRatio? 更多的DT应?场景类别:? 连续函数,多分类,回归? 决策树的究极进化 Ensemble? Bagging? Random Forest? Boosting? GBDT? XGBoost 决策树 分治思想 根据不同的条件作出相应的决定 熵 区