机器学习——决策树

本文介绍了决策树的基本概念,包括分类原理,如熵、信息增益和信息增益率。讨论了CART剪枝策略和特征工程,特别是字典和文本数据的特征提取方法。通过泰坦尼克号乘客生存预测的例子展示了决策树在实际问题中的应用,并提到了决策树的可视化。此外,还比较了决策树回归与线性回归的差异。
摘要由CSDN通过智能技术生成

决策树

是一种树形结构,其中每个内部节点表示一个属性上的判断,每个分支代表一个判断结果的输出,最后每个叶节点代表一种分类结果,本质是一颗由多个判断节点
sklearn.tree.DecisionTreeClassifier(criterion='gini',max_depth=None,random_state=None)

在这里插入图片描述

决策树分类原理


系统越有序,熵值越低;系统越混乱或者分散,熵值越高
数据越集中的地方熵值越小,数据越分散的地方熵值越大

在这里插入图片描述
pn为第n个的概率

信息增益(决策树划分依据)
选大的

以某特征划分数据集前后的熵的差值,可以用划分前后集合熵的差值来衡量使用当前特征对于样本集合D划分效果的好坏

在这里插入图片描述
一般而言,信息增益越大,则意味着使用属性a来进行划分所获的的“纯度提升”越大

信息增益率(决策树划分依据)
选大的

在这里插入图片描述
例子

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

基尼值和基尼指数(决策树划分依据)
选小的

在这里插入图片描述

分类

在这里插入图片描述
C4.5采用的是后剪枝,且C4.5不一定是二叉树,但CART一定是二叉树

cart剪枝

剪枝是决策树学习算法对付“过拟合”的主要手段

常用剪枝方法
预剪枝
在构造树的过程中,同时剪枝

后剪枝
把一棵树构造完成后,再从下往上剪枝

特征工程-特征提取

将任意数据(如文本或图像)转换为可用于机器学习的数字特征
sklearn.feature_extraction
sparse是是否返回sparse矩阵

字典特征提取
对字典数据进行特征值化
sklearn.feature_extraction.DictVectorizer(sparse=Ture)

from sklearn.feature_extraction import DictVectorizer 

def dict_demo():
    '''
    字典特征提取
    '''
    #1获取数据
    data=[{'city':'北京','temperature':100},
          {'city':'上海','temperature':60},
          {'city':'云南','temperature':30}]
    #2字典特征提取
    #2.1实例化
    transfer=DictVectorizer(sparse=False)
    
    #2.2转换
    new_data=transfer.fit_transform(data)
    print(new_data)
    
    #2.3获取具体属性名
    names=transfer.get_feature_names_out()
    print('属性名字是:\n',names)
    
dict_demo()

[[ 0. 0. 1. 100.]
[ 1. 0. 0. 60.]
[ 0. 1. 0. 30.]]
属性名字是:
[‘city=上海’ ‘city=云南’ ‘city=北京’ ‘temperature’]

对于特征中存在类别信息的我们都会做one-hot编码处理

文本特征提取
对文本数据进行特征值化
sklearn.feature_extraction.text.CountVectorizer(stop_word=[])
stop_word是停用词
注意:要利用toarray()进行sparse矩阵转换array数组,因为该方法没有sparse参数,因此不能使用sparse=False

from sklearn.feature_extraction.text import CountVectorizer
def english_count_demo():
    #1获取数据
    data=['life is short,i like python',
          'life is too long,i dislike python']
    #2文本特征转换
    transfer=CountVectorizer(stop_words=['dislike'])
    new_data=transfer.fit_transform(data)
    
    #3查看特征名字
    names=transfer.get_feature_names_out()
    
    print('特征名字是:\n',names)
    print(new_data.toarray())
    
english_count_demo()

特征名字是:
[‘is’ ‘life’ ‘like’ ‘long’ ‘python’ ‘short’ ‘too’]
[[1 1 1 0 1 1 0]
[1 1 0 1 1 0 1]]

已经统计了词频,只是此处没有重复的单词,以及单个单词和标点符号不进行统计

中文文本特征提取
jieba分词

from sklearn.feature_extraction.text import CountVectorizer
import jieba
def cut_word(text):
    ret=' '.join(jieba.lcut(text)) #切分后,通过空格进行拼接
    return ret
    
cut_word('我爱你python, 人生苦短,我用python')

