Repository: sktime/sktime

Issue:
[BUG] Forecasting horizon in EnsembleForecaster fit and predict
**Describe the bug**
Closely related to #126, but the fix in `BaseForecaster` has not carried over to `EnsembleForecaster` as it overrides the fit and predict methods.

**To Reproduce**
```python
import pandas as pd
from sktime.forecasters import EnsembleForecaster
from sktime.forecasters import ExpSmoothingForecaster
from sktime.datasets import load_shampoo_sales

shampoo = load_shampoo_sales()
train = pd.Series([shampoo.iloc[0].iloc[:30]])

estimators = [
    ('ses', ExpSmoothingForecaster()),
    ('holt', ExpSmoothingForecaster(trend='additive'))
]
m = EnsembleForecaster(estimators=estimators)

# Error in fit
m.fit(train)

# Error in predict
m.fit(train, fh = 1)
m.predict(train)
```

**Expected behavior**
Have default forecasting horizon in line with `BaseForecaster`

**Versions**
<details>

Windows-10-10.0.17763-SP0
Python 3.7.4 (tags/v3.7.4:e09359112e, Jul  8 2019, 20:34:20) [MSC v.1916 64 bit (AMD64)]
NumPy 1.17.2
SciPy 1.3.1
sktime 0.3.0

</details>

[BUG] Forecasting horizon in EnsembleForecaster fit and predict
**Describe the bug**
Closely related to #126, but the fix in `BaseForecaster` has not carried over to `EnsembleForecaster` as it overrides the fit and predict methods.

**To Reproduce**
```python
import pandas as pd
from sktime.forecasters import EnsembleForecaster
from sktime.forecasters import ExpSmoothingForecaster
from sktime.datasets import load_shampoo_sales

shampoo = load_shampoo_sales()
train = pd.Series([shampoo.iloc[0].iloc[:30]])

estimators = [
    ('ses', ExpSmoothingForecaster()),
    ('holt', ExpSmoothingForecaster(trend='additive'))
]
m = EnsembleForecaster(estimators=estimators)

# Error in fit
m.fit(train)

# Error in predict
m.fit(train, fh = 1)
m.predict(train)
```

**Expected behavior**
Have default forecasting horizon in line with `BaseForecaster`

**Versions**
<details>

Windows-10-10.0.17763-SP0
Python 3.7.4 (tags/v3.7.4:e09359112e, Jul  8 2019, 20:34:20) [MSC v.1916 64 bit (AMD64)]
NumPy 1.17.2
SciPy 1.3.1
sktime 0.3.0

</details>



Discussion:

Resolving patch:
diff --git a/sktime/forecasters/compose.py b/sktime/forecasters/compose.py
--- a/sktime/forecasters/compose.py
+++ b/sktime/forecasters/compose.py
@@ -38,7 +38,7 @@ def __init__(self, estimators=None, weights=None, check_input=True):
         self.fitted_estimators_ = []
         super(EnsembleForecaster, self).__init__(check_input=check_input)
 
-    def fit(self, y, fh=None, X=None):
+    def fit(self, y, fh=1, X=None):
         """
         Internal fit.
 
@@ -70,7 +70,7 @@ def fit(self, y, fh=None, X=None):
             self.fitted_estimators_.append(fitted_estimator)
         return self
 
-    def predict(self, fh=None, X=None):
+    def predict(self, fh=1, X=None):
         """
         Internal predict using fitted estimator.
 


Test patch:
diff --git a/sktime/forecasters/tests/test_EnsembleForecaster.py b/sktime/forecasters/tests/test_EnsembleForecaster.py
--- a/sktime/forecasters/tests/test_EnsembleForecaster.py
+++ b/sktime/forecasters/tests/test_EnsembleForecaster.py
@@ -6,6 +6,7 @@
 from sktime.forecasters import ExpSmoothingForecaster
 from sktime.forecasters import ARIMAForecaster
 from sktime.datasets import load_shampoo_sales
+from sktime.utils.validation.forecasting import validate_fh
 
 __author__ = "Markus Löning"
 
@@ -14,7 +15,7 @@
 FORECASTERS = (DummyForecaster, ExpSmoothingForecaster, ARIMAForecaster)
 
 # forecast horizons
-FHS = ([1], [1, 3], np.array([1]), np.array([1, 3]), np.arange(5))
+FHS = (None, [1], [1, 3], np.array([1]), np.array([1, 3]), np.arange(5))
 
 # load test data
 y = load_shampoo_sales()
@@ -27,14 +28,19 @@ def test_EnsembleForecaster_fhs(fh):
         ('last', DummyForecaster(strategy='last'))
     ]
     m = EnsembleForecaster(estimators=estimators)
-    m.fit(y, fh=fh)
-    y_pred = m.predict(fh=fh)
 
-    # adjust for default value
     if fh is None:
-        fh = np.array([1])
-    if isinstance(fh, list):
-        fh = np.asarray(fh)
+        # Fit and predict with default fh
+        m.fit(y)
+        y_pred = m.predict()
+
+        # for further checks, set fh to default
+        fh = validate_fh(1)
+    else:
+        # Validate fh and then fit/predict
+        fh = validate_fh(fh)
+        m.fit(y, fh=fh)
+        y_pred = m.predict(fh=fh)
 
     # test length of output
     assert len(y_pred) == len(fh)