目录
tree.DescisionTreeClassifier | 分类树 |
tree.DescisionTreeRegressor | 回归树 |
tree.export_graphviz | 生成决策树,画图用 |
tree.ExtraTreeClassifier | 高随机版本的分类树 |
tree.ExtraTreeRegressor | 高随机版本的回归书 |
sklearn的基本建模流程
from sklearn import tree #导入需要的模块(这里是tree)
clf = tree.DecisionTreeClassifier() #实例化一个分类树
clf = clf.fit(X_train,y_train) #用训练集数据训练模型
result = clf.score(X_test,y_test) #导入测试集,从接口中调用需要的信息
分类树:DecisionTreeClassifier
class sklearn.tree.DecisionTreeClassifier
(criterion=’gini’, #分类策略,信息熵‘entropy’或者基尼系数‘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, #限制信息增益的大小,小于设定值就不分支
min_impurity_split=None,
class_weight=None, #样本不均衡时使用
presort=False)
重要参数criterion
参数 | criterion(准则) |
如何影响模型? | 为了找出哪一个特征用来做分支,通过计算不纯度的方法来选择,不纯度越低说明这个分类特征好。 |
可选择的输入? | 默认是基尼系数‘gini’,也可以填写‘entropy’信息增益 |
如何选取这个参数? | 一般用默认的 数据维度大,噪音大则用基尼系数 纬度低,数据干净没有区别 决策树欠拟合的时候,使用信息增益 |
实战部分
# -*- coding: utf-8 -*-
"""
Created on Tue Sep 10 20:15:06 2019
@author: Administrator
"""
from sklearn import tree
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
import pandas as pd
#下载自带的红酒数据
wine = load_wine()
print(wine.data.shape)
print(wine.target)
print(wine.feature_names)
print(wine.target_names)
#训练集与测试街 划分,test_size=0.3意思是有拿30%的数据做测试集
Xtrain, Xtest, Ytrain, Ytest = train_test_split(wine.data,wine.target,test_size=0.3)
#模型建立
clf = tree.DecisionTreeClassifier(criterion="entropy")
clf = clf.fit(Xtrain, Ytrain)
score = clf.score(Xtest, Ytest) #返回预测的准确度
print('score :',score)
#树的最大深度,学习曲线(也可以调节其他参数)
import matplotlib.pyplot as plt
test = []
for i in range(10):
clf = tree.DecisionTreeClassifier(max_depth=i+1,
criterion="entropy",
random_state=30,
splitter="random")
clf = clf.fit(Xtrain, Ytrain)
score = clf.score(Xtest, Ytest)
test.append(score)
plt.plot(range(1,11),test,color="red",label="max_depth")
plt.legend()
plt.show()
##画一棵树
#
#feature_name = ['酒精','苹果酸','灰','灰的碱性','镁','总酚','类黄酮','非黄烷类酚类',
# '花青素','颜色强度','色调','od280/od315稀释葡萄酒','脯氨酸']
#
#import graphviz
#
#dot_data = tree.export_graphviz(clf,feature_names = feature_name,class_names=["琴酒","雪莉","贝尔摩斯"],filled=True,rounded=True)
#graph = graphviz.Source(dot_data)
#print(graph)
这是树的最大深度学习曲线,从这里可以看出max_depth=6 拐点,结果可能不同,根据数据划分来看
重要接口
#apply返回每个测试样本所在的叶子节点的索引
clf.apply(Xtest)
#predict返回每个测试样本的分类/回归结果
clf.predict(Xtest)
#查看重要特征,返回的是一个数组,每一个位置代表对应特征的重要程度
clf.feature_importances_
七个参数:
学习策略criterion,
两个随机性相关的参数(random_state,splitter),
四个剪枝参数(max_depth, ,min_sample_leaf,max_feature,min_impurity_decrease)
一个属性:feature_importances_
四个接口:fit,score,apply,predict
分类树与回归数参数对比
参数 | DecisionTreeClassifer | DecisionTreeRegreesor |
特征选择标准criterion | 可以使用"gini"或者"entropy",前者代表基尼系数,后者代表信息增益。一般说使用默认的基尼系数"gini"就可以了,即CART算法。除非你更喜欢类似ID3, C4.5的最优特征选择方法。 | 可以使用"mse"或者"mae",前者是均方差,后者是和均值之差的绝对值之和。推荐使用默认的"mse"。一般来说"mse"比"mae"更加精确。除非你想比较二个参数的效果的不同之处。 |
决策树最大深max_depth | 决策树的最大深度,默认可以不输入,如果不输入的话,决策树在建立子树的时候不会限制子树的深度。一般来说,数据少或者特征少的时候可以不管这个值。如果模型样本量多,特征也多的情况下,推荐限制这个最大深度,具体的取值取决于数据的分布。常用的可以取值10-100之间。 | |
划分时考虑的最大特征数max_features | 可以使用很多种类型的值,默认是"None",意味着划分时考虑所有的特征数;如果是"log2"意味着划分时最多考虑log2Nlog2N个特征;如果是"sqrt"或者"auto"意味着划分时最多考虑N−−√N个特征。如果是整数,代表考虑的特征绝对数。如果是浮点数,代表考虑特征百分比,即考虑(百分比xN)取整后的特征数。其中N为样本总特征数。一般来说,如果样本特征数不多,比如小于50,我们用默认的"None"就可以了,如果特征数非常多,我们可以灵活使用刚才描述的其他取值来控制划分时考虑的最大特征数,以控制决策树的生成时间。 | |
特征划分点选择标准splitter | 可以使用"best"或者"random"。前者在特征的所有划分点中找出最优的划分点。后者是随机的在部分划分点中找局部最优的划分点。默认的"best"适合样本量不大的时候,而如果样本数据量非常大,此时决策树构建推荐"random" | |
内部节点再划分所需最小样本数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
class sklearn.tree.DecisionTreeRegressor (criterion=’mse’,
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,
min_impurity_split=None,
presort=False)
没什么太大的区别,没有class_weight参数
实战部分:
from sklearn.datasets import load_boston
from sklearn.model_selection import cross_val_score
from sklearn.tree import DecisionTreeRegressor
boston = load_boston()
#分割数据
Xtrain, Xtest, Ytrain, Ytest = train_test_split(boston.data, boston.target,test_size=0.3)
#实例化模型
regressor = DecisionTreeRegressor(random_state=0)
#拟合模型
regressor = regressor.fit(Xtrain,Ytrain)
score = regressor.score(Xtest,Ytest)
predict = regressor.predict(Xtest)
apply = regressor.apply(Xtest)
score
pridict
apply
#不显示的分割训练和数据集,可以用交叉验证
#score = cross_val_score(regressor, boston.data, boston.target, cv=10,scoring = "neg_mean_squared_error").mean()
参考资料: https://live.bilibili.com/12582510
参考资料:https://shunliz.gitbooks.io/machine-learning/content/ml/decisiontree/summary.html