-
-
Notifications
You must be signed in to change notification settings - Fork 26.2k
ENH add Naive Bayes Metaestimator ColumnwiseNB
(aka "GeneralNB")
#22574
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
avm19
wants to merge
218
commits into
scikit-learn:main
Choose a base branch
from
avm19:ColumnwiseNB
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
+1,636
−7
Open
Changes from all commits
Commits
Show all changes
218 commits
Select commit
Hold shift + click to select a range
75ce0de
Add abstract methods to _BaseDiscreteNB and minor corrections in comm…
6f80025
Merge remote-tracking branch 'upstream/main' into naive-bayes-abstract
62ebbe0
Implemented ColumnwiseNB and tests
4ca9ac5
Added my name to module authors.
d7a9bf4
ColumnwiseNB docstring correction, See Also, Example. Added example t…
2dfcd40
black formatting compliance.
861a573
black formatting compliance.
9b73275
ColumnwiseNB: added _required_parameters = [estimators]
fa66575
Dirty trick with ColumnwiseNB._required_parameters to pass tests
12677e7
ColumnwiseNB docstring: added extended summary
e748cf1
ColumnwiseNB test issue: added to VALIDATE_ESTIMATOR_INIT exclusion list
8b7cfc8
ColumnwiseNB: rename 'estimators' into 'estimatorNBs'
7cb8430
Rename 'estimators' into 'estimatorNBs' in test_naive_bayes.py
2abac32
ColumnwiseNB: rename 'estimators' in the example too
c9a5e1d
Added pytest skip when no pandas to test_naive_bayes.py
79f980f
ColumnwiseNB: update class prior AFTER update fitted estimators
c2cd353
test_naive_bayes.py Added more tests to improve coverage
7ac5986
Merge branch 'main' into ColumnwiseNB
a4939f2
Merge remote-tracking branch 'upstream/main' into ColumnwiseNB
de1123b
Add DOC entry and corrections to DOCSTRING
e515b6a
ColumnwiseNB: DOCSTRING correction
b120499
Merge remote-tracking branch 'upstream/main' into ColumnwiseNB
9dbbb4d
Merge remote-tracking branch 'upstream/main' into ColumnwiseNB
8c86193
Merge remote-tracking branch 'upstream/main' into ColumnwiseNB
cf414c5
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 0c64f2e
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 4ccf640
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 94041f5
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 99d3793
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 6cc8ce4
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 3e7f53a
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 c70c675
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 8c90d29
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 a74fd15
Merge branch 'scikit-learn:main' into ColumnwiseNB asdf
avm19 2cc6d5a
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 c8f09cd
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 6033041
Merge remote-tracking branch 'origin/main' into ColumnwiseNB
eba339f
Replace ColumnwiseNB exception from init test in VALIDATE_ESTIMATOR_INIT
0dbb07f
Reformatting to comply with black=22.3.0
5add60b
Fixing the init and set_params test. Cf. #22537
f0fd8b3
ColumnwiseNB: rename estimatorsNBs to nb_estimators
1c884f3
tests for ColumnwiseNB: rename estimatorsNBs to nb_estimators
0dab95b
flake8 fix in text_naive_bayes.py
1bd1059
black fix in test_naive_bayes.py
bccf49b
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 081114f
Merge branch 'main' of github.com:scikit-learn/scikit-learn into Colu…
5979e7b
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 fcf032c
Added example: ColumnwiseNB for titanic dataset
d3d606f
Merge branch 'ColumnwiseNB' of github.com:avm19/scikit-learn into Col…
1966cca
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 e2e3ccf
flake8 fix
75ce7af
ColumnwiseNB: added _check_n_features to fit and partial_fit
2d706bd
Correction to the example (ColumnwiseNB for titanic dataset)
4203f7b
Added a section to the naive bayes guide in documentation
ffc4b60
CI fix: try n_retires=10 in fetch_openml
b5628ee
Merge branch 'main' of github.com:scikit-learn/scikit-learn into Colu…
31b47a0
Fix formatting in the gallery example
64adf79
Fix formatting in the gallery example
f6eaab7
Improve documentation and the gallery example
a40fdca
Re #21355 'no validation at init'-test: Remove the logic at setter, k…
5492c60
Merge remote-tracking branch 'upstream/main' into ColumnwiseNB
40085e5
Add test for error when subestimator does not compute class priors, b…
019c0e0
Extend the test for class priors extraction to MultinomialNB to cover…
197740d
Add ColumnwiseNB._sk_visual_block_ method for better HTML representation
b275993
Add test for ColumnwiseNB._sk_visual_block()
5a8d59e
Black formatting correction
be83512
Tests for ColumnwiseNB priors: Remove unnecessary definitions
50ab0b7
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 2e09146
Merge branch 'main' of github.com:scikit-learn/scikit-learn into Colu…
b93f39d
Change log: add an entry for ColumnwiseNB
3a82e8d
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 7aa60ec
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 4fab0e9
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 311d134
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 7eb9e2f
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 8eabb30
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 b91ed02
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 595bb58
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 ff4be14
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 616897e
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 e423db9
Changelog entry moved from v1.1.rst to v1.2.rst
199cbeb
Merge upstream
e86757d
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 de7db85
Merge remote-tracking branch 'upstream/main' into ColumnwiseNB
6fdd100
Merge branch 'ColumnwiseNB' of github.com:avm19/scikit-learn into Col…
f3ecdfb
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 fb4c9c8
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 8ee2cd2
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 1047ad5
Merge remote-tracking branch 'upstream/main' into ColumnwiseNB
261bc5d
Format cited code in docstring sklearn/naive_bayes.py
avm19 c7334a2
Merge branch 'ColumnwiseNB' of github.com:avm19/scikit-learn into Col…
c19e76b
Remove unnecessary import in test.naive_bayes.py::test_cwnb_example
1eb5d49
Update authors in examples/miscellaneous/plot_combining_naive_bayes.py
avm19 7a8ee18
Split test functions and give better names in test_naive_bayes.py
03e48e6
Namechange and minor comments in test_naive_bayes.py
e1449a0
Test union GaussianNBs matches single one when priors are specified
e60cd80
Merge remote-tracking branch 'upstream/main' into ColumnwiseNB
0b1829c
Implement _BaseNB.predict_joint_log_proba method and test for it
ec9033e
_BaseNB.predict_join_log_proba improve docstring
9c721ff
Merge branch 'naive-bayes-jll' into ColumnwiseNB
c321f63
Changelog entry
c65bbc7
Merge branch 'naive-bayes-jll' into ColumnwiseNB
2be313e
Use predict_joint_log_proba instead of _joint_log_likelihood in sub-e…
0ba8cb5
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 e4df039
Merge branch 'main' of github.com:scikit-learn/scikit-learn into Colu…
fe6fab8
Merge branch 'ColumnwiseNB' of github.com:avm19/scikit-learn into Col…
aae81e9
Common parameter validation towards #23462 and custom test
4ba7bac
Docs terminology log-likelihood -> log-probability
f1b2d02
Merge remote-tracking branch 'upstream/main' into ColumnwiseNB
389bad1
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 1224e9a
Empty commit to trigger pipeline
433e071
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 67418a1
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 f3015a4
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 8850648
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 2004fa8
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 9c840f8
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 0e5cfd2
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 2779e07
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 397cc1b
Parameter parser='auto' in fetch_openml. See #21938
33622ae
Use set_config(transform_output=pandas) and string feature names. See…
ef69554
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 dbfac78
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 a8f9413
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 92beb26
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 e7ef3e9
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 3e63954
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 9d8161d
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 c36f36a
Merge branch 'main' into ColumnwiseNB
glemaitre a5ea324
DOC update changelog
glemaitre 446cd5e
Merge remote-tracking branch 'upstream/main' into ColumnwiseNB
3743b17
Minor format suggestions from glemaitre's review
avm19 df70750
Merge remote-tracking branch 'upstream/main' into ColumnwiseNB
75a00f4
Docstring: versionadded note and a reference to the User Guide
e70e6c8
Docstring for n_features_in_
df49fb4
Merge remote-tracking branch 'upstream/main' into ColumnwiseNB
3291276
Merge remote-tracking branch 'upstream/main' into ColumnwiseNB
f19914d
Remove n_classes_ attribute
23469d7
named_estimators_ is now not a property, but a field
9683a2b
Minor formatting: f-string in place of old style
03ef84d
Factor out _fit_partial from fit and fit_partial
2b8bde7
Merge remote-tracking branch 'upstream/main' into ColumnwiseNB
1198f25
Ensure ColumnwiseNB.class_count_ is float64
983a3a6
Merge remote-tracking branch 'upstream/main' into ColumnwiseNB
21ae456
Docstring: clarify callable columns are evaluated only once
51b3a39
Decorate partial_fit with available_if
0eb36a9
Improve _validate_estimators for when non-tuples are passed
8d27d6e
Improve _validate_estimators and test
76b32ad
Merge remote-tracking branch 'upstream/main' into ColumnwiseNB
298f3ae
black formatting
09eaf7a
Use .utils._encode._unique instead of np.unique
b38206b
Docstring: replace double backticks with single backticks
844afec
Remove and/or correct comments
77313a3
Merge remote-tracking branch 'upstream/main' into ColumnwiseNB
ac67bee
Merge remote-tracking branch 'upstream/main' into ColumnwiseNB
75b2cfc
Correct mistake that fit() does not fit from scratch. Test
a3a0653
Common tests and estimator checks for ColumnwiseNB (more)
5201045
Pass tests by removing memory address in column selector __repr__
043dbd6
Empty commit to trigger build pipeline
d077501
Merge remote-tracking branch 'upstream/main' into ColumnwiseNB
23ec142
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 5434ef3
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 07d4b9d
Merge remote-tracking branch 'upstream/main' into ColumnwiseNB
755b459
Merge branch 'ColumnwiseNB' of github.com:avm19/scikit-learn into Col…
6c5c7d8
Use utils.parallel.delayed not utils.fixes.delayed
7d6c837
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 d849fdf
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 6a69cc2
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 58613ed
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 0f36fe6
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 8feddf6
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 be5cba5
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 937c857
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 2e1b3e4
Merge remote-tracking branch 'upstream/main' into ColumnwiseNB
a8a07c4
TST use global_random_seed towards #22827
70f38fb
Trigger build
a9051bb
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 b63fd28
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 0159a80
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 d34e387
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 764013c
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 65b1e50
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 9d6eb91
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 4df6ff5
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 f8277ba
Minor typo in a comment
avm19 4aa9b83
Add np.where to cover the possibility of zero prior
avm19 d14dae9
black formatting
d30ac13
Merge remote-tracking branch 'upstream/main' into ColumnwiseNB
8ea37ff
Reformatting to comply with black=23.3.0
cf69151
Merge remote-tracking branch 'upstream/main' into ColumnwiseNB
dbbeaf5
Apply _fit_context decorator. Cf. #26473
ff02ae8
black formatting
923ec6e
Merge remote-tracking branch 'upstream/main' into ColumnwiseNB
cb5a43d
Formatting ruff
b8cd150
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 af6df1a
Merge remote-tracking branch 'upstream/main' into ColumnwiseNB
7257e77
Merge remote-tracking branch 'origin/ColumnwiseNB' into ColumnwiseNB
4ec0924
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 96fdb12
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 37a3341
Merge branch 'scikit-learn:main' into ColumnwiseNB
avm19 f62c3c3
Merge remote-tracking branch 'upstream/main' into ColumnwiseNB
e2d48d8
Move the changelog entry from 1.3 to 1.4
45e4381
Move ColumnwiseNB section before Out of Core section
95d00cd
Change versionadded from 1.3 to 1.4
a1ed149
Update sklearn/naive_bayes.py
avm19 6c09328
Update sklearn/naive_bayes.py
avm19 b0ccfb0
Update sklearn/naive_bayes.py
avm19 52c2265
Merge branch 'ColumnwiseNB' of github.com:avm19/scikit-learn into Col…
53fb1a9
Formatting
ddf5f55
Fix test re _parameter_constraints = {'nb_estimators': [list], ...}
78c70eb
Change nb_estimator to naive_bayes_estimator in all docstring
95c9c69
Rename 'nb_estimators' into 'estimators'
21e4fb8
Merge remote-tracking branch 'upstream/main' into ColumnwiseNB
3c3315c
Fix rename 'nb_estimators' into 'estimators'
ca78f52
Fix _fit_context decorator.
585d778
Merge remote-tracking branch 'upstream/main' into ColumnwiseNB
7d0ad34
Change _iter signature to mirror ColumnTransformer changes in #27005
919e2ca
Merge remote-tracking branch 'upstream/main' into ColumnwiseNB
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,135 @@ | ||
""" | ||
=================================================== | ||
Combining Naive Bayes Estimators using ColumnwiseNB | ||
=================================================== | ||
|
||
.. currentmodule:: sklearn | ||
|
||
This example shows how to use :class:`~naive_bayes.ColumnwiseNB` | ||
meta-estimator to construct a naive Bayes model from base naive Bayes | ||
estimators. The resulting model is applied to a dataset with a mixture of | ||
discrete and continuous features. | ||
|
||
We consider the titanic dataset, in which: | ||
|
||
- numerical (continous) features "age" and "fare" are handled by | ||
:class:`~naive_bayes.GaussianNB`; | ||
- categorical (discrete) features "embarked", "sex", and "pclass" are handled | ||
by :class:`~naive_bayes.CategoricalNB`. | ||
""" | ||
|
||
# Author: Andrey V. Melnik <andrey.melnik.maths@gmail.com> | ||
# Pedro Morales <part.morales@gmail.com> | ||
# | ||
# License: BSD 3 clause | ||
|
||
# %% | ||
import pandas as pd | ||
|
||
from sklearn import set_config | ||
from sklearn.datasets import fetch_openml | ||
|
||
set_config(transform_output="pandas") | ||
|
||
X, y = fetch_openml( | ||
"titanic", version=1, as_frame=True, return_X_y=True, n_retries=10, parser="auto" | ||
) | ||
X["pclass"] = X["pclass"].astype("category") | ||
# Add a category for NaNs to the "embarked" feature: | ||
X["embarked"] = X["embarked"].cat.add_categories("N/A").fillna("N/A") | ||
|
||
# %% | ||
# Build and use a pipeline around ``ColumnwiseNB`` | ||
# ------------------------------------------------ | ||
|
||
from sklearn.compose import ColumnTransformer | ||
from sklearn.impute import SimpleImputer | ||
from sklearn.metrics import accuracy_score | ||
from sklearn.model_selection import GridSearchCV, train_test_split | ||
from sklearn.naive_bayes import CategoricalNB, ColumnwiseNB, GaussianNB | ||
from sklearn.pipeline import Pipeline | ||
from sklearn.preprocessing import OrdinalEncoder | ||
|
||
numeric_features = ["age", "fare"] | ||
numeric_transformer = SimpleImputer(strategy="median") | ||
|
||
categorical_features = ["embarked", "sex", "pclass"] | ||
categories = [X[c].unique().to_list() for c in X[categorical_features]] | ||
categorical_transformer = OrdinalEncoder(categories=categories) | ||
|
||
preprocessor = ColumnTransformer( | ||
transformers=[ | ||
("num", numeric_transformer, numeric_features), | ||
("cat", categorical_transformer, categorical_features), | ||
], | ||
verbose_feature_names_out=False, | ||
) | ||
|
||
classifier = ColumnwiseNB( | ||
estimators=[ | ||
("gnb", GaussianNB(), numeric_features), | ||
("cnb", CategoricalNB(), categorical_features), | ||
] | ||
) | ||
|
||
pipe = Pipeline(steps=[("preprocessor", preprocessor), ("classifier", classifier)]) | ||
pipe | ||
# %% | ||
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0) | ||
|
||
pipe.fit(X_train, y_train) | ||
y_pred = pipe.predict(X_test) | ||
print(f"Test accuracy: {accuracy_score(y_test, y_pred)}") | ||
|
||
# %% | ||
# Compare choices of columns using ``GridSearchCV`` | ||
# -------------------------------------------------- | ||
# | ||
# The allocation of columns to constituent subestimators can be regarded as a | ||
# hyperparameter. We can explore the combinations of columns' choices and values | ||
# of other hyperparameters with the help of :class:`~.model_selection.GridSearchCV`. | ||
|
||
param_grid = { | ||
"classifier__estimators": [ | ||
[ | ||
("gnb", GaussianNB(), ["age", "fare"]), | ||
("cnb", CategoricalNB(), categorical_features), | ||
], | ||
[("gnb", GaussianNB(), []), ("cnb", CategoricalNB(), ["pclass"])], | ||
[("gnb", GaussianNB(), ["embarked"]), ("cnb", CategoricalNB(), [])], | ||
], | ||
"preprocessor__num__strategy": ["mean", "most_frequent"], | ||
} | ||
|
||
grid_search = GridSearchCV(pipe, param_grid, cv=10) | ||
grid_search | ||
|
||
# %% | ||
# Calling `fit` triggers the cross-validated search for the best | ||
# hyperparameters combination: | ||
|
||
grid_search.fit(X_train, y_train) | ||
|
||
print("Best params:") | ||
print(grid_search.best_params_) | ||
|
||
# %% | ||
# As it turns out, the best results are achieved by the naive Bayes model when "sex" | ||
# is the only feature used: | ||
|
||
cv_results = pd.DataFrame(grid_search.cv_results_) | ||
cv_results = cv_results.sort_values("mean_test_score", ascending=False) | ||
cv_results["Columns dictionary"] = cv_results["param_classifier__estimators"].map( | ||
lambda l: {e[0]: e[-1] for e in l} | ||
) | ||
cv_results["'gnb' columns"] = cv_results["Columns dictionary"].map(lambda d: d["gnb"]) | ||
cv_results["'cnb' columns"] = cv_results["Columns dictionary"].map(lambda d: d["cnb"]) | ||
cv_results[ | ||
[ | ||
"mean_test_score", | ||
"std_test_score", | ||
"param_preprocessor__num__strategy", | ||
"'gnb' columns", | ||
"'cnb' columns", | ||
] | ||
] |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.