《老饼讲解机器学习》http://ml.bbbdata.com/teach#96
目录
一. sklearn决策树完整入参设置
二. 参数解释
(一) 训练参数
(二) 模型训练
(三) 模型训练后方法与属性
三.代码
一. sklearn决策树完整入参设置
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 :分枝时变量选择方式
明细解析如下:
参数名称 | 参数输入要求 | 变量说明 | 详细说明 |
---|
criterion | gini(默认),entropy | 节点质量评估函数 | gini为基尼系数,entropy为熵 |
splitter | best(默认),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 | 整数&#xff0c;小数&#xff0c;None(默认)&#xff0c; {"auto", "sqrt", "log2"} | 特征最大查找个数 | 先对max_features进行如下转换&#xff0c;统一转换成成整数。 整数&#xff1a;max_features&#61;max_features auto&#xff1a;max_features&#61;sqrt(n_features) sqrt&#xff1a;max_features&#61;sqrt(n_features) log2&#xff1a;max_features&#61;log2rt(n_features) 小数&#xff1a;max_features&#61;int(max_features * n_features) None:max_features&#61;n_features 如果max_features<特征个数&#xff0c;则会随机抽取max_features个特征&#xff0c;只在这max_features中查找特征进行分裂。 |
random_state | 整数&#xff0c;随机数实例&#xff0c;None(默认) | 训练过程中的随机种子。 | 如果设定为非None值&#xff0c;则每次训练都会是一样的结果。 |
max_leaf_nodes | 整数&#xff0c;None(默认) | 最大叶子节点数。 | 如果为None,则无限制。 |
min_impurity_decrease | 小数&#xff0c;默认0. | 节点分枝最小纯度增长量 | 信息增益 |
min_impurity_split | - | - | 已弃用 |
class_weight | 字典&#xff08;多输出为字典列表&#xff09; &#xff0c;balanced&#xff0c;None&#xff08;默认&#xff09; | 各类别样本的权重 | None:样本权重全为1 字典:{0:1,1:2}代表0类的样本权重为1&#xff0c;1类的样本权重为2.&#xff08;多输出时&#xff0c;格式为:[{0:1,1:2},{0:1,1:2}]&#xff09; balanced:把总权重n_samples均分给各类&#xff0c;各类再均分给各个样本。例&#xff1a;有3个类别&#xff0c;10个样本&#xff0c;则每个类别平均权重为10/3,平均到某个类别的权重就为 (10/3)/类别样本数。公式&#xff1a;class_weight &#61; n_samples / (n_classes * np.bincount(y))。 |
presort | - | - | 已弃用 |
ccp_alpha | 非负小数&#xff0c;默认0 | 剪枝时的alpha系数 | 默认0时即不剪枝 |
注&#xff1a;回归树DecisionTreeRegressor的入参与分类树基本相同&#xff0c;不同之处&#xff1a;
1.criterion可选值&#xff1a;mse:默认修士&#xff0c;均方差&#xff0c;mae&#xff1a;平均绝对差&#xff0c;friedman_mse&#xff1a;
2.没有class_weight
(二) 模型训练
clf.fit(X,y) &#xff1a;模型训练
(三) 模型训练后方法与属性
-------------预测与评估---------------------
clf.predict(X) &#xff1a;预测X的类别
clf.predict_proba(X) &#xff1a;预测X属于各类的概率
clf.predict_log_proba(X) &#xff1a;相当于 np.log(clf.predict_proba())
clf.apply(X) &#xff1a;返回样本预测节点的索引
clf.score(X,y) &#xff1a;返回准确率&#xff0c;即模型预测值与y不同的个数占比(支持样本权重&#xff1a;clf.score(X,y,sample_weight&#61;sample_weight))
clf.decision_path(np.array([0 ,1 ,2 ,1 ]).reshape(1, -1)).todense() : 返回决策路径&#xff1a;格式[ 1 1 0 0 0] &#xff0c;它代表通过了第0&#xff0c;第1个节点。
-----------------剪枝-------------------------
clf.cost_complexity_pruning_path(X, y) &#xff1a;返回 CCP(Cost Complexity Pruning代价复杂度剪枝)法的剪枝路径。
备注&#xff1a; CCP的计算方法请参考文章&#xff1a;《决策树后剪枝&#xff1a;CCP剪枝法》
--------------树信息--------------------------
clf.get_depth() &#xff1a;返回树的深度
clf.get_n_leaves() &#xff1a;叶子节点个数
clf.tree_.node_count &#xff1a;总节点个数
--------------树明细数据--------------------------
左节点编号 : 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
备注&#xff1a;详细解说请参考文章&#xff1a;《决策树训练后的模型数据》
--------------其它--------------------------
clf.feature_importances_ &#xff1a;各个特征的权重。
clf.get_params() &#xff1a;查看模型的入参设置
如果想获取节点上样本的数据&#xff0c;sklearn不直接提供&#xff0c;但可以借用 clf.apply(X) &#xff0c;把原数据作为输入&#xff0c;间接获得。
备注&#xff1a;特征权重的计算方法&#xff1a;《决策特征权重feature_importances计算方法》
三.代码
from sklearn.datasets import load_iris
from sklearn import tree#----------------数据准备----------------------------
iris &#61; load_iris() # 加载数据
#---------------模型训练----------------------------------
clf &#61; tree.DecisionTreeClassifier(criterion&#61;"gini",splitter&#61;"best",max_depth&#61;None,min_samples_split&#61;2,min_samples_leaf&#61;1,min_weight_fraction_leaf&#61;0.,max_features&#61;None,random_state&#61;None,max_leaf_nodes&#61;None,min_impurity_decrease&#61;0.,min_impurity_split&#61;None,class_weight&#61;None,presort&#61;&#39;deprecated&#39;,ccp_alpha&#61;0.0) # sk-learn的决策树模型
clf &#61; clf.fit(iris.data, iris.target) # 用数据训练树模型构建()
r &#61; tree.export_text(clf, feature_names&#61;iris[&#39;feature_names&#39;]) #训练好的决策树
#---------------模型预测结果------------------------
text_x &#61; iris.data[[0,1,50,51,100,101], :]
pred_target_prob &#61; clf.predict_proba(text_x) # 预测类别概率
pred_target &#61; clf.predict(text_x) # 预测类别#---------------打印结果---------------------------
print("\n&#61;&#61;&#61;模型&#61;&#61;&#61;&#61;&#61;&#61;")
print(r)
print("\n&#61;&#61;&#61;测试数据&#xff1a;&#61;&#61;&#61;&#61;&#61;")
print(text_x)
print("\n&#61;&#61;&#61;预测所属类别概率&#xff1a;&#61;&#61;&#61;&#61;&#61;")
print(pred_target_prob)
print("\n&#61;&#61;&#61;预测所属类别&#xff1a;&#61;&#61;&#61;&#61;&#61;&#61;")
print(pred_target)