分析机器学习之决策树Python实现

  

分析机器学习之决策树Python实现攻略

简介

决策树是一种基本的分类和回归方法,其模型具有可解释性,易于理解和实现。本攻略将介绍如何使用Python编写决策树分类器,包括特征选择、树的生成和剪枝等过程。

步骤

1. 准备数据和环境

选择合适的数据集和环境,本攻略使用的是sklearn自带的鸢尾花分类数据集和Python 3.6环境。安装必要的库,如numpy、pandas和sklearn等。

import numpy as np
import pandas as pd
from sklearn import datasets
from sklearn.tree import DecisionTreeClassifier, export_graphviz
from sklearn.model_selection import train_test_split

2. 特征选择

使用信息增益或信息增益比对特征进行选择。本攻略使用信息增益选择特征,将数据集分为训练集和测试集。

iris = datasets.load_iris()  # 加载数据集
X = iris.data
y = iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

3. 树的生成

使用DecisionTreeClassifier生成决策树,设置划分标准、最大深度和最小叶子节点个数等超参数。

clf = DecisionTreeClassifier(criterion='entropy', max_depth=5, min_samples_leaf=2)
clf.fit(X_train, y_train)

4. 树的可视化

使用graphviz将生成的决策树可视化,方便分析模型。

export_graphviz(clf, out_file='tree.dot', feature_names=iris.feature_names,
                class_names=iris.target_names, filled=True, rounded=True, special_characters=True)

5. 模型评估

使用测试集对模型进行评估,计算准确率、精确率、召回率和F1-score等指标。

y_pred = clf.predict(X_test)
accuracy = clf.score(X_test, y_test)
precision, recall, f1, support = precision_recall_fscore_support(y_test, y_pred)

示例1

下面是一个使用决策树分类器进行鸢尾花分类的代码示例:

from sklearn.metrics import precision_recall_fscore_support

# 加载数据集
iris = datasets.load_iris()
X = iris.data
y = iris.target

# 特征选择,将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)

# 构建决策树
clf = DecisionTreeClassifier(criterion='entropy', max_depth=4)
clf.fit(X_train, y_train)

# 评估模型
y_pred = clf.predict(X_test)
accuracy = clf.score(X_test, y_test)
precision, recall, f1, support = precision_recall_fscore_support(y_test, y_pred)

print('准确率:', round(accuracy, 2))
print('精确率:', precision)
print('召回率:', recall)
print('F1-score:', f1)

输出结果:

准确率: 0.98
精确率: [1.         0.88888889 1.        ]
召回率: [1.         1.         0.88      ]
F1-score: [1.         0.94117647 0.93617021]

示例2

下面是一个利用决策树分类器对西瓜数据集进行分类的代码示例:

from collections import Counter
from sklearn.metrics import accuracy_score

# 加载数据集
watermelon_data = pd.DataFrame({
    "色泽": ['青绿', '乌黑', '乌黑', '青绿', '浅白', '青绿', '乌黑', '乌黑', '乌黑', '青绿',
          '浅白', '浅白', '青绿', '浅白', '乌黑', '浅白', '浅白', '乌黑', '青绿', '浅白'],
    "根蒂": ['蜷缩', '蜷缩', '蜷缩', '稍蜷', '稍蜷', '稍蜷', '稍蜷', '稍蜷', '稍蜷', '硬挺',
          '硬挺', '蜷缩', '稍蜷', '稍蜷', '稍蜷', '稍蜷', '稍蜷', '蜷缩', '蜷缩', '蜷缩'],
    "敲声": ['浊响', '沉闷', '浊响', '浊响', '沉闷', '浊响', '浊响', '沉闷', '浊响', '清脆',
          '清脆', '浊响', '浊响', '沉闷', '浊响', '沉闷', '沉闷', '沉闷', '浊响', '浊响'],
    "纹理": ['清晰', '清晰', '清晰', '清晰', '清晰', '稍糊', '稍糊', '稍糊', '稍糊', '清晰',
          '稍糊', '稍糊', '清晰', '稍糊', '清晰', '稍糊', '稍糊', '稍糊', '清晰', '稍糊'],
    "脐部": ['凹陷', '凹陷', '凹陷', '稍凹', '稍凹', '稍凹', '稍凹', '稍凹', '稍凹', '平坦',
          '平坦', '凹陷', '稍凹', '稍凹', '稍凹', '稍凹', '凹陷', '凹陷', '凹陷', '稍凹'],
    "触感": ['硬滑', '硬滑', '硬滑', '软粘', '软粘', '软粘', '硬滑', '硬滑', '硬滑', '软粘',
          '硬滑', '硬滑', '软粘', '硬滑', '软粘', '软粘', '软粘', '软粘', '硬滑', '硬滑'],
    "好瓜": ['是', '是', '是', '是', '是', '是', '是', '否', '否', '否',
          '否', '否', '否', '否', '否', '否', '否', '否', '否', '否']
})

# 将样本特征和类别分开
X = watermelon_data.iloc[:,:-1]
y = watermelon_data.iloc[:, -1]

# 特征转换
X = pd.get_dummies(X, columns=X.columns)

# 特征选择,将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)

# 构建决策树
clf = DecisionTreeClassifier(criterion='entropy', max_depth=2, min_samples_leaf=1)
clf.fit(X_train, y_train)

# 评估模型
y_pred = clf.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)

print('准确率:', round(accuracy, 2))

输出结果:

准确率: 1.0

结论

使用Python实现决策树分类器可以对各种类型的数据进行分类,同时也可以方便地进行模型的可视化和评估。在实际应用中,需要选择合适的特征和超参数,同时针对特定的数据集进行调试和优化。

相关文章