diff --git a/docs/ml.md b/docs/ml.md index 149f923..97bc22d 100644 --- a/docs/ml.md +++ b/docs/ml.md @@ -198,4 +198,40 @@ 容易过拟合:如果不进行剪枝,决策树可能会过度拟合训练数据。 对噪声敏感:小的变化可能导致完全不同的树结构。 处理连续变量效果较差:对于连续变量,决策树的划分可能不够精细。 - 倾向于偏向于多值特征:信息增益可能会导致决策树偏向具有更多取值的特征。 \ No newline at end of file + 倾向于偏向于多值特征:信息增益可能会导致决策树偏向具有更多取值的特征。 + +随机森林:构建多个决策树将其预测结果结合起来,从而提高模型性能 + 原理: + 随机采样: + 对于每一棵决策树,随机森林通过对训练数据进行有放回抽样,即每次从训练集中随机选择样本来构建一棵树。这样,在每棵树中,可能会有一些样本没有被选择到(这些样本称为“袋外样本”)。 + 每棵树都是在一个不同的子集上训练的,因此即使所有的树都是基于决策树模型,最终的森林也是多个“不同”的树. + 特征随机性: + 在每一棵树的节点划分时,随机森林不是在所有特征上选择最优切分点,而是随机选择一个特征子集来进行分裂。这样可以增加树之间的差异性,减少单棵树的过拟合风险。 + 例如,在某个节点上,随机选择k个特征(k通常小于总特征数),然后在这k个特征中选择最佳切分点。 + 决策树构建: + 在每一棵决策树中,通常不对树的深度进行限制,或者只设置最小样本数和最大深度等限制条件。树的生长较为“自由”,这可以捕捉更多的数据复杂性。集成学习: + 随着多棵树的训练完成,每棵树对样本进行独立的预测。在回归任务中,随机森林会对所有树的预测结果取平均值;在分类任务中,随机森林会采用投票机制,选择预测频次最多的类别作为最终结果。 + + 优缺点: + 优点: + 减少过拟合:通过集成多棵决策树,随机森林通过平均(回归)或投票(分类)来减少单棵树可能发生的过拟合。 + 提高准确性:集成的多棵树的预测通常比单棵树要更准确,尤其在面对复杂和高维度数据时,随机森林表现得尤为出色。 + 处理大规模数据:可以处理高维数据,能够通过特征选择和随机性减少维度灾难。 + 鲁棒性强:即使某些特征或数据不完整,随机森林依然能够保持相对较好的性能。 + 特征重要性评估:通过分析每个特征在不同树中的表现,随机森林可以给出特征的重要性排序。 + + 缺点: + 模型复杂:由于包含多棵树,随机森林模型本身较为复杂,训练和预测时的计算开销较大,尤其是数据集非常庞大的时候。 + 可解释性差:相比单一的决策树,随机森林作为一个集成模型,其“黑箱”性质较强,难以直接解释其决策过程。 + 内存消耗大:由于随机森林需要存储多棵树,因此在内存和计算资源上会有较高的要求,尤其是在大数据集上。 + 适用场景: + 高维数据和复杂数据: + 随机森林能够自动处理高维数据和复杂的特征间关系,适合特征维度较高或者数据关系非线性的场景。 + 回归任务和分类任务: + 随机森林既可以用于回归任务(例如预测房价、股市预测等),也可以用于分类任务(例如图像分类、文本分类等)。 + 数据噪声较多的场景: + 随机森林通过集成多棵树来减轻单棵树可能发生的过拟合问题,因此特别适合处理带有噪声和缺失数据的任务。 + 特征选择: + 在特征数量非常庞大的情况下,随机森林能够通过其特征重要性评估功能,自动筛选出对预测有重要贡献的特征。 + 非线性关系: + 当数据中的特征和目标变量之间存在复杂的非线性关系时,单棵线性模型(如线性回归)可能表现不佳,但随机森林可以通过多棵树的集成来捕捉这些复杂的非线性关系。 \ No newline at end of file diff --git a/output/random_forest_c.png b/output/random_forest_c.png new file mode 100644 index 0000000..dab9d13 Binary files /dev/null and b/output/random_forest_c.png differ diff --git a/random_forest_classification.py b/random_forest_classification.py new file mode 100644 index 0000000..4ea918e --- /dev/null +++ b/random_forest_classification.py @@ -0,0 +1,40 @@ +# 导入所需库 +from sklearn.ensemble import RandomForestClassifier +from sklearn.datasets import load_iris +from sklearn.model_selection import train_test_split +from sklearn.metrics import accuracy_score, classification_report +import matplotlib.pyplot as plt + +# 1. 加载数据集(这里使用鸢尾花数据集) +iris = load_iris() +X = iris.data +y = iris.target + +# 2. 划分训练集和测试集(80%训练,20%测试) +X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) + +# 3. 创建随机森林分类器 +rf_classifier = RandomForestClassifier(n_estimators=100, random_state=42) + +# 4. 训练模型 +rf_classifier.fit(X_train, y_train) + +# 5. 在测试集上进行预测 +y_pred = rf_classifier.predict(X_test) + +# 6. 评估模型性能 +accuracy = accuracy_score(y_test, y_pred) +print(f"模型准确率:{accuracy:.4f}") + +# 输出详细的分类报告(精确率、召回率、F1分数等) +print("分类报告:") +print(classification_report(y_test, y_pred)) + +# 7. 可视化特征重要性(可选) +feature_importances = rf_classifier.feature_importances_ + +plt.figure(figsize=(10, 6)) +plt.barh(iris.feature_names, feature_importances) +plt.xlabel("feature importance") +plt.title("random forest model feature importance") +plt.savefig('./output/random_forest_c.png')