我爱你 python , 人生 苦短 , 我用 python

def chinese_count_demo():
    """
    文本特征提取-中文
    :return: None
    """
    # 1.获取数据
    data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
            "我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
            "如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]

    # 2.文章分割
    list1=[]
    for temp in data:
        list1.append(cut_word(temp))
    print(list1)

    # 3.文本特征转换
    # 3.1 实例化+转化
    transfer = CountVectorizer(stop_words=["一种", "今天"])
    new_data = transfer.fit_transform(list1)

    # 3.2 查看特征名字
    names = transfer.get_feature_names_out()

    print("特征名字是:\n", names)
    print(new_data.toarray())

chinese_count_demo()

在这里插入图片描述

TF-idf文本特征提取
如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类
sklearn.feature_extraction.text.TfidfVectorizer

在这里插入图片描述

在这里插入图片描述

from sklearn.feature_extraction.text import TfidfVectorizer
def tfidf_demo():
    """
    文本特征提取-中文
    :return: None
    """
    # 1.获取数据
    data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
            "我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
            "如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]

    # 2.文章分割
    list2= []
    for temp in data:
        list2.append(cut_word(temp))
    print(list2)

    # 3.文本特征转换
    # 3.1 实例化+转化
    transfer = TfidfVectorizer()
    new_data = transfer.fit_transform(list2)

    # 3.2 查看特征名字
    names = transfer.get_feature_names_out()

    print("特征名字是:\n", names)
    print(new_data.toarray())

tfidf_demo()

在这里插入图片描述

泰坦尼克号乘客生存预测

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.tree import DecisionTreeClassifier

# 1.获取数据
titan = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")

# 2.数据基本处理
# 2.1 确定特征值,目标值
x = titan[["pclass", "age", "sex"]]
y = titan["survived"]

# 2.2 缺失值处理
x['age'].fillna(value=titan["age"].mean(), inplace=True) #进行替换,inplace是是否对自身进行替换

# 2.3 数据集划分
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=22, test_size=0.2)

# 3.特征工程(字典特征抽取)
x_train = x_train.to_dict(orient="records") #转换成需要的字典类型格式
x_test = x_test.to_dict(orient="records")

transfer = DictVectorizer()
x_train = transfer.fit_transform(x_train)
x_test = transfer.fit_transform(x_test)

# 4.机器学习(决策树)
estimator = DecisionTreeClassifier(max_depth=15)
estimator.fit(x_train, y_train)

# 5.模型评估
y_pre = estimator.predict(x_test)
ret = estimator.score(x_test, y_test)
print(ret)

0.779467680608365

决策树可视化

sklearn.tree.export_graphviz()

from sklearn.tree import export_graphvizx
export_graphviz(estimator, out_file="./data/tree.dot", feature_names=['age', 'pclass=1st', 'pclass=2nd', 'pclass=3rd', '女性', '男性'])

网站显示结构
将dot文件下复制到网站上进行显示
http://webgraphviz.com

回归决策树

在这里插入图片描述
回归决策树和线性回归对比

import numpy as np
import matplotlib.pyplot as plt
from sklearn.tree import DecisionTreeRegressor
from sklearn.linear_model import LinearRegression

# 生成数据
x = np.array(list(range(1, 11))).reshape(-1,1)
y = ([5.56, 5.70, 5.91, 6.40, 6.80, 7.05, 8.90, 8.70, 9.00, 9.05])
x

在这里插入图片描述
只有特征值变成这样,才能算出相应的一个目标值

# 模型训练
m1 = DecisionTreeRegressor(max_depth=1)
m2 = DecisionTreeRegressor(max_depth=3)
m3 = LinearRegression()

m1.fit(x, y)
m2.fit(x, y)
m3.fit(x, y)

# 模型预测
x_test = np.arange(0, 10, 0.01).reshape(-1, 1)

y_1 = m1.predict(x_test)
y_2 = m2.predict(x_test)
y_3 = m3.predict(x_test)

# 结果可视化
plt.figure(figsize=(10, 6), dpi=100)

plt.scatter(x, y, label="data")
plt.plot(x_test, y_1, label="max_depth=1")
plt.plot(x_test, y_2, label="max_depth=3")
plt.plot(x_test, y_3, label="linear regression")

plt.xlabel("数据")
plt.ylabel("预测值")
plt.legend()

plt.show()

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

醋酸洋红就是我

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值