系列文章目录
第一章:Pyhton机器学习算法之KNN
第二章:Pyhton机器学习算法之K—Means
第三章:Pyhton机器学习算法之随机森林
目录
3.袋外误差(Out-of-Bag Error, OOB Error):
前言
随机森林(Random Forest)是一种集成学习方法,它通过构建多个决策树并将它们的预测结果进行汇总,从而改进预测精度和鲁棒性。这种方法在分类和回归问题中都有广泛的应用。以下是随机森林的一些关键特点和原理:
一、基本原理:
随机森林是一种集成学习方法,由许多“决策树”组成,就像一个森林里有很多棵树一样。
-
决策树:随机森林的基础是决策树。决策树是一种树形结构,其中每个内部节点表示一个特征上的测试,每个分支代表一个测试结果,每个叶节点代表一个类别(对于分类问题)或一个数值(对于回归问题)。
-
集成学习:随机森林通过构建多个决策树(通常是数百棵或更多)并将它们的预测结果进行平均(对于回归)或投票(对于分类)来提高整体性能。
理论基础:
随机森林是一种基于决策树的集成方法,通过引入随机性和集成思想,提高模型的准确性与鲁棒性。它可以用于分类和回归问题。
工作原理:
-
每棵树独立给出自己的建议(预测)。
-
森林就是所有树的集合,它们会根据“多数表决”来决定最终结果。
二、核心思想:
随机性主要体现在:
1.随机选数据:
每棵树的训练样本是从原始数据集中通过有放回抽样(bootstrap sampling)得到的,这样每棵树学到的东西会有些不一样。这意味着某些样本可能被多次使用,而某些样本可能一次都不用。这有助于增加模型的多样性。
2.随机选特征:
在构建每棵树时,不是使用全部特征,而是从所有特征中随机选择一个子集来分裂节点,这样每棵树的“视角”也会不同。这有助于减少模型之间的相关性。
每棵树都不一样,它们的“想法”是多样的,不会只盯着一模一样的信息看。多样性让最终的结果更加稳健。
三、基本概念:
决策树的基本结构:
决策树是一个基于特征分割数据的树状模型,其基本操作是:
-
对某个特征X _按照阈值 t 进行分割:

-
分割的目标是最大化数据纯度的提升,使用指标如基尼指数(分类问题)或均方误差(回归问题)来选择最优分割点。
四、特征重要性评估:
1. 基尼指数(分类问题):
基尼指数衡量节点的不纯度:

其中,pk 是当前节点中类别k 的样本占比。基尼指数越小,节点越纯。
2. 均方误差(回归问题):
用于衡量预测值和真实值的偏差:

3.袋外误差(Out-of-Bag Error, OOB Error):
由于采用了有放回抽样,总有一些样本没有被用于训练某棵树。这些未被使用的样本可以用来评估该树的性能,从而无需额外的验证集。OOB误差可以提供一个较好的模型评估,并且可以用于调整随机森林的超参数,例如:树的数量、最大深度等,通过观察oob在不同参数下的变化,选择最佳超参数。
五、特征选择原理:
每棵树的每次分裂时,随机选择 m 个特征(m<<M, M是总特征数),仅在这些特征中寻找最优分裂点。
假设特征集合为
,则每次分裂时,随机选择的特征子集为
,从中选出分裂点。
随机特征选择降低了树之间的相关性,从而提高了集成的效果。
在数据预测上,分类问题对每棵树的预测进行投票,选择票数最多的类别;回归问题对每棵树的预测取平均。
六、误差分析:
随机森林的误差来源主要有两部分:
-
偏差(Bias):由模型的假设错误引入,偏差低意味着模型能够很好地拟合训练数据。
-
方差(Variance):由数据扰动引起的预测变化,方差低意味着模型对数据噪声不敏感。
随机森林通过集成多个树,降低了单棵树的方差,同时保持较低的偏差。其总误差公式为:
![]()
其中,Correlation 表示各树之间的相关性。通过引入随机性,随机森林降低了树之间的相关性,从而减少总误差。
七、完整案例:
导入模块:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split,GridSearchCV
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report,confusion_matrix,roc_curve,auc
生成一个10特征6有效特征2冗余特征的DataFrame:
X,y =make_classification(
n_samples =1000,#设置1000样本数
n_features=10,#设置10个特征
n_informative =6 ,#设置6个有效特征
n_redundant=2,#设置2个冗余特征
n_classes=2,#设置类别数(二分类问题)
random_state=42,#固定随机种子
shuffle=True#打乱数据
)
#转化成DataFrame形式
features = [f'feature_{i}'for i in range(1,11)] #给特征命名
data = pd.DataFrame(X,columns=features )
data['Target']=y #添加目标变量
效果如下:

