That's nice to know, thanks a lot for the reference! Best, Sebastian
> On Oct 28, 2018, at 3:34 AM, Guillaume Lemaître <g.lemaitr...@gmail.com> > wrote: > > FYI: https://github.com/scikit-learn/scikit-learn/pull/12364 > > On Sun, 28 Oct 2018 at 09:32, Guillaume Lemaître <g.lemaitr...@gmail.com> > wrote: > There is always a shuffling when iteration over the features (even when going > to all features). > So in the case of a tie the split will be done on the first feature encounter > which will be different due to the shuffling. > > There is a PR which was intending to make the algorithm deterministic to > always select the same feature in the case of tie. > > On Sun, 28 Oct 2018 at 09:22, Fernando Marcos Wittmann > <fernando.wittm...@gmail.com> wrote: > The random_state is used in the splitters: > > SPLITTERS = SPARSE_SPLITTERS if issparse(X) else DENSE_SPLITTERS > > splitter = self.splitter > if not isinstance(self.splitter, Splitter): > splitter = SPLITTERS[self.splitter](criterion, > self.max_features_, > min_samples_leaf, > min_weight_leaf, > random_state, > self.presort) > > Which is defined as: > > DENSE_SPLITTERS = {"best": _splitter.BestSplitter, > "random": _splitter.RandomSplitter} > > SPARSE_SPLITTERS = {"best": _splitter.BestSparseSplitter, > "random": _splitter.RandomSparseSplitter} > > Both 'best' and 'random' uses random states. The DecisionTreeClassifier uses > 'best' as default `splitter` parameter. I am not sure how this 'best' > strategy was defined. The docs define as "Supported strategies are “best”. > > > > > On Sun, Oct 28, 2018 at 9:32 AM Piotr Szymański <nied...@gmail.com> wrote: > Just a small side note that I've come across with Random Forests which in the > end form an ensemble of Decision Trees. I ran a thousand iterations of RFs on > multi-label data and managed to get a 4-10 percentage points difference in > subset accuracy, depending on the data set, just as a random effect, while > I've seen papers report differences of just a couple pp as statistically > significant after a non-parametric rank test. > > On Sun, Oct 28, 2018 at 7:44 AM Sebastian Raschka <m...@sebastianraschka.com> > wrote: > Good suggestion. The trees look different. I.e., there seems to be a tie at > some point between choosing X[:, 0] <= 4.95 and X[:, 3] <= 1.65 > > So, I suspect that the features are shuffled, let's call it X_shuffled. Then > at some point the max_features are selected, which is by default > X_shuffled[:, :n_features]. Based on that, if there's a tie between > impurities for the different features, it's probably selecting the first > feature in the array among these ties. > > If this is true (have to look into the code more deeply then) I wonder if it > would be worthwhile to change the implementation such that the shuffling only > occurs if max_features < n_feature, because this way we could have > deterministic behavior for the trees by default, which I'd find more > intuitive for plain decision trees tbh. > > Let me know what you all think. > > Best, > Sebastian > > > On Oct 27, 2018, at 11:07 PM, Julio Antonio Soto de Vicente > > <ju...@esbet.es> wrote: > > > > Hmmm that’s weird... > > > > Have you tried to plot the trees (the decision rules) for the tree with > > different seeds, and see if the gain for the first split is the same even > > if the split itself is different? > > > > I’d at least try that before diving into the source code... > > > > Cheers, > > > > -- > > Julio > > > >> El 28 oct 2018, a las 2:24, Sebastian Raschka <m...@sebastianraschka.com> > >> escribió: > >> > >> Thanks, Javier, > >> > >> however, the max_features is n_features by default. But if you execute sth > >> like > >> > >> import numpy as np > >> from sklearn.datasets import load_iris > >> from sklearn.model_selection import train_test_split > >> from sklearn.tree import DecisionTreeClassifier > >> > >> iris = load_iris() > >> X, y = iris.data, iris.target > >> X_train, X_test, y_train, y_test = train_test_split(X, y, > >> test_size=0.3, > >> random_state=123, > >> shuffle=True, > >> stratify=y) > >> > >> for i in range(20): > >> tree = DecisionTreeClassifier() > >> tree.fit(X_train, y_train) > >> print(tree.score(X_test, y_test)) > >> > >> > >> > >> You will find that the tree will produce different results if you don't > >> fix the random seed. I suspect, related to what you said about the random > >> feature selection if max_features is not n_features, that there is > >> generally some sorting of the features going on, and the different trees > >> are then due to tie-breaking if two features have the same information > >> gain? > >> > >> Best, > >> Sebastian > >> > >> > >> > >>> On Oct 27, 2018, at 6:16 PM, Javier López <jlo...@ende.cc> wrote: > >>> > >>> Hi Sebastian, > >>> > >>> I think the random state is used to select the features that go into each > >>> split (look at the `max_features` parameter) > >>> > >>> Cheers, > >>> Javier > >>> > >>> On Sun, Oct 28, 2018 at 12:07 AM Sebastian Raschka > >>> <m...@sebastianraschka.com> wrote: > >>> Hi all, > >>> > >>> when I was implementing a bagging classifier based on scikit-learn's > >>> DecisionTreeClassifier, I noticed that the results were not deterministic > >>> and found that this was due to the random_state in the > >>> DescisionTreeClassifier (which is set to None by default). > >>> > >>> I am wondering what exactly this random state is used for? I can imaging > >>> it being used for resolving ties if the information gain for multiple > >>> features is the same, or it could be that the feature splits of > >>> continuous features is different? (I thought the heuristic is to sort the > >>> features and to consider those feature values next to each associated > >>> with examples that have different class labels -- but is there maybe some > >>> random subselection involved?) > >>> > >>> If someone knows more about this, where the random_state is used, I'd be > >>> happy to hear it :) > >>> > >>> Also, we could then maybe add the info to the DecisionTreeClassifier's > >>> docstring, which is currently a bit too generic to be useful, I think: > >>> > >>> https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/tree/tree.py > >>> > >>> > >>> random_state : int, RandomState instance or None, optional > >>> (default=None) > >>> If int, random_state is the seed used by the random number > >>> generator; > >>> If RandomState instance, random_state is the random number > >>> generator; > >>> If None, the random number generator is the RandomState instance > >>> used > >>> by `np.random`. > >>> > >>> > >>> Best, > >>> Sebastian > >>> _______________________________________________ > >>> scikit-learn mailing list > >>> scikit-learn@python.org > >>> https://mail.python.org/mailman/listinfo/scikit-learn > >>> _______________________________________________ > >>> scikit-learn mailing list > >>> scikit-learn@python.org > >>> https://mail.python.org/mailman/listinfo/scikit-learn > >> > >> _______________________________________________ > >> scikit-learn mailing list > >> scikit-learn@python.org > >> https://mail.python.org/mailman/listinfo/scikit-learn > > _______________________________________________ > > scikit-learn mailing list > > scikit-learn@python.org > > https://mail.python.org/mailman/listinfo/scikit-learn > > _______________________________________________ > scikit-learn mailing list > scikit-learn@python.org > https://mail.python.org/mailman/listinfo/scikit-learn > > > -- > Piotr Szymański > nied...@gmail.com > _______________________________________________ > scikit-learn mailing list > scikit-learn@python.org > https://mail.python.org/mailman/listinfo/scikit-learn > > > -- > > Fernando Marcos Wittmann > MS Student - Energy Systems Dept. > School of Electrical and Computer Engineering, FEEC > University of Campinas, UNICAMP, Brazil > +55 (19) 987-211302 > > _______________________________________________ > scikit-learn mailing list > scikit-learn@python.org > https://mail.python.org/mailman/listinfo/scikit-learn > > > -- > Guillaume Lemaitre > INRIA Saclay - Parietal team > Center for Data Science Paris-Saclay > https://glemaitre.github.io/ > > > -- > Guillaume Lemaitre > INRIA Saclay - Parietal team > Center for Data Science Paris-Saclay > https://glemaitre.github.io/ > _______________________________________________ > scikit-learn mailing list > scikit-learn@python.org > https://mail.python.org/mailman/listinfo/scikit-learn _______________________________________________ scikit-learn mailing list scikit-learn@python.org https://mail.python.org/mailman/listinfo/scikit-learn