@sh.add_function(dsp, outputs=['clutch_speed_model'])
def calibrate_clutch_speed_model(
clutch_phases, accelerations, clutch_tc_speeds_delta, velocities,
gear_box_speeds_in, gears):
"""
Calibrate clutch speed model.
:param clutch_phases:
When the clutch is active [-].
:type clutch_phases: numpy.array
:param accelerations:
Acceleration vector [m/s2].
:type accelerations: numpy.array
:param clutch_tc_speeds_delta:
Engine speed delta due to the clutch [RPM].
:type clutch_tc_speeds_delta: numpy.array
:param velocities:
Velocity vector [km/h].
:type velocities: numpy.array
:param gear_box_speeds_in:
Gear box speed vector [RPM].
:type gear_box_speeds_in: numpy.array
:param gears:
Gear vector [-].
:type gears: numpy.array
:return:
Clutch speed model.
:rtype: callable
"""
model = _no_model
if clutch_phases.sum() > 10:
from co2mpas.utils import mae
from sklearn.pipeline import Pipeline
# noinspection PyProtectedMember
from ..engine._thermal import _SelectFromModel, _XGBRegressor
X = np.column_stack(
(accelerations, velocities, gear_box_speeds_in, gears)
)[clutch_phases]
y = clutch_tc_speeds_delta[clutch_phases]
# noinspection PyArgumentEqualDefault
mdl = _XGBRegressor(
max_depth=2,
n_estimators=int(min(300., 0.25 * (len(y) - 1))),
random_state=0,
objective='reg:squarederror'
)
mdl = Pipeline([
('feature_selection', _SelectFromModel(mdl, '0.8*median')),
('classification', mdl)
])
mdl.fit(X, y)
if mae(mdl.predict(X), y) < mae(0, y):
keys = 'accelerations', 'velocities', 'gear_box_speeds_in', 'gears'
# noinspection PyUnusedLocal,PyMissingOrEmptyDocstring
def model(times, **kwargs):
return mdl.predict(np.column_stack(sh.selector(keys, kwargs)))
return model