#按照28比例 拆分验证集和测试集
X_train,X_test,y_train,y_test = train_test_split(data[features],data['Target'],test_size =0.2,random_state=42)
查看特征分布情况:
#设置绘图样式
sns.set_style("whitegrid")
#绘制特征分布图 去前四个特征作为展示
plt.figure(figsize=(10, 6))
for i, feature in enumerate(features[:4]):
plt.subplot(2, 2, i + 1)
sns.histplot(X_train[feature], kde=True, bins=20, color='red')
plt.title(f'{feature}')
plt.tight_layout()
效果如下:

查看因变量分布:
#目标类比分布
sns.countplot(x=data['Target'],data=data,palette='pastel')
plt.title('Trage')
plt.xlabel('class')
plt.ylabel('count')
效果如下:

判断特征相关性:
#特征相关性热图 特征线性相关性判别
plt.figure(figsize=(10,8))
correlation_matrix =data[features].corr()
sns.heatmap(correlation_matrix,annot=True,cmap='coolwarm',fmt='.2f')
plt.title('Feature Correlation Matrix')
效果如下:

初始建模:
#初始的随机森林建模
rmodel=RandomForestClassifier()
rmodel.fit(X_train,y_train)
#初始模型评估
y_predict = rmodel.predict(X_test)
right_rate=classification_report(y_test,y_predict)
right_rate
特征重要性评估:
#特征重要性评估
#柱状图
importance_feature = rmodel.feature_importances_
plt.figure(figsize=(10,6))
plt.bar(features,importance_feature, color='red')
plt.xlabel('feature')
plt.ylabel('importance')
#折线图
plt.plot(features,importance_feature,color='blue',linestyle='--',marker='o')
plt.xlabel('feature')
plt.ylabel('importance')
plt.title('Feature Importance')
效果如下:

参数调优:
#参数优化
#定义参数网络 n_estimators 定义树的数量,max_depth最大树深 min_samples_split最小样例分割数 min_samples_leaf 叶子节点最小保留特征数
param_grid = {
'n_estimators': [50, 100, 200],
'max_depth': [None, 10, 20],
'min_samples_split': [2, 5, 10],
'min_samples_leaf': [1, 2, 4]
}
# 使用 GridSearchCV 进行参数优化 cv为交叉验证次数
# 使用 GridSearchCV 进行参数优化
grid_search = GridSearchCV(estimator=RandomForestClassifier(), param_grid=param_grid, cv=5, scoring='accuracy', verbose=1, n_jobs=-1)
# 拟合模型
grid_search.fit(X_train, y_train)
# 获取最佳参数
best_params = grid_search.best_params_
效果如下:

模型评估:
#模型评估
#混淆矩阵评估
sns.heatmap(confusion_matrix(y_test,y_pred_optimized),annot=True,fmt='d',cmap='Blues')
plt.title("Confusion Matrix")
plt.xlabel("Predicted")
plt.ylabel("Actual")
效果如下:

y_pred_proda = best_rmodel.predict_proba(X_test)[:, 1]
fpr, tpr, _ = roc_curve(y_test, y_pred_proda)
roc_auc = auc(fpr, tpr)
plt.figure(figsize=(5, 5))
plt.plot(fpr, tpr, c='red', label=f'ROC curve (area = {roc_auc:.2f})')
plt.plot([0, 1], [0, 1], linestyle='--', color='gray') # 参考线
plt.xlabel("False Positive Rate")
plt.ylabel("True Positive Rate")
效果如下:

八、优势与劣势:
优势:
-
准确性高:由于结合了多个决策树的预测结果,随机森林通常能够显著提高预测准确性。
-
鲁棒性强:随机森林对噪声和异常值具有较强的鲁棒性,因为每个树都是在不同的子数据集上构建的,且只使用了部分特征。
-
易于实现和调参:随机森林的实现相对简单,且参数较少,使得调参过程相对容易。
-
能够评估特征重要性:随机森林还可以提供关于特征重要性的信息,这对于特征选择和模型解释非常有用。
劣势:
-
容易过拟合,特别是在树深较大的情况下。
-
对数据的扰动敏感(即小数据变化可能导致完全不同的树)。
总结
综上所述,随机森林是一种强大的集成学习方法,它结合了多个决策树的预测结果以提高模型的准确性和鲁棒性。在实际应用中,需要根据具体任务和数据特点来选择合适的参数和配置。
7107

被折叠的 条评论
为什么被折叠?



