sklearn与决策树-应用
入门应用
sklearn决策树参数详解
作者 : 老饼 日期 : 2022-06-26 09:49:25 更新 : 2022-08-03 20:45:52
本站原创文章,转载请说明来自《老饼讲解-机器学习》ml.bbbdata.com


本文讲述sklearn决策树的参数说明,包括入参说明,模型方法说明和一些实际应用等

主要作为使用sklearn决策时的查阅资料


   01. 简单Demo   


先展示一个简单的调用Demo



from sklearn.datasets import load_iris
from sklearn import tree
#----------------数据准备----------------------------
iris = load_iris()                          # 加载数据
#---------------模型训练----------------------------------
clf = tree.DecisionTreeClassifier(criterion="gini",
                 splitter="best",
                 max_depth=None,
                 min_samples_split=2,
                 min_samples_leaf=1,
                 min_weight_fraction_leaf=0.,
                 max_features=None,
                 random_state=None,
                 max_leaf_nodes=None,
                 min_impurity_decrease=0.,
                 min_impurity_split=None,
                 class_weight=None,
                 presort='deprecated',
                 ccp_alpha=0.0) # sk-learn的决策树模型
clf = clf.fit(iris.data, iris.target)       # 用数据训练树模型构建()
r = tree.export_text(clf, feature_names=iris['feature_names']) #训练好的决策树
#---------------模型预测结果------------------------
text_x = iris.data[[0,1,50,51,100,101], :]
pred_target_prob = clf.predict_proba(text_x)   # 预测类别概率
pred_target = clf.predict(text_x)              # 预测类别




   02. 入参解释   



下面是sklearn决策树的一个完整入参设置参考Demo



clf = tree.DecisionTreeClassifier(criterion="gini",
                 splitter="best",
                 max_depth=None,
                 min_samples_split=2,
                 min_samples_leaf=1,
                 min_weight_fraction_leaf=0.,
                 max_features=None,
                 random_state=None,
                 max_leaf_nodes=None,
                 min_impurity_decrease=0.,
                 min_impurity_split=None,
                 class_weight=None,
                 presort='deprecated',
                 ccp_alpha=0.0) # sk-learn的决策树模型


   常用参数   


 class_weight  :设置各类别样本的权重,默认是各个样本权重一样,都为 1.               
ccp_alpha    :剪枝时的alpha系数,需要剪枝时设置该参数,默认值是不会剪枝的。  
random_state :需要每次训练都一样时,就需要设置该参数。                                   
criterion      :节点质量评估函数(gini,entropy) (看似常用,实际不常用。)        




   预防过拟合参数   


min_samples_leaf      :叶子节点最小样本数。              
min_samples_split      :节点分枝最小样本个数             
max_depth         :树分枝的最大深度                            
min_weight_fraction_leaf :叶子节点最小权重和         
min_impurity_decrease  :节点分枝最小纯度增长量    
max_leaf_nodes       :最大叶子节点数                         


 


   树的多样性参数   


 max_features:特征最大查找个数                                 
splitter      :分枝时变量选择方式                                  

这部分参数常用于训练弱树




  所有入参说明  







