细说机器学习算法之随机森林及代码实现

系列文章目录

第一章:Pyhton机器学习算法之KNN

第二章:Pyhton机器学习算法之K—Means

第三章:Pyhton机器学习算法之随机森林


目录

系列文章目录

前言

一、基本原理:

理论基础:

工作原理:

二、核心思想:

1.随机选数据:

2.随机选特征:

三、基本概念:

决策树的基本结构:

四、特征重要性评估:

1. 基尼指数(分类问题):

2. 均方误差(回归问题):

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")

效果如下:

八、优势与劣势:

优势:

  1. 准确性高:由于结合了多个决策树的预测结果,随机森林通常能够显著提高预测准确性。

  2. 鲁棒性强:随机森林对噪声和异常值具有较强的鲁棒性,因为每个树都是在不同的子数据集上构建的,且只使用了部分特征。

  3. 易于实现和调参:随机森林的实现相对简单,且参数较少,使得调参过程相对容易。

  4. 能够评估特征重要性:随机森林还可以提供关于特征重要性的信息,这对于特征选择和模型解释非常有用。

劣势:

  • 容易过拟合,特别是在树深较大的情况下。

  • 对数据的扰动敏感(即小数据变化可能导致完全不同的树)。


总结

综上所述,随机森林是一种强大的集成学习方法,它结合了多个决策树的预测结果以提高模型的准确性和鲁棒性。在实际应用中,需要根据具体任务和数据特点来选择合适的参数和配置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值