大数跨境
0
0

【左手Python右手R】随机森林模型(Random Forest Model)的相关分析及评价

【左手Python右手R】随机森林模型(Random Forest Model)的相关分析及评价 医学统计数据分析
2025-02-14
1
导读:【左手Python右手R】随机森林模型(Random Forest Model)的相关分析及评价
‌随机森林模型

‌随机森林模型‌是一种集成学习方法,主要用于分类和回归任务。它由多个决策树组成,通过集成这些决策树的预测结果来提高模型的准确性和稳定性‌。


随机森林的工作原理

随机森林使用名为“bagging”的技术,通过数据集和特征的随机自助抽样样本并行构建完整的决策树。每棵树在称为自助聚集的过程中随机对训练数据子集进行抽样,模型适合这些较小的数据集,并汇总预测结果。通过有放回抽样,可以重复使用同一数据的几个实例,结果就是,这些树不仅基于不同的数据集进行训练,而且还使用不同的特征做出决策‌。


随机森林的特点

随机性‌:随机森林通过数据随机和特征随机来减少模型的偏差和过拟合问题。数据随机通过有放回抽样构成不同的样本数据集,特征随机则从所有特征中随机选择一部分特征用于每棵树的训练‌

泛化能力‌:由于每棵树都是基于不同的数据集和特征训练的,整体模型具有较好的泛化能力,能够适应不同的数据集‌。

‌运算速度快‌:随机森林在处理大数据时表现优异,运算速度较快‌。

总之,随机森林模型通过集成多个决策树的预测结果,提高了模型的准确性和稳定性,适用于多种机器学习任务。







我们仍以示例数据为例:








首先使用Rstudio打开示例数据:








首先使用caret包演示:

library(caret)

set.seed(1234)

rf.model <- train(

  结局 ~ 指标1+指标2+指标3+指标4+指标5+指标6,

  data=Train, method="rf",

  preProcess=c(center", "scale),

  trControl=trainControl(method="cv", number=10, classProbs=T))

print(rf.model)

plot(rf.model)










也可以使用randomForest包

library(randomForest)

modelFit <- randomForest(结局 ~ 指标1+指标2+指标3+指标4+指标5, data = Train, keep.forest = TRUE, 

                         predict.all = TRUE, type = "prob")

print(modelFit)

plot(modelFit)










使用Train数据得到的模型预测test数据(caret包):
rf.pred.prob <- predict(rf.model, newdata=Test)

并绘制ROC曲线检验效果

par(las=1, cex.axis=.8)

rf.roc <- roc(

  y ~ pred,

  data=data.frame(y=Test$结局, pred=rf.pred.prob),

  plot=T, ci=T, main="ROC Curve of Random Forest",

  print.auc=T, print.auc.cex=.8,

  print.thres=T, print.thres.cex=.8,

  auc.polygon=T, max.auc.polygon=T, grid=T)








使用Train数据得到的模型预测test数据(randomForest包):

rf.pred.prob <- predict(modelFit, newdata=Test)

并绘制ROC曲线检验效果:

par(las=1, cex.axis=.8)

rf.roc <- roc(

  y ~ pred,

  data=data.frame(y=Test$结局, pred=rf.pred.prob),

  plot=T, ci=T, main="ROC Curve of Random Forest",

  print.auc=T, print.auc.cex=.8,

  print.thres=T, print.thres.cex=.8,

  auc.polygon=T, max.auc.polygon=T, grid=T)








对随机森林进行可视化

library(fastshap)

library(shapviz)

pfun <- function(model, newdata){

  predict(model, newdata=newdata)

}

set.seed(1234)

rf.shap <- explain(rf.model, X=Test, pred_wrapper=pfun, shap_only=F,

                   feature_names=c("指标1", "指标2", "指标3", "指标4", "指标5", "指标6"))

sv_importance(shapviz(rf.shap), kind="beeswarm") +

  theme_bw() +

  theme(axis.text.y=element_text(family="Songti SC"),

        panel.grid=element_blank())






随机森林模型

随机森林模型‌是一种集成学习方法,主要用于分类和回归任务。它通过构建多个决策树并将它们的结果进行投票或平均,以得到最终的预测结果。随机森林模型由Leo Breiman和Adele Cutler发展,并由Tin Kam Ho在1995年提出‌。


