机器学习基础之《分类算法(6)—决策树》

一、决策树

1、认识决策树

决策树思想的来源非常朴素,程序设计中的条件分支结构就是if-else结构,最早的决策树就是利用这类结构分割数据的一种分类学习方法

2、一个对话的例子

想一想这个女生为什么把年龄放在最上面判断!!!

如何高效的进行决策?特征的先后顺序

二、决策树分类原理详解

1、我们通过一个问题例子

已知有四个特征值,预测是否贷款给某个人

(1)先看房子,再看工作 --> 是否贷款(只看了两个特征)

(2)年龄,信贷情况,工作 --> 看了三个特征

第二种这种方式就没有第一种高效

希望能够找到一种数学的方法,快速自动的判断,应该先看哪个特征

2、信息论基础

需要引入信息熵、信息增益等信息论的知识!!!

(1)信息

香农定义的:消除随机不定性的东西

小明 年龄 "我今年18岁"

小华 "小明明年19岁"

小明说了之后,小华说的这句话就变成废话了,不是信息

(2)信息的衡量 -- 信息量 -- 信息熵

3、信息熵的定义

H的专业术语称之为信息熵,单位为比特bit

4、以银行贷款数据为例,计算信息熵

某人,已知年龄、工作、房子、信贷情况,是否贷款给这个人?

需要衡量不确定性的大小

这里有两种情况,一种是贷款,一种是不贷款

不贷款的概率是6/15,贷款的概率是9/15

H(总) = -(6/15 * log 6/15 + 9/15 * log 9/15) = 0.971

当我们知道某一个特征之后,不确定性会减少

那么我们如果能求出,知道某个特征之后,不确定性减少的程度。再比较,知道哪一个特征之后,不确定性减少的程度是最多的。我们是不是可以先看这个特征

求当知道某个特征之后,它的信息熵是多少?

引入---信息增益

5、信息增益

决策树的划分依据之一---信息增益

(1)定义和公式

特征A对训练数据集D的信息增益g(D,A),定义为集合D的信息熵H(D)与特征A给定条件下D的信息条件熵H(D|A)之差

g(D,A) = H(D) - 条件熵H(D|A)

信息增益就衡量了,知道某个特征之后,它的不确定性的减少程度

计算知道年龄之后的信息增益是多少:

g(D,年龄) = H(D) - H(D|年龄)

求H(D|年龄):

H(青年) = -(2/5 * log 2/5 + 3/5 * log 3/5) =

H(中年) = -(2/5 * log 2/5 + 3/5 * log 3/5) =

H(老年) = -(1/5 * log 1/5 + 4/5 * log 4/5) =

H(D|年龄) = 1/3 * H(青年) + 1/3 * H(中年) + 1/3 * H(老年)

我们以A1、A2、A3、A4代表年龄、有工作、有自己的房子和贷款情况。最终计算的结果g(D, A1) = 0.313, g(D, A2) = 0.324, g(D, A3) = 0.420,g(D, A4) = 0.363。所以我们选择A3作为划分的第一个特征

(2)公式

(3)当然决策树的原理不止信息增益这一种,还有其他方法

ID3:

信息增益,最大的准则

C4.5:

信息增益比,最大的准则

CART:

分类树:基尼系数,最小的准则,在sklearn中可以选择划分的默认原则

优势:划分更加细致(从后面的例子来理解)

三、决策树API

1、API

class sklearn.tree.DecisionTreeClassifier(criterion='gini', max_depth=None, random_state=None)

决策树分析器

criterion:默认是'gini'系数,也可以选择信息增益的熵'entropy'

max_depth:树的深度大小

树的深度太大,会过拟合

过拟合会导致模型泛化能力差,即过度适合当前样本集而缺乏适应(预测)新样本的能力

random_state:随机数种子

2、决策树对鸢尾花分类

python 复制代码
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.tree import DecisionTreeClassifier

