24.11.10

实验八:随机森林算法实现与测试
一、实验目的
深入理解随机森林的算法原理,进而理解集成学习的意义,能够使用 Python 语言实现随机森林算法的训练与测试,并且使用五折交叉验证算法进行模型训练与评估。
二、实验内容
(1)从 scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集(注意同分布取样);
(2)使用训练集训练随机森林分类算法;
(3)使用五折交叉验证对模型性能(准确度、精度、召回率和 F1 值)进行评估和选择;
(4)使用测试集,测试模型的性能,对测试结果进行分析,完成实验报告中实验八的部分。
三、算法步骤、代码、及结果

  1. 算法伪代码
    使用 load_iris() 加载 Iris 数据集,X 为特征矩阵,y 为标签向量。
    使用 train_test_split() 函数将数据集分成训练集和测试集,保证训练集和测试集中类别分布一致,且 1/3 的数据作为测试集。
    初始化一个 RandomForestClassifier 模型,设置树的数量为 100,并训练模型。
    使用 rf_classifier.feature_importances_ 输出每个特征的重要性。
    使用 cross_validate() 进行五折交叉验证,评估模型在准确率、精确率、召回率和 F1 分数上的表现。我们通过 make_scorer() 定义了自定义评分标准。
    输出每个评估指标的五折交叉验证得分均值,了解模型在不同指标上的表现。
    使用训练好的模型对测试集进行预测。
    使用 classification_report() 输出测试集的分类性能报告,包括准确率、精确率、召回率和 F1 分数。
  2. 算法主要代码
    完整源代码\调用库方法(函数参数说明)
    from sklearn.datasets import load_iris
    from sklearn.model_selection import train_test_split
    from sklearn.metrics import classification_report
    from sklearn.ensemble import RandomForestClassifier
    from sklearn.model_selection import cross_val_score
    from sklearn.metrics import make_scorer, accuracy_score, precision_score, recall_score, f1_score
    from sklearn.model_selection import cross_val_predict
    from sklearn.model_selection import cross_validate

加载 Iris 数据集

iris = load_iris()
X = iris.data
y = iris.target

留出 1/3 数据作为测试集,注意同分布取样

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1/3, random_state=42, stratify=y)

train_test_split主要参数:

sklearn.model_selection.train_test_split(*arrays, test_size=None, train_size=None, random_state=None, shuffle=True, stratify=None)

arrays:待划分的特征矩阵 X 和标签向量 y

test_size:测试集比例,默认为 None

取值范围:(0, 1) 表示比例;整数表示测试集样本数;若为 None,则自动计算

train_size:训练集比例,默认为 None。若 test_size 和 train_size 均为 None,则默认 test_size=0.25

random_state:随机种子,整型值使得结果可复现

shuffle:布尔值,是否在划分前打乱数据,默认为 True

stratify:按特定分布划分数据。通常为标签 y,保证训练集和测试集中类别分布一致

print(f"训练集样本数: {len(X_train)}, 测试集样本数: {len(X_test)}")

定义随机森林模型

rf_classifier = RandomForestClassifier(n_estimators=100, random_state=42)

RandomForestClassifier主要参数:

n_estimators=100: 森林中树的数量,默认值为 100

criterion='gini': 划分标准,默认值为 gini,可选 entropy

max_depth=None: 树的最大深度,默认值为 None,表示生长到完全分类

random_state=42: 随机种子,确保实验可重复

在训练集上训练模型

rf_classifier.fit(X_train, y_train)

输出模型特征重要性

print("特征重要性:")
print(rf_classifier.feature_importances_)

使用五折交叉验证评估性能

scoring = {
"accuracy": make_scorer(accuracy_score),
"precision_macro": make_scorer(precision_score, average='macro'),
"recall_macro": make_scorer(recall_score, average='macro'),
"f1_macro": make_scorer(f1_score, average='macro')
}

获取交叉验证分数

cv_results = cross_validate(rf_classifier, X_train, y_train, cv=5, scoring=scoring, return_train_score=False)

cross_validate主要参数:

sklearn.model_selection.cross_validate(estimator, X, y=None, *, scoring=None, cv=None, n_jobs=None, verbose=0, fit_params=None, return_train_score=False, return_estimator=False, error_score=nan)

estimator:用于训练的模型,如 LogisticRegression()

X:特征矩阵

y:标签向量

scoring:评估指标,默认为 None,即使用模型默认评分标准

可选单个指标(如 'accuracy')或列表(如 ['accuracy', 'precision_macro'])

cv:交叉验证折数,默认值 5

n_jobs:并行计算的线程数,默认为 None

-1 表示使用所有可用CPU

return_train_score:是否返回训练集分数,默认为 False

输出交叉验证结果

print("五折交叉验证结果:")
for metric, scores in cv_results.items():
if "test" in metric:
print(f"{metric}: {scores.mean():.4f}")

使用测试集进行预测

y_test_pred = rf_classifier.predict(X_test)

输出测试集性能报告

print("测试集性能报告:")
print(classification_report(y_test, y_test_pred, target_names=iris.target_names))

classification_report主要参数:

sklearn.metrics.classification_report(y_true, y_pred, *, labels=None, target_names=None, sample_weight=None, digits=2, output_dict=False, zero_division='warn')

y_true:真实标签

y_pred:预测标签

target_names:类别标签的名称

digits:结果小数位数,默认为 2

output_dict:是否以字典形式返回,默认为 False

  1. 训练结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)

四、心得体会
通过本次实验,我深入理解了随机森林算法的原理,包括基于决策树的随机特征选择和集成思想,认识到其在处理高维数据和减少过拟合方面的优势。在实践中,我使用Python实现了随机森林算法的训练与测试,并应用五折交叉验证对模型进行了训练与评估。实验让我体会到参数(如树的数量、最大深度)的调节对模型性能的影响,进一步提升了我在机器学习模型构建与优化方面的能力。

posted @ 2024-11-10 16:39  起名字真难_qmz  阅读(22)  评论(0)    收藏  举报