在训练过程中确保RandomForestClassifier选择一个变量

2024-09-30 16:38:43 发布

您现在位置:Python中文网/ 问答频道 /正文

这是一个有点菜鸟的问题。在

我想用sklearn中的RandomForestClassifier来训练Random Forest。我有一些变量,但是从这些变量中,我希望算法在它训练的每一棵树中确定地选择一个变量(我们称之为SourceID)。在

我该怎么做?我在分类器中看不到任何参数在这种情况下会有帮助。在

任何帮助都将不胜感激! 蒂娅。在

编辑

下面是我的场景。。在

如果老师在Concept A上布置作业,我必须预测下一个可能的作业概念。下一个分配的概念将严重依赖于已经分配的Concept A。例如,在指定“牛顿第一运动定律”之后,“牛顿第二运动定律”很有可能被指定。通常,在Concept A之后分配的概念的选择是有限的。根据过去的数据,我想在分配Concept A之后预测最佳可能的选项。在

如果我让random forest随机挑选变量,那么会有一些树没有Concept A的变量,在这种情况下,预测可能没有多大意义,这就是为什么我要强制选择这个变量。更好的是,如果这个变量被选为每个树中要拆分的第一个变量,那就更好了。在

这说明问题了吗?random forest根本不是这份工作的候选人吗?在


Tags: 算法概念分类器作业情况randomsklearnconcept
2条回答

我不相信scikit现在有办法了。您可以使用max_features=None这将删除所有特征选择的随机性。在

如果可以切换包,R的Ranger(https://cran.r-project.org/web/packages/ranger/ranger.pdf)有选项拆分.select.weightsalways.split.variables这可能是您要找的。定义随机选择的概率,或总是在随机选择之外包括这些特征。在

这违背了随机森林的总体设计,降低了随机性,进而削弱了算法的方差约简。你应该知道很多关于你的数据和选择这个选项的问题。正如@Michal所暗示的,在这里小心行事。在

RandomForestClassifier中没有这样的选项,但是随机森林算法只是一个决策树的集合,其中每个树只考虑所有可能特征的子集,并在训练数据的引导子样本上进行训练。在

因此,对于那些被迫使用一组特定特性的树,我们自己手动创建这个并不困难。我在下面写了一个类来做这个。这不会执行健壮的输入验证或类似的操作,但是您可以参考sklearn的random forestfit函数的源代码。这是为了让您了解如何自己构建它:

FixedFeatureRFC.py

import numpy as np
from sklearn.tree import DecisionTreeClassifier

class FixedFeatureRFC:
    def __init__(self, n_estimators=10, random_state=None):
        self.n_estimators = n_estimators

        if random_state is None:
            self.random_state = np.random.RandomState()

    def fit(self, X, y, feats_fixed=None, max_features=None, bootstrap_frac=0.8):
        """
        feats_fixed: indices of features (columns of X) to be 
                     always used to train each estimator

        max_features: number of features that each estimator will use,
                      including the fixed features.

        bootstrap_frac: size of bootstrap sample that each estimator will use.
        """
        self.estimators = []
        self.feats_used = []
        self.n_classes  = np.unique(y).shape[0]

        if feats_fixed is None:
            feats_fixed = []
        if max_features is None:
            max_features = X.shape[1]

        n_samples = X.shape[0]
        n_bs = int(bootstrap_frac*n_samples)

        feats_fixed = list(feats_fixed)
        feats_all   = range(X.shape[1])

        random_choice_size = max_features - len(feats_fixed)

        feats_choosable = set(feats_all).difference(set(feats_fixed))
        feats_choosable = np.array(list(feats_choosable))

        for i in range(self.n_estimators):
            chosen = self.random_state.choice(feats_choosable,
                                              size=random_choice_size,
                                              replace=False)
            feats = feats_fixed + list(chosen)
            self.feats_used.append(feats)

            bs_sample = self.random_state.choice(n_samples,
                                                 size=n_bs,
                                                 replace=True)

            dtc = DecisionTreeClassifier(random_state=self.random_state)
            dtc.fit(X[bs_sample][:,feats], y[bs_sample])
            self.estimators.append(dtc)

    def predict_proba(self, X):
        out = np.zeros((X.shape[0], self.n_classes))
        for i in range(self.n_estimators):
            out += self.estimators[i].predict_proba(X[:,self.feats_used[i]])
        return out / self.n_estimators

    def predict(self, X):
        return self.predict_proba(X).argmax(axis=1)

    def score(self, X, y):
        return (self.predict(X) == y).mean() 

下面是一个测试脚本,以查看上面的类是否按预期工作:

test.py

^{pr2}$

输出为:

n_features = 30
0.983739837398

没有一个断言失败,这表明我们选择修复的特性在每个随机特征子样本中使用,并且每个特征子样本的大小是所需的max_features大小。对保留数据的高精度表明分类器工作正常。在

相关问题 更多 >