打算开一个有关机器学习的专题 后面会一章一章地更新,有需要的同学可以关注我哈 这个暑假,大家一起来学习机器学习
决策树的基本概念
决策树是一种常见的机器学习算法,适用于分类和回归任务。它通过不断将数据集划分为更小的子集,从而构建一棵树形结构,其中每个节点代表一个决策点或属性测试,分支代表决策结果或测试结果,叶节点表示最终的分类结果或回归值。
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)
总结
- **回归树**用于连续目标变量,主要使用均方误差等分裂标准,通过最小化叶节点内的方差进行分裂。
- **分类树**用于离散目标变量,主要使用基尼指数或信息增益等分裂标准,通过最小化不纯度进行分裂。
- 预测输出和损失函数根据任务类型(回归或分类)有所不同。
第一次写机器学习的博客 可能有点不太好 缺什么的话 就在评论区和我说 我给他补上 哈哈哈