sklearn.tree
- scikit-learn决策树算法类库内部实现是使用了调优过的CART树算法,既可以做分类,又可以做回归。
DecisionTreeClassifier
-
特征选择标准criterion
可以使用"gini"或者"entropy",前者代表基尼系数,后者代表信息增益。
一般说使用默认的基尼系数"gini"就可以了,即CART算法。除非你更喜欢类似ID3, C4.5的最优特征选择方法。 -
特征划分点选择标准splitter
可以使用"best"或者"random"。前者在特征的所有划分点中找出最优的划分点。后者是随机的在部分划分点中找局部最优的划分点。
默认的"best"适合样本量不大的时候,而如果样本数据量非常大,此时决策树构建推荐"random" 。 -
划分时考虑的最大特征数max_features
可以使用很多种类型的值,默认是"None",意味着划分时考虑所有的特征数;如果是"log2"意味着划分时最多考虑 l o g 2 N log_2N log2N个特征;如果是"sqrt"或者"auto"意味着划分时最多考虑 N \sqrt{N} N个特征。如果是整数,代表考虑的特征绝对数。如果是浮点数,代表考虑特征百分比,即考虑(百分比 x N)取整后的特征数。其中N为样本总特征数。
一般来说,如果样本特征数不多,比如小于50,我们用默认的"None"就可以了,如果特征数非常多,我们可以灵活使用刚才描述的其他取值来控制划分时考虑的最大特征数,以控制决策树的生成时间。 -
决策树最大深max_depth
决策树的最大深度,默认可以不输入,如果不输入的话,决策树在建立子树的时候不会限制子树的深度。
一般来说,数据少或者特征少的时候可以不管这个值。如果模型样本量多,特征也多的情况下,推荐限制这个最大深度,具体的取值取决于数据的分布。常用的可以取值10-100之间。 -
内部节点再划分所需最小样本数min_samples_split
这个值限制了子树继续划分的条件,如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分。
默认是2,如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。(如10万样本建立决策树时,可选择min_samples_split=10) -
叶子节点最少样本数min_samples_leaf
这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。
默认是1,可以输入最少的样本数的整数,或者最少样本数占样本总数的百分比。如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。(如10万样本使用min_samples_leaf的值为5) -
叶子节点最小的样本权重和min_weight_fraction_leaf
这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。
默认是0,就是不考虑权重问题。一般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值了。 -
最大叶子节点数max_leaf_nodes
通过限制最大叶子节点数,可以防止过拟合。
默认是"None”,即不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征多的话,可以加以限制,具体的值可以通过交叉验证得到。 -
类别权重class_weight
指定样本各类别的的权重,主要是为了防止训练集某些类别的样本过多,导致训练的决策树过于偏向这些类别。
这里可以自己指定各个样本的权重,或者用“balanced”,如果使用“balanced”,则算法会自己计算权重,样本量少的类别所对应的样本权重会高。当然,如果你的样本类别分布没有明显的偏倚,则可以不管这个参数,选择默认的"None" -
节点划分最小不纯度min_impurity_split
这个值限制了决策树的增长,如果某节点的不纯度(基尼系数,信息增益,均方差,绝对差)小于这个阈值,则该节点不再生成子节点(叶子节点 )。 -
数据是否预排序presort
这个值是布尔值,默认是False不排序。一般来说,如果样本量少或者限制了一个深度很小的决策树,设置为true可以让划分点选择更加快,决策树建立的更加快。如果样本量太大的话,反而没有什么好处。问题是样本量少的时候,我速度本来就不慢。所以这个值一般懒得理它就可以了。
DecisionTreeRegressor
- 特征选择标准criterion
可以使用"mse"或者"mae",前者是均方差,后者是和均值之差的绝对值之和。
推荐使用默认的"mse"。一般来说"mse"比"mae"更加精确。除非你想比较二个参数的效果的不同之处。
ExtraTree Classifier&Regressor
- ExtRa Trees是Extremely Randomized Trees的缩写,极度随机树。
- 相较于普通决策树,极度随机决策树选择划分点的方式不同。
- 对于普通决策树,每个特征都是根据某个标准(信息增益或者gini不纯)去进行划分,然后再按照某个标准来选择特征。
- 对于extra trees中的决策树,划分点的选择更为随机,比如一个数值特征的取值范围是0到100,我们随机选择一个0到100的数值作为划分点;然后再按照评判标准选择一个特征。
Tuning
- 一般来说,样本数比特征数多一些会比较容易建立健壮的模型;如果样本数量少但是样本特征非常多,在拟合决策树模型前,推荐先做降维处理,比如主成分分析(PCA),特征选择(Losso)或者独立成分分析(ICA)
- 在训练模型前,注意观察样本的类别情况(主要指分类树),如果类别分布非常不均匀,就要考虑用class_weight来限制模型过于偏向样本多的类别。
- 如果输入的样本矩阵是稀疏的,推荐在拟合前调用csc_matrix稀疏化,在预测前调用csr_matrix稀疏化。
saveing
import pickle
with open(filename, 'wb') as fw:
pickle.dump(inputTree, fw)
with open(filename, 'rb') as fr:
tree = pickle.load(fr)