1、概念
决策树分类是一种监督学习算法,用于分类问题,即预测离散标签。其核心原理是通过树状图模型来模拟决策过程,从而对数据进行分类。
2、数据准备:
收集数据集,并对其进行清洗和预处理。
将数据集分为特征(X)和目标变量(y)
datas=pd.read_excel("电信客户流失数据.xlsx")
data=datas.iloc[:,:-1]
target=datas.iloc[:,-1]
3、特征选择:
决策树通过选择最能区分数据的特征来构建模型。特征选择的标准通常基于信息增益、基尼不纯度或熵等指标。
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test=train_test_split(data,target,test_size=0.2,random_state=42)
4、构建树模型:
根节点:从整个数据集开始,选择一个特征及其阈值作为根节点,这个特征应该能够最大程度地减少数据的不确定性。
分裂:根据根节点的特征值将数据集分割成若干子集,每个子集对应树的一个分支。
递归构建:对每个子集重复上述过程,选择新的最优特征进行分裂,直到满足停止条件。
5、停止条件:
树达到最大深度。
节点中的样本数量小于预设的最小分割阈值。
节点中的样本全部属于同一类别。
6、剪枝:剪枝是决策树优化的重要步骤,它通过移除树的部分分支来减少模型复杂度。
预剪枝:在树完全生长之前就停止生长,以避免过拟合。
后剪枝:先让树完全生长,然后从底部开始剪除那些对分类贡献不大的分支。
7、运用交叉验证找到最合适的tree.DecisionTreeClassifier
参数
from sklearn.model_selection import cross_val_score
# 导入交叉验证评分函数
scores = []
# 初始化一个空列表,用于存储每个max_depth参数下的模型平均召回率
c_param_range = [8, 9, 10, 11, 12, 13, 14]
# 定义一个列表,包含要测试的max_depth参数值
for i in c_param_range:
# 遍历c_param_range中的每个max_depth值
dtr = tree.DecisionTreeClassifier(criterion="gini", max_depth=i, random_state=51, min_samples_leaf=2)
# 创建决策树分类器实例,设置分裂标准为"gini",最大深度为当前的i,随机种子为51,叶子节点最小样本数为2
score = cross_val_score(dtr, data, target, cv=8, scoring='recall')
# 对决策树模型进行8折交叉验证,评分标准为召回率
score_mean = sum(score) / len(score)
# 计算交叉验证得到的召回率分数的平均值
scores.append(score_mean)
# 将计算出的平均召回率添加到scores列表中
best_c = c_param_range[np.argmax(scores)]
# 使用np.argmax找到scores列表中最大值的索引,这个索引对应的max_depth值即为最佳的max_depth参数
8、训练模型:
使用训练数据集来训练决策树模型。
dtr=tree.DecisionTreeClassifier(criterion="gini",max_depth=best_c,random_state=51,min_samples_leaf=2)
dtr.fit(x_train,y_train)
9、预测:
在决策树构建完成后,新样本通过树的路径进行分类。从根节点开始,根据样本的特征值沿着树向下移动,直到到达叶节点,叶节点的类别即为样本的预测类别。
test_predict=dtr.predict(x_test)
print(metrics.classification_report(y_test,test_predict))
10、评估:
使用准确率、召回率、F1分数等指标来评估决策树模型的性能。
10、优化:
通过调整模型参数(如树的深度、最小分割样本数等)和使用交叉验证等方法来优化模型。
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)
树模型参数:
1.criterion :gini or entropy 【采用基尼系数还是熵值衡量,默认基尼系数】
2.splitter: best or random 前者是在所有特征中找最好的切分点 后者是在部分特征中(数据量大的时候)【默认best,无需更改】
3.max_features:(所有),log2,sqrt,N 特征小于50的时候一般使用所有的 【默认取所有特征,无需更改】
4.max_depth: 数据少或者特征少的时候可以不管这个值,如果模型样本量多,特征也多的情况下,可以尝试限制下。如果没有设置,那么将会把节点完全展开,直到所有的叶子节点都是纯的,或者达到最小叶子节点的个数阈值设置。
5.min_samples_split :(内部节点再划分所需最小样本数),如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分,如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。【控制内部节点分裂的情况;假设<10,那么分裂的数量小于10就不会再次分裂了,默认2个】
6.min_samples_leaf :(叶子节点最少样本数),这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝,如果样本量不大,不需要管这个值【先构成决策树,再剪枝,当小于某个设定值后,删除此节点以及此节点的分支节点】
7.min_weight_fraction_leaf:(叶子节点最小的样本权重和),这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝,默认是0,就是不考虑权重问题。一般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值了。
8.max_leaf_nodes :(最大叶子节点数),通过限制最大叶子节点数,可以防止过拟合,默认是"None”,即不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征分成多的话,可以加以限制具体的值可以通过交叉验证得到。【假设限制最大的叶子节点数为10个,那么就不会再次分裂了】
9. min_impurity_decrease :
10.min_impurity_split: 这个值限制了决策树的增长,如果某节点的不纯度(基尼系数,信息增益,均方差,绝对差)小于这个阈值则该节点不再生成子节点。即为叶子节点 。
11.class_weight 指定样本各类别的的权重,主要是为了防止训练集某些类别的样本过多导致训练的决策树过于偏向这些类别。这里可以自己指定各个样本的权重如果使用“balanced”,则算法会自己计算权重,样本量少的类别所对应的样本权重会高。
12.random_state是用来设置决策树分枝中随机模式的参数。当数据集中的特征数量较少时,随机性不会很明显。但是,当特征数量较多时,随机性就会变得明显。random_state参数可以确保每次运行代码时都得到相同的结果。