diff --git a/docs/sources/CHANGELOG.md b/docs/sources/CHANGELOG.md index a128a787b..ac587767f 100755 --- a/docs/sources/CHANGELOG.md +++ b/docs/sources/CHANGELOG.md @@ -17,6 +17,7 @@ The CHANGELOG for the current development version is available at ##### New Features +- `StackingCVClassifier` and `StackingCVRegressor` now support `random_state` parameter, which, together with `shuffle`, controls the randomness in the cv splitting. ([#523](https://github.com/rasbt/mlxtend/pull/523) via [Qiang Gu](https://github.com/qiaguhttps://github.com/qiagu)) - Other stacking estimators, including `StackingClassifier`, `StackingCVClassifier` and `StackingRegressor`, support grid search over the `regressors` and even a single base regressor. ([#522](https://github.com/rasbt/mlxtend/pull/522) via [Qiang Gu](https://github.com/qiaguhttps://github.com/qiagu)) - Adds multiprocessing support to `StackingCVClassifier`. ([#522](https://github.com/rasbt/mlxtend/pull/522) via [Qiang Gu](https://github.com/qiaguhttps://github.com/qiagu)) - Adds multiprocessing support to `StackingCVRegressor`. ([#512](https://github.com/rasbt/mlxtend/pull/512) via [Qiang Gu](https://github.com/qiaguhttps://github.com/qiagu)) diff --git a/docs/sources/user_guide/classifier/StackingCVClassifier.ipynb b/docs/sources/user_guide/classifier/StackingCVClassifier.ipynb index 724a576a2..e8c035984 100644 --- a/docs/sources/user_guide/classifier/StackingCVClassifier.ipynb +++ b/docs/sources/user_guide/classifier/StackingCVClassifier.ipynb @@ -110,7 +110,7 @@ "Accuracy: 0.91 (+/- 0.01) [KNN]\n", "Accuracy: 0.90 (+/- 0.03) [Random Forest]\n", "Accuracy: 0.92 (+/- 0.03) [Naive Bayes]\n", - "Accuracy: 0.93 (+/- 0.02) [StackingClassifier]\n" + "Accuracy: 0.91 (+/- 0.01) [StackingClassifier]\n" ] } ], @@ -133,13 +133,11 @@ "clf3 = GaussianNB()\n", "lr = LogisticRegression()\n", "\n", - "# The StackingCVClassifier uses scikit-learn's check_cv\n", - "# internally, which doesn't support a random seed. Thus\n", - "# NumPy's random seed need to be specified explicitely for\n", - "# deterministic behavior\n", - "np.random.seed(RANDOM_SEED)\n", - "sclf = StackingCVClassifier(classifiers=[clf1, clf2, clf3], \n", - " meta_classifier=lr)\n", + "# Starting from v0.16.0, StackingCVRegressor supports\n", + "# `random_state` to get deterministic result.\n", + "sclf = StackingCVClassifier(classifiers=[clf1, clf2, clf3],\n", + " meta_classifier=lr,\n", + " random_state=RANDOM_SEED)\n", "\n", "print('3-fold cross validation:\\n')\n", "\n", @@ -162,7 +160,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -242,14 +240,10 @@ "clf3 = GaussianNB()\n", "lr = LogisticRegression()\n", "\n", - "# The StackingCVClassifier uses scikit-learn's check_cv\n", - "# internally, which doesn't support a random seed. Thus\n", - "# NumPy's random seed need to be specified explicitely for\n", - "# deterministic behavior\n", - "np.random.seed(RANDOM_SEED)\n", "sclf = StackingCVClassifier(classifiers=[clf1, clf2, clf3],\n", " use_probas=True,\n", - " meta_classifier=lr)\n", + " meta_classifier=lr,\n", + " random_state=42)\n", "\n", "print('3-fold cross validation:\\n')\n", "\n", @@ -290,14 +284,14 @@ "text": [ "0.673 +/- 0.01 {'kneighborsclassifier__n_neighbors': 1, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 10}\n", "0.667 +/- 0.00 {'kneighborsclassifier__n_neighbors': 1, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 50}\n", - "0.927 +/- 0.03 {'kneighborsclassifier__n_neighbors': 1, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 10}\n", - "0.893 +/- 0.02 {'kneighborsclassifier__n_neighbors': 1, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 50}\n", - "0.667 +/- 0.00 {'kneighborsclassifier__n_neighbors': 5, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 10}\n", + "0.933 +/- 0.02 {'kneighborsclassifier__n_neighbors': 1, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 10}\n", + "0.920 +/- 0.02 {'kneighborsclassifier__n_neighbors': 1, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 50}\n", + "0.673 +/- 0.01 {'kneighborsclassifier__n_neighbors': 5, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 10}\n", "0.667 +/- 0.00 {'kneighborsclassifier__n_neighbors': 5, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 50}\n", - "0.947 +/- 0.02 {'kneighborsclassifier__n_neighbors': 5, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 10}\n", - "0.947 +/- 0.02 {'kneighborsclassifier__n_neighbors': 5, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 50}\n", + "0.940 +/- 0.02 {'kneighborsclassifier__n_neighbors': 5, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 10}\n", + "0.927 +/- 0.02 {'kneighborsclassifier__n_neighbors': 5, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 50}\n", "Best parameters: {'kneighborsclassifier__n_neighbors': 5, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 10}\n", - "Accuracy: 0.95\n" + "Accuracy: 0.94\n" ] } ], @@ -316,13 +310,9 @@ "clf3 = GaussianNB()\n", "lr = LogisticRegression()\n", "\n", - "# The StackingCVClassifier uses scikit-learn's check_cv\n", - "# internally, which doesn't support a random seed. Thus\n", - "# NumPy's random seed need to be specified explicitely for\n", - "# deterministic behavior\n", - "np.random.seed(RANDOM_SEED)\n", "sclf = StackingCVClassifier(classifiers=[clf1, clf2, clf3], \n", - " meta_classifier=lr)\n", + " meta_classifier=lr,\n", + " random_state=42)\n", "\n", "params = {'kneighborsclassifier__n_neighbors': [1, 5],\n", " 'randomforestclassifier__n_estimators': [10, 50],\n", @@ -355,9 +345,34 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.673 +/- 0.01 {'kneighborsclassifier-1__n_neighbors': 1, 'kneighborsclassifier-2__n_neighbors': 1, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 10}\n", + "0.667 +/- 0.00 {'kneighborsclassifier-1__n_neighbors': 1, 'kneighborsclassifier-2__n_neighbors': 1, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 50}\n", + "0.947 +/- 0.02 {'kneighborsclassifier-1__n_neighbors': 1, 'kneighborsclassifier-2__n_neighbors': 1, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 10}\n", + "0.920 +/- 0.02 {'kneighborsclassifier-1__n_neighbors': 1, 'kneighborsclassifier-2__n_neighbors': 1, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 50}\n", + "0.673 +/- 0.01 {'kneighborsclassifier-1__n_neighbors': 1, 'kneighborsclassifier-2__n_neighbors': 5, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 10}\n", + "0.667 +/- 0.00 {'kneighborsclassifier-1__n_neighbors': 1, 'kneighborsclassifier-2__n_neighbors': 5, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 50}\n", + "0.960 +/- 0.02 {'kneighborsclassifier-1__n_neighbors': 1, 'kneighborsclassifier-2__n_neighbors': 5, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 10}\n", + "0.933 +/- 0.02 {'kneighborsclassifier-1__n_neighbors': 1, 'kneighborsclassifier-2__n_neighbors': 5, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 50}\n", + "0.673 +/- 0.01 {'kneighborsclassifier-1__n_neighbors': 5, 'kneighborsclassifier-2__n_neighbors': 1, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 10}\n", + "0.667 +/- 0.00 {'kneighborsclassifier-1__n_neighbors': 5, 'kneighborsclassifier-2__n_neighbors': 1, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 50}\n", + "0.960 +/- 0.02 {'kneighborsclassifier-1__n_neighbors': 5, 'kneighborsclassifier-2__n_neighbors': 1, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 10}\n", + "0.933 +/- 0.02 {'kneighborsclassifier-1__n_neighbors': 5, 'kneighborsclassifier-2__n_neighbors': 1, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 50}\n", + "0.673 +/- 0.01 {'kneighborsclassifier-1__n_neighbors': 5, 'kneighborsclassifier-2__n_neighbors': 5, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 10}\n", + "0.667 +/- 0.00 {'kneighborsclassifier-1__n_neighbors': 5, 'kneighborsclassifier-2__n_neighbors': 5, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 50}\n", + "0.953 +/- 0.02 {'kneighborsclassifier-1__n_neighbors': 5, 'kneighborsclassifier-2__n_neighbors': 5, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 10}\n", + "0.927 +/- 0.02 {'kneighborsclassifier-1__n_neighbors': 5, 'kneighborsclassifier-2__n_neighbors': 5, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 50}\n", + "Best parameters: {'kneighborsclassifier-1__n_neighbors': 1, 'kneighborsclassifier-2__n_neighbors': 5, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 10}\n", + "Accuracy: 0.96\n" + ] + } + ], "source": [ "from sklearn.model_selection import GridSearchCV\n", "\n", @@ -368,13 +383,9 @@ "clf3 = GaussianNB()\n", "lr = LogisticRegression()\n", "\n", - "# The StackingCVClassifier uses scikit-learn's check_cv\n", - "# internally, which doesn't support a random seed. Thus\n", - "# NumPy's random seed need to be specified explicitely for\n", - "# deterministic behavior\n", - "np.random.seed(RANDOM_SEED)\n", "sclf = StackingCVClassifier(classifiers=[clf1, clf1, clf2, clf3], \n", - " meta_classifier=lr)\n", + " meta_classifier=lr,\n", + " random_state=RANDOM_SEED)\n", "\n", "params = {'kneighborsclassifier-1__n_neighbors': [1, 5],\n", " 'kneighborsclassifier-2__n_neighbors': [1, 5],\n", @@ -429,26 +440,29 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "StackingCVClassifier(classifiers=[Pipeline(steps=[('columnselector', ColumnSelector(cols=(0, 2))), ('logisticregression', LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n", - " intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,\n", - " penalty='l2', random_state=None, solve...='l2', random_state=None, solver='liblinear', tol=0.0001,\n", - " verbose=0, warm_start=False))])],\n", + "StackingCVClassifier(classifiers=[Pipeline(memory=None,\n", + " steps=[('columnselector', ColumnSelector(cols=(0, 2), drop_axis=False)), ('logisticregression', LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n", + " intercept_scaling=1, max_iter=100, multi_class='warn',\n", + " n_jobs=None,...nalty='l2', random_state=None, solver='warn',\n", + " tol=0.0001, verbose=0, warm_start=False))])],\n", " cv=2,\n", " meta_classifier=LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n", - " intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,\n", - " penalty='l2', random_state=None, solver='liblinear', tol=0.0001,\n", - " verbose=0, warm_start=False),\n", - " shuffle=True, stratify=True, use_features_in_secondary=False,\n", + " intercept_scaling=1, max_iter=100, multi_class='warn',\n", + " n_jobs=None, penalty='l2', random_state=None, solver='warn',\n", + " tol=0.0001, verbose=0, warm_start=False),\n", + " n_jobs=None, pre_dispatch='2*n_jobs', random_state=42,\n", + " shuffle=True, store_train_meta_features=False, stratify=True,\n", + " use_clones=True, use_features_in_secondary=False,\n", " use_probas=False, verbose=0)" ] }, - "execution_count": 1, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -470,7 +484,8 @@ " LogisticRegression())\n", "\n", "sclf = StackingCVClassifier(classifiers=[pipe1, pipe2], \n", - " meta_classifier=LogisticRegression())\n", + " meta_classifier=LogisticRegression(),\n", + " random_state=42)\n", "\n", "sclf.fit(X, y)" ] @@ -493,21 +508,12 @@ "text": [ "## StackingCVClassifier\n", "\n", - "*StackingCVClassifier(classifiers, meta_classifier, use_probas=False, cv=2, use_features_in_secondary=False, stratify=True, shuffle=True, verbose=0, store_train_meta_features=False, use_clones=True, n_jobs=None, pre_dispatch='2*n_jobs')*\n", + "*StackingCVClassifier(classifiers, meta_classifier, use_probas=False, cv=2, shuffle=True, random_state=None, stratify=True, verbose=0, use_features_in_secondary=False, store_train_meta_features=False, use_clones=True, n_jobs=None, pre_dispatch='2*n_jobs')*\n", "\n", "A 'Stacking Cross-Validation' classifier for scikit-learn estimators.\n", "\n", "New in mlxtend v0.4.3\n", "\n", - "**Notes**\n", - "\n", - "The StackingCVClassifier uses scikit-learn's check_cv\n", - "internally, which doesn't support a random seed. Thus\n", - "NumPy's random seed need to be specified explicitely for\n", - "deterministic behavior, for instance, by setting\n", - "np.random.seed(RANDOM_SEED)\n", - "prior to fitting the StackingCVClassifier\n", - "\n", "**Parameters**\n", "\n", "- `classifiers` : array-like, shape = [n_classifiers]\n", @@ -539,12 +545,17 @@ " `StratifiedKFold` cross validation depending the value of `stratify`\n", " argument.\n", "\n", - "- `use_features_in_secondary` : bool (default: False)\n", + "- `shuffle` : bool (default: True)\n", "\n", - " If True, the meta-classifier will be trained both on the predictions\n", - " of the original classifiers and the original dataset.\n", - " If False, the meta-classifier will be trained only on the predictions\n", - " of the original classifiers.\n", + " If True, and the `cv` argument is integer, the training data will be\n", + " shuffled at fitting stage prior to cross-validation. If the `cv`\n", + " argument is a specific cross validation technique, this argument is\n", + " omitted.\n", + "\n", + "- `random_state` : int, RandomState instance or None, optional (default: None)\n", + "\n", + " Constrols the randomness of the cv splitter. Used when `cv` is\n", + " integer and `shuffle=True`. New in v0.16.0.\n", "\n", "- `stratify` : bool (default: True)\n", "\n", @@ -552,13 +563,6 @@ " K-Fold cross validation technique. If the `cv` argument is a specific\n", " cross validation technique, this argument is omitted.\n", "\n", - "- `shuffle` : bool (default: True)\n", - "\n", - " If True, and the `cv` argument is integer, the training data will be\n", - " shuffled at fitting stage prior to cross-validation. If the `cv`\n", - " argument is a specific cross validation technique, this argument is\n", - " omitted.\n", - "\n", "- `verbose` : int, optional (default=0)\n", "\n", " Controls the verbosity of the building process.\n", @@ -570,6 +574,13 @@ " - `verbose>2`: Changes `verbose` param of the underlying regressor to\n", " self.verbose - 2\n", "\n", + "- `use_features_in_secondary` : bool (default: False)\n", + "\n", + " If True, the meta-classifier will be trained both on the predictions\n", + " of the original classifiers and the original dataset.\n", + " If False, the meta-classifier will be trained only on the predictions\n", + " of the original classifiers.\n", + "\n", "- `store_train_meta_features` : bool (default: False)\n", "\n", " If True, the meta-features computed from the training data used\n", @@ -594,7 +605,7 @@ " The number of CPUs to use to do the computation.\n", " ``None`` means 1 unless in a :obj:`joblib.parallel_backend` context.\n", " ``-1`` means using all processors. See :term:`Glossary `\n", - " for more details.\n", + " for more details. New in v0.16.0.\n", "\n", "- `pre_dispatch` : int, or string, optional\n", "\n", @@ -610,7 +621,7 @@ " spawned\n", " - A string, giving an expression as a function of n_jobs,\n", " as in '2*n_jobs'\n", - "\n", + " New in v0.16.0.\n", "\n", "**Attributes**\n", "\n", diff --git a/docs/sources/user_guide/regressor/StackingCVRegressor.ipynb b/docs/sources/user_guide/regressor/StackingCVRegressor.ipynb index 307196b5c..3df0cdbdb 100644 --- a/docs/sources/user_guide/regressor/StackingCVRegressor.ipynb +++ b/docs/sources/user_guide/regressor/StackingCVRegressor.ipynb @@ -87,7 +87,7 @@ "R^2 Score: 0.46 (+/- 0.29) [SVM]\n", "R^2 Score: 0.43 (+/- 0.14) [Lasso]\n", "R^2 Score: 0.53 (+/- 0.28) [Random Forest]\n", - "R^2 Score: 0.58 (+/- 0.23) [StackingCVRegressor]\n" + "R^2 Score: 0.57 (+/- 0.24) [StackingCVRegressor]\n" ] } ], @@ -109,13 +109,11 @@ "rf = RandomForestRegressor(n_estimators=5, \n", " random_state=RANDOM_SEED)\n", "\n", - "# The StackingCVRegressor uses scikit-learn's check_cv\n", - "# internally, which doesn't support a random seed. Thus\n", - "# NumPy's random seed need to be specified explicitely for\n", - "# deterministic behavior\n", - "np.random.seed(RANDOM_SEED)\n", + "# Starting from v0.16.0, StackingCVRegressor supports\n", + "# `random_state` to get deterministic result.\n", "stack = StackingCVRegressor(regressors=(svr, lasso, rf),\n", - " meta_regressor=lasso)\n", + " meta_regressor=lasso,\n", + " random_state=RANDOM_SEED)\n", "\n", "print('5-fold cross validation scores:\\n')\n", "\n", @@ -141,16 +139,11 @@ "Neg. MSE Score: -33.34 (+/- 22.36) [SVM]\n", "Neg. MSE Score: -35.53 (+/- 16.99) [Lasso]\n", "Neg. MSE Score: -27.25 (+/- 16.76) [Random Forest]\n", - "Neg. MSE Score: -25.56 (+/- 18.22) [StackingCVRegressor]\n" + "Neg. MSE Score: -25.82 (+/- 18.10) [StackingCVRegressor]\n" ] } ], "source": [ - "# The StackingCVRegressor uses scikit-learn's check_cv\n", - "# internally, which doesn't support a random seed. Thus\n", - "# NumPy's random seed need to be specified explicitely for\n", - "# deterministic behavior\n", - "np.random.seed(RANDOM_SEED)\n", "stack = StackingCVRegressor(regressors=(svr, lasso, rf),\n", " meta_regressor=lasso)\n", "\n", @@ -186,18 +179,18 @@ "metadata": {}, "outputs": [ { - "name": "stderr", + "name": "stdout", "output_type": "stream", "text": [ - "/Users/guq/miniconda3/envs/python3/lib/python3.7/site-packages/sklearn/model_selection/_search.py:841: DeprecationWarning: The default of the `iid` parameter will change from True to False in version 0.22 and will be removed in 0.24. This will change numeric results when test-set sizes are unequal.\n", - " DeprecationWarning)\n" + "Best: 0.679576 using {'lasso__alpha': 1.2, 'meta_regressor__n_estimators': 10, 'ridge__alpha': 0.4}\n" ] }, { - "name": "stdout", + "name": "stderr", "output_type": "stream", "text": [ - "Best: 0.674237 using {'lasso__alpha': 1.6, 'meta_regressor__n_estimators': 100, 'ridge__alpha': 0.2}\n" + "/Users/guq/miniconda3/envs/python3/lib/python3.7/site-packages/sklearn/model_selection/_search.py:841: DeprecationWarning: The default of the `iid` parameter will change from True to False in version 0.22 and will be removed in 0.24. This will change numeric results when test-set sizes are unequal.\n", + " DeprecationWarning)\n" ] } ], @@ -215,13 +208,9 @@ "lasso = Lasso(random_state=RANDOM_SEED)\n", "rf = RandomForestRegressor(random_state=RANDOM_SEED)\n", "\n", - "# The StackingCVRegressor uses scikit-learn's check_cv\n", - "# internally, which doesn't support a random seed. Thus\n", - "# NumPy's random seed need to be specified explicitely for\n", - "# deterministic behavior\n", - "np.random.seed(RANDOM_SEED)\n", "stack = StackingCVRegressor(regressors=(lasso, ridge),\n", " meta_regressor=rf, \n", + " random_state=RANDOM_SEED,\n", " use_features_in_secondary=True)\n", "\n", "params = {'lasso__alpha': [0.1, 1.0, 10.0],\n", @@ -252,21 +241,21 @@ "name": "stdout", "output_type": "stream", "text": [ - "0.616 +/- 0.09 {'lasso__alpha': 0.2, 'meta_regressor__n_estimators': 10, 'ridge__alpha': 0.05}\n", + "0.637 +/- 0.09 {'lasso__alpha': 0.2, 'meta_regressor__n_estimators': 10, 'ridge__alpha': 0.05}\n", "0.656 +/- 0.08 {'lasso__alpha': 0.2, 'meta_regressor__n_estimators': 10, 'ridge__alpha': 0.1}\n", - "0.653 +/- 0.09 {'lasso__alpha': 0.2, 'meta_regressor__n_estimators': 10, 'ridge__alpha': 0.15}\n", - "0.669 +/- 0.09 {'lasso__alpha': 0.2, 'meta_regressor__n_estimators': 10, 'ridge__alpha': 0.2}\n", - "0.632 +/- 0.08 {'lasso__alpha': 0.2, 'meta_regressor__n_estimators': 10, 'ridge__alpha': 0.25}\n", - "0.664 +/- 0.08 {'lasso__alpha': 0.2, 'meta_regressor__n_estimators': 10, 'ridge__alpha': 0.3}\n", - "0.632 +/- 0.08 {'lasso__alpha': 0.2, 'meta_regressor__n_estimators': 10, 'ridge__alpha': 0.35}\n", - "0.642 +/- 0.08 {'lasso__alpha': 0.2, 'meta_regressor__n_estimators': 10, 'ridge__alpha': 0.4}\n", - "0.653 +/- 0.09 {'lasso__alpha': 0.2, 'meta_regressor__n_estimators': 10, 'ridge__alpha': 0.45}\n", - "0.657 +/- 0.09 {'lasso__alpha': 0.2, 'meta_regressor__n_estimators': 100, 'ridge__alpha': 0.05}\n", - "0.650 +/- 0.09 {'lasso__alpha': 0.2, 'meta_regressor__n_estimators': 100, 'ridge__alpha': 0.1}\n", - "0.648 +/- 0.09 {'lasso__alpha': 0.2, 'meta_regressor__n_estimators': 100, 'ridge__alpha': 0.15}\n", + "0.635 +/- 0.09 {'lasso__alpha': 0.2, 'meta_regressor__n_estimators': 10, 'ridge__alpha': 0.15}\n", + "0.647 +/- 0.08 {'lasso__alpha': 0.2, 'meta_regressor__n_estimators': 10, 'ridge__alpha': 0.2}\n", + "0.630 +/- 0.09 {'lasso__alpha': 0.2, 'meta_regressor__n_estimators': 10, 'ridge__alpha': 0.25}\n", + "0.628 +/- 0.09 {'lasso__alpha': 0.2, 'meta_regressor__n_estimators': 10, 'ridge__alpha': 0.3}\n", + "0.639 +/- 0.09 {'lasso__alpha': 0.2, 'meta_regressor__n_estimators': 10, 'ridge__alpha': 0.35}\n", + "0.641 +/- 0.09 {'lasso__alpha': 0.2, 'meta_regressor__n_estimators': 10, 'ridge__alpha': 0.4}\n", + "0.653 +/- 0.08 {'lasso__alpha': 0.2, 'meta_regressor__n_estimators': 10, 'ridge__alpha': 0.45}\n", + "0.644 +/- 0.09 {'lasso__alpha': 0.2, 'meta_regressor__n_estimators': 100, 'ridge__alpha': 0.05}\n", + "0.642 +/- 0.09 {'lasso__alpha': 0.2, 'meta_regressor__n_estimators': 100, 'ridge__alpha': 0.1}\n", + "0.646 +/- 0.09 {'lasso__alpha': 0.2, 'meta_regressor__n_estimators': 100, 'ridge__alpha': 0.15}\n", "...\n", - "Best parameters: {'lasso__alpha': 1.6, 'meta_regressor__n_estimators': 100, 'ridge__alpha': 0.2}\n", - "Accuracy: 0.67\n" + "Best parameters: {'lasso__alpha': 1.2, 'meta_regressor__n_estimators': 10, 'ridge__alpha': 0.4}\n", + "Accuracy: 0.68\n" ] } ], @@ -318,21 +307,12 @@ "text": [ "## StackingCVRegressor\n", "\n", - "*StackingCVRegressor(regressors, meta_regressor, cv=5, shuffle=True, use_features_in_secondary=False, store_train_meta_features=False, refit=True)*\n", + "*StackingCVRegressor(regressors, meta_regressor, cv=5, shuffle=True, random_state=None, verbose=0, refit=True, use_features_in_secondary=False, store_train_meta_features=False, n_jobs=None, pre_dispatch='2*n_jobs')*\n", "\n", "A 'Stacking Cross-Validation' regressor for scikit-learn estimators.\n", "\n", "New in mlxtend v0.7.0\n", "\n", - "**Notes**\n", - "\n", - "The StackingCVRegressor uses scikit-learn's check_cv\n", - "internally, which doesn't support a random seed. Thus\n", - "NumPy's random seed need to be specified explicitely for\n", - "deterministic behavior, for instance, by setting\n", - "np.random.seed(RANDOM_SEED)\n", - "prior to fitting the StackingCVRegressor\n", - "\n", "**Parameters**\n", "\n", "- `regressors` : array-like, shape = [n_regressors]\n", @@ -357,14 +337,6 @@ " - An iterable yielding train, test splits.\n", " For integer/None inputs, it will use `KFold` cross-validation\n", "\n", - "- `use_features_in_secondary` : bool (default: False)\n", - "\n", - " If True, the meta-regressor will be trained both on\n", - " the predictions of the original regressors and the\n", - " original dataset.\n", - " If False, the meta-regressor will be trained only on\n", - " the predictions of the original regressors.\n", - "\n", "- `shuffle` : bool (default: True)\n", "\n", " If True, and the `cv` argument is integer, the training data will\n", @@ -372,13 +344,14 @@ " argument is a specific cross validation technique, this argument is\n", " omitted.\n", "\n", - "- `store_train_meta_features` : bool (default: False)\n", + "- `random_state` : int, RandomState instance or None, optional (default: None)\n", "\n", - " If True, the meta-features computed from the training data\n", - " used for fitting the\n", - " meta-regressor stored in the `self.train_meta_features_` array,\n", - " which can be\n", - " accessed after calling `fit`.\n", + " Constrols the randomness of the cv splitter. Used when `cv` is\n", + " integer and `shuffle=True`. New in v0.16.0.\n", + "\n", + "- `verbose` : int, optional (default=0)\n", + "\n", + " Controls the verbosity of the building process. New in v0.16.0\n", "\n", "- `refit` : bool (default: True)\n", "\n", @@ -389,6 +362,45 @@ " the scikit-learn fit/predict API interface but are not compatible\n", " to scikit-learn's `clone` function.\n", "\n", + "- `use_features_in_secondary` : bool (default: False)\n", + "\n", + " If True, the meta-regressor will be trained both on\n", + " the predictions of the original regressors and the\n", + " original dataset.\n", + " If False, the meta-regressor will be trained only on\n", + " the predictions of the original regressors.\n", + "\n", + "- `store_train_meta_features` : bool (default: False)\n", + "\n", + " If True, the meta-features computed from the training data\n", + " used for fitting the\n", + " meta-regressor stored in the `self.train_meta_features_` array,\n", + " which can be\n", + " accessed after calling `fit`.\n", + "\n", + "- `n_jobs` : int or None, optional (default=None)\n", + "\n", + " The number of CPUs to use to do the computation.\n", + " ``None`` means 1 unless in a :obj:`joblib.parallel_backend` context.\n", + " ``-1`` means using all processors. See :term:`Glossary `\n", + " for more details. New in v0.16.0.\n", + "\n", + "- `pre_dispatch` : int, or string, optional\n", + "\n", + " Controls the number of jobs that get dispatched during parallel\n", + " execution. Reducing this number can be useful to avoid an\n", + " explosion of memory consumption when more jobs get dispatched\n", + " than CPUs can process. This parameter can be:\n", + " - None, in which case all the jobs are immediately\n", + " created and spawned. Use this for lightweight and\n", + " fast-running jobs, to avoid delays due to on-demand\n", + " spawning of the jobs\n", + " - An int, giving the exact number of total jobs that are\n", + " spawned\n", + " - A string, giving an expression as a function of n_jobs,\n", + " as in '2*n_jobs'\n", + " New in v0.16.0.\n", + "\n", "**Attributes**\n", "\n", "- `train_meta_features` : numpy array, shape = [n_samples, n_regressors]\n", @@ -546,7 +558,10 @@ "\n", "- `X` : array-like, shape = (n_samples, n_features)\n", "\n", - " Test samples.\n", + " Test samples. For some estimators this may be a\n", + " precomputed kernel matrix instead, shape = (n_samples,\n", + " n_samples_fitted], where n_samples_fitted is the number of\n", + " samples used in the fitting for the estimator.\n", "\n", "\n", "- `y` : array-like, shape = (n_samples) or (n_samples, n_outputs)\n", @@ -570,15 +585,22 @@ "\n", "Set the parameters of this estimator.\n", "\n", - "The method works on simple estimators as well as on nested objects\n", - "(such as pipelines). The latter have parameters of the form\n", - "``__`` so that it's possible to update each\n", - "component of a nested object.\n", + "Valid parameter keys can be listed with ``get_params()``.\n", "\n", "**Returns**\n", "\n", "self\n", "\n", + "### Properties\n", + "\n", + "
\n", + "\n", + "*named_regressors*\n", + "\n", + "**Returns**\n", + "\n", + "List of named estimator tuples, like [('svc', SVC(...))]\n", + "\n", "\n" ] } diff --git a/mlxtend/classifier/stacking_cv_classification.py b/mlxtend/classifier/stacking_cv_classification.py index 16331e577..a45b3b6a2 100644 --- a/mlxtend/classifier/stacking_cv_classification.py +++ b/mlxtend/classifier/stacking_cv_classification.py @@ -29,15 +29,6 @@ class StackingCVClassifier(_BaseXComposition, ClassifierMixin, New in mlxtend v0.4.3 - Notes - ------- - The StackingCVClassifier uses scikit-learn's check_cv - internally, which doesn't support a random seed. Thus - NumPy's random seed need to be specified explicitely for - deterministic behavior, for instance, by setting - np.random.seed(RANDOM_SEED) - prior to fitting the StackingCVClassifier - Parameters ---------- classifiers : array-like, shape = [n_classifiers] @@ -61,20 +52,18 @@ class StackingCVClassifier(_BaseXComposition, ClassifierMixin, For integer/None inputs, it will use either a `KFold` or `StratifiedKFold` cross validation depending the value of `stratify` argument. - use_features_in_secondary : bool (default: False) - If True, the meta-classifier will be trained both on the predictions - of the original classifiers and the original dataset. - If False, the meta-classifier will be trained only on the predictions - of the original classifiers. - stratify : bool (default: True) - If True, and the `cv` argument is integer it will follow a stratified - K-Fold cross validation technique. If the `cv` argument is a specific - cross validation technique, this argument is omitted. shuffle : bool (default: True) If True, and the `cv` argument is integer, the training data will be shuffled at fitting stage prior to cross-validation. If the `cv` argument is a specific cross validation technique, this argument is omitted. + random_state : int, RandomState instance or None, optional (default: None) + Constrols the randomness of the cv splitter. Used when `cv` is + integer and `shuffle=True`. New in v0.16.0. + stratify : bool (default: True) + If True, and the `cv` argument is integer it will follow a stratified + K-Fold cross validation technique. If the `cv` argument is a specific + cross validation technique, this argument is omitted. verbose : int, optional (default=0) Controls the verbosity of the building process. - `verbose=0` (default): Prints nothing @@ -84,6 +73,11 @@ class StackingCVClassifier(_BaseXComposition, ClassifierMixin, regressor being fitted - `verbose>2`: Changes `verbose` param of the underlying regressor to self.verbose - 2 + use_features_in_secondary : bool (default: False) + If True, the meta-classifier will be trained both on the predictions + of the original classifiers and the original dataset. + If False, the meta-classifier will be trained only on the predictions + of the original classifiers. store_train_meta_features : bool (default: False) If True, the meta-features computed from the training data used for fitting the meta-classifier stored in the @@ -103,7 +97,7 @@ class StackingCVClassifier(_BaseXComposition, ClassifierMixin, The number of CPUs to use to do the computation. ``None`` means 1 unless in a :obj:`joblib.parallel_backend` context. ``-1`` means using all processors. See :term:`Glossary ` - for more details. + for more details. New in v0.16.0. pre_dispatch : int, or string, optional Controls the number of jobs that get dispatched during parallel execution. Reducing this number can be useful to avoid an @@ -117,7 +111,7 @@ class StackingCVClassifier(_BaseXComposition, ClassifierMixin, spawned - A string, giving an expression as a function of n_jobs, as in '2*n_jobs' - + New in v0.16.0. Attributes ---------- @@ -137,10 +131,9 @@ class StackingCVClassifier(_BaseXComposition, ClassifierMixin, """ def __init__(self, classifiers, meta_classifier, - use_probas=False, cv=2, + use_probas=False, cv=2, shuffle=True, + random_state=None, stratify=True, verbose=0, use_features_in_secondary=False, - stratify=True, - shuffle=True, verbose=0, store_train_meta_features=False, use_clones=True, n_jobs=None, pre_dispatch='2*n_jobs'): @@ -148,11 +141,12 @@ def __init__(self, classifiers, meta_classifier, self.classifiers = classifiers self.meta_classifier = meta_classifier self.use_probas = use_probas - self.verbose = verbose self.cv = cv - self.use_features_in_secondary = use_features_in_secondary - self.stratify = stratify self.shuffle = shuffle + self.random_state = random_state + self.stratify = stratify + self.verbose = verbose + self.use_features_in_secondary = use_features_in_secondary self.store_train_meta_features = store_train_meta_features self.use_clones = use_clones self.n_jobs = n_jobs @@ -203,6 +197,7 @@ def fit(self, X, y, groups=None, sample_weight=None): # Override shuffle parameter in case of self generated # cross-validation strategy final_cv.shuffle = self.shuffle + final_cv.random_state = self.random_state # Input validation. X, y = check_X_y(X, y, accept_sparse=['csc', 'csr']) diff --git a/mlxtend/classifier/tests/test_stacking_cv_classifier.py b/mlxtend/classifier/tests/test_stacking_cv_classifier.py index e794bd515..63f9a1dfa 100644 --- a/mlxtend/classifier/tests/test_stacking_cv_classifier.py +++ b/mlxtend/classifier/tests/test_stacking_cv_classifier.py @@ -245,12 +245,12 @@ def test_use_features_in_secondary(): def test_do_not_stratify(): - np.random.seed(123) meta = LogisticRegression(multi_class='ovr', solver='liblinear') clf1 = RandomForestClassifier(n_estimators=10) clf2 = GaussianNB() sclf = StackingCVClassifier(classifiers=[clf1, clf2], meta_classifier=meta, + random_state=42, stratify=False) scores = cross_val_score(sclf, @@ -266,14 +266,14 @@ def test_cross_validation_technique(): # This is like the `test_do_not_stratify` but instead # autogenerating the cross validation strategy it provides # a pre-created object - np.random.seed(123) cv = KFold(n_splits=2, shuffle=True) meta = LogisticRegression(multi_class='ovr', solver='liblinear') - clf1 = RandomForestClassifier(n_estimators=10) + clf1 = RandomForestClassifier(n_estimators=10, random_state=42) clf2 = GaussianNB() sclf = StackingCVClassifier(classifiers=[clf1, clf2], meta_classifier=meta, - cv=cv) + cv=cv, + random_state=42) scores = cross_val_score(sclf, X_iris, @@ -281,7 +281,7 @@ def test_cross_validation_technique(): cv=5, scoring='accuracy') scores_mean = (round(scores.mean(), 2)) - assert scores_mean == 0.93, scores.mean() + assert scores_mean == 0.92, scores.mean() def test_not_fitted(): @@ -346,6 +346,7 @@ def test_get_params(): 'meta_classifier', 'n_jobs', 'pre_dispatch', + 'random_state', 'randomforestclassifier', 'shuffle', 'store_train_meta_features', @@ -358,13 +359,13 @@ def test_get_params(): def test_classifier_gridsearch(): - np.random.seed(123) clf1 = KNeighborsClassifier(n_neighbors=1) - clf2 = RandomForestClassifier(n_estimators=10) + clf2 = RandomForestClassifier(n_estimators=10, random_state=42) clf3 = GaussianNB() lr = LogisticRegression(multi_class='ovr', solver='liblinear') sclf = StackingCVClassifier(classifiers=[clf1], - meta_classifier=lr) + meta_classifier=lr, + random_state=42) params = {'classifiers': [[clf1], [clf1, clf2, clf3]]} @@ -409,20 +410,21 @@ def test_predict_meta_features(): def test_meta_feat_reordering(): - np.random.seed(123) knn = KNeighborsClassifier() lr = LogisticRegression(multi_class='ovr', solver='liblinear') gnb = GaussianNB() stclf = StackingCVClassifier(classifiers=[knn, gnb], meta_classifier=lr, shuffle=True, + random_state=42, store_train_meta_features=True) X_train, X_test, y_train, y_test = train_test_split(X_breast, y_breast, + random_state=0, test_size=0.3) stclf.fit(X_train, y_train) assert round(roc_auc_score(y_train, - stclf.train_meta_features_[:, 1]), 2) == 0.87, \ + stclf.train_meta_features_[:, 1]), 2) == 0.86, \ round(roc_auc_score(y_train, stclf.train_meta_features_[:, 1]), 2) @@ -442,7 +444,8 @@ def test_sparse_inputs(): rf = RandomForestClassifier(n_estimators=10) lr = LogisticRegression(multi_class='ovr', solver='liblinear') stclf = StackingCVClassifier(classifiers=[rf, rf], - meta_classifier=lr) + meta_classifier=lr, + random_state=42) X_train, X_test, y_train, y_test = train_test_split(X_breast, y_breast, test_size=0.3) @@ -456,23 +459,23 @@ def test_sparse_inputs(): def test_sparse_inputs_with_features_in_secondary(): - np.random.seed(123) - rf = RandomForestClassifier(n_estimators=10) + rf = RandomForestClassifier(n_estimators=10, random_state=42) lr = LogisticRegression(multi_class='ovr', solver='liblinear') stclf = StackingCVClassifier(classifiers=[rf, rf], meta_classifier=lr, + random_state=42, use_features_in_secondary=True) X_train, X_test, y_train, y_test = train_test_split(X_breast, y_breast, test_size=0.3) # dense stclf.fit(X_train, y_train) - assert round(stclf.score(X_train, y_train), 2) == 0.99, \ + assert round(stclf.score(X_train, y_train), 2) == 1.0, \ round(stclf.score(X_train, y_train), 2) # sparse stclf.fit(sparse.csr_matrix(X_train), y_train) - assert round(stclf.score(X_train, y_train), 2) == 0.99, \ + assert round(stclf.score(X_train, y_train), 2) == 1.0, \ round(stclf.score(X_train, y_train), 2) @@ -494,10 +497,11 @@ def test_works_with_df_if_fold_indexes_missing(): """ np.random.seed(123) - rf = RandomForestClassifier(n_estimators=10) + rf = RandomForestClassifier(n_estimators=10, random_state=42) lr = LogisticRegression(multi_class='ovr', solver='liblinear') stclf = StackingCVClassifier(classifiers=[rf, rf], meta_classifier=lr, + random_state=42, use_features_in_secondary=True) X_modded = pd.DataFrame(X_breast, diff --git a/mlxtend/regressor/stacking_cv_regression.py b/mlxtend/regressor/stacking_cv_regression.py index a9faeb9dc..091acdd84 100644 --- a/mlxtend/regressor/stacking_cv_regression.py +++ b/mlxtend/regressor/stacking_cv_regression.py @@ -32,15 +32,6 @@ class StackingCVRegressor(_BaseXComposition, RegressorMixin, TransformerMixin): New in mlxtend v0.7.0 - Notes - ------- - The StackingCVRegressor uses scikit-learn's check_cv - internally, which doesn't support a random seed. Thus - NumPy's random seed need to be specified explicitely for - deterministic behavior, for instance, by setting - np.random.seed(RANDOM_SEED) - prior to fitting the StackingCVRegressor - Parameters ---------- regressors : array-like, shape = [n_regressors] @@ -59,25 +50,16 @@ class StackingCVRegressor(_BaseXComposition, RegressorMixin, TransformerMixin): - An object to be used as a cross-validation generator. - An iterable yielding train, test splits. For integer/None inputs, it will use `KFold` cross-validation - use_features_in_secondary : bool (default: False) - If True, the meta-regressor will be trained both on - the predictions of the original regressors and the - original dataset. - If False, the meta-regressor will be trained only on - the predictions of the original regressors. shuffle : bool (default: True) If True, and the `cv` argument is integer, the training data will be shuffled at fitting stage prior to cross-validation. If the `cv` argument is a specific cross validation technique, this argument is omitted. + random_state : int, RandomState instance or None, optional (default: None) + Constrols the randomness of the cv splitter. Used when `cv` is + integer and `shuffle=True`. New in v0.16.0. verbose : int, optional (default=0) - Controls the verbosity of the building process. - store_train_meta_features : bool (default: False) - If True, the meta-features computed from the training data - used for fitting the - meta-regressor stored in the `self.train_meta_features_` array, - which can be - accessed after calling `fit`. + Controls the verbosity of the building process. New in v0.16.0 refit : bool (default: True) Clones the regressors for stacking regression if True (default) or else uses the original ones, which will be refitted on the dataset @@ -85,11 +67,23 @@ class StackingCVRegressor(_BaseXComposition, RegressorMixin, TransformerMixin): recommended if you are working with estimators that are supporting the scikit-learn fit/predict API interface but are not compatible to scikit-learn's `clone` function. + use_features_in_secondary : bool (default: False) + If True, the meta-regressor will be trained both on + the predictions of the original regressors and the + original dataset. + If False, the meta-regressor will be trained only on + the predictions of the original regressors. + store_train_meta_features : bool (default: False) + If True, the meta-features computed from the training data + used for fitting the + meta-regressor stored in the `self.train_meta_features_` array, + which can be + accessed after calling `fit`. n_jobs : int or None, optional (default=None) The number of CPUs to use to do the computation. ``None`` means 1 unless in a :obj:`joblib.parallel_backend` context. ``-1`` means using all processors. See :term:`Glossary ` - for more details. + for more details. New in v0.16.0. pre_dispatch : int, or string, optional Controls the number of jobs that get dispatched during parallel execution. Reducing this number can be useful to avoid an @@ -103,6 +97,7 @@ class StackingCVRegressor(_BaseXComposition, RegressorMixin, TransformerMixin): spawned - A string, giving an expression as a function of n_jobs, as in '2*n_jobs' + New in v0.16.0. Attributes ---------- @@ -118,20 +113,21 @@ class StackingCVRegressor(_BaseXComposition, RegressorMixin, TransformerMixin): """ def __init__(self, regressors, meta_regressor, cv=5, - shuffle=True, verbose=0, n_jobs=1, - use_features_in_secondary=False, - store_train_meta_features=False, - refit=True, pre_dispatch='2*n_jobs'): + shuffle=True, random_state=None, verbose=0, + refit=True, use_features_in_secondary=False, + store_train_meta_features=False, n_jobs=None, + pre_dispatch='2*n_jobs'): self.regressors = regressors self.meta_regressor = meta_regressor self.cv = cv self.shuffle = shuffle + self.random_state = random_state self.verbose = verbose - self.n_jobs = n_jobs + self.refit = refit self.use_features_in_secondary = use_features_in_secondary self.store_train_meta_features = store_train_meta_features - self.refit = refit + self.n_jobs = n_jobs self.pre_dispatch = pre_dispatch def fit(self, X, y, groups=None, sample_weight=None): @@ -175,6 +171,7 @@ def fit(self, X, y, groups=None, sample_weight=None): # Override shuffle parameter in case of self generated # cross-validation strategy kfold.shuffle = self.shuffle + kfold.random_state = self.random_state # # The meta_features are collection of the prediction data, # in shape of [n_samples, len(self.regressors)]. Each column diff --git a/mlxtend/regressor/tests/test_stacking_cv_regression.py b/mlxtend/regressor/tests/test_stacking_cv_regression.py index c3306cfd0..10d22b499 100644 --- a/mlxtend/regressor/tests/test_stacking_cv_regression.py +++ b/mlxtend/regressor/tests/test_stacking_cv_regression.py @@ -37,11 +37,12 @@ def test_different_models(): ridge = Ridge(random_state=1) svr_rbf = SVR(kernel='rbf', gamma='auto') stack = StackingCVRegressor(regressors=[svr_lin, lr, ridge], - meta_regressor=svr_rbf) + meta_regressor=svr_rbf, + random_state=0) stack.fit(X1, y).predict(X1) - mse = 0.21 + mse = 0.20 got = np.mean((stack.predict(X1) - y) ** 2) - assert round(got, 2) == mse + assert round(got, 2) == mse, got def test_use_features_in_secondary(): @@ -52,6 +53,7 @@ def test_use_features_in_secondary(): stack = StackingCVRegressor(regressors=[svr_lin, lr, ridge], meta_regressor=svr_rbf, cv=3, + random_state=0, use_features_in_secondary=True) stack.fit(X1, y).predict(X1) mse = 0.2 @@ -65,9 +67,10 @@ def test_multivariate(): ridge = Ridge(random_state=1) svr_rbf = SVR(kernel='rbf', gamma='auto') stack = StackingCVRegressor(regressors=[svr_lin, lr, ridge], - meta_regressor=svr_rbf) + meta_regressor=svr_rbf, + random_state=0) stack.fit(X2, y).predict(X2) - mse = 0.19 + mse = 0.20 got = np.mean((stack.predict(X2) - y) ** 2) assert round(got, 2) == mse, '%f != %f' % (round(got, 2), mse) @@ -78,7 +81,8 @@ def test_internals(): cv = 10 stack = StackingCVRegressor(regressors=[lr, lr, lr, lr, lr], meta_regressor=lr, - cv=cv) + cv=cv, + random_state=0) stack.fit(X3, y2) assert stack.predict(X3).mean() == y2.mean() assert stack.meta_regr_.intercept_ == 0.0 @@ -93,7 +97,8 @@ def test_gridsearch_numerate_regr(): ridge = Ridge(random_state=1) svr_rbf = SVR(kernel='rbf', gamma='auto') stack = StackingCVRegressor(regressors=[svr_lin, ridge, ridge], - meta_regressor=svr_rbf) + meta_regressor=svr_rbf, + random_state=42) params = {'ridge-1__alpha': [0.01, 1.0], 'ridge-2__alpha': [0.01, 1.0], @@ -117,7 +122,8 @@ def test_get_params(): svr_rbf = SVR(kernel='rbf') ridge = Ridge(random_state=1) stregr = StackingCVRegressor(regressors=[ridge, lr], - meta_regressor=svr_rbf) + meta_regressor=svr_rbf, + random_state=42) got = sorted(list({s.split('__')[0] for s in stregr.get_params().keys()})) expect = ['cv', @@ -125,6 +131,7 @@ def test_get_params(): 'meta_regressor', 'n_jobs', 'pre_dispatch', + 'random_state', 'refit', 'regressors', 'ridge', @@ -140,7 +147,8 @@ def test_regressor_gridsearch(): svr_rbf = SVR(kernel='rbf', gamma='auto') ridge = Ridge(random_state=1) stregr = StackingCVRegressor(regressors=[lr], - meta_regressor=svr_rbf) + meta_regressor=svr_rbf, + random_state=1) params = {'regressors': [[ridge, lr], [lr, ridge, lr]]} @@ -218,19 +226,20 @@ def test_sparse_matrix_inputs(): ridge = Ridge(random_state=1) svr_rbf = SVR(kernel='rbf', gamma='auto') stack = StackingCVRegressor(regressors=[svr_lin, lr, ridge], - meta_regressor=svr_rbf) + meta_regressor=svr_rbf, + random_state=42) # dense stack.fit(X1, y).predict(X1) - mse = 0.20 + mse = 0.21 got = np.mean((stack.predict(X1) - y) ** 2) - assert round(got, 2) == mse + assert round(got, 2) == mse, got # sparse stack.fit(sparse.csr_matrix(X1), y) mse = 0.20 got = np.mean((stack.predict(sparse.csr_matrix(X1)) - y) ** 2) - assert round(got, 2) == mse + assert round(got, 2) == mse, got def test_sparse_matrix_inputs_with_features_in_secondary(): @@ -240,19 +249,20 @@ def test_sparse_matrix_inputs_with_features_in_secondary(): svr_rbf = SVR(kernel='rbf', gamma='auto') stack = StackingCVRegressor(regressors=[svr_lin, lr, ridge], meta_regressor=svr_rbf, + random_state=42, use_features_in_secondary=True) # dense stack.fit(X1, y).predict(X1) mse = 0.20 got = np.mean((stack.predict(X1) - y) ** 2) - assert round(got, 2) == mse + assert round(got, 2) == mse, got # sparse stack.fit(sparse.csr_matrix(X1), y) mse = 0.20 got = np.mean((stack.predict(sparse.csr_matrix(X1)) - y) ** 2) - assert round(got, 2) == mse + assert round(got, 2) == mse, got # Calling for np.random will break the existing tests by changing the