sklearn文档参数描述
函数签名
class 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”}, default=”gini”。信息增益的计算方式(基尼指数/信息熵)。
- splitter: {“best”, “random”}, default=”best”。节点分裂策略(最佳分割/随机分割)。
- max_depth: int, default=None。控制树的最大深度,用于防止过拟合。如果不设置,那么决策树会分裂到直到所有的叶子节点中只含有同一种样本或者叶子中的样本数小于min_samples_split参数。
- min_samples_split: int or float, default=2。如果是整数,就是每个叶子节点需要进一步分裂的最少样本数,如果是小数,那么这个最少样本个数等于min_samples_split*样本总数。
- min_samples_leaf : int, float, optional (default=1)。如果是整数,就是每个叶子节点最少容纳的样本数,如果是小数,那么每个叶子节点最少容纳的个数等于min_samples_leaf*样本总数。如果某个分裂条件下分裂出得某个子树含有的样本数小于这个数字,那么不能进行分裂。
- min_weight_fraction_leaf : float, optional (default=0.)。叶子节点最少需要占据总样本的比重,如果样本比重没有提供的话,每个样本占有相同比重。
- max_features : int, float, string or None, optional (default=None)。分裂时需要考虑的最多的特征数,如果是整数,那么分裂时就考虑这几个特征,如果是小数,则分裂时考虑的特征数=max_features*总特征数,如果是“auto”或者“sqrt”,考虑的特征数是总特征数的平方根,如果是“log2”,考虑的特征数是log2(总特征素),如果是None,考虑的特征数=总特征数。需要注意的是,如果在规定的考虑特征数之内无法找到满足分裂条件的特征,那么决策树会继续寻找特征,直到找到一个满足分裂条件的特征。
- max_leaf_nodes : int or None, optional (default=None)。规定最多的叶子个数,根据区分度从高到低选择叶子节点,如果不传入这个参数,则不限制叶子节点个数。
sklearn官方文档中的决策树优化建议
- 特征数与样本数的平衡,样本数过小容易过拟合
- 对特征进行降维,使用PCA,ICA之类的技术,更有可能找到有区分度的特征
- 了解决策树的结构有利于了解数据中的重要特征
- 将树可视化,初始使用比较小的深度来查看决策树是否适合用于训练这个数据。然后再慢慢增加深度
- 每增加一层深度需要的样本数就需要翻倍,所以控制好树的深度,避免过拟合
- 使用min_samples_split min_samples_leaf两个参数保证每个叶子节点都有多个样本,如果每个叶子中的样本数很少,往往说明决策树过拟合了。从min_samples_leaf=5开始尝试。对于类别较少的分类问题,min_samples_leaf=1往往是最好的选择。
- 对数据集进行平衡性调整,以免整个树被数据量很大的树支配,将每个类别的样本数调整成一样的,或者更好的,将每个类别的样本权重调整成一样的。这样,根据权重进行剪枝的方案,如min_weight_fraction_leaf,会更好的调整样本的平衡性,比min_samples_leaf这种对权重不敏感的方案要好。
- 所有决策树的内部的数据类型是np.float32,如果不是这个数据类型,那么决策树会复制一个数据集。(考虑内存,可以自己先把数据集的数据类型调整好)
- 对于有很多0值的稀疏样本,建议将输入转换成csc_matrix再进行训练,并将测试集转换成csr_matrix再进行预测。这样可以节省很多时间。