Repository: DistrictDataLabs/yellowbrick

Issue:
Ridge' is not a CV regularization model; try ManualAlphaSelection instead
**Describe the bug**
I am trying to find the best Alpha for a Ridge model without CV using Yellowbrick ManualAlphaSelection API. My code is pretty basic and it has been taken from the yellowbrick´s documentation. Even though it does not work:

**To Reproduce**

from yellowbrick.regressor import ManualAlphaSelection
from sklearn.linear_model import Ridge
model = ManualAlphaSelection(Ridge(),  scoring='neg_mean_squared_error')
model.fit(X_train, y_train)
model.show()
`
**Dataset**
The dataset does not matter because the code itself does not Works. It is a syntax problem.

**Expected behavior**
It was expected that ManualAlphaSelection  Works but Python raises the message: 'Ridge' is not a CV regularization model; try ManualAlphaSelection instead. But this message is wrong because the ManualAlphaSelection is already being used

**Traceback**

```
If applicable, add the traceback from the exception.
```

**Desktop (please complete the following information):**
 - OS:  Windows 10
 - Python Version  Anaconda3 Python 3 
 - Yellowbrick Version is the last on because I just installed it on march the 19th. I don´t know how to check this out.

**Additional context** Jupyter notebook 6.0.3



Discussion:
@mmhernandm this is a known bug, but it's slipped past us for a while since we didn't have an issue for it. Thanks for opening it - we will apply a patch before our next release. 
@rebeccabilbro it would be nice to know what it would take to make ManualAlphaSelection green and create an issue for it. 

Also, is #157 related? If not, could we add it to the above issue. 

Resolving patch:
diff --git a/yellowbrick/regressor/alphas.py b/yellowbrick/regressor/alphas.py
--- a/yellowbrick/regressor/alphas.py
+++ b/yellowbrick/regressor/alphas.py
@@ -311,10 +311,13 @@ def __init__(self, model, ax=None, alphas=None, cv=None, scoring=None, **kwargs)
             )
 
         # Call super to initialize the class
-        super(ManualAlphaSelection, self).__init__(model, ax=ax, **kwargs)
+        super(AlphaSelection, self).__init__(model, ax=ax, **kwargs)
 
         # Set manual alpha selection parameters
-        self.alphas = alphas or np.logspace(-10, -2, 200)
+        if alphas is not None:
+            self.alphas = alphas
+        else:
+            self.alphas = np.logspace(-10, -2, 200)
         self.errors = None
         self.score_method = partial(cross_val_score, cv=cv, scoring=scoring)
 
@@ -361,7 +364,7 @@ def draw(self):
 
 
 ##########################################################################
-## Quick Method
+## Quick Methods
 ##########################################################################
 
 
@@ -426,3 +429,84 @@ def alphas(model, X, y=None, ax=None, is_fitted="auto", show=True, **kwargs):
 
     # Return the visualizer
     return visualizer
+
+
+def manual_alphas(
+    model,
+    X,
+    y=None,
+    ax=None,
+    alphas=None,
+    cv=None,
+    scoring=None,
+    show=True,
+    **kwargs
+):
+    """Quick Method:
+    The Manual Alpha Selection Visualizer demonstrates how different values of alpha
+    influence model selection during the regularization of linear models.
+    Generally speaking, alpha increases the affect of regularization, e.g. if
+    alpha is zero there is no regularization and the higher the alpha, the
+    more the regularization parameter influences the final model.
+
+    Parameters
+    ----------
+
+    model : an unfitted Scikit-Learn regressor
+        Should be an instance of an unfitted regressor, and specifically one
+        whose name doesn't end with "CV". The regressor must support a call to
+        ``set_params(alpha=alpha)`` and be fit multiple times. If the
+        regressor name ends with "CV" a ``YellowbrickValueError`` is raised.
+
+    ax : matplotlib Axes, default: None
+        The axes to plot the figure on. If None is passed in the current axes
+        will be used (or generated if required).
+
+    alphas : ndarray or Series, default: np.logspace(-10, 2, 200)
+        An array of alphas to fit each model with
+
+    cv : int, cross-validation generator or an iterable, optional
+        Determines the cross-validation splitting strategy.
+        Possible inputs for cv are:
+
+        - None, to use the default 3-fold cross validation,
+        - integer, to specify the number of folds in a `(Stratified)KFold`,
+        - An object to be used as a cross-validation generator.
+        - An iterable yielding train, test splits.
+
+        This argument is passed to the
+        ``sklearn.model_selection.cross_val_score`` method to produce the
+        cross validated score for each alpha.
+
+    scoring : string, callable or None, optional, default: None
+        A string (see model evaluation documentation) or
+        a scorer callable object / function with signature
+        ``scorer(estimator, X, y)``.
+
+        This argument is passed to the
+        ``sklearn.model_selection.cross_val_score`` method to produce the
+        cross validated score for each alpha.
+
+    kwargs : dict
+        Keyword arguments that are passed to the base class and may influence
+        the visualization as defined in other Visualizers.
+
+    Returns
+    -------
+    visualizer : AlphaSelection
+        Returns the alpha selection visualizer
+    """
+    # Instantiate the visualizer
+    visualizer = ManualAlphaSelection(
+        model, ax, alphas=alphas, scoring=scoring, cv=cv, **kwargs
+    )
+
+    visualizer.fit(X, y)
+
+    if show:
+        visualizer.show()
+    else:
+        visualizer.finalize()
+
+    # Return the visualizer
+    return visualizer


Test patch:
diff --git a/tests/baseline_images/test_regressor/test_alphas/test_quick_method_manual.png b/tests/baseline_images/test_regressor/test_alphas/test_quick_method_manual.png
new file mode 100644
Binary files /dev/null and b/tests/baseline_images/test_regressor/test_alphas/test_quick_method_manual.png differ
diff --git a/tests/baseline_images/test_regressor/test_alphas/test_similar_image_manual.png b/tests/baseline_images/test_regressor/test_alphas/test_similar_image_manual.png
new file mode 100644
Binary files /dev/null and b/tests/baseline_images/test_regressor/test_alphas/test_similar_image_manual.png differ
diff --git a/tests/test_regressor/test_alphas.py b/tests/test_regressor/test_alphas.py
--- a/tests/test_regressor/test_alphas.py
+++ b/tests/test_regressor/test_alphas.py
@@ -28,6 +28,8 @@
 from yellowbrick.exceptions import YellowbrickTypeError
 from yellowbrick.exceptions import YellowbrickValueError
 from yellowbrick.regressor.alphas import AlphaSelection, alphas
+from yellowbrick.regressor.alphas import ManualAlphaSelection, manual_alphas
+
 
 from sklearn.svm import SVR, SVC
 from sklearn.cluster import KMeans
@@ -167,3 +169,52 @@ def test_quick_method(self):
         )
         assert isinstance(visualizer, AlphaSelection)
         self.assert_images_similar(visualizer)
+
+
+class TestManualAlphaSelection(VisualTestCase):
+    """
+    Test the ManualAlphaSelection visualizer
+    """
+    def test_similar_image_manual(self):
+        """
+        Integration test with image similarity comparison
+        """
+
+        visualizer = ManualAlphaSelection(Lasso(random_state=0), cv=5)
+
+        X, y = make_regression(random_state=0)
+        visualizer.fit(X, y)
+        visualizer.finalize()
+
+        # Image comparison fails on Appveyor with RMS 0.024
+        self.assert_images_similar(visualizer, tol=0.1)
+
+    @pytest.mark.parametrize("model", [RidgeCV, LassoCV, LassoLarsCV, ElasticNetCV])
+    def test_manual_with_cv(self, model):
+        """
+        Ensure only non-CV regressors are allowed
+        """
+        with pytest.raises(YellowbrickTypeError):
+            ManualAlphaSelection(model())
+
+    @pytest.mark.parametrize("model", [SVR, Ridge, Lasso, LassoLars, ElasticNet])
+    def test_manual_no_cv(self, model):
+        """
+        Ensure non-CV regressors are allowed
+        """
+        try:
+            ManualAlphaSelection(model())
+        except YellowbrickTypeError:
+            pytest.fail("could not instantiate Regressor on alpha selection")
+
+    def test_quick_method_manual(self):
+        """
+        Test the manual alphas quick method producing a valid visualization
+        """
+        X, y = load_energy(return_dataset=True).to_numpy()
+
+        visualizer = manual_alphas(
+            ElasticNet(random_state=0), X, y, cv=3, is_fitted=False, show=False
+        )
+        assert isinstance(visualizer, ManualAlphaSelection)
+        self.assert_images_similar(visualizer)