def plot_pred(date, time, fti, target, **kwargs):
    """Worker func for plotting ML predictions"""
    examples = kwargs['examples']
    info = kwargs['info']
    time_marker = 'first_hour' if fti <= 12 else 'second_hour'

    rng = np.arange(0., 0.55, 0.05) if 'torn' in target else np.arange(
        0., 1.1, 0.1)

    kwargs = {'alpha': 0.95, 'extend': 'neither', 'cmap': target_cmap[target]}
    plt = Plotting(date=None,
                   z1_levels=rng,
                   z2_levels=[35, 60],
                   z3_levels=[35., 60],
                   z4_levels=[prob_threshold[target], 90.],
                   z4_color='k',
                   **kwargs)

    n_panels = 2
    fig, axes, = plt._create_fig(
        fig_num=0,
        sub_plots=(2, 1),
        plot_map=False,
        figsize=(7, 6),
        hspace=0.15,
        wspace=0.15,
    )
    map_axes, x, y = plt._generate_base_map(axes=axes, date=date, fig=fig)

    valid_date_and_time, initial_date_and_time = get_time.determine_forecast_valid_datetime(
        date_dir=str(date), time_dir=time, fcst_time_idx=fti)
    try:
        mrms_dbz = mrms.load_single_mrms_time(
            date_dir=date,
            valid_datetime=valid_date_and_time,
            var_name='DZ_CRESSMAN')
    except:
        return None

    try:
        ens_data = EnsembleData(date_dir=date,
                                time_dir=time,
                                base_path='summary_files')
        data = ens_data.load(variables=['comp_dz'],
                             time_indexs=[fti],
                             tag='ENS')
    except:
        return None
    wofs_dbz = data['comp_dz'].values[0]

    wofs_dbz = prob_match_mean(var=wofs_dbz,
                               mean_var=np.mean(wofs_dbz, axis=0),
                               neighborhood=15)

    init_time_str, valid_time_str = get_timestampes(initial_date_and_time,
                                                    valid_date_and_time)

    load_lsr = loadLSR(date_dir=date,
                       date=valid_date_and_time[0],
                       time=valid_date_and_time[1],
                       forecast_length=30)
    load_wwa = loadWWA(date_dir=date,
                       date=valid_date_and_time[0],
                       time=valid_date_and_time[1],
                       forecast_length=30,
                       time_window=30)

    hail_ll = load_lsr.load_hail_reports()
    torn_ll = load_lsr.load_tornado_reports()
    wind_ll = load_lsr.load_wind_reports()
    lsr_points = {'hail': hail_ll, 'tornado': torn_ll, 'wind': wind_ll}

    torn_wwa = load_wwa.load_tornado_warning_polygon(return_polygons=True)
    wwa_points = {'tornado': torn_wwa}

    ml_preds, objects = load_ml_predictions(time_marker,
                                            target,
                                            date,
                                            time,
                                            fti,
                                            model_names=['LogisticRegression'],
                                            examples=examples,
                                            info=info)

    baseline_pred = load_baseline(date, time, fti, target, time_marker)

    ml_preds, objects = smooth_objects(objects,
                                       ml_preds,
                                       model_names=['LogisticRegression'])

    if baseline_pred is None or ml_preds is None:
        return None

    all_preds = ml_preds + [baseline_pred]
    titles = ['LogisticRegression', baseline_names[target]]

    for j, forecast_probabilities in enumerate(all_preds):
        ax = axes.flat[j]
        if np.amax(forecast_probabilities.astype(float) *
                   100.) > prob_threshold[target]:
            z4 = forecast_probabilities.astype(float) * 100.
        else:
            z4 = None

        ###wwa_points=wwa_points,
        contours = plt.spatial_plotting(
            fig,
            ax,
            x,
            y,
            lsr_points=lsr_points,
            z1=np.ma.masked_where(forecast_probabilities == 0.,
                                  forecast_probabilities),
            z2=mrms_dbz,
            z3=wofs_dbz,
            z4=z4,
            map_ax=map_axes[j],
        )
        ax.set_title(titles[j], fontsize=12, pad=1.0, alpha=0.8)
        label_centroid(objects[0], forecast_probabilities, ax)

    axes.flat[0].text(
        0.0,
        1.17,
        f'Init Time : {init_time_str}',
        fontsize=8,
        alpha=0.9,
        transform=axes.flat[0].transAxes,
    )

    axes.flat[0].text(0.0,
                      1.12,
                      f'Valid Time : {valid_time_str}',
                      fontsize=8,
                      alpha=0.9,
                      transform=axes.flat[0].transAxes)

    base_plot.add_alphabet_label(n_panels, axes, pos=(0.9, 0.08))

    additional_handles = [
        Line2D([0], [0],
               marker='o',
               color='w',
               markerfacecolor='r',
               markersize=6,
               alpha=0.8),
        Line2D([0], [0],
               marker='o',
               color='w',
               markerfacecolor='b',
               markersize=6,
               alpha=0.8),
        Line2D([0], [0],
               marker='o',
               color='w',
               markerfacecolor='g',
               markersize=6,
               alpha=0.8),
        Line2D([0], [0], color='b', alpha=0.8),
        Line2D([0], [0], color='k', alpha=0.8),
    ]

    additional_labels = [
        'Tornado', 'Severe Wind', 'Severe Hail', 'WoFS PMM DBZ > 35',
        'MRMS DBZ > 35'
    ]

    major_ax = base_plot.set_major_axis_labels(fig,
                                               xlabel='',
                                               ylabel_left='',
                                               labelpad=5)

    #base_plot.set_legend(n_panels, fig, axes[0,0], major_ax, additional_handles, additional_labels, bbox_to_anchor=(0.425, -0.375), ncol=2)

    colorbar_labels = {
        'tornado': 'Probability of Tornado',
        'severe_hail': 'Probability of Severe Hail',
        'severe_wind': 'Probability of Severe Wind'
    }
    base_plot.add_colorbar(fig=fig,
                           plot_obj=contours,
                           ax=axes,
                           colorbar_label=colorbar_labels[target])

    fname = f'example_ml_predictions_vs_baseline_{date}_{time}_{target}_{time_marker}_{fti:02d}.png'
    plt._save_fig(fig=fig, fname=fname, dpi=300, aformat='png')
           date_dir=str(date), time_dir=time, fcst_time_idx=fti
            )
    mrms_dbz = mrms.load_single_mrms_time(date_dir=date, valid_datetime=initial_date_and_time, var_name='DZ_CRESSMAN' )
    ens_data = EnsembleData(date_dir=date, time_dir=time, base_path='summary_files')

    data = ens_data.load(variables=['comp_dz'], time_indexs=[0], tag='ENS')
    wofs_dbz = data['comp_dz'].values[0]
    wofs_dbz = prob_match_mean(var=wofs_dbz, mean_var=np.mean(wofs_dbz, axis=0), neighborhood=15)

    init_time_str, valid_time_str = get_timestampes(initial_date_and_time, valid_date_and_time)

    idx = get_examples_at_datetime(info, date, time, fti)
    labeled_regions = load_probability_objects(date, time, fti)
    forecast_probabilities = to_predictions_2d(predictions, labeled_regions, labels_column, idx)    

    map_axes, x, y = plt._generate_base_map(axes=[axes], date=date, fig=fig)

    kwargs = {'alpha':0.95, 'extend': 'neither', 'cmap': target_cmap[target_var]}
    plt = Plotting( date=None, z1_levels = np.arange(0., 1.1, .1), z2_levels = [35, 60], z3_levels=[35., 60], **kwargs )
        
    contours = plt.spatial_plotting(fig,
                    axes,
                    x, y,
                    z1=np.ma.masked_where( forecast_probabilities==0.,  forecast_probabilities),
                    z2=mrms_dbz,
                    z3=wofs_dbz,
                    map_ax=map_axes[0],
                    )
    if i %3 == 0:
        contours_set.append(contours)