随机森林Python

随机森林开发指南:用 Python 实现的 5 种方法

Florian Zyprian

随机森林(Random Forest)是决策树的集合,也是目前最流行的方法之一。 机器学习世界 并经常用于进行预测。在本文中,我们将讨论 5 种不同的 Python 软件包,您可以使用它们来实现随机森林。

让我们先来看看如何在不使用包的情况下在Python中实现随机森林。

在Python中实现随机森林

随机森林由决策树的集合组成。该算法对训练数据和变量进行随机采样,并从每个样本中创建一棵决策树。预测是通过对单个树的预测进行平均或匹配来进行的。

这个代码例子在Python中实现了随机森林算法。该算法的目的是生成一组决策树,并通过汇总它们的预测结果来提高预测的准确性。

随机森林的纯Python实现

代码从导入所需的库开始,即numpy和collection。此外,还导入了Scikit-Learn数据集模块,以便使用函数 make_classification() 它产生了一个人工数据集,在这个数据集上可以对算法进行训练和测试。

接下来,一个类 节点 定义为代表决策树的节点。每个节点都有几个属性,如 特征_idx, 阈值, 左边, ,以及 价值.

该班级 随机森林 是实现该算法的主类。它有几个参数,如 n_trees, max_depthmin_samples_split.ǞǞǞ fit()-函数将数据集作为输入,通过重复的随机选择生成决策树,以进行预测。

职能 build_tree() 通过递归分割数据来创建一棵决策树。如果达到最大深度,只有一个类,或者没有达到最小样本量,就会创建一个具有最频繁出现的标签的叶子节点。否则,就会选择一个随机的特征,计算出分割的最佳阈值,并相应地分割数据。然后,这个过程被递归地应用到两个子树上,直到满足终止条件。

ǞǞǞ 预测()-该函数通过汇总所有决策树的预测结果来生成对新数据的预测。该 predict_tree()-函数根据数据和当前的决策树做出决定。

职能 best_split() 通过计算信息增益,为决策节点分离选择最佳特征和阈值。该 Information_gain()-该函数在当前阈值的基础上计算信息增益,而该函数 熵() 计算一个节点的熵。该 拆分()-该函数将数据分割成两个子集,决策树的每个分支都有一个。该函数 最常见的标签(Most_common_label) 返回最常出现的标签。

总的来说,这是一个强大的代码实例,是Python中随机森林算法的清晰实现。它使用了各种技术,如引导、特征抽样和熵计算,以做出准确的预测。

随机森林样本代码

下面是一个用Python实现随机森林的示例代码。

将 numpy 导入 np
from collections import Counter
from sklearn.datasets import make_classification
类 Node:
    def __init__(self, feature_idx=None, threshold=None, left=None, right=None, value=None):
        self.feature_idx = feature_idx
        self.threshold = threshold
        self.left = 左
        self.right = right
        self.value = value
类 RandomForest:
    def __init__(self, n_trees=10, max_depth=5, min_samples_split=5):
        self.n_trees = n_trees
        self.max_depth = max_depth
        self.min_samples_split = min_samples_split
        self.trees = []
    def fit(self, X, y):
        n_samples, n_features = X.shape
        for i in range(self.n_trees):
            sample_idxs = np.random.choice(n_samples, n_samples, replace=True)
            X_bootstrap = X[sample_idxs]
            y_bootstrap = y[sample_idxs]
            tree = self.build_tree(X_bootstrap, y_bootstrap, 0)
            self.trees.append(tree)
    def build_tree(self, X, y, depth):
        n_samples, n_features = X.shape
        n_labels = len(np.unique(y))
        如果 depth == self.max_depth 或 n_labels == 1 或 n_samples < self.min_samples_split:
            leaf_value = self.most_common_label(y)
            返回 Node(value=leaf_value)
        feature_idxs = np.random.choice(n_features, int(np.sqrt(n_features)), replace=False)
        best_feature_idx, best_threshold = self.best_split(X, y, feature_idxs)
        left_idxs, right_idxs = self.split(X[:, best_feature_idx], best_threshold)
        left = self.build_tree(X[left_idxs, :], y[left_idxs], depth+1)
        right = self.build_tree(X[right_idxs, :], y[right_idxs], depth+1)
        return Node(best_feature_idx, best_threshold, left, right)
    def predict(self, X):
        predictions = np.zeros((X.shape[0], len(self.trees)))
        for i, tree in enumerate(self.trees):
            predictions[:, i] = self.predict_tree(X, tree)
        return np.round(np.mean(predictions, axis=1))
    def predict_tree(self, X, tree):
        if tree.value is not None:
            return tree.value
        if X[tree.feature_idx]  best_gain,则
                best_gain = gain
                split_idx = feature_idx
                split_threshold = threshold
    返回 split_idx、split_threshold
def information_gain(self, y, X_column, split_threshold):
    parent_entropy = self.entropy(y)
    left_idxs, right_idxs = self.split(X_column, split_threshold)
    如果 len(left_idxs) == 0 或 len(right_idxs) == 0:
        返回 0
    n = len(y)
    n_l, n_r = len(left_idxs), len(right_idxs)
    e_l, e_r = self.entropy(y[left_idxs]), self.entropy(y[right_idxs])
    child_entropy = (n_l/n)*e_l + (n_r/n)*e_r
    ig = parent_entropy - child_entropy
    返回 ig
def entropy(self, y):
    _, counts = np.unique(y, return_counts=True)
    概率 = counts / len(y)
    entropy = sum(probabilities * -np.log2(probabilities))
    返回熵
