目录
机器学习决策树是一种常用的机器学习算法,用于建立预测模型和分类模型。以下是对机器学习决策树及其相关算法的详细介绍:
决策树模型
决策树模型基于树状结构,通过分析数据特征与目标变量之间的关系,将数据集划分为不同的子集,以逐步构建决策规则。
决策树的结构类似于一颗倒置的树,由节点和边组成。树的顶部被称为根节点,每个节点表示一个特征属性或判断条件。从根节点开始,根据不同的特征属性进行分支,直到叶节点,叶节点表示最终的预测结果。
决策树的构建过程基于训练数据集。算法通过选择最佳的特征属性来分裂节点,并根据特征属性的取值创建子节点。通过递归的方式,持续地将数据集划分为更小的子集,直到满足停止条件。
在分类问题中,决策树的叶节点表示不同的类别。对于新的输入数据,通过遵循决策树的路径,可以确定其所属的类别。在回归问题中,叶节点表示一个数值,通过对应的路径可以得到预测的数值。
决策树相关算法
分类及回归树(CART)
CART算法既可以用于分类问题,也可以用于回归问题。在分类问题中,CART算法使用基尼不纯度(Gini impurity)或信息增益比(Gain ratio)来选择最佳划分属性;在回归问题中,CART算法使用平方误差最小化准则来选择最佳划分点。
1.特点
二叉树结构
CART算法生成的决策树是二叉树,即每个非叶子节点都有两个分支
分类与回归
CART既可以用于分类任务,也可以用于回归任务。在分类任务中,CART使用基尼不纯度(Gini Impurity)作为选择最佳划分属性的标准。
在回归任务中,CART使用均方误差(Mean Squared Error, MSE)作为划分属性的标准。
连续变量处理
CART算法能够处理连续型变量,对于连续型变量,CART会找到最优的划分点将连续变量离散化。
2.计算方法
决策树生成
对于分类任务,计算每个特征的基尼不纯度,选择基尼不纯度降低最多的特征进行分裂。
对于回归任务,计算每个特征的均方误差,选择均方误差降低最多的特征进行分裂。
递归地进行上述过程,直到满足停止条件(如子节点中的样本都属于同一类别,或者没有更多的特征可以分裂)。
剪枝
剪枝是为了避免过拟合,通过移除一些子树或叶子节点来简化决策树。
后剪枝是在决策树生成完成后进行的,使用验证数据集来评估不同剪枝程度下的模型性能,选择性能最好的剪枝策略。
预测
对于新的数据样本,从根节点开始,根据样本的特征值沿着决策树向下遍历,直到达到一个叶子节点。
如果是分类任务,叶子节点对应的类别就是预测结果;如果是回归任务,叶子节点对应的数值就是预测结果。
ID3算法
ID3算法是一种基于信息增益的决策树生成算法。它选择信息增益最大的特征作为当前节点的划分特征,并递归地构建子树。然而,ID3算法倾向于选择取值较多的特征,可能导致过拟合问题。
1.特点
基于信息增益
ID3算法以信息增益作为选择划分属性的标准。信息增益表示划分数据集前后信息熵的变化,变化越大说明使用当前特征划分数据集后所获得的“纯度提升”越大。
结构简单
ID3算法的结构相对简单,易于理解和实现。
学习能力强
由于ID3算法利用信息增益原理选择分类属性,因此它具有较强的学习能力。
分类速度快
ID3算法的分类速度较快,适合大规模数据的分类问题。
对噪声数据敏感
由于信息增益的不稳定性,ID3算法容易倾向于众数属性,导致过度拟合,且对噪声数据比较敏感。
不能处理连续属性
ID3算法不能直接处理连续属性,需要将其离散化。
2.计算方法
计算原始数据集的熵
作为初始熵值,熵的计算公式为H(D)=-Σ(p(xi) * log2(p(xi))),其中p(xi)表示数据集中分类为xi的样本的概率。
计算每个特征的信息增益
信息增益表示给定特征后,数据集的熵减少的程度,可以通过计算原始熵与特征划分后的加权熵之差来表示。
选择信息增益最大的特征
选择信息增益最大的特征作为划分特征,这是因为信息增益最大的特征能够提供最多的关于目标变量的信息。
根据选择的特征进行数据集划分
将数据集根据选定的特征的不同取值进行划分,得到新的子集。
递归地处理每个子集
对于每个子集,重复步骤1-4,直到满足停止条件,例如所有样本都属于同一类别,或者没有更多的特征可供划分。
C4.5算法
C4.5算法是ID3算法的改进版。它使用增益率(Gain ratio)来选择最佳划分特征,以克服ID3算法倾向于选择取值较多特征的缺点。此外,C4.5算法还引入了连续特征的处理和缺失值的处理等功能。
随机森林(Random Forest)
随机森林是一种集成学习方法,它通过构建多个决策树并对其进行集成来提高分类或回归的准确性。在随机森林中,每个决策树都是基于原始数据集的随机子集和随机特征子集构建的。通过对多个决策树的预测结果进行投票或平均,可以得到最终的预测结果。
1.特点
集成学习
随机森林通过集成多个决策树模型来提高预测性能。每个决策树都是基于原始数据集的随机子集和随机特征子集构建的。
高准确率
随机森林通常具有较高的预测准确率,因为它结合了多个模型的预测结果。
抗过拟合
由于每个决策树都是基于随机子集构建的,并且引入了随机性,随机森林能够有效抵抗过拟合。
特征评估
随机森林能够提供每个特征在分类或回归问题中的重要性评估,这对于特征选择和理解模型行为非常有用。
并行处理
由于随机森林包含多个独立的决策树,因此可以并行处理,提高计算效率。
处理缺失值
随机森林能够处理包含缺失值的数据集,而无需进行额外的数据预处理。
2.计算方法
随机抽样
对于给定的训练数据集,随机森林算法会进行有放回的随机抽样,生成多个与原始数据集大小相同的子数据集(也称为自助样本)。
随机特征选择
在每个子数据集上,随机森林算法会随机选择一部分特征来构建决策树。这个随机选择的过程有助于减少模型之间的相关性,提高集成学习的效果。
构建决策树
使用每个子数据集和随机选择的特征子集来构建决策树。每个决策树都会完整生长,不进行剪枝操作。
集成预测
对于分类问题,随机森林将每个决策树的预测结果进行投票,选择票数最多的类别作为最终预测结果。对于回归问题,随机森林将每个决策树的预测结果进行平均,得到最终的预测值。
特征重要性评估
随机森林还可以根据每个特征在所有决策树中出现的频率和贡献度来评估该特征的重要性。这对于特征选择和解释模型预测结果非常有用。
总之,随机森林算法通过集成多个基于随机抽样和特征选择的决策树模型来做出预测,具有高准确率、抗过拟合和特征评估等特点。
此外,还有其他的机器学习算法,如朴素贝叶斯、支持向量机(SVM)、K-近邻(KNN)、神经网络等。这些算法各有特点和优势,适用于不同的场景和问题。在实际应用中,需要根据具体问题和数据特点选择合适的算法。
算法实现
4.1 ID3算法代码实现
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from collections import Counter
import math
# 创建数据集
data = {
'年龄段': [1, 2, 2, 0, 1, 2, 0, 1, 2, 2],
'有工作': [0, 1, 1, 0, 1, 0, 1, 1, 0, 1],
'有自己的房子': [0, 0, 1, 1, 1, 1, 0, 1, 1, 1],
'信贷情况': [0, 1, 1, 0, 1, 1, 2, 1, 1, 1],
'是否给贷款': [0, 0, 1, 1, 1, 1, 0, 1, 1, 1]
}
df = pd.DataFrame(data)
X = df.drop('是否给贷款', axis=1)
y = df['是否给贷款']
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 计算熵的函数
def calc_entropy(y):
hist = Counter(y)
ps = [hist[val] / len(y) for val in hist.keys()]
return -sum([p * math.log2(p) for p in ps if p > 0])
# 计算信息增益的函数
def calc_information_gain(X, y, feature):
values = X[feature].unique()
weighted_entropy = sum((X[feature] == val).sum() / len(X) * calc_entropy(y[X[feature] == val]) for val in values)
orig_entropy = calc_entropy(y)
return orig_entropy - weighted_entropy
# 计算每个特征的信息增益
feature_gains = {feature: calc_information_gain(X_train, y_train, feature) for feature in X_train.columns}
# 输出每个特征的信息增益
print("ID3算法中\n每个特征的信息增益:")
for feature, gain in feature_gains.items():
print(f"{feature}: {gain:.4f}")
# 选择信息增益最大的特征作为划分属性
best_feature = max(feature_gains, key=feature_gains.get)
print(f"最佳划分特征: {best_feature}")
# 由于scikit-learn的DecisionTreeClassifier默认使用CART算法,我们需要手动实现ID3的划分逻辑
# 这里我们仅展示如何计算信息增益,并不完整实现ID3算法
# 完整的ID3算法实现需要递归地构建决策树,处理连续属性、缺失值等复杂情况
# 使用scikit-learn的DecisionTreeClassifier作为替代,虽然它默认使用CART算法
from sklearn.tree import DecisionTreeClassifier
# 使用信息增益作为划分标准(虽然scikit-learn的DecisionTreeClassifier默认使用基尼指数)
clf_id3_like = DecisionTreeClassifier(criterion='entropy', random_state=42)
clf_id3_like.fit(X_train, y_train)
# 预测测试集结果
y_pred_id3 = clf_id3_like.predict(X_test)
# 输出测试数据的预测结果及准确率
print("\n测试数据预测结果:")
print(y_pred_id3)
print(f"ID3算法准确率: {accuracy_score(y_test, y_pred_id3)}")
4.2 CART算法代码实现
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.tree import DecisionTreeClassifier
# 创建贷款数据集
data = {
'年龄段': [1, 2, 2, 0, 1, 2, 0, 1, 2, 2],
'有工作': [0, 1, 1, 0, 1, 0, 1, 1, 0, 1],
'有自己的房子': [0, 0, 1, 1, 1, 1, 0, 1, 1, 1],
'信贷情况': [0, 0, 1, 0, 1, 1, 2, 1, 1, 1],
'是否给贷款': [0, 0, 1, 1, 1, 1, 0, 1, 1, 1]
}
# 转换为DataFrame
df = pd.DataFrame(data)
# 分离特征和标签
X = df[['年龄段', '有工作', '有自己的房子', '信贷情况']]
y = df['是否给贷款']
# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1)
# 初始化并训练决策树分类器,使用基尼不纯度作为分割标准
clf = DecisionTreeClassifier(criterion='gini', max_depth=3, random_state=1)
clf.fit(X_train, y_train)
# 预测测试集的标签
y_pred = clf.predict(X_test)
# 计算准确率
score = accuracy_score(y_test, y_pred)
print("CART分类树的准确率: %.4f" % score)