def KNN_iris():
    """
    用KNN算法对鸢尾花进行分类
    """
    # 1、获取数据
    iris = load_iris()
    print("iris.data:\n", iris.data)
    print("iris.target:\n", iris.target)
    # 2、划分数据集
    x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=6)
    # 3、特征工程:标准化
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    # 用训练集的平均值和标准差对测试集的数据来标准化
    # 这里测试集和训练集要有一样的平均值和标准差,而fit的工作就是计算平均值和标准差,所以train的那一步用fit计算过了,到了test这就不需要再算一遍自己的了,直接用train的就可以
    x_test = transfer.transform(x_test)
    # 4、KNN算法预估器
    estimator = KNeighborsClassifier(n_neighbors=3)
    estimator.fit(x_train, y_train)
    # 5、模型评估
    # 方法1:直接比对真实值和预测值
    y_predict = estimator.predict(x_test)
    print("y_predict:\n", y_predict)
    print("直接比对真实值和预测值:\n", y_test == y_predict)
    # 方法2:计算准确率
    score = estimator.score(x_test, y_test)
    print("准确率为:\n", score)
    return None
 
def KNN_iris_gscv():
    """
    用KNN算法对鸢尾花进行分类,添加网格搜索和交叉验证
    """
    # 1、获取数据
    iris = load_iris()
    print("iris.data:\n", iris.data)
    print("iris.target:\n", iris.target)
    # 2、划分数据集
    x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=6)
    # 3、特征工程:标准化
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    # 用训练集的平均值和标准差对测试集的数据来标准化
    # 这里测试集和训练集要有一样的平均值和标准差,而fit的工作就是计算平均值和标准差,所以train的那一步用fit计算过了,到了test这就不需要再算一遍自己的了,直接用train的就可以
    x_test = transfer.transform(x_test)
    # 4、KNN算法预估器
    estimator = KNeighborsClassifier()
    # 加入网格搜索和交叉验证
    # 参数准备
    param_dict = {"n_neighbors": [1, 3, 5, 7, 9, 11]}
    estimator = GridSearchCV(estimator, param_grid=param_dict, cv=10)
    estimator.fit(x_train, y_train)
    # 5、模型评估
    # 方法1:直接比对真实值和预测值
    y_predict = estimator.predict(x_test)
    print("y_predict:\n", y_predict)
    print("直接比对真实值和预测值:\n", y_test == y_predict)
    # 方法2:计算准确率
    score = estimator.score(x_test, y_test)
    print("准确率为:\n", score)
    #最佳参数:best_params_
    print("最佳参数:\n", estimator.best_params_)
    #最佳结果:best_score_
    print("最佳结果:\n", estimator.best_score_)
    #最佳估计器:best_estimator_
    print("最佳估计器:\n", estimator.best_estimator_)
    #交叉验证结果:cv_results_
    print("交叉验证结果:\n", estimator.cv_results_)
    return None

def nb_news():
    """
    用朴素贝叶斯算法对新闻进行分类
    """
    # 1、获取数据
    news = fetch_20newsgroups(subset="all")
    # 2、划分数据集
    x_train, x_test, y_train, y_test = train_test_split(news.data, news.target)
    # 3、特征工程:文本特征抽取-tfidf
    transfer = TfidfVectorizer()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)
    # 4、朴素贝叶斯算法预估器流程
    estimator = MultinomialNB()
    estimator.fit(x_train, y_train)
    # 5、模型评估
    # 方法1:直接比对真实值和预测值
    y_predict = estimator.predict(x_test)
    print("y_predict:\n", y_predict)
    print("直接比对真实值和预测值:\n", y_test == y_predict)
    # 方法2:计算准确率
    score = estimator.score(x_test, y_test)
    print("准确率为:\n", score)
    return None

