详解 Scikit-learn 的 tree.DecisionTreeClassifier函数:决策树分类器

  • Post category:Python

下面就为大家详细介绍一下 Scikit-learn 中的 sklearn.tree.DecisionTreeClassifier 函数的作用与使用方法的攻略。

函数作用介绍

sklearn.tree.DecisionTreeClassifier 主要用于拟合分类树模型,它能够根据特征的值将数据集划分为多个类别,对数据进行分类。利用分类树模型建立的决策规则非常直观易懂,因此在实际应用中得到了广泛的应用。

函数语法

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=False)

函数参数说明

  • 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: 停止分裂的阈值(小于等于该值时,分裂停止),已弃用;
  • class_weight: 每个类别的权重,可以是字典形式的权重,也可以是字符串形式的权重,可以选择 ‘balanced’,默认值为 None
  • presort: 决定是否预先排序数据以加速训练,默认值为 False

函数返回值

DecisionTreeClassifier 函数返回的是一个 DecisionTreeClassifier 对象,相当于一个分类树模型。

函数使用方法

使用 DecisionTreeClassifier 函数需要先将数据集进行处理,确保数据集中无缺失值,并且特征与标签已经分离。在将数据集转化成符合使用函数要求的格式后,就可以进行分类树模型的训练了。

下面给出两个实例:

实例一

本实例将介绍如何使用 DecisionTreeClassifier 函数对鸢尾花数据集进行分类。

首先,我们需要导入必要的库并读取数据集:

import pandas as pd
import numpy as np
from sklearn.datasets import load_iris

iris = load_iris()

df = pd.DataFrame(np.column_stack((iris.data, iris.target)), columns=iris.feature_names+['target'])

读取数据后,接下来需要将数据集拆分为特征和标签:

features = iris.data
target = iris.target

然后,我们可以使用 train_test_split 函数将数据集划分为训练集和测试集,并对训练集使用 DecisionTreeClassifier 进行训练:

from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier

X_train, X_test, y_train, y_test = train_test_split(features, target, random_state=0)

model = DecisionTreeClassifier(random_state=0)
model.fit(X_train, y_train)

训练完成后,我们可以使用测试集对模型进行评估,使用 accuracy_score 函数计算分类准确率:

from sklearn.metrics import accuracy_score

y_pred = model.predict(X_test)
score = accuracy_score(y_test, y_pred)
print(score)

在本示例中,我们使用了鸢尾花数据集,使用 DecisionTreeClassifier 训练鸢尾花数据集,并将测试集的分类准确率输出。

实例二

本实例将介绍如何使用 DecisionTreeClassifier 函数对泰坦尼克乘客是否幸存进行预测。

首先,我们需要导入必要的库并读取数据集(数据集的下载链接为:https://www.kaggle.com/c/titanic/data):

import pandas as pd
import numpy as np

df_train = pd.read_csv('train.csv')
df_test = pd.read_csv('test.csv')

读取数据后,我们需要进行数据的预处理,包括缺失值的填充、特征值的处理等:

# 对 Age 特征值进行中位数填充
median_value = df_train['Age'].median()
df_train['Age'] = df_train['Age'].fillna(median_value)
df_test['Age'] = df_test['Age'].fillna(median_value)

# 对 Embarked 特征值进行频率填充
most_frequency = df_train['Embarked'].mode()[0]
df_train['Embarked'] = df_train['Embarked'].fillna(most_frequency)
df_test['Embarked'] = df_test['Embarked'].fillna(most_frequency)

# 对 Fare 特征值进行平均数填充
mean_value = df_train['Fare'].mean()
df_test['Fare'] = df_test['Fare'].fillna(mean_value)

# 对 Parch 和 SibSp 进行组合处理,生成家庭人数特征
df_train['FamilySize'] = df_train['Parch'] + df_train['SibSp'] + 1
df_test['FamilySize'] = df_test['Parch'] + df_test['SibSp'] + 1

预处理完成后,我们需要对数据进行特征工程,将非数字特征转化为数值特征,并删除一些无用的特征:

# 将 Sex、Embarked 特征的字符串数据转化为数值
df_train['Sex'] = df_train['Sex'].factorize()[0]
df_test['Sex'] = df_test['Sex'].factorize()[0]
df_train['Embarked'] = df_train['Embarked'].factorize()[0]
df_test['Embarked'] = df_test['Embarked'].factorize()[0]

# 删除无用的特征,包括 Name、Ticket、Cabin 等
df_train = df_train.drop(['Name', 'Ticket', 'Cabin'], axis=1)
df_test = df_test.drop(['Name', 'Ticket', 'Cabin'], axis=1)

然后,我们可以使用 train_test_split 函数将数据集划分为训练集和测试集,并对训练集使用 DecisionTreeClassifier 进行训练:

from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split

# 取出训练集和测试集的特征和标签
features_train = df_train.drop(['Survived'], axis=1)
targets_train = df_train['Survived']
features_test = df_test

# 将训练集划分为新的训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(features_train, targets_train, test_size=0.2, random_state=0)

# 训练 DecisionTreeClassifier 模型
model = DecisionTreeClassifier(random_state=0)
model.fit(X_train, y_train)

训练完成后,我们可以使用测试集对模型进行评估,使用 accuracy_score 函数计算分类准确率:

from sklearn.metrics import accuracy_score

y_pred = model.predict(X_test)
score = accuracy_score(y_test, y_pred)
print(score)

在本示例中,我们使用了泰坦尼克号数据集,对训练集进行了缺失值填充、特征工程,并使用 DecisionTreeClassifier 训练泰坦尼克号数据集,并将测试集的分类准确率输出。

至此,我们已经完整地介绍了 DecisionTreeClassifier 函数的作用与使用方法,包括参数、返回值、使用示例等。