随机森林模型的基本原理

随机森林模型通过以下步骤构建:

‌样本随机‌:从原始数据集中通过有放回抽样形成多个子数据集。

‌特征随机‌:在每个节点上随机选择一部分特征进行决策树的构建。

‌决策树构建‌:对每个子数据集构建一个决策树,每棵树都会完整成长而不会剪枝。

‌集成预测‌:最终预测是所有决策树的平均值(回归任务)或多数投票(分类任务)‌。




随机森林模型的优点:

‌防止过拟合‌:通过集成多个决策树,随机森林能够有效地处理过拟合问题,提高模型的泛化能力‌。

‌处理非线性问题‌:随机森林能够处理非线性问题,并且擅长处理大量样本和特征‌。

‌降低方差‌:通过减少单个决策树的方差,随机森林提高了对新数据的预测能力‌。

‌可解释性‌:尽管当前深度学习非常流行,随机森林因其简单、有效、高效以及可解释性等优点,仍然成为许多数据分析师工作中的首选算法‌。

实际应用:

随机森林模型可以应用于多种任务,包括分类、回归和异常检测。由于其强大的泛化能力和对高维数据的处理能力,随机森林在金融、医疗、生物信息学等领域有广泛的应用‌。






今天我们仍以示例数据为例,探讨一下随机森林模型可视化及预测效果的ROC曲线、混淆矩阵评价。








#加载程序包(openpyxl和pandas等)

# 使用pandas读取示例数据xlsx文件

import openpyxl

import pandas as pd

import simpleNomo

import matplotlib.pyplot as plt

datarf = pd.read_excel(r'C:\Users\hyy\Desktop\示例数据.xlsx')

# 查看前几行数据

print(datarf.head())








#随机森林主要使用到的第三方库有以下几种:

#numpy:常见的科学计算库

#matplotlib:进行绘图使用

#sklearn.datasets:导入训练需要的数据集

#train_test_split:划分训练集和测试集

#DecisionTreeClassifier:定义随机森林中的决策树分类器






#随机森林(Random Forest)的构建步骤如下:准备训练数据集;重复步骤(随机选择特征子集;随机采样训练数据集;构建决策树;);对新样本进行预测;模型评估;特征重要性评估

#步骤概览:

# 模型训练

#def fit(self, X, y):

"""

    训练随机森林模型

    :param X: 训练集特征

    :param y: 训练集标签

"""

# 模型预测

#def predict(self, X):

"""

    使用训练好的模型进行预测

    :param X: 测试集特征

    :return: 预测结果

"""

# 精度

#def score(self, y_pred, y):

"""

    计算分类的准确率

    :param y_pred: 预测值

    :param y: 真实值

    :return: 准确率

"""






#示例数据模型实战

import numpy as np

import matplotlib.pyplot as plt

from sklearn.datasets import load_iris

from sklearn.model_selection import train_test_split

from sklearn.tree import DecisionTreeClassifier

# 设置随机种子

seed_value = 1234

np.random.seed(seed_value)

# 对导入的实例数据分离特征和目标变量

X = datarf[['指标1', '指标2', '指标3','指标4','指标5','指标6']]

y = datarf[['结局']]

# 划分训练集和测试集

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 数据标准化

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()

X_train = scaler.fit_transform(X_train)

X_test =  scaler.fit_transform(X_test)






# 训练随机森林

from sklearn.ensemble import RandomForestClassifier

rfmodel = RandomForestClassifier(

                   n_estimators=100, 

                   max_depth=5,

                   min_samples_split=2, 

                   random_state=seed_value)

rfmodel.fit(X_train, y_train)


#预测测试集数据

y_train_pred = rfmodel.predict(X_train)

