# 不纯度:用来衡量一个系统的混乱程度纯度,纯度越高,分类效果越好,反之效果较差 # 信息熵:指的是客观上,一个事情的不确定性,不确定性随着信息熵的增大而增大 # 信息增益 :通过已知信息使未知集合的不确定性减少的程度, # 父节点的信息熵减去子节点的信息熵 # 基尼指数:基尼指数越小说明一个集合中被分错的概率越小 不纯度越低 # 基尼系数 = 样本被选中的概率 * 被分错的概率 # 不纯度可以由基尼系数或者信息熵算 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")