随机森林模型是一种集成学习方法,主要用于分类和回归任务。它由多个决策树组成,通过集成这些决策树的预测结果来提高模型的准确性和稳定性。
随机森林使用名为“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、数据分析图表制作等心得。承接数据分析,论文修回,医学统计,空间分析,问卷分析业务。若有投稿和数据分析代做需求,可以直接联系我,谢谢!


