sklearn.tree.DecisionTreeClassifier 决策树模型参数详解

时间:2024-02-29 16:44:21

决策树参数如下:

class 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, min_impurity_decrease=0.0,
min_impurity_split=None, class_weight=None, presort=\'deprecated\', ccp_alpha=0.0)

可选参数:

  • criterion:分裂节点所用的标准,可选“gini”, “entropy”,默认“gini”
  • splitter:用于在每个节点上选择拆分的策略。可选“best”, “random”,默认“best”。
  • max_depth:树的最大深度。如果为None,则将节点展开,直到所有叶子都是纯净的(只有一个类),或者直到所有叶子都包含少于min_samples_split个样本。默认是None。
  • min_samples_split:拆分内部节点所需的最少样本数:如果为int,则将min_samples_split视为最小值。如果为float,则min_samples_split是一个分数,而ceil(min_samples_split * n_samples)是每个拆分的最小样本数。默认是2。
  • min_samples_leaf:在叶节点处需要的最小样本数。仅在任何深度的分割点在左分支和右分支中的每个分支上至少留下min_samples_leaf个训练样本时,才考虑。这可能具有平滑模型的效果,尤其是在回归中。如果为int,则将min_samples_leaf视为最小值。如果为float,则min_samples_leaf是分数,而ceil(min_samples_leaf * n_samples)是每个节点的最小样本数。默认是1。
  • min_weight_fraction_leaf:在所有叶节点处(所有输入样本)的权重总和中的最小加权分数。如果未提供sample_weight,则样本的权重相等。
  • max_features:寻找最佳分割时要考虑的特征数量:如果为int,则在每个拆分中考虑max_features个特征。如果为float,则max_features是一个分数,并在每次拆分时考虑int(max_features * n_features)个特征。如果为“auto”,则max_features = sqrt(n_features)。如果为“ sqrt”,则max_features = sqrt(n_features)。如果为“ log2”,则max_features = log2(n_features)。如果为None,则max_features = n_features。注意:在找到至少一个有效的节点样本分区之前,分割的搜索不会停止,即使它需要有效检查多个max_features功能也是如此。
  • random_state:随机种子,负责控制分裂特征的随机性,为整数。默认是None。
  • max_leaf_nodes:最大叶子节点数,整数,默认为None
  • min_impurity_decrease:如果分裂指标的减少量大于该值,则进行分裂。
  • min_impurity_split:决策树生长的最小纯净度。默认是0。自版本0.19起不推荐使用:不推荐使用min_impurity_split,而建议使用0.19中的min_impurity_decrease。min_impurity_split的默认值在0.23中已从1e-7更改为0,并将在0.25中删除。
  • class_weight:每个类的权重,可以用字典的形式传入{class_label: weight}。如果选择了“balanced”,则输入的权重为n_samples / (n_classes * np.bincount(y))。
  • presort:此参数已弃用,并将在v0.24中删除。
  • ccp_alpha:将选择成本复杂度最大且小于ccp_alpha的子树。默认情况下,不执行修剪。

可选函数:

  • classes_:类标签(单输出问题)或类标签数组的列表(多输出问题)。
  • feature_importances_:特征重要度。
  • max_features_:max_features的推断值。
  • n_classes_:类数(用于单输出问题),或包含每个输出的类数的列表(用于多输出问题)。
  • n_features_:执行拟合时的特征数量。
  • n_outputs_:执行拟合时的输出数量。
  • tree_:
# -*- coding: utf-8 -*-
"""
Created on Tue Aug 11 10:12:48 2020

@author: Admin
"""

# 引入数据
from sklearn import datasets
import numpy as np

iris = datasets.load_iris()
X = iris.data[:,[2,3]]
y = iris.target
print("Class labels:",np.unique(y))  #打印分类类别的种类
## 画出决策边界图(只有在2个特征才能画出来)
import matplotlib.pyplot as plt
%matplotlib inline
from matplotlib.colors import ListedColormap

def plot_decision_region(X,y,classifier,resolution=0.02):
    markers = (\'s\',\'x\',\'o\',\'^\',\'v\')
    colors = (\'red\',\'blue\',\'lightgreen\',\'gray\',\'cyan\')
    cmap = ListedColormap(colors[:len(np.unique(y))])

    # plot the decision surface
    x1_min,x1_max = X[:,0].min()-1,X[:,0].max()+1
    x2_min,x2_max = X[:,1].min()-1,X[:,1].max()+1
    xx1,xx2 = np.meshgrid(np.arange(x1_min,x1_max,resolution),
                         np.arange(x2_min,x2_max,resolution))
    Z = classifier.predict(np.array([xx1.ravel(),xx2.ravel()]).T)
    Z = Z.reshape(xx1.shape)
    plt.contourf(xx1,xx2,Z,alpha=0.3,cmap=cmap)
    plt.xlim(xx1.min(),xx1.max())
    plt.ylim(xx2.min(),xx2.max())

    # plot class samples
    for idx,cl in enumerate(np.unique(y)):
        plt.scatter(x=X[y==cl,0],
                   y = X[y==cl,1],
                   alpha=0.8,
                   c=colors[idx],
                   marker = markers[idx],
                   label=cl,
                   edgecolors=\'black\')
# 切分训练数据和测试数据
from sklearn.model_selection import train_test_split
## 30%测试数据,70%训练数据,stratify=y表示训练数据和测试数据具有相同的类别比例
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3,random_state=1,stratify=y)

from sklearn.preprocessing import StandardScaler

sc = StandardScaler()
## 估算训练数据中的mu和sigma
sc.fit(X_train)
## 使用训练数据中的mu和sigma对数据进行标准化
X_train_std = sc.transform(X_train)
X_test_std = sc.transform(X_test)

## 决策树分类器
from sklearn.tree import DecisionTreeClassifier
tree = DecisionTreeClassifier(criterion=\'gini\',max_depth=4,random_state=1)
tree.fit(X_train_std,y_train)
plot_decision_region(X_train_std,y_train,classifier=tree,resolution=0.02)
plt.xlabel(\'petal length [standardized]\')
plt.ylabel(\'petal width [standardized]\')
plt.legend(loc=\'upper left\')
plt.show()
tree_fit=tree.fit(X_train_std,y_train)
tree_fit.classes_  #array([0, 1, 2])
tree_fit.feature_importances_  #array([0.42708333, 0.57291667])
tree_fit.max_features_  #2
tree_fit.n_classes_  #3
tree_fit.n_features_  #2
tree_fit.n_outputs_  #1
tree_fit.tree_

决策树可视化:

pydotplus的安装:在命令行输入conda install -c conda-forge pydotplus

## 决策树可视化
from pydotplus import graph_from_dot_data
from sklearn.tree import export_graphviz
dot_data = export_graphviz(tree,filled=True,class_names=[\'Setosa\',\'Versicolor\',\'Virginica\'],
                          feature_names=[\'petal_length\',\'petal_width\'],out_file=None)
graph = graph_from_dot_data(dot_data)
graph.write_png(\'D:\\Users\\Desktop\\一部二部文件\\tree.png\')