def split(self, X_column, threshold):
    left_idxs = np.argwhere(X_column  threshold).flatten()
    返回 left_idxs、right_idxs
def most_common_label(self, y):
    counter = counter(y)
    most_common = counter.most_common(1)
    返回 most_common[0][0]

生成数据并拟合RandomForest模型

X, y = make_classification(n_samples=1000, n_features=10, n_informative=5, random_state=42)
rf = RandomForest(n_trees=10, max_depth=5, min_samples_split=5) rf.fit(X, y)

进行预测

X_test = np.random.randn(10, 10)
predictions = rf.predict(X_test)

这是随机森林算法在 Python 中的一个非常简单的实现。但是,正如你所看到的,它非常繁琐,你必须考虑到很多事情。例如,检查是否已达到树的深度、决策树的使用和预测的调整。

因此,在实践中,经常使用包来实现随机森林。下面你会发现五个不同的Python包,你可以用它们来实现随机森林。

使用Scikit-Learn的随机森林

Scikit-Learn是机器学习领域的一个流行包,提供了许多算法和函数。使用Scikit-Learn,你只需几行代码就可以实现随机森林。

下面是一个示例代码。

from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import make_classification
# 创建数据并拟合 RandomForest 模型
X, y = make_classification(n_samples=1000, n_features=10, n_informative=5, random_state=42)
rf = RandomForestClassifier(n_estimators=10, max_depth=5, min_samples_split=5, random_state=42)
rf.fit(X, y)
# 进行预测
X_test = np.random.randn(10, 10)
predictions = rf.predict(X_test)
print(predictions)

XGBoost中的随机森林

XGBoost是一个专门设计用于决策树和梯度提升算法的软件包。

被开发出来了。它速度快,提供了许多自定义模型的选项。XGBoost还支持随机森林模型。

下面是一个示例代码。

将 xgboost 导入 xgb
从 sklearn.datasets 导入 make_classification
# 生成数据
X, y = make_classification(n_samples=1000, n_features=10, n_informative=5, random_state=42)
# 创建 XGBoost 数据结构
dtrain = xgb.DMatrix(X, label=y)
# 设置超参数
params = {
    "objective": "multi:softprob"、
    "eval_metric": "mlogloss"、
    "num_class":len(np.unique(y))、
    "max_depth": 5、
    "subsample": 0.8、
    "colsample_bytree": 0.8、
    "种子":42
}
# 拟合模型
num_round = 10
bst = xgb.train(params, dtrain, num_round)
# 进行预测
X_test = np.random.randn(10, 10)
dtest = xgb.DMatrix(X_test)
predictions = bst.predict(dtest)
print(predictions)

在LightGBM中实施决策树

LightGBM是另一个用于决策树和梯度提升算法的快速软件包。它还为随机森林模型提供了一个选项。

下面是一个示例代码。

将 lightgbm 导入 lgb
从 sklearn.datasets 导入 make_classification
# 生成数据
X, y = make_classification(n_samples=1000, n_features=10, n_informative=5, random_state=42)
# 创建 LightGBM 数据结构
lgb_train = lgb.Dataset(X, y)
# 设置超参数
params = {
    "objective": "multiclass"、
    "num_class": len(np.unique(y))、
    "max_depth": 5、
    "subsample": 0.8、
    "colsample_bytree": 0.8、
    "种子":42
}
# 拟合模型
num_round = 10
bst = lgb.train(params, lgb_train, num_round)
# 进行预测
X_test = np.random.randn(10, 10)
predictions = bst.predict(X_test)
print(predictions)

Statsmodels中的RandomForestRegressor和RandomForestClassifier

Statsmodels是一个专门用于统计建模和分析的软件包。它还提供了随机森林模型的选项。

下面是RandomForestRegressor的示例代码。

import statsmodels.api as sm
从 sklearn.datasets 导入 make_regression
# 生成数据
X、y = make_regression(n_samples=100, n_features=10, random_state=42)
# 拟合模型
rf = sm.OLS(y, X)
result = rf.fit()
# 进行预测
X_test = np.random.randn(10, 10)
predictions = result.predict(X_test)
print(predictions)

下面是一个RandomForestClassifier的示例代码。

import statsmodels.api as sm
从 sklearn.datasets 导入 make_classification
# 生成数据
X, y = make_classification(n_samples=100, n_features=10, random_state=42)
# 拟合模型
rf = sm.discrete_model.RandomForest(y, X)
result = rf.fit()
# 进行预测
X_test = np.random.randn(10, 10)
predictions = result.predict(X_test)
print(predictions)

总结

随机森林是一种流行的 算法 在机器学习领域,随机森林模型是一种常用的预测模型。Python 中有许多软件包可以帮助实现随机森林模型,如 Scikit-Learn、XGBoost、LightGBM 和 Statsmodels。根据您的要求和数据量,您可以选择最适合您的软件包。

关于我

更多精彩文章

利用数字采集技术进行数字流程优化

文件采集:创新的、数字化的文件管理

数字革命从根本上改变了企业的工作方式。优化工作流程和提高工作效率的最重要工具之一就是...

阅读故事

人工智能营销指南:使用案例、实例和工具

GAIO(生成式人工智能优化)最近展示了人工智能在市场营销中的重要性。GAIO 应对的挑战是企业如何优化...

阅读故事

应收账款:通过AI更有效地处理

检查信用度、监控收到的付款并撰写催款函:企业通过应收账款会计来确保自身流动性的工作量很大...

阅读故事
箭头向上