python机器学习算法之决策树入门讲解

一、决策树树模型介绍。

决策树(Decision Tree),它是一种以树形数据结构来展示决策规则和分类结
果的模型,作为一种归纳学习算法,其重点是将看似无序、杂乱的已知数据,通过某
种技术手段将它们转化成可以预测未知数据的树状模型,每一条从根结点(对最终分
类结果贡献最大的属性)到叶子结点(最终分类结果)的路径都代表一条决策的规则。
说白了就是树模型,构造的是二叉树或者是多叉树,主要是三种树ID3,C4.5,CART树
上面的说法过于抽象,下面来看一个实际的例子。
案例:判断一个水果是不是苹果
python机器学习算法之决策树入门讲解_第1张图片
3 种典型的决策树算法:
ID3 算法 : ID3 是最早提出的决策树算法,他就是利用信息增益来选择特征的。
C4.5 算法 : 它是 ID3 的改进版,不是直接使用信息增益,而是引入“信息增益率”指
标作为特征的选择依据。
CART Classification and Regression Tree : 这种算法即可以用于分类,也可以用于回
归问题。 CART 算法使用了基尼系数取代了信息熵模型。
信息增益:

信息增益是指在数据集合的经验熵与特征给定条件下的经验条件熵之差。所以信息增益越大的话特征的分类能力就越强。

条件熵的话,是在一直随机变量X的条件下,随机变量Y的不确定性。

信息增益率‌(Information Gain Ratio)是决策树算法中用于特征选择的一种方法,主要用于 C4.5算法中。信息增益率通过考虑特征属性的固有值(Intrinsic Value)来避免信息增益对多值属性的偏好,从而提高特征选择的准确性

信息增益率是用信息增益和属性对应的固有值的比来定义的。

基尼系数:

决策树基尼系数(Gini Coefficient)是用于衡量分类树模型性能的指标。基尼指数也被称为不纯度,它用于衡量样本在某个特征上的不平衡程度。它通常应用于决策树模型中,这种模型可以根据特征来预测一个样本,基尼指数可以用来描述一个特征的不平衡度,进而有助于进一步评价模型的表现

基尼系数是用纯度来表示的,直观来说的话就是反映了从数据集中随机抽选两个样本,这两个样本的类别标记不一致的概率,因此值越小相对的纯度就越高,划分节点的话效果就越好。

二、剪枝

在决策树中,剪枝分为两种方式:

1.预剪枝过程为:将当前节点标记为叶节点,类别标记为训练样例中最多的类别

2.后剪枝过程为:自底向上,将当前子树节点标记为叶节点,类别标记为训练样例中最多的类别

三、优缺点

优点:
1.决策树易于理解和解释,可以可视化分析,容易提取出规则
2.可以同时处理标称型和数值型的数据
3.比较适合处理有缺失属性的样本(因为在构建树(在分裂中)的时候会自动过滤掉)
4.能够处理不相关的特征
5.测试数据集时,运行速度比较快
6.在相对短的时间内能够对大型数据源做出可行且效果良好的结果

缺点:

1.过拟合:决策树容易过拟合训练数据,特别是当树的深度很大或分支较多时。过拟合会导致模型在新数据上表现不佳,因为它过于复杂,过多地记忆了训练数据的噪声。

2.不稳定性:决策树对数据中微小的变化非常敏感。即使数据中存在轻微的变化,决策树的结构可能会发生显著变化,这使得模型不稳定。

3.处理不平衡数据:当数据集中的类别分布不平衡时,决策树容易偏向于占多数的类别,对于少数类别的预测性能较差。需要采取额外的措施来处理不平衡数据。

4.局部最优解:决策树构建时使用贪婪算法,可能导致生成局部最优的树结构,而不一定是全局最优。这可能需要在多个不同的初始条件下训练多个决策树来减轻这一问题。

5.特征连续性处理:决策树通常将特征看作离散值,不擅长处理连续特征。尽管有方法可以将连续特征处理为离散特征,但这增加了复杂性。

6.不足的泛化能力:决策树的泛化能力相对较弱,特别是在高维数据中。它在某些情况下可能无法很好地适应未见数据。

四、代码实现:

import pandas as pd
from sklearn.model_selection import train_test_split, cross_val_score, GridSearchCV
from sklearn.metrics import accuracy_score, roc_curve, roc_auc_score
from sklearn.tree import DecisionTreeClassifier
dfs = pd.read_csv(r'E:\PycharmProjects\senior High School Four\day9zy\data\vedio_dataset.csv')
# print(dfs.head(5))
x = dfs.drop(columns=['like', 'duration_time', 'real_time', 'H', 'date'])
y = dfs['like']
x_train, x_test, y_train, y_test = train_test_split(x, y, train_size=0.2, random_state=1)
model = DecisionTreeClassifier(max_depth=3, random_state=2)
model.fit(x_train, y_train)
y_pred = model.predict(x_test)


score = accuracy_score(y_pred, y_test)

parameteres = {'max_depth':[1,2,4,5,9],'criterion':['gini','entropy'],'min_samples_split':[2,5,8,9,10]}#min_samples_split:决定了能够继续进行分隔的最少分割样本
grid_search=GridSearchCV(model,parameteres,cv=5)
grid_search.fit(x_train,y_train)
best = grid_search.best_params_
print(best)
de = DecisionTreeClassifier(criterion='gini',max_depth=5,min_samples_split=2)
de.fit(x_train,y_train)
sc = de.score(x_test,y_test)
print(sc)

你可能感兴趣的:(机器学习,算法,python)