机器学习 sklearn学习 第一天-决策树 分类树

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)来给矩阵增维
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值