分类树及解析

发布于:2023-01-08 ⋅ 阅读:(385) ⋅ 点赞:(0)
# 不纯度:用来衡量一个系统的混乱程度纯度,纯度越高,分类效果越好,反之效果较差

# 信息熵:指的是客观上,一个事情的不确定性,不确定性随着信息熵的增大而增大

# 信息增益 :通过已知信息使未知集合的不确定性减少的程度,
# 父节点的信息熵减去子节点的信息熵

# 基尼指数:基尼指数越小说明一个集合中被分错的概率越小 不纯度越低
# 基尼系数 = 样本被选中的概率 * 被分错的概率

# 不纯度可以由基尼系数或者信息熵算
import os
import numpy as np
import pandas as pd
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
from sklearn import tree
import graphviz

os.environ["PATH"] += os.pathsep + r'D:\cut\Graphviz\bin/'
wine = load_wine()

data = wine.data  # 数据
target = wine.target  # 标签
feature = wine.feature_names  # 特征值

# data = pd.concat([pd.DataFrame(data), pd.DataFrame(target)], axis=1)
# print(pd.DataFrame(data, columns=feature))

x_train, x_test, y_train, y_test = train_test_split(data, target, test_size=0.7, random_state=20)

clf = tree.DecisionTreeClassifier(criterion="entropy", random_state=30, splitter="best")
# 创建决策树对象:
#   参数一: criterion 这个是用来算不纯度的,可以使用gini 或者是 entropy方法去计算不纯度,当不纯度越低,说明数据有序性越高
#   参数二: 这个参数是用来控制数拟合度,因为创建决策树的时候,总是创建许多树,随机抽取一部分重要特征,进行计算不纯度,然后
#       进行较低 进行创建树,当random_statue这个参数固定后,就会抽取固定的特征,特定数据,而不是随机选取
#    参数三: splitter这个也有一定的随机性,两个参数,一个是random,一个是best,best先取最重要的特征值。


clf.fit(x_train, y_train)

score = clf.score(x_test, y_test)
print(score)  # 每次划分的结果不一阳,测试集训练集合不一样

feature_name = ['酒精', '苹果酸', '灰', '灰的碱性', '镁', '总酚', '类黄酮', '非黄烷类酚类', '花青素', '颜色强度', '色调', 'od280/od315稀释葡萄酒',
                '脯氨酸']  # 特征值
dot_data = tree.export_graphviz(
    clf,
    feature_names=feature_name,
    class_names=['one', 'two', 'three'],
    filled=True,
    rounded=True
)
print(clf.feature_importances_)  # 查看特征重要性
print([*zip(feature_name, clf.feature_importances_)])  # 可以看到各个特征值的占比 占比越大 对决策树的影响越大
graph = graphviz.Source(dot_data.replace('helvetica', 'Microsoft YaHei'), encoding='utf-8')

# graph.view("../datas/output/_csv.csv")