<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def fit( model, params, X_train, y_train, X_test, y_test, additional_calls, fit_params=None, scorer=None, random_state=None, ):
 """ Find a good model and search among a space of hyper-parameters This does a hyper-parameter search by creating many models and then fitting them incrementally on batches of data and reducing the number of models based on the scores computed during training. Over time fewer and fewer models remain. We train these models for increasingly long times. The model, number of starting parameters, and decay can all be provided as configuration parameters. Training data should be given as Dask arrays. It can be large. Testing data should be given either as a small dask array or as a numpy array. It should fit on a single worker. Parameters model : Estimator params : List[Dict] Parameters to start training on model X_train : dask Array y_train : dask Array X_test : Array Numpy array or small dask array. Should fit in single node's memory. y_test : Array Numpy array or small dask array. Should fit in single node's memory. additional_calls : callable A function that takes information about scoring history per model and returns the number of additional partial fit calls to run on each model fit_params : dict Extra parameters to give to partial_fit scorer : callable A scorer callable object / function with signature ``scorer(estimator, X, y)``. random_state : int, RandomState instance or None, optional, default: None If int, random_state is the seed used by the random number generator; If RandomState instance, random_state is the random number generator; If None, the random number generator is the RandomState instance used by `np.random`. Examples -------- {'model_id': 2, 'params': {'l1_ratio': 0.9529529529529529, 'average': False, 'alpha': 0.014933932161242525}, 'partial_fit_calls': 8, 'partial_fit_time': 0.17334818840026855, 'score': 0.58765, 'score_time': 0.031442880630493164} Returns ------- info : Dict[int, List[Dict]] Scoring history of each successful model, keyed by model ID. This has the parameters, scores, and timing information over time models : Dict[int, Future] Dask futures pointing to trained models history : List[Dict] A history of all models scores over time """

    return default_client().sync(
        _fit,
        model,
        params,
        X_train,
        y_train,
        X_test,
        y_test,
        additional_calls,
        fit_params=fit_params,
        scorer=scorer,
        random_state=random_state,
    )