Repository: alteryx/evalml (python)

Issue:
Update `numeric_dtypes`
Update the values that are considered numeric types in `gen_utils.numeric_dtypes`. Woodwork supports many additional numeric dtypes that aren't captured by the `numeric_dtypes` array we currently have in EvalML. 

Repro code:
```python
import woodwork as ww
from evalml.utils.gen_utils import numeric_dtypes

data = ww.demo.load_retail(nrows=100)
print(data.types)
for column in data.columns:    
    print(f'"{column}" is numeric: {data[column].dtype in numeric_dtypes}')
```

Result that is displayed:
![image](https://user-images.githubusercontent.com/22552445/100159131-329df580-2e7b-11eb-8ab6-89446c7f8444.png)

We see that column `quantity` is of type `Int64`, but that isn't in `numeric_dtypes`. 

*`numeric_dtypes` is used in `detect_problem_type`, which is called in the Looking Glass code for `analyze_metadata.py`. 

Pull request:
Update `detect_problem_types` implementation
fix #1469 

Updated this implementation to catch Int64 dtypes. Previously, using `analyze_metadata` in looking_glass, if the target data was `Int64`, the problem_type would be classified as multiclass as long as there were `>2` unique values. 

After using `is_numeric_dtype`:
![image](https://user-images.githubusercontent.com/22552445/100647944-395eb980-330e-11eb-9d87-d5567c2198b9.png)

Since we drop NaN data, classifying Boolean (nullable) as a numeric dtype is ok, since we'll catch this binary case before determining if it is regression or multiclass. 


Patch:
diff --git a/docs/source/release_notes.rst b/docs/source/release_notes.rst
index ddfd9515..32dbaf35 100644
--- a/docs/source/release_notes.rst
+++ b/docs/source/release_notes.rst
@@ -5,6 +5,7 @@ Release Notes
     * Enhancements
     * Fixes
         * Updated ``Woodwork`` to >=0.0.5 in ``core-requirements.txt`` :pr:`1473`
+        * Updated ``detect_problem_type`` to use ``pandas.api.is_numeric_dtype`` :pr:`1476`
     * Changes
         * Changed ``make clean`` to delete coverage reports as a convenience for developers :pr:`1464`
     * Documentation Changes
diff --git a/evalml/problem_types/utils.py b/evalml/problem_types/utils.py
index d82f46b1..95f2d453 100644
--- a/evalml/problem_types/utils.py
+++ b/evalml/problem_types/utils.py
@@ -1,9 +1,8 @@
 import pandas as pd
+from pandas.api.types import is_numeric_dtype
 
 from .problem_types import ProblemTypes
 
-from evalml.utils.gen_utils import numeric_dtypes
-
 
 def handle_problem_types(problem_type):
     """Handles problem_type by either returning the ProblemTypes or converting from a str.
@@ -46,7 +45,7 @@ def detect_problem_type(y):
         raise ValueError("Less than 2 classes detected! Target unusable for modeling")
     if num_classes == 2:
         return ProblemTypes.BINARY
-    if y.dtype in numeric_dtypes:
+    if is_numeric_dtype(y.dtype):
         if (num_classes > 10):
             return ProblemTypes.REGRESSION
     return ProblemTypes.MULTICLASS


Test patch:
diff --git a/evalml/tests/problem_type_tests/test_problem_types.py b/evalml/tests/problem_type_tests/test_problem_types.py
index 47fb2e7b..4b071a3b 100644
--- a/evalml/tests/problem_type_tests/test_problem_types.py
+++ b/evalml/tests/problem_type_tests/test_problem_types.py
@@ -95,6 +95,14 @@ def test_detect_problem_type_regression():
     assert detect_problem_type(y_float) == ProblemTypes.REGRESSION
 
 
+def test_numeric_extensions():
+    y_Int64 = pd.Series([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], dtype='Int64')
+    y_Int64_null = pd.Series([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, None], dtype='Int64')
+
+    assert detect_problem_type(y_Int64) == ProblemTypes.REGRESSION
+    assert detect_problem_type(y_Int64_null) == ProblemTypes.REGRESSION
+
+
 def test_nan_none_na():
     y_none = pd.Series([None])
     y_pdna = pd.Series([pd.NA])