决策树是一种用来 classification (分类)和 regression(回归) 的无参监督学习方法。其目的是创建一种模型从数据特征中学习简单的决策规则来预测一个目标变量的值
官方解释:决策分类树
sklearn.tree.DecisionTreeClassifier(*, criterion='gini', splitter='best', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=None, random_state=None, max_leaf_nodes=None, min_impurity_decrease=0.0, class_weight=None, ccp_alpha=0.0)
参数 | 含义 |
---|---|
criterion | 节点分裂效果的量化指标,默认gini(基尼系数);可选择:entropy(信息熵)和gini和log_loss |
splitter | 用于在每个节点上选择拆分的策略。支持的策略是“best”选择最佳拆分,“random”选择最佳随机拆分。 |
max_depth | 树的最大深度.;若为None,则节点一直分裂,直到无法继续分裂,或者叶子节点包含的样本数目小于min_samples_split |
min_samples_split | 一个节点分枝所需要的最小样本数目: 如果是int,那么考虑min_samples_split作为最小值。如果是float,那么min_samples_split是一个分数,ceil(min_samples_split * n_samples)是每次拆分的最小样本数。 |
min_samples_leaf | 一个节点分枝后,分裂的节点所包含的最小样本数目。如果是int,那么考虑min_samples_leaf作为最小值。如果是float,那么min_samples_leaf是一个分数,ceil(min_samples_leaf * n_samples)是每个节点的最小样本数。 |
min_weight_fraction_leaf | 叶节点上所需的(所有输入样本的)权重总和的最小加权分数。当没有提供sample_weight时,样本具有相等的权值 |
max_features | 限制分枝时考虑的特征个数 。如果是int,那么考虑每次拆分时的max_features特性。如果是float,那么max_features是一个分数,max(1, int(max_features * n_features_in_))特征在每次拆分时都被考虑。如果" auto “,那么max_features=sqrt(n_features)。如果” sqrt “,那么max_features=sqrt(n_features)。如果” log2 ",那么max_features=log2(n_features)。如果为None,则max_features=n_features。 |
random_state | 如果准则的改进对于几个分割是相同的,并且必须随机选择一个分割,则情况就是如此。为了在拟合过程中获得确定性行为,random_state必须固定为一个整数。 |
max_leaf_nodes | 最大的叶子节点数目 |
min_impurity_decrease | 限制信息增益的大小,信息增益小于设定数值的分枝不会发生。 |
class_weight | 可以采用“balanced”模式使用y的值自动调整权重,权重与输入数据中的类频率成反比,如n_samples / (n_classes * np.bincount(y)) |
属性列表:
属性 | 含义 |
---|---|
classes_ | 类标签(单个输出问题),或类标签数组列表(多个输出问题)。 |
feature_importances_ | 特征权重 |
max_features_ | max_features的推断值。 |
n_classes_ | 类的数量(针对单个输出问题),或包含每个输出的类的数量的列表(针对多个输出问题)。 |
n_features_in_ | fit时看到的特征数目 |
feature_names_in_ | fit时看到的特征名称 |
n_outputs_ | fit时output的数目 |
tree_ | 底层Tree对象 |
数据集采用的是:sklearn.datasets中的wine数据集,在这里我把它导出为了csv进行后续训练。
from sklearn import tree
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
import pandas as pd
import graphviz
#读取数据
wine=pd.read_csv(r"D:\ml-learn\code\decision-tree\wine.csv")
#特征和标签
wine_features,wine_label=wine.iloc[:,:13],wine.iloc[:,13:14]
#划分数据集
Xtrain,Xtest,Ytrain,Ytest=train_test_split(wine_features,wine_label,test_size=0.3)
#构建模型
clf = tree.DecisionTreeClassifier(criterion="entropy",
splitter="best",
max_depth=5,
min_samples_split=0.15,
min_samples_leaf=0.05,
random_state=1,
class_weight="balanced")
#训练模型
clf = clf.fit(Xtrain, Ytrain)
#决策树属性
#决策树标签种类
classes=clf.classes_
#特征重要性权重
feature_importance=clf.feature_importances_
#最大特征数目
clf.max_features_
#标签的种类数目
clf.n_classes_
#输入特征数目
clf.n_features_in_
#输出标签数目
clf.n_outputs_
#决策树对象
clf.tree_
#决策树方法
#apply:返回样本预测类别所在的叶子节点
clf.apply(Xtest)
#计算最小成本复杂度修剪过程中的修剪路径。
clf.cost_complexity_pruning_path(Xtest,Ytest)
#返回决策路径
clf.decision_path(Xtest)
#决策树深度
clf.get_depth()
#决策树叶子节点数目
clf.get_n_leaves()
#决策树训练参数
clf.get_params
#获取预测值
clf.predict(Xtest)
#获取预测值的log-probabilities :范围在-inf到0
clf.predict_log_proba(Xtest)
#预测每一类的可能性:范围在0-1
clf.predict_proba(Xtest)
#测试集得分:准确率
clf.score(Xtest,Ytest)
#绘制一个决策树,并保存pdf
dot_data = tree.export_graphviz(clf,
out_file=None,
feature_names=wine_features.columns,
class_names=["class1","class2","class3"],
filled=True, rounded=True,special_characters=True)
graph = graphviz.Source(dot_data)
graph.render(r"D:\ml-learn\code\decision-tree\wine")
官方函数说明:DecisionTreeRegressor
sklearn.tree.DecisionTreeRegressor(*, criterion='squared_error', splitter='best', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=None, random_state=None, max_leaf_nodes=None, min_impurity_decrease=0.0, ccp_alpha=0.0)
回归树和分类树主要不同的参数在于criterion
criterion表示回归树衡量分枝质量的指标,支持的标准有三种:
方法区别:回归树的接口score返回的是R平方,并不是MSE
#回归树案例:
from sklearn.model_selection import cross_val_score
from sklearn import tree
from sklearn.model_selection import train_test_split
import graphviz
import pandas as pd
#读取数据
boston=pd.read_csv(r"D:\ml-learn\code\decision-tree\boston_house_prices.csv")
boston_features,boston_target=boston.iloc[:,:13],boston.iloc[:,13:]
#划分数据集
Xtrain,Xtest,Ytrain,Ytest=train_test_split(boston_features,boston_target,test_size=0.3)
#构建回归树
regressor=tree.DecisionTreeRegressor(random_state=1,max_depth=5)
#训练回归树
regressor=regressor.fit(Xtrain,Ytrain)
#交叉验证
cross_val_score(regressor,Xtest,Ytest, cv=10,scoring = "neg_mean_squared_error")
# 回归树属性
#特征重要性权重
regressor.feature_importances_
#最大特征数目
regressor.max_features_
#标签的种类数目
regressor.n_classes_
#输入特征数目
regressor.n_features_in_
#输出标签数目
regressor.n_outputs_
#回归树对象
regressor.tree_
#回归树方法
#apply:返回样本预测类别所在的叶子节点
regressor.apply(Xtest)
#计算最小成本复杂度修剪过程中的修剪路径。
regressor.cost_complexity_pruning_path(Xtest,Ytest)
#返回决策路径
regressor.decision_path(Xtest)
#决策树深度
regressor.get_depth()
#决策树叶子节点数目
regressor.get_n_leaves()
#决策树训练参数
regressor.get_params
#获取预测值
regressor.predict(Xtest)
#测试集得分:准确率
regressor.score(Xtest,Ytest)
#绘制一个决策树,并保存pdf
dot_data = tree.export_graphviz(regressor,
out_file=None,
feature_names=boston_features.columns,
filled=True, rounded=True,special_characters=True)
graph = graphviz.Source(dot_data)
graph.render(r"D:\ml-learn\code\decision-tree\boston")