趋近智
"线性模型提供稳固的基准,但许多关系并非线性。基于树的模型提供了一种不同方式,通过将特征空间划分为矩形区域来进行预测。它们是许多先进机器学习 (machine learning)技术的重要组成部分。本节讲解两种主要的基于树的算法:决策树及其强大的集成扩展——随机森林。"
想象一下通过基于特征提出一系列是/否问题来进行预测。这就是决策树背后的想法。它学习一种基于特征的层级划分,最终得出预测结果(分类中的类别标签或回归中的连续值)。
工作原理:
max_depth)、包含的样本少于最小阈值(min_samples_split或min_samples_leaf),或者无法通过分裂进一步提高纯度/减少误差时,递归停止。使用scikit-learn实现:
让我们在一个简单数据集上训练一个DecisionTreeClassifier。
import pandas as pd
from sklearn.tree import DecisionTreeClassifier, plot_tree
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt
import graphviz # 可选,用于可视化
# 样本数据(请替换为您的实际数据)
data = {
'Feature1': [2.5, 0.5, 2.2, 1.9, 3.1, 2.3, 2.0, 1.0, 1.5, 1.1],
'Feature2': [1.7, 0.8, 1.5, 1.0, 2.5, 0.9, 2.0, 1.1, 0.5, 1.3],
'Target': [1, 0, 1, 0, 1, 0, 1, 0, 0, 0]
}
df = pd.DataFrame(data)
X = df[['Feature1', 'Feature2']]
y = df['Target']
# 划分数据
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 初始化并训练决策树分类器
# 限制深度以防止过拟合并便于可视化
dt_clf = DecisionTreeClassifier(criterion='gini', max_depth=3, random_state=42)
dt_clf.fit(X_train, y_train)
# 进行预测
y_pred = dt_clf.predict(X_test)
# 评估
accuracy = accuracy_score(y_test, y_pred)
print(f"决策树准确率: {accuracy:.4f}")
# 可视化树(需要matplotlib,可选graphviz)
plt.figure(figsize=(12, 8))
plot_tree(dt_clf, filled=True, feature_names=X.columns.tolist(), class_names=['类别 0', '类别 1'], rounded=True)
plt.title("简单决策树结构(最大深度=3)")
plt.show()
# 使用graphviz的替代可视化(如果已安装)
# dot_data = export_graphviz(dt_clf, out_file=None,
# feature_names=X.columns.tolist(),
# class_names=['类别 0', '类别 1'],
# filled=True, rounded=True,
# special_characters=True)
# graph = graphviz.Source(dot_data)
# graph.render("decision_tree") # 将树保存到decision_tree.pdf
# print("决策树已保存到decision_tree.pdf")
对于回归任务,您将使用DecisionTreeRegressor并通过均方误差(MSE)等回归指标进行评估。
优点与缺点:
max_depth或min_samples_leaf之类的约束会有帮助,但找到合适的平衡点可能比较困难。过拟合的倾向是最大的缺点,这引导我们了解像随机森林这样的集成方法。
与其依赖单个可能不稳定且过拟合 (overfitting)的树,为什么不构建许多不同的树并结合它们的预测呢?这是随机森林背后的主要思想。它是一种集成方法,利用自助法(bagging)和特征随机性来生成一组决策树。
工作原理:
max_features参数 (parameter))。这使得树之间去相关。如果某个特征预测能力很强,它也不会在所有树的划分中占据主导地位。自助法和特征随机性的这种组合使得树之间各不相同。平均它们的预测可以减少方差,并提高模型相对于单个决策树的泛化能力。
使用scikit-learn实现:
训练RandomForestClassifier或RandomForestRegressor非常直接。
from sklearn.ensemble import RandomForestClassifier, RandomForestRegressor
import numpy as np
# 针对分类任务,使用之前相同的数据划分
rf_clf = RandomForestClassifier(n_estimators=100, # 森林中树的数量
max_depth=5, # 单个树的最大深度
max_features='sqrt', # 每个划分点要考虑的特征数量
random_state=42,
n_jobs=-1) # 使用所有可用CPU核心
rf_clf.fit(X_train, y_train)
# 进行预测
y_pred_rf = rf_clf.predict(X_test)
# 评估
accuracy_rf = accuracy_score(y_test, y_pred_rf)
print(f"随机森林准确率: {accuracy_rf:.4f}")
# 特征重要性(有助于理解特征贡献)
importances = rf_clf.feature_importances_
feature_names = X.columns
indices = np.argsort(importances)[::-1]
print("\n特征重要性:")
for i in indices:
print(f"{feature_names[i]}: {importances[i]:.4f}")
# 回归示例(需要不同的目标'y')
# Generate some sample regression data
# np.random.seed(42)
# X_reg = np.random.rand(100, 2) * 10
# y_reg = 2 * X_reg[:, 0] - 3 * X_reg[:, 1] + np.random.randn(100) * 2 + 5
# X_train_reg, X_test_reg, y_train_reg, y_test_reg = train_test_split(X_reg, y_reg, test_size=0.3, random_state=42)
# rf_reg = RandomForestRegressor(n_estimators=100, random_state=42, n_jobs=-1)
# rf_reg.fit(X_train_reg, y_train_reg)
# y_pred_reg = rf_reg.predict(X_test_reg)
# mse = mean_squared_error(y_test_reg, y_pred_reg)
# print(f"\n随机森林回归器MSE: {mse:.4f}")
我们可以可视化特征重要性,它通常来源于每个特征在森林中所有树中对减少不纯度的贡献大小。
这些特征重要性源自随机森林分类器示例。数值越高表示对模型预测的贡献越大。注意:具体数值取决于训练数据和模型参数。
优点与缺点:
n_estimators)的情况下。n_estimators、max_depth和max_features等超参数 (hyperparameter)以获得最佳性能。基于树的模型,特别是随机森林,是监督学习 (supervised learning)中强大且广泛使用的工具。虽然单个决策树提供可解释性,但它们过拟合的倾向常使随机森林成为获得更高预测准确度的更实用选择。了解它们的工作原理以及如何使用scikit-learn等库实现它们是应用数据科学的一项基本技能。接下来的章节将介绍梯度提升等其他强大的集成方法,并探讨系统地调整模型超参数的方式。
这部分内容有帮助吗?
© 2026 ApX Machine LearningAI伦理与透明度•