机器学习(决策树总结)(新手小白)

打算开一个有关机器学习的专题 后面会一章一章地更新,有需要的同学可以关注我哈  这个暑假,大家一起来学习机器学习

决策树的基本概念

决策树是一种常见的机器学习算法,适用于分类和回归任务。它通过不断将数据集划分为更小的子集,从而构建一棵树形结构,其中每个节点代表一个决策点或属性测试,分支代表决策结果或测试结果,叶节点表示最终的分类结果或回归值。

1. 节点(Node):
   - 根节点(Root Node):树的顶层节点,包含整个数据集。
   - 内部节点(Internal Node)**:具有一个或多个子节点,表示对某个特征的测试。
   - 叶节点(Leaf Node)**:不再进一步划分,代表最终的决策或预测结果。
2. 分支(Branch):
   - 从一个节点到另一个节点的路径,表示一个特征的可能取值。
3. 划分标准:
   - 决策树的构建过程涉及选择最佳的特征来划分数据集。常用的划分标准包括:
     - **信息增益(Information Gain)**:基于熵(Entropy)的减少量来选择特征。
     - **基尼指数(Gini Index)**:衡量数据集的不纯度,选择基尼指数最小的特征。
     - **均方误差(Mean Squared Error, MSE)**:回归任务中常用的标准,选择使误差最小的特征。
4. 熵(Entropy):
   - 衡量信息的不确定性或混乱程度,公式为:
     \[
     H(S) = - \sum_{i=1}^{n} p_i \log_2(p_i)
     \]
     其中,\(p_i\) 是类别 \(i\) 的概率。
5. 信息增益(Information Gain)**:
   - 通过某个特征划分数据集后,信息熵的减少量,公式为:
     \[
     IG(T, X) = H(T) - \sum_{i=1}^{n} \frac{|T_i|}{|T|} H(T_i)
     \]
     其中,\(H(T)\) 是划分前的熵,\(H(T_i)\) 是划分后的子集熵,\(|T_i|\) 是子集的大小。
6. 基尼指数(Gini Index):
   - 衡量数据集的不纯度,公式为:
     \[
     Gini(D) = 1 - \sum_{i=1}^{n} p_i^2
     \]
     其中,\(p_i\) 是类别 \(i\) 的概率。
7. 剪枝(Pruning):
   - 为了防止过拟合,可以对树进行剪枝,即移除一些不必要的节点和分支。剪枝方法包括:
     - 预剪枝(Pre-pruning)**:在构建树的过程中,通过设置最大深度、最小样本数等参数来限制树的生长。
     - 后剪枝(Post-pruning)**:先构建完整的决策树,然后通过交叉验证等方法剪掉不必要的分支。决策树的优缺点
优点:
- 直观且易于理解和解释。
- 可以处理数值型和分类型数据。
- 不需要过多的数据预处理。
- 可以处理多输出问题。
缺点:
- 容易过拟合,特别是在树的深度较大时。
- 对数据中的噪声和离群点敏感。
- 对类间样本数量不平衡的数据,信息增益容易偏向于取值较多的特征。

决策树在实践中广泛应用于分类任务、回归任务和特征选择等方面。为了提高决策树模型的性能,可以结合集成方法如随机森林(Random Forest)和梯度提升树(Gradient Boosting Trees)等。

 这些是基本概念  也是很难的  高手可以自行理解  而且上面公式我从文档复制的时候 有点不清楚呀  可以自己找哦(接下来我说一些新手知识点)

决策树咱们就将两个 多了不讲 好吧 一个是分类树 一个是回归树 不要问为什么 因为蒟蒻只会这两个 hhhh

分类树

从名字就可以看出来  这个分类树的作用 其实就是分类  xiixi

o 忘记说了 这是适合sklearn学的哦

类和参数

`DecisionTreeClassifier` 是 scikit-learn 库中用于分类任务的决策树分类器。它有多个参数,可以调整模型的行为和性能。以下是 `DecisionTreeClassifier` 类的主要参数及其解释:

### `DecisionTreeClassifier` 的参数

1. **`criterion`**:
   - 用于衡量分裂质量的函数。常用选项有:
     - `"gini"`(默认):使用基尼不纯度。
     - `"entropy"`:使用信息增益。

2. **`splitter`**:
   - 用于选择每次分裂的策略。选项有:
     - `"best"`(默认):选择最佳分割。
     - `"random"`:在候选分割中随机选择最优分割。

3. **`max_depth`**:
   - 树的最大深度。如果为 None,则节点将展开直到所有叶子都是纯的,或者直到叶子包含少于 `min_samples_split` 个样本。默认值为 None。

