File size: 2,442 Bytes
d8e0581
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import gradio as gr
import numpy as np
from sklearn.datasets import load_diabetes
from sklearn.linear_model import RidgeCV
from sklearn.feature_selection import SelectFromModel
from time import time
from sklearn.feature_selection import SequentialFeatureSelector
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt

def select_features(method,num_features):
    diabetes = load_diabetes()
    X, y = diabetes.data, diabetes.target
    ridge = RidgeCV(alphas=np.logspace(-6, 6, num=5)).fit(X, y)
    feature_names = np.array(diabetes.feature_names)
    if method == 'model':
        importance = np.abs(ridge.coef_)
        threshold = np.sort(importance)[-3] + 0.01
        tic = time()
        sfm = SelectFromModel(ridge, threshold=threshold).fit(X, y)
        toc = time()
        selected_features = feature_names[sfm.get_support()]
        if int(num_features) < len(selected_features):
            selected_features = selected_features[:int(num_features)]
        execution_time = toc - tic
    elif method == 'sfs-forward':
        tic_fwd = time()
        sfs_forward = SequentialFeatureSelector(
            ridge, n_features_to_select=int(num_features), direction="forward"
        ).fit(X, y)
        toc_fwd = time()
        selected_features = feature_names[sfs_forward.get_support()]
        execution_time = toc_fwd - tic_fwd
    elif method == 'sfs-backward':
        tic_bwd = time()
        sfs_backward = SequentialFeatureSelector(
            ridge, n_features_to_select=int(num_features), direction="backward"
        ).fit(X, y)
        toc_bwd = time()
        selected_features = feature_names[sfs_backward.get_support()]
        execution_time = toc_bwd - tic_bwd
    return f"Selected the following features: {selected_features} in {execution_time:.3f} seconds"

title = "Selecting features with Sequential Feature Selection"
with gr.Blocks(title=title) as demo:
    gr.Markdown(f"## {title}")
    gr.Markdown("This app demonstrates feature selection techniques using model based selection and sequential feature selection. The app uses the diabetes dataset from sklearn")

    method = gr.Radio(["model", "sfs-forward", "sfs-backward"], label="Method")
    num_features = gr.Textbox(label="Number of features")
    output = gr.Textbox(label="Output Box")
    select_btn = gr.Button("Select")
    select_btn.click(fn=select_features, inputs=[method,num_features], outputs=output)

demo.launch()