概述
据说这个教程是侧重于应用的,原理的我还没搞太懂,吃瓜也就看了前六章,也是模模糊糊。。。。。
sklearn就是调包,希望能学会。
流程是:
- 实例化,建立评估模型对象;
- 通过模型接口训练模型;
- 通过模型接口提取需要的信息。
对应的代码就是:
from sklearn import tree
clf = tree.DecisionTreeClassifier()
clf = clf.fit(x_train,y_train)
result = clf.score(x_test,y_test)
重要参数
- criterion,可以取信息熵和基尼系数,分别是entropy和Gini impurity。
- 随机参数:random_state设置一个随机数种子,随机生成决策树,选取最好的;splitter="random"也是随机处理。
import numpy as np
import pandas as pd
from sklearn import tree
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
import graphviz
# pandas拼接数据
df = pd.concat([pd.DataFrame(wine.data), pd.DataFrame(wine.target)],axis=1)
# 划分训练集和测试集
Xtrain, Xtest, Ytrain, Ytest = train_test_split(wine.data, wine.target, test_size=0.3)
# 实例化一个分类器
clf = tree.DecisionTreeClassifier(criterion='entropy',random_state=3,splitter="random")
# 训练
clf = clf.fit(Xtrain, Ytrain)
# 评价结果
score = clf.score(Xtest, Ytest)
# 用graphviz画出决策树
dot_data = tree.export_graphviz(clf, feature_names=wine.feature_names, class_names=['0', '1', '2'], filled=True, rounded=True, special_characters=True)
graph = graphviz.Source(dot_data)
graph
剪枝参数调优
决策树如果对训练集分类过于详尽,就可能造成对测试集的过拟合,剪枝就是防止过拟合的有效方法。
-
max_depth
限制树的最大深度,超过设定深度的树枝全部剪掉。在高维度样本量时非常有效。
在实际使用时,可以从3开始尝试,看拟合效果再决定是否增加深度。 -
min_samples_leaf , min_samples_split
min_samples_leaf限定一个节点在分支后的每个子节点都必须包含至少min_samples_leaf个训练样本,否则分支就不会发生或者分支会朝着满足每个子节点都包含min_samples_leaf个样本的方向发生。
一般搭配max_depth使用,在回归树中效果很好,可以让模型变得更加平滑。一般从5开始尝试,同时这个树还可以是小数。这个参数还可以保证每个叶子的最小尺寸,可以在回归问题中避免低方差,避免过拟合的叶子节点出现。对于多分类为题,1通常是最佳选择。
min_samples_split限定一个节点必须至少包含min_samples_split个样本,这个节点才被允许分支,否则分支就不会发生。 -
max_features 和 min_impurity_decrease
一般与max_depth一起使用,用作树的精修
max_features限制分支时考虑的特征个数,超过限制个数的特征都会被舍弃,和max_depth异曲同工。
max_features是用来限制高维度数据的过拟合的剪枝参数,器方法比较暴力,直接限制可以用的特征数量,而强行使决策树停下的参数,在不知道决策树中的各个特征的重要性的情况下,强行设定这个参数可能会导致模型学习不足。如果希望通过降维的方式防止过拟合,可以使用PCA,ICA或者特征选择模块中的降维算法。
min_impurity_decrease限制信息增益的大小,信息增益小于设定数值的分支不会发生。 -
class_weight 和 min_weight_fraction_leaf
完成样本标签平衡的参数。
就是样本标签有权重,有权重后,剪枝就要基于权重剪枝 -
确定最优剪枝参数
使用确定超参数的曲线进行判断。超参数学习曲线是一条以超参数的取值为横坐标,模型的度量指标为纵坐标的曲线,用来衡量不同超参数取值下模型的表现的曲线。在红酒数据集中就是训练得到的score。
例如:
test = []
for i in range(10):
clf = tree.DecisionTreeClassifier(criterion='entropy',random_state=30,
splitter="random",
max_depth=i+1,
)
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()
重要属性和接口
sklearn不接受一维的数据,如果样本数据是一维的,则需要用reshape(1,-1)来增维。
- apply
clf.apply(Xtest)
返回每个测试样本所在的叶子节点的索引 - predict
clf.predict(Xtest)
返回每个测试样本的分类/回归结果。