4. **`min_samples_split`**:
   - 拆分内部节点所需的最小样本数。可以是整数或浮点数:
     - 如果是整数,则考虑每个节点的最小样本数。
     - 如果是浮点数,则计算其为比例,例如 `min_samples_split=0.1` 意味着每个节点至少包含 10% 的样本。默认值为 2。

5. **`min_samples_leaf`**:
   - 在叶节点上需要的最小样本数。可以是整数或浮点数:
     - 如果是整数,则每个叶子节点至少包含这个数量的样本。
     - 如果是浮点数,则计算其为比例,例如 `min_samples_leaf=0.1` 意味着每个叶子节点至少包含 10% 的样本。默认值为 1。

6. **`min_weight_fraction_leaf`**:
   - 叶节点中样本权重的最小和的分数。如果为 0,则叶子节点中样本权重不受限制。默认值为 0.0。

7. **`max_features`**:
   - 寻找最佳分割时要考虑的特征数量:
     - 如果为整数,则考虑的特征数量。
     - 如果为浮点数,则考虑的特征比例。
     - 如果为 `"auto"` 或 `"sqrt"`,则使用 `sqrt(n_features)`。
     - 如果为 `"log2"`,则使用 `log2(n_features)`。
     - 如果为 None,则使用所有特征。默认值为 None。

8. **`random_state`**:
   - 控制随机性,例如分割时随机选择特征。与 `splitter="random"` 和 `max_features` 参数一起使用。传递一个整数以获得可重复的输出。

9. **`max_leaf_nodes`**:
   - 最大叶节点数。如果为 None,则不限制叶节点数量。默认值为 None。

10. **`min_impurity_decrease`**:
    - 如果节点分裂会导致不纯度的减少大于或等于该值,则该节点将分裂。默认值为 0.0。

11. **`class_weight`**:
    - 类别权重的字典形式。形式为 `{class_label: weight}`。如果为 `"balanced"`,则使用 `n_samples / (n_classes * np.bincount(y))` 计算权重。

12. **`ccp_alpha`**:
    - 复杂度参数用于最小成本复杂度剪枝。默认值为 0.0。

示例代码
from sklearn.tree import DecisionTreeClassifier

# 创建一个决策树分类器,设置部分参数
clf = 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,
    class_weight=None,
    ccp_alpha=0.0
)

# 训练模型
clf.fit(X_train, y_train)

# 预测
y_pred = clf.predict(X_test)

参数选择的影响
- `criterion`** 和 **`splitter`** 会影响树的构建策略和分割质量。
- `max_depth`**、**`min_samples_split`** 和 **`min_samples_leaf`** 是防止过拟合的重要参数,控制树的生长。
- `max_features`** 控制特征选择的随机性,通常在集成方法如随机森林中很有用。
- `random_state`** 用于保证结果的可重复性。
- `class_weight`** 对于处理不平衡数据集非常有用。
- `ccp_alpha`** 用于复杂度剪枝,减少模型的复杂度。

参数总结:

鄙人认为的重要参数其实就这几个:

1. max_depth 控制树的最大深度,有效防止过拟合的现象出现

2.min_samples_split和min_samples_leaf  和 max_depth差不多

通过调整这些参数,可以优化模型的性能以适应特定数据集和任务。

实例
from sklearn import tree
from sklearn.datasets import fetch_california_housing
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
import matplotlib.pyplot as plt

data = fetch_california_housing()

x = pd.DataFrame(data.data)

feature = data.feature_names

x.columns = feature


y = pd.Series(data.target)


# xtrain,xtest,ytrain,ytest = train_test_split(x,y,test_size=0.3,random_state=666)


clf = tree.DecisionTreeRegressor(random_state=666,max_depth=5,min_samples_split=5)
#clf.fit(xtrain,ytrain)
xtrain,xtest,ytrain,ytest = train_test_split(x,y,test_size=0.3,random_state=1)

clf.fit(xtrain,ytrain)
#score = clf.score(xtest,ytest)
csv = cross_val_score(clf,x,y,cv=10,
                  scoring = "neg_mean_squared_error", #又因为您指定了 scoring = "neg_mean_squared_error",所以这些得分将是负的均方误差(MSE)
                  )

plt.figure(figsize=(20,10))
tree.plot_tree(clf, feature_names=feature, filled=True, rounded=True)
plt.title("Decision Tree Regressor")
plt.savefig("regression_tree.png", dpi=300)
plt.show()

print(csv.mean())
print(x)
print(y)

注:画图这个咱就不说了 有啥问题可以后台问 ok

