Class 1 决策树
决策树介绍
概述
决策树是如何工作的
决策树(Decision Tree)是一种非参数的有监督学习方法,它能够从一系列有特征和标签的数据中总结出决策规则,并用树状图的结构来呈现这些规则,以解决分类和回归问题
节点:
最初的问题所在的地方叫做根节点,在得到结论前的每一个问题都是中间节点,而得到的每一个结论(动物的类别)都叫做叶子节点
决策树算法的核心是要解决两个问题:
1)如何从数据表中找出最佳节点和最佳分枝?
2)如何让决策树停止生长,防止过拟合?
Skleran中的决策树
模块 sklearn.tree
sklearn模型建立流程
分类树对应的代码
1
2
3
4
5from sklearn import tree #导入需要的模块 clf = tree.DecisionTreeClassifier() #实例化 clf = clf.fit(X_train,y_train) #用训练集数据训练模型 result = clf.score(X_test,y_test) #导入测试集,从接口中调用需要的信息
分类树 DecisionTreeClassifier与红酒数据集
重要参数
criterion(规定不纯度的计算)
这个参数是确定计算不纯度的方法
对分类树来说,衡量最佳节点和最佳的分枝方法这个“最佳”的指标叫做“不纯度”
通常来说,不纯度越低,决策树对训练集的拟合越好。现在使用的决策树算法在分枝方法上的核心大多是围绕在对某个不纯度相关指标的最优化上
Criterion这个参数正是用来决定不纯度的计算方法的。sklearn提供了两种选择:
1)输入”entropy“,使用信息熵(Entropy)
2)输入”gini“,使用基尼系数(Gini Impurity)
比起基尼系数,信息熵对不纯度更加敏感,对不纯度的惩罚最强。但是在实际使用中,信息熵和基尼系数的效果基本相同
决策树的计算流程
random_state & splitter(控制决策树的随机模式)
random_state用来设置分枝中的随机模式的参数,默认None,确定了random_state后,模式就固定下来了,低维度的数据(比如鸢尾花数据集),随机性几乎不会显现
splitter也是用来控制决策树中的随机选项的有两种输入值,
输入”best",决策树在分枝时虽然随机,但是还是会优先选择更重要的特征进行分枝
输入“random",决策树在分枝时会更加随机,树会因为含有更多的不必要信息而更深更大,并因这些不必要信息而降低对训练集的拟合。
class_weight & min_weight_fraction_leaf (目标权重参数)
在样本不平衡的时候使用,完成样本标签平衡的参数。样本不平衡是指在一组数据集中,标签的一类天生占有很大的比例,比如说一个人信用是否良好,99%都是良好,但是不代表那1%我们不在乎。
因此我们要使用class_weight参数对样本标签进行一定的均衡,给少量的标签更多的权重,让模型更偏向少数类,向捕获少数类的方向建模。该参数默认None,此模式表示自动给与数据集中的所有标签相同的权重
min_weight_fraction_leaf这个基于权重的剪枝参数来使用(基于权重的剪枝)
剪枝参数
为什么要进行剪枝
max_depth (树的深度)
限制树的最大深度,超过设定深度的树枝全部剪掉,这是用得最广泛的剪枝参数,在高维度低样本量时非常有效。决策树多生长一层,对样本量的需求会增加一倍,所
以限制树深度能够有效地限制过拟合。在集成算法中也非常实用。实际使用时,建议从=3开始尝试,看看拟合的效果再决定是否增加设定深度
min_samples_leaf & min_samples_split
min_samples_leaf :叶子节点最小包含的样本数
一个节点在分枝后的每个子节点都必须包含至少min_samples_leaf个训练样本,否则分枝就不会发生,或者,分枝会朝着满足每个子节点都包含min_samples_leaf个样本的方向去发,一般搭配max_depth使用,在回归树中有神奇的效果,可以让模型变得更加平滑
min_samples_split:中间节点最小包含的样本数
一个节点必须要包含至少min_samples_split个训练样本,这个节点才允许被分枝,否则分枝就不会发生
max_features & min_impurity_decrease
max_features
max_features限制分枝时考虑的特征个数,超过限制个数的特征都会被舍弃
min_impurity_decrease
min_impurity_decrease限制信息增益的大小,信息增益小于设定数值的分枝不会发生
确定最优的剪枝参数
使用确定超参数的曲线来进行判断,
**超参数的学习曲线:**一条以超参数的取值为横坐标,模型的度量指标为纵坐标的曲线,它是用来衡量不同超参数取值下模型的表现的线
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15import 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_importances_
特征对这个决策树的特征
1
2
3
4
5
6
7>>> clf.feature_importances_ >>> array([0. , 0.04084697, 0. , 0. , 0. , 0. , 0.298995 , 0. , 0. , 0.14117746, 0. , 0.03251792, 0.48646265])
更直观的展示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18>>> # 更直观的观察特征的重要性 [*zip(feature_names,clf.feature_importances_)] >>> [('酒精', 0.0), ('苹果酸', 0.040846969416378096), ('灰', 0.0), ('灰的碱性', 0.0), ('镁', 0.0), ('总酚', 0.0), ('类黄酮', 0.2989950010851191), ('非黄烷类酚类', 0.0), ('花青素', 0.0), ('颜色强度', 0.14117746164216577), ('色调', 0.0), ('od280/od315稀释葡萄酒', 0.03251791557296616), ('脯氨酸', 0.48646265228337093)]
apply&predict
1
2
3
4
5
6
7
8#apply返回每个测试样本所在的叶子节点的索引 >>> clf.apply(Xtest) >>>array([22, 4, 13, 6, 4, 25, 16, 32, 13, 32, 22, 6, 4, 32, 24, 6, 6, 32, 32, 24, 32, 9, 32, 16, 4, 4, 32, 4, 4, 22, 32, 16, 32, 6, 16, 6], dtype=int64)
1
2
3
4
5
6
7>>> #predict返回每个测试样本的分类/回归结果 clf.predict(Xtest) >>> array([1, 2, 1, 2, 2, 0, 1, 0, 1, 0, 1, 2, 2, 0, 1, 2, 2, 0, 0, 1, 0, 2, 0, 1, 2, 2, 0, 2, 2, 1, 0, 1, 0, 2, 1, 2])
代码实践
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32# 导入相关的库 from sklearn import tree from sklearn.datasets import load_wine from sklearn.model_selection import train_test_split import pandas as pd import graphviz # load data wine = load_wine() data = wine.data target = wine.target print('data{} target{}'.format(data.shape,target.shape)) Xtrain,Xtest,Ytrain,Ytest = train_test_split(data,target,test_size = 0.2) print('Xtrain{},Xtest{},Ytrain{},Ytest{}'.format(Xtrain.shape,Xtest.shape,Ytrain.shape,Ytest.shape)) # tree clf = tree.DecisionTreeClassifier(criterion='entropy') clf = clf.fit(Xtrain,Ytrain) score = clf.score(Xtest,Ytest)# 返回预测的准确度 print(score) # 绘制出建立的决策树 feature_names = ['酒精','苹果酸','灰','灰的碱性','镁','总酚','类黄酮', '非黄烷类酚类','花青素','颜色强度','色调','od280/od315稀释葡萄酒','脯氨酸'] dot_data=tree.export_graphviz(clf, feature_names=feature_names, class_names=['A','B','C'], filled=True, #是否填充颜色 rounded=True #绘制的图案的形状 ) graph = graphviz.Source(dot_data) graph
回归树DecisionTreeRegressor
1
2
3
4class 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)
重要参数,属性及接口
criterion (回归树衡量分支质量的指标)
1)输入"mse"使用均方误差mean squared error(MSE),父节点和叶子节点之间的均方误差的差额将被用来作为
特征选择的标准,这种方法通过使用叶子节点的均值来最小化L2损失
2)输入“friedman_mse”使用费尔德曼均方误差,这种指标使用弗里德曼针对潜在分枝中的问题改进后的均方误差
3)输入"mae"使用绝对平均误差MAE(mean absolute error),这种指标使用叶节点的中值来最小化L1损失
属性中最重要的依然是feature_importances_,接口依然是apply, fit, predict, score最核心。
代码实践
1
2
3
4
5
6
7
8
9from sklearn.datasets import load_boston from sklearn.model_selection import cross_val_score from sklearn.tree import DecisionTreeRegressor boston = load_boston() regressor = DecisionTreeRegressor(random_state=0) cross_val_score(regressor, boston.data, boston.target, cv=10, scoring = "neg_mean_squared_error") #交叉验证cross_val_score的用法
实例:泰坦尼克号幸存者的预测
导入库和数据
1
2
3
4
5
6import pandas as pd from sklearn.tree import DecisionTreeClassifier from sklearn.model_selection import train_test_split from sklearn.model_selection import GridSearchCV from sklearn.model_selection import cross_val_score
1
2
3
4
5dir_path = r'D:data53_24630_机器学习-Sklearn1 决策树课件数据源码' file_name = r'data.csv' file_path = '{}{}'.format(dir_path,file_name) data = pd.read_csv(file_path)
产看数据信息
1
2
3
4
5# 查看pandas前几行 data.head(5) # 打印数据信息 data.info()
进行数据的预处理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15# 删除缺失值过多的和无关的行 data.drop(['Cabin','Name','Ticket'],inplace=True,axis=1) # 填补重要列的缺失值 data['Age'] = data['Age'].fillna(data['Age'].mean()) data=data.dropna() # 讲分类变量转换为数值型变量 # 将二分类转换为数值型变量 data['Sex']=(data['Sex']=='male').astype('int') # 将三分类问题转换为数值型变量 labels = data['Embarked'].unique().tolist() data['Embarked'] = data['Embarked'].apply(lambda x: labels.index(x)) # 查看最后的结果 data.head()
将类别转换为数值型变量
labels = data[‘Embarked’].unique().tolist()
data[‘Embarked’] = data[‘Embarked’].apply(lambda x: labels.index(x))
(注意这种方式只适用于类别之间没有关联关系的情况)
提取标签和特征矩阵,分测试集和训练集
1
2
3
4
5
6
7
8
9
10# 分离特征和标签 x = data.iloc[:,data.columns != 'Survived'] y = data.iloc[:,data.columns == 'Survived'] # 划分训练集和测试集 Xtrain,Xtest,Ytrain,Ytest = train_test_split(x,y,test_size=0.3) # 修正训练集和测试集的索引 for i in [Xtrain,Xtest,Ytrain,Ytest]: i.index = range(i.shape[0]) Xtrain.head(5)
粗跑一下查看效果
1
2
3
4
5clf = DecisionTreeClassifier(random_state=25) clf = clf.fit(Xtrain,Ytrain) score_ = clf.score(Xtest,Ytest) score_
1
2
3score_ = cross_val_score(clf,x,y,cv=10).mean() score_
使用交叉验证效果
调整参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18tr = [] te = [] for i in range(10): clf = DecisionTreeClassifier(random_state = 25, max_depth = i+1, criterion='entropy') clf = clf.fit(Xtrain,Ytrain) score_tr = clf.score(Xtrain,Ytrain) score_te = cross_val_score(clf,x,y,cv=10).mean() tr.append(score_tr) te.append(score_te) print(max(te)) plt.plot(range(1,11),tr,color='red',label='train') plt.plot(range(1,11),te,color='blue',label='test') plt.xticks(range(1,11)) plt.legend() plt.show()
进行参数的调整,并观察效果
采用循环查看树的深度对训练误差和测试误差的影响
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18tr = [] te = [] for i in range(10): clf = DecisionTreeClassifier(random_state = 25, max_depth = i+1, criterion='entropy') clf = clf.fit(Xtrain,Ytrain) score_tr = clf.score(Xtrain,Ytrain) score_te = cross_val_score(clf,x,y,cv=10).mean() tr.append(score_tr) te.append(score_te) print(max(te)) plt.plot(range(1,11),tr,color='red',label='train') plt.plot(range(1,11),te,color='blue',label='test') plt.xticks(range(1,11)) plt.legend() plt.show()
网格搜索
1
2
3
4
5
6
7
8
9
10
11
12# 一串参数和这些参数对应的,我们希望网格搜索搜索的参数和取值范围 parameters = {'criterion':('gini','entropy'), "max_depth":[*range(1,10)], 'min_samples_leaf':[*range(1,50,5)], 'min_impurity_decrease':[*np.linspace(0,0.5,20)] } clf = DecisionTreeClassifier(random_state = 25) GS = GridSearchCV(clf,parameters,cv=10) GS = GS.fit(Xtrain,Ytrain) GS,beest_params_,GS.best_score_
最后
以上就是光亮茉莉最近收集整理的关于Class 1 决策树Class 1 决策树决策树介绍分类树 DecisionTreeClassifier与红酒数据集回归树DecisionTreeRegressor实例:泰坦尼克号幸存者的预测的全部内容,更多相关Class内容请搜索靠谱客的其他文章。
发表评论 取消回复