```from sklearn import tree
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
import graphviz
wine=load_wine()#字典类型的红酒数据集
import pandas as pd
pd.concat([pd.DataFrame(wine.data), pd.DataFrame(wine.target)], axis=1)#红酒数据集,标签--连成一个表
#划分训练集,测试集,Y是标签(1,2,0)
Xtrain,Xtest,Ytrain,Ytest=train_test_split(wine.data,wine.target,test_size=0.3)
#1.实例化
clf=tree.DecisionTreeClassifier(criterion="entropy",random_state=30,splitter="random")
#信息熵,设置分支中的随机模式的参数,splitter:虽然决策树分支随机,但是可以设置优先选择重要的特征进行分支。best;或者random
#可以防止过拟合
#2.数据进入训练
clf=clf.fit(Xtrain,Ytrain)
#3.使用接口,导入测试集打分
score=clf.score(Xtest,Ytest)#返回预测的准确度accuracy
# print(score)
#画树
feature_name=['酒精','苹果酸','灰','灰的碱性','镁','类黄酮','非黄烷类酚类','花青素','颜色强度','色调','不知道啥','氨酸','']
dot_data=tree.export_graphviz(clf
,feature_names=feature_name
,class_names=['白酒','啤酒','红酒']
,filled=True#框的颜色
,rounded=True#圆框
,
)
graphy=graphviz.Source(dot_data)
# print(graphy)
# print(clf.feature_importances_)#决策树的权重
print([*zip(feature_name,clf.feature_importances_)])#将标签和对应的权重合起来
#剪枝参数
#max_depth限制树的最大深度,超过设定深度的树枝全部剪掉
#min_sample_leaf限定,一个节点在分枝后的每个子节点都必须包含至少min_samples_leaf个训练样本,否则分枝就不会发生
#min_samples_split限定,一个节点必须要包含至少min_samples_split个训练样本,这个节点才允许被分歧,否则分枝就不会发生。
#超参数曲线
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(Xtrain, Ytrain)
score = clf.score(Xtest, Ytest)
test.append(score)
plt.plot(range(1, 11), test, color="red", label="max_depth")
plt.legend()
plt.show()
#目标权重参数
#class_weight & min_weight_fraction_leaf完成样本标签平衡的参数
#apply 返回每个测试样本所在的叶子结点的索引;predict:返回每个测试样本分类预测结果
print(clf.apply(Xtest))
print(clf.predict(Xtest))
#所有接口中要求输入X_train和X_test的部分,必须至少是一个二维矩阵,因为sklearn不接受任何一维矩阵作为特征矩阵被输入
# 假设你的数据只有一个特征,必须使用reshape(-1,1)来增维
# 假设你的数据只有一个特征和一个样本,必须使用reshape(1,-1)来增维
sklearn—决策树的学习
最新推荐文章于 2024-09-08 23:53:15 发布