实例化决策树对象:
 

分训练

clf = tree.DecisionTreeClassifier(criterion='entropy'
                                  ,random_state=3
                                  ,splitter="random" # 降低过拟合  有可能加了这个score会变低 那就不加
                                  ,max_depth=10 # 决策树深度
                                  ) # 默认是gini参数

集和测试集以及训练:
 

xtrain,xtest,ytrain,ytest = train_test_split(x,y,test_size=0.3,random_state=1)

clf.fit(xtrain,ytrain)

交叉验证:

csv = cross_val_score(clf,x,y,cv=10,
                  scoring = "neg_mean_squared_error", #又因为您指定了 scoring = "neg_mean_squared_error",所以这些得分将是负的均方误差(MSE)
                  )

我学这个树的时候 这个交叉验证到底是干啥 

我现在搞懂了 使用交叉验证的时候 可以不分训练集 和 测试集 ,cv的意思是分多少次进行验证

然后这个scoring指定返回的数值类型 这里返回的就是 负的均方差  越接近1 说明模型拟合的效果越好
回归树的图像:

回归树
类和参数

`DecisionTreeRegressor` 是 scikit-learn 库中用于回归任务的决策树模型。与 `DecisionTreeClassifier` 类似,它通过递归地将数据集划分成更小的子集来构建一棵树形结构,但其目的是预测连续值而不是类别。以下是 `DecisionTreeRegressor` 类的主要参数及其解释:

### `DecisionTreeRegressor` 的参数

1. **`criterion`**:
   - 用于衡量分裂质量的函数。常用选项有:
     - `"mse"`(默认):均方误差 (Mean Squared Error)。
     - `"friedman_mse"`:具有 Friedman's 改进的均方误差。
     - `"mae"`:平均绝对误差 (Mean Absolute Error)。
     - `"poisson"`:泊松偏差(用于计数数据)。

2. **`splitter`**:
   - 用于选择每次分裂的策略。选项有:
     - `"best"`(默认):选择最佳分割。
     - `"random"`:在候选分割中随机选择最优分割。

3. **`max_depth`**:
   - 树的最大深度。如果为 None,则节点将展开直到所有叶子都是纯的,或者直到叶子包含少于 `min_samples_split` 个样本。默认值为 None。

4. **`min_samples_split`**:
   - 拆分内部节点所需的最小样本数。可以是整数或浮点数:
     - 如果是整数,则考虑每个节点的最小样本数。
     - 如果是浮点数,则计算其为比例,例如 `min_samples_split=0.1` 意味着每个节点至少包含 10% 的样本。默认值为 2。

5. **`min_samples_leaf`**:
   - 在叶节点上需要的最小样本数。可以是整数或浮点数:
     - 如果是整数,则每个叶子节点至少包含这个数量的样本。
     - 如果是浮点数,则计算其为比例,例如 `min_samples_leaf=0.1` 意味着每个叶子节点至少包含 10% 的样本。默认值为 1。

6. **`min_weight_fraction_leaf`**
   - 叶节点中样本权重的最小和的分数。如果为 0,则叶子节点中样本权重不受限制。默认值为 0.0。

7. **`max_features`**:
   - 寻找最佳分割时要考虑的特征数量:
     - 如果为整数,则考虑的特征数量。
     - 如果为浮点数,则考虑的特征比例。
     - 如果为 `"auto"` 或 `"sqrt"`,则使用 `sqrt(n_features)`。
     - 如果为 `"log2"`,则使用 `log2(n_features)`。
     - 如果为 None,则使用所有特征。默认值为 None。

8. **`random_state`**:
   - 控制随机性,例如分割时随机选择特征。与 `splitter="random"` 和 `max_features` 参数一起使用。传递一个整数以获得可重复的输出。

9. **`max_leaf_nodes`**:
   - 最大叶节点数。如果为 None,则不限制叶节点数量。默认值为 None。

10. **`min_impurity_decrease`**:
    - 如果节点分裂会导致不纯度的减少大于或等于该值,则该节点将分裂。默认值为 0.0。

11. **`ccp_alpha`**:
    - 复杂度参数用于最小成本复杂度剪枝。默认值为 0.0。

### 参数选择的影响
- **`criterion`** 和 **`splitter`** 会影响树的构建策略和分割质量。
- **`max_depth`**、**`min_samples_split`** 和 **`min_samples_leaf`** 是防止过拟合的重要参数,控制树的生长。
- **`max_features`** 控制特征选择的随机性,通常在集成方法如随机森林中很有用。
- **`random_state`** 用于保证结果的可重复性。
- **`ccp_alpha`** 用于复杂度剪枝,减少模型的复杂度。