def decision_iris():
    """
    用决策树对鸢尾花数据进行分类
    """
    # 1、获取数据集
    iris = load_iris()
    # 2、划分数据集
    x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=6)
    # 3、决策树预估器
    estimator = DecisionTreeClassifier(criterion='entropy')
    estimator.fit(x_train, y_train)
    # 4、模型评估
    # 方法1:直接比对真实值和预测值
    y_predict = estimator.predict(x_test)
    print("y_predict:\n", y_predict)
    print("直接比对真实值和预测值:\n", y_test == y_predict)
    # 方法2:计算准确率
    score = estimator.score(x_test, y_test)
    print("准确率为:\n", score)
    return None

if __name__ == "__main__":
    # 代码1:用KNN算法对鸢尾花进行分类
    KNN_iris()
    # 代码2:用KNN算法对鸢尾花进行分类,添加网格搜索和交叉验证
    #KNN_iris_gscv()
    # 代码3:用朴素贝叶斯算法对新闻进行分类
    #nb_news()
    # 代码4:用决策树对鸢尾花数据进行分类
    decision_iris()

运行结果:

python 复制代码
y_predict:
 [0 2 0 0 2 1 1 0 2 1 2 1 2 2 1 1 2 1 1 0 0 2 0 0 1 1 1 2 0 1 0 1 0 0 1 2 1
 2]
直接比对真实值和预测值:
 [ True  True  True  True  True  True False  True  True  True  True  True
  True  True  True False  True  True  True  True  True  True  True  True
  True  True  True  True  True  True  True  True  True  True False  True
  True  True]
准确率为:
 0.9210526315789473
y_predict:
 [0 2 0 0 2 1 1 0 2 1 2 1 2 2 1 1 2 1 1 0 0 2 0 0 1 1 1 2 0 1 0 1 0 0 1 2 1
 2]
直接比对真实值和预测值:
 [ True  True  True  True  True  True False  True  True  True  True  True
  True  True  True False  True  True  True  True  True  True  True  True
  True  True  True  True  True  True  True  True  True  True False  True
  True  True]
准确率为:
 0.9210526315789473

KNN是一种懒惰算法,在计算的时候,它在内存里疯狂的计算跟每个样本之间的距离

决策树应用场景更适合运用在数据量比较大的情况下

相关推荐
茜茜西西CeCe37 分钟前
数字图像处理-领域平均滤波
图像处理·机器学习·计算机视觉·matlab·领域平均滤波
AI technophile38 分钟前
OpenCV计算机视觉实战(26)——OpenCV与机器学习
opencv·机器学习·计算机视觉
Q264336502310 小时前
【有源码】基于Hadoop生态的大数据共享单车数据分析与可视化平台-基于Python与大数据的共享单车多维度数据分析可视化系统
大数据·hadoop·python·机器学习·数据分析·spark·毕业设计
B站_计算机毕业设计之家12 小时前
Python+Flask+Prophet 汽车之家二手车系统 逻辑回归 二手车推荐系统 机器学习(逻辑回归+Echarts 源码+文档)✅
大数据·人工智能·python·机器学习·数据分析·汽车·大屏端
MoRanzhi120313 小时前
SciPy傅里叶变换与信号处理教程:数学原理与Python实现
python·机器学习·数学建模·数据分析·信号处理·傅里叶分析·scipy
dlraba80213 小时前
Pandas:机器学习数据处理的核心利器
人工智能·机器学习·pandas
m0_6770343513 小时前
机器学习-推荐系统(上)
人工智能·机器学习
箫乾13 小时前
第78篇:AI+交通:自动驾驶、智能交通管理与物流优化
人工智能·机器学习·自动驾驶
ARM+FPGA+AI工业主板定制专家14 小时前
基于JETSON/RK3588机器人高动态双目视觉系统方案
人工智能·机器学习·fpga开发·机器人·自动驾驶
~~李木子~~17 小时前
用 Python 实现 Gini 决策树分类与可视化-机器学习
python·决策树·机器学习