目录
决策树是一种用于分类和回归分析的机器学习算法。它通过创建树状的决策规则来对数据进行分类或预测。决策树的每个节点代表一个属性,每个分支代表一个判断条件,而每个叶节点代表一个类别或一个回归值。决策树的构建过程是通过计算数据集中各个属性的信息增益或信息熵来选择最优的属性进行划分,直到所有数据都被准确分类或达到停止条件。决策树具有可解释性强、易于理解和实现等优点,广泛应用于数据挖掘、模式识别和预测分析等领域。
易于理解和解释:决策树可以直观地展示问题的决策过程,易于理解和解释。决策树的节点代表特征,边代表决策规则,完整的决策树可以清晰地展示出问题的所有决策路径。
可处理离散和连续型数据:决策树可以处理离散型和连续型数据,而且不需要对数据进行过多的预处理。对于连续型数据,决策树可以通过设置阈值进行离散化处理。
可处理多分类问题:决策树可以自然地处理多分类问题,将问题的决策过程分解为多个二分类子问题。
可处理大量特征:决策树对于大量特征的处理能力较强,不需要对特征进行特别的选择和降维处理。
可处理缺失值:决策树可以处理缺失值,不需要对缺失值进行特殊处理。
不受数据分布的影响:决策树对数据的分布不敏感,可以处理不平衡数据集。
可以通过剪枝避免过拟合:决策树可以通过剪枝进行模型的正则化,避免过拟合。
可以结合其他机器学习方法进行集成学习:决策树可以与其他机器学习方法进行结合,如随机森林和梯度提升树,形成集成学习模型,提高预测性能。
基尼决策树(Gini Decision Tree)是一种用于分类问题的决策树算法。基尼指数是一种衡量数据集纯度的指标,用于评估一个特征的划分能力。基尼指数越小,表示数据集的纯度越高。
基尼决策树的基本思想是通过选择最优的特征和划分点来创建一棵决策树。算法的流程如下:
选择最佳特征:计算每个特征的基尼指数,选择基尼指数最小的特征作为当前节点的划分特征。
划分数据集:根据选定的特征和划分点,将当前节点的数据集划分成多个子集。
递归建树:对每个子集,重复上述步骤,直到满足终止条件。
生成决策树:根据递归建树的结果,将每个节点与对应的子树连接起来,形成一棵完整的决策树。
基尼决策树相对于其他决策树算法的优点是计算速度较快,对于处理大规模数据集有一定的优势。然而,基尼决策树容易过拟合,对异常值敏感,可能会导致决策边界过于复杂。为了解决这些问题,可以使用剪枝等策略进行优化。
熵决策树(Entropy Decision Tree)是一种基于信息熵的决策树算法。在熵决策树中,每个节点的划分都是根据信息熵的减少来进行的。
信息熵是对数据集中信息的不确定性的度量。在熵决策树中,首先计算数据集的初始熵,然后计算每个特征的信息增益,选择信息增益最大的特征作为当前节点的划分特征。然后对当前节点的每个取值进行划分,并计算划分后的数据集的熵。重复这个过程,直到所有特征都被使用或者划分后的数据集的熵为0(即数据集已经完全分类)。
熵决策树通过选择信息增益最大的特征来进行划分,这样可以使得每次划分都能够尽量减少数据集的不确定性。在构建完熵决策树后,可以使用该决策树对新的样本进行分类。
熵决策树是一种经典的决策树算法,在机器学习和数据挖掘任务中被广泛应用。它具有简单、高效的特点,并且能够处理离散和连续特征。然而,熵决策树容易过拟合,对噪声数据敏感。因此,现在一些改进的决策树算法如C4.5、CART等被广泛使用。
熵决策树(Entropy Decision Tree)和基尼决策树(Gini Decision Tree)是两种常见的决策树算法,在决策树的构建过程中使用不同的指标来选择最佳的切分点。
熵决策树:熵是一种度量集合的无序程度或不确定性的指标。在熵决策树算法中,使用熵来衡量一个切分点对数据集的纯度影响,选择熵减最大的切分点作为当前节点的划分依据。熵的计算公式为:
Entropy(D) = - Σ(p(i) * log(p(i)))
其中,D表示当前节点的数据集,p(i)表示当前节点中第i个类别的样本所占的比例。
基尼决策树:基尼指数是一种衡量不纯度的指标,用于度量随机选择的一个样本在数据集中被分错的概率。在基尼决策树算法中,使用基尼指数来选择最佳的切分点,选择基尼指数最小的切分点作为当前节点的划分依据。基尼指数的计算公式为:
Gini(D) = 1 - Σ(p(i)^2)
其中,D表示当前节点的数据集,p(i)表示当前节点中第i个类别的样本所占的比例。
区别:
- 衡量指标:熵决策树使用熵来衡量纯度,而基尼决策树使用基尼指数来衡量纯度。
- 计算复杂度:基尼指数的计算比熵的计算更简单,因为基尼指数不涉及对数计算。
- 结果不同:由于使用不同的纯度度量标准,熵和基尼指数会导致生成不同的决策树。熵决策树更倾向于生成更平衡的决策树,而基尼决策树更倾向于生成更深度的决策树。
选择使用哪种决策树算法,可以根据具体问题的特点和需求来确定。
data=pd.read_csv('iris.csv')
data.info()#类型
'''结果:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 150 entries, 0 to 149
Data columns (total 6 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Unnamed: 0 150 non-null int64
1 Sepal.Length 150 non-null float64
2 Sepal.Width 150 non-null float64
3 Petal.Length 150 non-null float64
4 Petal.Width 150 non-null float64
5 Species 150 non-null object
dtypes: float64(4), int64(1), object(1)
memory usage: 7.2+ KB
'''
data['Species'].unique()
#结果:array(['setosa', 'versicolor', 'virginica'], dtype=object)
X=data.drop(['Species'],axis=1)
y=data['Species']
data:
from sklearn.model_selection import train_test_split#将数据分成测试和训练集
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=0)#测试集占百分之三十,random_state=0随机抽取数据集里的成为测试集
from sklearn.tree import DecisionTreeClassifier#决策树的class
cls_gini=DecisionTreeClassifier(criterion='gini',max_depth=3,random_state=0)#gini,设置最深深度为3
cls_entropy=DecisionTreeClassifier(criterion='entropy',random_state=0)#entropy
cls_gini.fit(X_train,y_train)
cls_entropy.fit(X_train,y_train)
y_pred_gini = cls_gini.predict(X_test)
'''结果:
array(['virginica', 'versicolor', 'setosa', 'virginica', 'setosa',
'versicolor', 'setosa', 'versicolor', 'versicolor', 'versicolor',
'virginica', 'versicolor', 'versicolor', 'versicolor',
'versicolor', 'setosa', 'versicolor', 'versicolor', 'setosa',
'setosa', 'virginica', 'versicolor', 'setosa', 'setosa',
'virginica', 'setosa', 'setosa', 'versicolor', 'versicolor',
'setosa', 'virginica', 'versicolor', 'setosa', 'virginica',
'virginica', 'versicolor', 'setosa', 'versicolor', 'versicolor',
'versicolor', 'virginica', 'setosa', 'virginica', 'setosa',
'setosa'], dtype=object)
'''
y_pred_entropy = cls_entropy.predict(X_test)
'''结果:
array(['virginica', 'versicolor', 'setosa', 'virginica', 'setosa',
'versicolor', 'setosa', 'versicolor', 'versicolor', 'versicolor',
'virginica', 'versicolor', 'versicolor', 'versicolor',
'versicolor', 'setosa', 'versicolor', 'versicolor', 'setosa',
'setosa', 'virginica', 'versicolor', 'setosa', 'setosa',
'virginica', 'setosa', 'setosa', 'versicolor', 'versicolor',
'setosa', 'virginica', 'versicolor', 'setosa', 'virginica',
'virginica', 'versicolor', 'setosa', 'versicolor', 'versicolor',
'versicolor', 'virginica', 'setosa', 'virginica', 'setosa',
'setosa'], dtype=object)
'''
from sklearn.metrics import accuracy_score
accuracy_score(y_test,y_pred_gini)
#结果:0.9777777777777777
accuracy_score(y_test,y_pred_entropy)
#结果:0.9777777777777777
print("gini 的 train score:",cls_gini.score(X_train,y_train))
print("gini 的 test score:",cls_gini.score(X_test,y_test))
'''结果:
gini 的 train score: 1.0
gini 的 test score: 0.9777777777777777
'''
print("entropy 的 train score:",cls_entropy.score(X_train,y_train))
print("entropy 的 test score:",cls_entropy.score(X_test,y_test))
'''结果:
entropy 的 train score: 1.0
entropy 的 test score: 0.9777777777777777
'''
plt.figure(figsize=(12,8))
tree.plot_tree(cls_gini.fit(X_train,y_train))
plt.figure(figsize=(12,8))
tree.plot_tree(cls_entropy.fit(X_train,y_train))
?