和分类树差不多 我就不说了哈

实例
from sklearn import tree
from sklearn.datasets import fetch_california_housing
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
import matplotlib.pyplot as plt

data = fetch_california_housing()

x = pd.DataFrame(data.data)

feature = data.feature_names

x.columns = feature


y = pd.Series(data.target)


# xtrain,xtest,ytrain,ytest = train_test_split(x,y,test_size=0.3,random_state=666)


clf = tree.DecisionTreeRegressor(random_state=666,max_depth=5,min_samples_split=5)
#clf.fit(xtrain,ytrain)
xtrain,xtest,ytrain,ytest = train_test_split(x,y,test_size=0.3,random_state=1)

clf.fit(xtrain,ytrain)
#score = clf.score(xtest,ytest)
csv = cross_val_score(clf,x,y,cv=10,
                  scoring = "neg_mean_squared_error", #又因为您指定了 scoring = "neg_mean_squared_error",所以这些得分将是负的均方误差(MSE)
                  )

plt.figure(figsize=(20,10))
tree.plot_tree(clf, feature_names=feature, filled=True, rounded=True)
plt.title("Decision Tree Regressor")
plt.savefig("regression_tree.png", dpi=300)
plt.show()

print(csv.mean())
print(x)
print(y)

它的图像和分类树一样

二者的区别

回归树(Regression Tree)和分类树(Classification Tree)都是决策树模型的变种,分别用于回归任务和分类任务。它们在构建和使用上有许多相似之处,但由于目标不同,处理方法和评估标准存在一些差异。

### 回归树和分类树的主要区别

1. **目标变量类型**:
   - **回归树**:用于预测连续的数值型变量。例如,预测房价、温度、销售额等。
   - **分类树**:用于预测离散的类别标签。例如,分类邮件是否为垃圾邮件,预测图像中的物体类别等。

2. **分裂标准**:
   - **回归树**:
     - 使用均方误差(MSE)、均方根误差(RMSE)或平均绝对误差(MAE)等作为分裂标准。均方误差是最常用的标准,通过最小化叶节点内目标值的方差来进行分裂。
     - 具体公式:\[ MSE = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y})^2 \]
     - 目标是最小化分裂后每个子节点的方差,从而使每个节点内的样本尽可能相似。

   - **分类树**:
     - 使用基尼指数(Gini Index)、信息增益(Information Gain)或分类误差率(Misclassification Error)作为分裂标准。基尼指数和信息增益是最常用的标准,通过最小化不纯度来进行分裂。
     - 具体公式(以基尼指数为例):\[ Gini = 1 - \sum_{i=1}^{K} p_i^2 \]
     - 目标是最大化信息增益或最小化基尼指数,从而使每个节点内的样本尽可能纯。

3. **预测输出**:
   - **回归树**:叶节点的预测值是叶节点内所有样本目标值的平均值。预测结果是一个连续值。
   - **分类树**:叶节点的预测值是叶节点内所有样本中出现频率最高的类别。预测结果是一个类别标签。

4. **损失函数**:
   - **回归树**:主要使用回归损失函数,如均方误差(MSE)。
   - **分类树**:主要使用分类损失函数,如交叉熵损失或零一损失。

5. **剪枝策略**:
   - 两者的剪枝策略基本相同,都是通过减少模型复杂度来防止过拟合。不过,具体的剪枝方法如代价复杂度剪枝(Cost Complexity Pruning)在回归树和分类树中应用时,使用的标准会有所不同。

示例代码

from sklearn.tree import DecisionTreeRegressor

# 创建一个回归树
regressor = DecisionTreeRegressor(criterion='mse', max_depth=5)

# 训练模型
regressor.fit(X_train, y_train)

# 预测
y_pred = regressor.predict(X_test)

分类树

from sklearn.tree import DecisionTreeClassifier

# 创建一个分类树
classifier = DecisionTreeClassifier(criterion='gini', max_depth=5)

# 训练模型
classifier.fit(X_train, y_train)

# 预测
y_pred = classifier.predict(X_test)

总结

- **回归树**用于连续目标变量,主要使用均方误差等分裂标准,通过最小化叶节点内的方差进行分裂。
- **分类树**用于离散目标变量,主要使用基尼指数或信息增益等分裂标准,通过最小化不纯度进行分裂。
- 预测输出和损失函数根据任务类型(回归或分类)有所不同。

第一次写机器学习的博客 可能有点不太好 缺什么的话 就在评论区和我说 我给他补上 哈哈哈 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值