参数名称参数输入要求变量说明详细说明
criteriongini(默认),entropy节点质量评估函数gini为基尼系数,entropy为熵
splitterbest(默认),random分枝时变量选择方式random:随机选择,best:选择最好的变量
max_depth整数,None(默认)树分枝的最大深度为None时,树分枝深度无限制
min_samples_split整数或小数,默认2节点分枝最小样本个数节点样本>=min_samples_split时,允许分枝,如果小于该值,则不再分枝(也可以设为小数,此时当作总样本占比,即min_samples_split=ceil(min_samples_split *总样本数)
min_samples_leaf整数或小数,默认1叶子节点最小样本数左右节点都需要满足>=min_samples_leaf,才会将父节点分枝,如果小于该值,则不再分枝(也可以设为小数,此时当作总样本占比,即min_samples_split=ceil(min_samples_split *总样本数))
min_weight_fraction_leaf小数,默认值0叶子节点最小权重和节点作为叶子节点,样本权重总和必须>=min_weight_fraction_leaf,为0时即无限制。
max_features整数,小数,None(默认),
{"auto", "sqrt", "log2"}
特征最大查找个数先对max_features进行如下转换,统一转换成成整数。
整数:max_features=max_features
auto:max_features=sqrt(n_features)
sqrt:max_features=sqrt(n_features)
log2:max_features=log2rt(n_features)
小数:max_features=int(max_features * n_features)
None:max_features=n_features
如果max_features<特征个数,则会随机抽取max_features个特征,只在这max_features中查找特征进行分裂。
random_state整数,随机数实例,None(默认)训练过程中的随机种子。如果设定为非None值,则每次训练都会是一样的结果。
max_leaf_nodes整数,None(默认)最大叶子节点数。如果为None,则无限制。
min_impurity_decrease小数,默认0.节点分枝最小纯度增长量信息增益
min_impurity_split--已弃用
class_weight字典(多输出为字典列表)
,balanced,None(默认)
各类别样本的权重None:样本权重全为1
字典:{0:1,1:2}代表0类的样本权重为1,1类的样本权重为2.(多输出时,格式为:[{0:1,1:2},{0:1,1:2}])
balanced:把总权重n_samples均分给各类,各类再均分给各个样本。例:有3个类别,10个样本,则每个类别平均权重为10/3,平均到某个类别的权重就为 (10/3)/类别样本数。公式:class_weight = n_samples / (n_classes * np.bincount(y))。
presort--已弃用
ccp_alpha非负小数,默认0剪枝时的alpha系数默认0时即不剪枝








回归树DecisionTreeRegressor的入参与分类树基本相同,

不同之处在于:


1. criterion可选值:mse:默认修士,均方差,mae:平均绝对差,friedman_mse 
2. 没有class_weight                                                                                            




  03. 模型训练方法   


 模型训练方法只有一个


clf.fit(X,y) :模型训练




  04. 模型训练后方法与属性  



    预测与评估    


clf.predict(X) :预测X的类别                                                      
clf.predict_proba(X) :预测X属于各类的概率                             
clf.predict_log_proba(X) :相当于 np.log(clf.predict_proba())   
clf.apply(X) :返回样本预测节点的索引                                        
clf.score(X,y)  : 返回准确率,即模型预测值与y不同的个数占比   
                                                  支持样本权重:clf.score(X,y,sample_weight=sample_weight) 
clf.decision_path(np.array([0 ,1 ,2 ,1 ]).reshape(1, -1)).todense() : 返回决策路径:格式[ 1 1 0 0 0] ,它代表通过了第0,第1个节点。


       剪枝      


clf.cost_complexity_pruning_path(X, y) :返回 CCP(Cost Complexity Pruning代价复杂度剪枝)法的剪枝路径。

备注: CCP的计算方法请参考文章:《决策树后剪枝:CCP剪枝法》


       树信息       


clf.get_depth()         :返回树的深度
clf.get_n_leaves()     :叶子节点个数
clf.tree_.node_count  :总节点个数 


   树明细数据   


左节点编号  :  clf.tree_.children_left      
 右节点编号  :  clf.tree_.children_right     
 分割的变量  :  clf.tree_.feature                
 分割的阈值 :  clf.tree_.threshold              
 不纯度(gini) :  clf.tree_.impurity             
 样本个数   :  clf.tree_.n_node_samples    
 样本分布    :  clf.tree_.value                     
备注:详细解说请参考文章:《决策树训练后的模型数据》


      其它      


clf.feature_importances_ :各个特征的权重。
clf.get_params()        :查看模型的入参设置   
如果想获取节点上样本的数据,sklearn不直接提供,
但可以借用 clf.apply(X) ,把原数据作为输入,间接获得。







 End 










联系老饼