Source code for mlinsights.mlmodel._extended_features_polynomial
"""
Implements new features such as polynomial features.
:githublink:`%|py|5`
"""
from itertools import combinations, chain
from itertools import combinations_with_replacement as combinations_w_r
[docs]def _transform_iall(degree, bias, XP, X, multiply, final):
"Computes the polynomial features"
if bias:
XP[:, 0] = 1
pos = 1
else:
pos = 0
n = X.shape[1]
for d in range(0, degree):
if d == 0:
XP[:, pos:pos + n] = X
index = list(range(pos, pos + n))
pos += n
index.append(pos)
else:
new_index = []
end = index[-1]
for i in range(0, n):
a = index[i]
new_index.append(pos)
new_pos = pos + end - a
multiply(XP[:, a:end], X[:, i:i + 1],
XP[:, pos:new_pos])
pos = new_pos
new_index.append(pos)
index = new_index
return final(XP)
[docs]def _transform_ionly(degree, bias, XP, X, multiply, final):
"Computes the polynomial features"
if bias:
XP[:, 0] = 1
pos = 1
else:
pos = 0
n = X.shape[1]
for d in range(0, degree):
if d == 0:
XP[:, pos:pos + n] = X
index = list(range(pos, pos + n))
pos += n
index.append(pos)
else:
new_index = []
end = index[-1]
for i in range(0, n):
a = index[i]
new_index.append(pos)
dec = index[i + 1] - index[i]
new_pos = pos + end - a - dec
if new_pos <= pos:
break
multiply(XP[:, a + dec:end], X[:, i:i + 1],
XP[:, pos:new_pos])
pos = new_pos
new_index.append(pos)
index = new_index
return final(XP)
[docs]def _combinations_poly(n_features, degree, interaction_only, include_bias):
"Computes all polynomial features combinations."
comb = (combinations if interaction_only else combinations_w_r)
start = int(not include_bias)
return chain.from_iterable(comb(range(n_features), i)
for i in range(start, degree + 1))