from pprint import pprint
# 决策树
from sklearn import tree
from sklearn.datasets import load_wine # 自带数据库,可以导入知名数据
from sklearn.model_selection import train_test_split # 测试集训练集
import graphviz
import pandas as pd
# todo:基本流程
# 计算全部特征的不纯度指标--->选取不纯度指标最优的特征来分枝--->在第一个特征的分枝下,计算全部特征的不纯度指标--->选取不纯度指标最优的特征来继续分枝
# 直到没有更多的特征可用,或整体不纯度指标已最优,决策树就会停止生长
import sklearn
# todo:决策树:类都在tree模块下:
# todo: 1.分类树 sklearn.tree.DecisionTreeClassifier
# todo:2.回归树 sklearn.tree.DecisionTreeRegressor
# 3.将生成的决策树导出为DOT格式,画图专用 sklearn.tree.export_graphviz
# 4.高随机版本的分类树 sklearn.tree.ExtraTreeClassifier
# 5.高随机版本的回归树 sklearn.tree.ExtraTreeRegressor
# todo:流程
# 1.实例化,建立评估模型对象
# 2.通过模型接口训练模型
# 3.通过模型接口提取需要的信息
# todo:流程对应代码
# from sklearn import tree
# clf=tree.DecisionTreeClassifier() # 实例化
# clf=clf.fit(X_trean,y_train) # 用训练集数据训练模型
# 对模型打分的
# result=clf.score(x_test,y_test) # 导入测试集,从接口中调用需要的信息
# todo:1 DecisionTreeClassifier 分类树
# todo:八个重要参数
# 参数 1 criterion 不纯度,基于节点来计算的,叶子节点的不纯度一定最低 计算速度没差(信息熵稍慢,有log2),默认1.基尼系数 “gini”,使用基尼系数 2 “entropy”,使用信息熵
# 参数 2 random_state 控制随机数种子,保证准确性一致
# 参数 3 splitter 设置分枝中的随机模式的参数,默认为None:俩种随机选项 1。best 2.random
# 参数 4 max_depth # 限制树的最大深度,建议从3开始
# 参数 5 min_sample_leaf# 限制 每个子分支都满足min_sample_lea个训练样本,建议=5开始使用,如果训练样本过大,建议使用浮点数;在回归问题中避免方差,建议=1
# 参数 6 min_sample_split # 限定 一个节点必须满足min_sample_split个训练样本,才允许被分支
# 参数 7 max_features 类似max_depth
# 参数 8 min_impurity_decrease 限制信息增益大小
# 参数 9 class_weight 目标权重
# 参数 9 min_weight_fraction_leaf 基于权重的剪枝参数
wine = load_wine()
# print(wine.data.shape)
a = pd.concat([pd.DataFrame(wine.data), pd.DataFrame(wine.target)], axis=1) # 俩个数据整合
# print(pd.DataFrame(wine.data)) # 字典取值
# print(pd.DataFrame(wine.target)) # 字典取值
# print(wine.feature_names) # 打印特征集名称
# print(wine.target_names) # 打印数据集名称,标签名
X_train, X_test, Y_train, Y_test = train_test_split(wine.data, wine.target, test_size=0.3) # 特征集,标签,30%做测试集,70做训练集
# print(X_train)
# print(X_train.shape)
# 建立模型
clf=tree.DecisionTreeClassifier(criterion="entropy"
,random_state=30
,splitter="random"
,max_depth=3)
clf = clf.fit(X_train,Y_train)
score1=clf.score(X_test,Y_test)
# 返回预测的
# todo 精准度 accuracy
# print(score1)
# todo 画出一颗树
# 特征名字
# 例如
# feature_names=["酒精","苹果酸","灰","灰的碱性","镁","总酚","类黄酮","非黄烷类酚类","花青素","颜色强度","色调","od280/od315稀释葡萄酒","脯氨酸"]
# dot_data=tree.export_graphviz(clf,feature_names=feature_names,# 特征名
# class_names=["琴酒","雪莉","贝尔摩德"], # 标签名
# filled=True, # 是否添加颜色
# rounded=True #
# )
# graphviz=graphviz.Source(dot_data)
# graphviz.save('111') # 保存看一下决策树
# print(clf.feature_importances_)
# pprint([*zip(feature_names,clf.feature_importances_)])
# # 学习曲线 可以找出最合适的参数
# import matplotlib.pyplot as plt
# test=[]
# for i in range(10):
# clf=tree.DecisionTreeClassifier(max_depth=i+1,
# criterion='entropy',
# random_state=30,
# splitter='random')
# clf=clf.fit(X_train,Y_train)
# sco2=clf.score(X_test,Y_test)
# test.append(sco2)
# plt.plot(range(1,11),test,color="red",label="max_depth")
# plt.legend()
# plt.show()
#todo 分类树属性
# 1.classes_ 输出所有标签
# 2.clf.feature_importances_ 每个特征重要性
# 3.max_features_ max_features的推断值
# 4.n_classes_ 标签类别的数据
# 5.n_fratures_ fit时特征个数
# 6.n_outputs_ fit十输出的结果的个数
# 7.tree_
# todo 重要接口和属性
# apply 返回每个测试样本所在叶子节点的索引
# 例如
# clf = clf.fit(X_train,Y_train)
#
# score1=clf.score(X_test,Y_test)
print(clf.apply(X_test))
print("*"*100)
# predict 返回每个测试样本的分类/回归结果
print(clf.predict(X_test))
# todo: 注
# sklearn 不接受任何一维矩阵作为特征被输入,如果数据只有一个特征,必须reshape(-1,1)来给矩阵增维
机器学习 sklearn学习 第一天-决策树 分类树
最新推荐文章于 2022-10-21 17:43:10 发布