print(预测训练集结果如下:\n",y_train_pred)

y_test_pred = rfmodel.predict(X_test)

print("预测测试集数据结果如下:\n",y_test_pred)








#随机森林模型可视化

import matplotlib.pyplot as plt

from sklearn.tree import plot_tree

# 可视化所有提取的决策树

fig, axes = plt.subplots(nrows=5, ncols=4, figsize=(40, 50), dpi=200)

for i in range(20):

    ax = axes[i // 4, i % 4]

    plot_tree( rfmodel.estimators_[i],

    feature_names=datarf.columns[3:9], # 使用 df 的列名作为特征名称

    filled=True, ax=ax

    )

    ax.set_title(f'Tree {i+1}')

plt.savefig('随机森林.png')

plt.tight_layout()

plt.show()










# Accuracy结果

from sklearn.metrics import classification_report, accuracy_score

score_train = accuracy_score(y_train,y_train_pred)

print("训练集Classification Report:\n ", classification_report(y_train,y_train_pred))

score_test = accuracy_score(y_test,y_test_pred)

print("测试集Classification Report:\n ", classification_report(y_test,y_test_pred))

print('训练集Accuracy: ', score_train)

print('测试集Accuracy: ', score_test)








#混淆矩阵评估模型

#导入第三方模块

from sklearn import metrics

# 混淆矩阵

print("混淆矩阵四格表输出如下:")

print(metrics.confusion_matrix(y_test, y_test_pred, labels = [0, 1]))

Accuracy = metrics._scorer.accuracy_score(y_test, y_test_pred)

Sensitivity = metrics._scorer.recall_score(y_test, y_test_pred)

Specificity = metrics._scorer.recall_score(y_test, y_test_pred, pos_label=0)

print("决策树模型混淆矩阵评价结果如下:")

print('模型准确率为%.2f%%' %(Accuracy*100))

print('正例覆盖率为%.2f%%' %(Sensitivity*100))

print('负例覆盖率为%.2f%%' %(Specificity*100))








# 使用Seaborn的heatmap绘制混淆矩阵

import matplotlib.pyplot as plt

from sklearn.metrics import confusion_matrix

import seaborn as sns

sns.heatmap(metrics.confusion_matrix(y_test, y_test_pred), annot=True, fmt='d')

plt.title('Confusion Matrix')

plt.xlabel('Predicted label')

plt.ylabel('True label')

plt.show()








#进行ROC曲线绘制计算准备

# у得分为模型预测正例的概率

y_score =rfmodel.predict_proba(X_test)[:,1]

#计算不同阈值下,fpr和tpr的组合值,其中fpr表示1-Specificity,tpr表示sensitivity

fpr,tpr,threshold =metrics.roc_curve(y_test,y_score)

# 计算AUC的值

roc_auc = metrics.auc(fpr,tpr)

print("随机森林模型预测测试集数据ROC曲线的AUC:",roc_auc)

随机森林模型预测测试集数据ROC曲线的AUC: 0.9709333333333334






#绘制ROC曲线

import matplotlib.pyplot as plt

import seaborn as sns

# 绘制面积图

plt.stackplot(fpr, tpr, color='steelblue', alpha = 0.5,edgecolor = 'black')

# 添加边际线

plt.plot(fpr, tpr, color='black',lw = 1)

# 添加对角线

plt.plot([0,1],[0,1],color ='red',linestyle ='--')

# 添加文本信息

plt.text(0.5,0.3,'Roc curve(area =%.2f)'% roc_auc)

# 添加轴标签

plt.xlabel('1-Specificity')

plt.ylabel('Sensitivity')

# 显示图形

plt.show()











医学统计数据分析分享交流SPSS、R语言、Python、ArcGis、Geoda、GraphPad、数据分析图表制作等心得。承接数据分析,论文修回,医学统计,空间分析,问卷分析业务。若有投稿和数据分析代做需求,可以直接联系我,谢谢!




【声明】内容源于网络
0
0
医学统计数据分析
分享交流SPSS、R语言、Python、ArcGis、Geoda、GraphPad、数据分析图表制作等心得。承接数据分析,论文返修,医学统计,空间分析,机器学习,生存分析,时间序列,时空面板,深度学习,问卷分析等业务。公众号右下角可联系作者
内容 323
粉丝 0
医学统计数据分析 分享交流SPSS、R语言、Python、ArcGis、Geoda、GraphPad、数据分析图表制作等心得。承接数据分析,论文返修,医学统计,空间分析,机器学习,生存分析,时间序列,时空面板,深度学习,问卷分析等业务。公众号右下角可联系作者
总阅读32
粉丝0
内容323