我的scikitlearn学习6.18

1 分类树DTC

分类树(Decision Tree Classifier)中的一些概念:
根节点
中间结点
叶子结点
子节点与父节点

2 分类树建模流程基本代码

from sklearn import tree
clf = tree.DecisionTreeClassifier() #实例化,调节模型参数
clf = clf.fit(X_train, Y_train) #训练模型
score = clf.score(X_test, Y_test) #检测模型

3 参数说明

3.1 DecisionTreeClassifier

classsklearn.tree.DecisionTreeClassifier(criterion=’gini’, splitter=’best’, max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=None, random_state=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, class_weight=None, presort=False)

3.1.1 criterion

criterion参数,指熵值/不纯度/不确定性/信息量的计算方法。节点的熵值越小,纯度越高,不确定性越小,信息量越小。随着树的加深,子节点的纯度一定高于父节点,熵值小于父节点,以节点的熵值下降最迅速的方式来构造决策树。
sklearn中,计算方法有两种:
1)“entropy”,信息熵,实际计算时为信息增益,即父节点信息熵-子节点信息熵;
2)“gini”,基尼系数,为默认项。

3.1.2 random_state&splitter

两者用来控制树在分枝时的随机性
参数random_state默认为"None",可输入任意整数,如30,可提高模型稳定性。(不明白整数的含义)
参数splitter默认为"best",根据特征的重要性进行分枝,当参数为"random"时,分枝变得随机,可防止模型过拟合。

3.1.3 剪枝参数

当决策树对训练集做出过于符合的解释,决策树包含了训练数据中的噪声时,决策树会出现过拟合现象。为提高决策树的泛化性,对决策树进行剪枝处理。

  • max_depth
    决策树深度
  • min_samples_leaf
    子节点最小样本量
  • min_samples_split
    可发生分枝的节点最小样本量
  • max_features
    特征个数限制
  • min_impurity_decrease
    最小信息增益值,当信息增益小于该值时便不会发生分枝

绘制超参数曲线,确定最优剪枝参数(决策树深度):

import matplotlib.pyplot as plt
test = []
for i in range(10):
    clf = tree.DecidionTreeClassifier(max_depth = i+1)
    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()

3.1.4 目标权重参数

样本不平衡的数据集进行标签平衡,给少量的标签更多的权重。

  • class_weight&min_weight_fraction_leaf
    (没听懂)

3.2 模型属性

  • clf.feature_importances_
    各特征对模型的重要性

3.3 算法接口

  • clf.fit(X_train, Y_train)
    模型训练
  • clf.score(X_test, Y_test)
    测试结果
  • clf.apply(X_test)
    每个测试样本叶子结点的索引
  • clf.predict(X_test)
    每个测试样本的分类结果

4 决策树生成与绘制总程序

在jupyter lab上运行代码前,需自安装graphviz,在官网获取安装包。

#导入库和模块
from sklearn import tree
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
#数据获取
wine = load_wine()
#数据查看
wine.data.shape
wine.target
import pandas as pd
pd.concat([pd.DataFrame(wine.data),pd.DataFrame(wine,target)], axis=1)#将pandas对象按索引连接,得到完整的数据表
wine.feature_names
wine.target_names
#划分训练集与测试集, 测试集占30%
Xtrain, Xtest, Ytrain, Ytest = train_test_split(wine.data, wine.target, test_size=0.3)
#决策树模型建立
clf = tree.DecisionTreeClassifier(
#random_state = 30,
#max_depth = 3,
#splitter = "random"
)
clf = clf.fit(Xtrain, Ytrain)
score = clf.score(Xtest, Ytest)#返回树对测试集的准确度
#绘制决策树
feature_name = ['alcohol','malic_acid','ash','alcalinity_of_ash','magnesium','total_phenols','flavanoids','nonflavanoid_phenols','proanthocyanins','color_intensity','hue','od280/od315_of_diluted_wines','proline']
import graphviz
dot_data = tree.export_graphviz(clf, feature_names=feature_name, class_names=['琴酒','雪莉','贝尔摩德'],filled=True, rounded=True)
graph = graphviz.Source(dot_data)
graph
#查看特征重要性
clf.feature_importances_
[*zip(feature_name, clf.feature_importances_)]
#查看树对训练集的拟合程度
score_train = clf.score(Xtrain, Ytrain)

5 实例

累了,见下篇。

猜你喜欢

转载自blog.csdn.net/i13629207958/article/details/106844228