先准备数据,再准备分类器,max_depth参数就是决策树的深度。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from sklearn import tree,datasets
from sklearn.model_selection import train_test_split
wine = datasets.load_wine()
X = wine.data[:,:2]
y = wine.target
X_train,X_test,y_train,y_test = train_test_split(X,y)
clf = tree.DecisionTreeClassifier(max_depth=1)
clf.fit(X_train,y_train)
cmap_light = ListedColormap(['#FFAAAA','#AAFFAA','#AAAAFF'])
cmap_bold = ListedColormap(['#FF0000','#00FF00','#0000FF'])
x_min,x_max = X_train[:,0].min() -1,X_train[:,0].max()+1
y_min,y_max = X_train[:,1].min() -1,X_train[:,1].max()+1
xx,yy = np.meshgrid(np.arange(x_min,x_max,.02),np.arange(y_min,y_max,.02))
Z = clf.predict(np.c_[xx.ravel(),yy.ravel()])
Z = Z.reshape(xx.shape)
plt.figure()
plt.pcolormesh(xx,yy,Z,cmap=cmap_light)
plt.scatter(X[:,0],X[:,1],c=y,cmap=cmap_bold,edgecolors='k',s=20)
plt.xlim(xx.min(),xx.max())
plt.ylim(yy.min(),yy.max())
plt.title("Classifier:(max_depth = 1)")
plt.show()
接下来加大深度看看结果有什么变化:
Z = clf2.predict(np.c_[xx.ravel(),yy.ravel()])
Z = Z.reshape(xx.shape)
plt.figure()
plt.pcolormesh(xx,yy,Z,cmap=cmap_light)
plt.scatter(X[:,0],X[:,1],c=y,cmap=cmap_bold,edgecolors='k',s=20)
plt.xlim(xx.min(),xx.max())
plt.ylim(yy.min(),yy.max())
plt.title("Classifier:(max_depth = 3)")
这时候分类器能进行三个分类的识别,而且大部分数据点都进入了正确的分类,接下来继续调整max_depth的值 = 5
接下来用graphviz库来展示一下决策树在每层之中都做了什么过程
export_graphviz(clf2,out_file="wine.dot",class_names=wine.target_names,feature_names=wine.feature_names[:2],impurity=False,filled=True)
with open("wine.dot") as f:
dot_grapg = f.read()
graph = graphviz.Source(dot_grapg)
工具就不下载了,从书上的图示也可以很轻松的看出是怎么运行的
export_graphviz()函数参数:
decision_tree:决策树回归器或分类器,要导出到GraphViz的决策树。
out_file=文件对象或字符串,可选(默认值=无)输出文件的句柄或名称。如果没有,结果将作为字符串返回。
max_depth:int,可选(默认值=无)表示的最大深度。如果没有,则完全生成树。
feature_names:字符串列表,可选(默认值=无)每个功能的名称。
class_names:字符串列表,布尔或无,可选(默认值=无)每个目标类的名称按升序排列。仅与分类相关,不支持多输出。如果为True,则显示类名的符号表示形式。
label:{'all','root','none'},可选(默认值为'all')是否显示杂质等的信息标签。选项包括“全部”在每个节点上显示,“根”仅在顶部根节点上显示,或“无”不在任何节点上显示。
filled:bool,可选(默认值=False)设置为True时,绘制节点以指示分类的多数类、回归值的极值或多重输出的节点纯度。
leaves_parallel:bool,可选(默认值=False)设置为True时,在树的底部绘制所有叶节点。
impurity:bool,可选(默认值=真)设置为True时,显示每个节点上的杂质。
node_ids:bool,可选(默认值=False)设置为True时,显示每个节点上的ID号。
proportion:bool,可选(默认值=False)设置为True时,将“值”和/或“样本”的显示分别更改为比例和百分比。
rotate:bool,可选(默认值=False)设置为True时,将树的方向从左到右,而不是从上到下。
rounded:bool,可选(默认值=False)设置为True时,使用圆角绘制节点框,并使用Helvetica字体而不是Times Roman字体。
special_characters:bool,可选(默认值=False)设置为False时,忽略特殊字符以实现PostScript兼容性。
precision:int,可选(默认值=3)每个节点的杂质值、阈值和值属性中的浮点精度位数。
Return->dot_data:串类型输入树的字符串表示形式为GraphViz点格式。仅当out_文件为None时返回。
学习还是很有效果的,现在读程序没有一开始这么困难了,基本可以知道每个函数的作用,继续努力。
决策树可以非常方便的将模型进行可视化,并不需要对数据进行转换,几乎不用对数据进行预处理。缺点就是不可避免的会出现过拟合的问题,为了解决这一问题可以使用随机森林法
随机森林
RandomForestClassifier()参数:
n_estimators:数值型取值
含义:森林中决策树的个数,默认是10criterion:字符型取值
含义:采用何种方法度量分裂质量,信息熵或者基尼指数,默认是基尼指数max_features:取值为int型, float型, string类型, or None(),默认"auto"
含义:寻求最佳分割时的考虑的特征数量,即特征数达到多大时进行分割。
int:max_features等于这个int值
float:max_features是一个百分比,每(max_features * n_features)特征在每个分割出被考虑。
"auto":max_features等于sqrt(n_features)
"sqrt":同等于"auto"时
"log2":max_features=log2(n_features)
None:max_features = n_featuresmax_depth:int型取值或者None,默认为None
含义:树的最大深度min_samples_split:int型取值,float型取值,默认为2
含义:分割内部节点所需的最少样本数量
int:如果是int值,则就是这个int值
float:如果是float值,则为min_samples_split * n_samplesmin_samples_leaf:int取值,float取值,默认为1
含义:叶子节点上包含的样本最小值
int:就是这个int值
float:min_samples_leaf * n_samplesmin_weight_fraction_leaf : float,default=0.
含义:能成为叶子节点的条件是:该节点对应的实例数和总样本数的比值,至少大于这个min_weight_fraction_leaf值max_leaf_nodes:int类型,或者None(默认None)
含义:最大叶子节点数,以最好的优先方式生成树,最好的节点被定义为杂质相对较少,即纯度较高的叶子节点min_impurity_split:float取值
含义:树增长停止的阀值。一个节点将会分裂,如果他的杂质度比这个阀值;如果比这个值低,就会成