自学机器学习之sklearn实现决策树和随机森林及其参数的解释

最近一直在补c++的知识,所以好久没有更新了,深深的罪恶感啊。。。

今天更新决策树和随机森林,数学推导在书本上都有。所以现在只用sklearn来实现决策树和随机森林。重点在参数的详细解释。。

直接上代码:

from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris

from sklearn.model_selection import train_test_split

datas = load_iris()

x  = datas.data
y = datas.target

x_train,x_test,y_train,y_test =train_test_split(x, y, test_size=0.3)

clf = DecisionTreeClassifier()
train = clf.fit(x_train,y_train)

print(train.predict(x_test))
print(y_test)

其中官网对 DecisionTreeClassifier的解释: 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,class_weight=None, presort=False)

criterion:string类型,可选(默认为”gini”)
衡量分类的质量。支持的标准有”gini”代表的是Gini impurity(不纯度)与”entropy”代表的是information gain(信息增益)。

splitter:string类型,可选(默认为”best”)
一种用来在节点中选择分类的策略。支持的策略有”best”,选择最好的分类,”random”选择最好的随机分类。

max_features:int,float,string or None 可选(默认为None)
在进行分类时需要考虑的特征数。
1.如果是int,在每次分类是都要考虑max_features个特征。
2.如果是float,那么max_features是一个百分率并且分类时需要考虑的特征数是int(max_features*n_features,其中n_features是训练完成时发特征数)。
3.如果是auto,max_features=sqrt(n_features)
4.如果是sqrt,max_features=sqrt(n_features)
5.如果是log2,max_features=log2(n_features)
6.如果是None,max_features=n_features
注意:至少找到一个样本点有效的被分类时,搜索分类才会停止。

max_depth:int or None,可选(默认为”None”)
表示树的最大深度。如果是”None”,则节点会一直扩展直到所有的叶子都是纯的或者所有的叶子节点都包含少于min_samples_split个样本点。忽视max_leaf_nodes是不是为None。

min_samples_split:int,float,可选(默认为2)
区分一个内部节点需要的最少的样本数。
1.如果是int,将其最为最小的样本数。
2.如果是float,min_samples_split是一个百分率并且ceil(min_samples_split*n_samples)是每个分类需要的样本数。ceil是取大于或等于指定表达式的最小整数。

min_samples_leaf:int,float,可选(默认为1)
一个叶节点所需要的最小样本数:
1.如果是int,则其为最小样本数
2.如果是float,则它是一个百分率并且ceil(min_samples_leaf*n_samples)是每个节点所需的样本数。

min_weight_fraction_leaf:float,可选(默认为0)
一个叶节点的输入样本所需要的最小的加权分数。

扫描二维码关注公众号,回复: 2935855 查看本文章

max_leaf_nodes:int,None 可选(默认为None)
在最优方法中使用max_leaf_nodes构建一个树。最好的节点是在杂质相对减少。如果是None则对叶节点的数目没有限制。如果不是None则不考虑max_depth.

class_weight:dict,list of dicts,”Banlanced” or None,可选(默认为None)
表示在表{class_label:weight}中的类的关联权值。如果没有指定,所有类的权值都为1。对于多输出问题,一列字典的顺序可以与一列y的次序相同。
“balanced”模型使用y的值去自动适应权值,并且是以输入数据中类的频率的反比例。如:n_samples/(n_classes*np.bincount(y))。
对于多输出,每列y的权值都会想乘。
如果sample_weight已经指定了,这些权值将于samples以合适的方法相乘。

random_state:int,RandomState instance or None
如果是int,random_state 是随机数字发生器的种子;如果是RandomState,random_state是随机数字发生器,如果是None,随机数字发生器是np.random使用的RandomState instance.

persort:bool,可选(默认为False)
是否预分类数据以加速训练时最好分类的查找。在有大数据集的决策树中,如果设为true可能会减慢训练的过程。当使用一个小数据集或者一个深度受限的决策树中,可以减速训练的过程。

详细的解释可以参考官网:点此链接

对于随机森林RandomForestRegressor,是由一颗颗树生成的,严格意义上说,随机森林的参数是包含树 的参数的,由于上面解释了树,下面只解释RandomForestRegressor的参数:

from sklearn.ensemble import RandomForestRegressor

from sklearn.datasets import  load_iris

from sklearn.model_selection import  train_test_split

datas = load_iris()
# print(datas)

data_x = datas.data

data_y = datas.target

# print(data_x)
# print(data_y)


x_train,x_test,y_train,y_test = train_test_split(data_x,data_y,test_size=0.3)

pcl = RandomForestRegressor()

train = pcl.fit(x_train,y_train)
p = pcl.predict(x_test)
print(p)
print(type(p))
print(type(y_test))
print(y_test)

官网对随机森林的解释:

class sklearn.ensemble.RandomForestRegressor(n_estimators=10, criterion=’mse’, max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=’auto’, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, bootstrap=True, oob_score=False, n_jobs=1, random_state=None, verbose=0, warm_start=False)

这里只给出了随机森林的参数:

n_estimators=10: 决策树的个数,越多越好,但是性能就会越差,至少100左右(具体数字忘记从哪里来的了)可以达到可接受的性能和误差率。

bootstrap=True: 是否有放回的采样。

oob_score=False: oob(out of band,带外)数据,即:在某次决策树训练中没有被bootstrap选中的数据。多单个模型的参数训练,我们知道可以用cross validation(cv)来进行,但是特别消耗时间,而且对于随机森林这种情况也没有大的必要,所以就用这个数据对决策树模型进行验证,算是一个简单的交叉验证。性能消耗小,但是效果不错。

n_jobs=1: 并行job个数。这个在ensemble算法中非常重要,尤其是bagging(而非boosting,因为boosting的每次迭代之间有影响,所以很难进行并行化),因为可以并行从而提高性能。1=不并行;n:n个并行;-1:CPU有多少core,就启动多少job

warm_start=False: 热启动,决定是否使用上次调用该类的结果然后增加新的。

class_weight=None: 各个label的权重。

猜你喜欢

转载自blog.csdn.net/songjinxaing/article/details/79793795