It should not be necessary to regenerate the combinations for degrees less than the maximum (but perhaps not regenerating them will be faster), seeing as `itertools.combinations(n, k)` is a superset of `itertools.combinations(n - 1, k)` as long as `n-1 >= k`, which it is here.

A trivial way to utilise this property would be to use
```python
combs = np.array(list(itertools.combinations(xrange(degree + n_features - 1), n_features - 1)), dtype=int)
comb_degree = np.max(combs, axis=1) - n_features + 2
for balls in range(deg_min, degree + 1):
    mask = comb_degree <= balls
    # TODO: append total, perform diff
    ...
```