随机森林模型Python代码——用随机森林模型实现机器学习

一、随机森林模型简介

随机森林模型是一种流行且功能强大的机器学习算法,用于分类和回归任务。它属于集成学习方法,主要通过构建多个决策树并综合它们的预测结果来工作。

1.1适用范围

随机森林模型可以应用于各种数据类型和问题上,包括:

  • 分类问题:如疾病诊断、图像分类。
  • 回归问题:如房价预测、股票价格预测。
  • 特征选择:随机森林可以评估各个特征的重要性。

1.2原理

  1. 自助采样(Bootstrap Sampling):从原始数据集中进行有放回的随机采样,形成多个子数据集。
  2. 建立决策树:对每个子数据集训练一个决策树。在训练过程中,每次分裂节点时不是考虑所有特征,而是随机选择一部分特征。
  3. 集成:通过投票(分类)或平均(回归)的方式,综合所有决策树的结果得出最终预测。

1.3优点

  • 鲁棒性:通过构建多棵树,降低过拟合的风险,增强模型的泛化能力。
  • 易于并行化:各决策树的建立可以完全并行进行。
  • 处理能力强:能够有效处理高维数据和大数据集。
  • 自动进行特征选择:较重要的特征会在构造决策树时更频繁地被选中。

1.4缺点

  • 模型解释性差:由于模型由大量决策树构成,因此很难解释单一模型的决策路径。
  • 预测性能:对于噪声特别多的数据集或异常值,可能会导致性能不稳定。

二、随机森林模型的Python实现

2.1Python代码

下面是使用Python的scikit-learn库实现随机森林分类器的一个示例。

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score

# 加载数据集
data = load_iris()
X = data.data
y = data.target

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 创建随机森林分类器
rf = RandomForestClassifier(n_estimators=100, random_state=42)

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

# 预测测试集
predictions = rf.predict(X_test)

# 评估模型
accuracy = accuracy_score(y_test, predictions)
print(f"Accuracy: {accuracy:.2f}")

# 特征重要性
importances = rf.feature_importances_
print("Feature importances:", importances)

2.2代码说明

  1. 数据生成
    • 使用 load_iris生成一个三分类数据集。
  2. 数据集划分
    • 使用 train_test_split 将数据集划分为训练集和测试集,测试集比例为30%。
  3. 创建随机森林分类器
    • 使用 RandomForestClassifier创建随机森林分类器。
  4. 模型训练
    • 得到一个随机森林模型 rf,并使用训练集数据对模型进行训练。
  5. 预测和评估
    • 使用测试集数据进行预测,计算预测值和预测概率。
    • 评估模型的准确率。
    • 输出混淆矩阵和绘制ROC曲线。
  6. 输出特征重要性:

              1. 使用feature_importances_函数输出每个特征的重要性

三、用随机森林模型实现机器学习案例

下面是一个完整的可运行随机森林案例,包括数据生成、模型训练、预测及评估的过程。我们将使用scikit-learn中的load_iris数据,并展示运行结果。

3.1案例主要代码

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score

# Load the dataset
data = load_iris()
X = data.data
y = data.target

# Split the dataset into training and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# Create a RandomForest Classifier
rf = RandomForestClassifier(n_estimators=100, random_state=42)

# Train the model
rf.fit(X_train, y_train)

# Predict on the test set
predictions = rf.predict(X_test)

# Evaluate the model
accuracy = accuracy_score(y_test, predictions)

# Feature importances
importances = rf.feature_importances_

accuracy, importances

3.2模型评价

1.模型准确性评价及特征重要性输出

Result
(1.0, array([0.10410501, 0.04460499, 0.41730813, 0.43398187]))
  • 准确度:模型在测试集上的准确度为 100%,这表示模型对测试集中的所有样本都做出了正确的预测。这样的结果在实际应用中较少见,通常可能是由于数据集规模小、类别分布不均或模型过拟合等因素导致。
  • 特征重要性
    • 第一个特征(通常为萼片长度)的重要性约为 10.4%
    • 第二个特征(通常为萼片宽度)的重要性约为 4.5%
    • 第三个特征(通常为花瓣长度)的重要性约为 41.7%
    • 第四个特征(通常为花瓣宽度)的重要性约为 43.4%

2.混淆矩阵图绘制详细代码

import matplotlib.pyplot as plt
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay, roc_curve, auc
from sklearn.preprocessing import label_binarize
import numpy as np

# Assuming 'rf' is your trained classifier, and 'X_test', 'y_test' are your test data

# Predict class probabilities for ROC calculation
predictions_proba = rf.predict_proba(X_test)

# Compute the confusion matrix using the class predictions
predictions = rf.predict(X_test)
cm = confusion_matrix(y_test, predictions)

# Binarize the output for ROC calculation (if it's a multi-class classification)
y_test_bin = label_binarize(y_test, classes=[0, 1, 2])
n_classes = y_test_bin.shape[1]

# Calculate ROC curve and ROC area for each class
fpr = dict()
tpr = dict()
roc_auc = dict()

for i in range(n_classes):
    fpr[i], tpr[i], _ = roc_curve(y_test_bin[:, i], predictions_proba[:, i])
    roc_auc[i] = auc(fpr[i], tpr[i])

# Plot confusion matrix separately
plt.figure(figsize=(8, 6))
ConfusionMatrixDisplay.from_estimator(rf, X_test, y_test, cmap='Blues')
plt.title('Confusion Matrix')
plt.show()

图中显示了模型对测试数据的分类结果。由于模型准确度为 100%,因此每个类别的预测都完全正确,没有误分类。

3.ROC曲线图详细代码

# Plot ROC curve separately
plt.figure(figsize=(8, 6))
for i in range(n_classes):
    plt.plot(fpr[i], tpr[i], label=f'Class {i} (area = {roc_auc[i]:.2f})')

# Plot details for ROC curve
plt.plot([0, 1], [0, 1], 'k--')  # Diagonal line for random guessing
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic (ROC)')
plt.legend(loc="lower right")

plt.show()

  • 每个类别的ROC曲线都显示在图中,分别用不同颜色表示。
  • 每条曲线的下方面积(AUC值)也给出,均为1.0,这表明模型对每个类别的分类性能都非常好。

3.3展示特征重要性图

# Retrieve feature importances
importances = rf.feature_importances_

# Plotting feature importances
plt.figure(figsize=(8, 4))
features = data.feature_names
plt.bar(features, importances, color='skyblue')
plt.xlabel('Features')
plt.ylabel('Importance')
plt.title('Feature Importances')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

这是随机森林模型中各个特征的重要性图。从图中可以看出:

  • 花瓣长度(petal length)和花瓣宽度(petal width)在模型中具有最高的重要性,这表明它们对于预测鸢尾花的类别非常关键。
  • 相比之下,萼片长度(sepal length)和萼片宽度(sepal width)的重要性较低。

这种视觉表示帮助我们了解哪些特征在决策过程中起到了主导作用,从而可以对模型的解释和后续的特征工程提供指导。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值