File size: 3,512 Bytes
a3b997c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# Import necessary libraries
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import MinMaxScaler
from sklearn.linear_model import ElasticNet
from sklearn.model_selection import train_test_split
import gradio as gr

# Define the safety function
def safety(freedom):
    return 1 - 0.7374 * freedom**2

# Load and process data for feature importance
def load_data():
    # Replace this path with the appropriate dataset URL or local file path for Hugging Face deployment
    data = pd.read_csv("data_ml.csv")  # Ensure the dataset is uploaded to the Hugging Face repo
    X = data.drop(columns=["Freedom"], errors="ignore")
    y = data["Freedom"] if "Freedom" in data.columns else None
    return X, y

# Calculate top features affecting safety
def get_top_features(X, y):
    if y is None:
        return pd.DataFrame({"Features": [], "Importance": []})
    
    # Split data and train ElasticNet model
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
    model = ElasticNet(alpha=1.0, l1_ratio=0.5, random_state=0).fit(X_train, y_train)
    
    # Get feature importance
    feature_importance = pd.DataFrame({
        "Features": X.columns,
        "Importance": np.abs(model.coef_)
    }).nlargest(7, "Importance").reset_index(drop=True)
    return feature_importance

# Generate PPF curve data
freedom = np.arange(0, 1.01, 0.01)
safety_values = safety(freedom)

# Initialize data and top features
X, y = load_data()
top_features = get_top_features(X, y)

# Function to update outputs when slider changes
def update_prediction(freedom_value):
    # Calculate safety
    safety_score = safety(freedom_value)
    
    # Create PPF plot
    fig, ax = plt.subplots(figsize=(8, 6))
    ax.plot(freedom, safety_values, label='Safety = 1 - 0.7374 * Freedom²', color='blue', linestyle='--')
    ax.scatter(freedom_value, safety_score, color='red', zorder=5)
    ax.text(
        freedom_value,
        safety_score,
        f"Selected Point ({freedom_value:.2f}, {safety_score:.2f})",
        fontsize=9,
        verticalalignment='bottom'
    )
    ax.set_title("Safety vs Freedom Relationship")
    ax.set_xlabel("Freedom")
    ax.set_ylabel("Safety")
    ax.legend()
    ax.grid(False)
    
    return (
        f"Predicted Safety: {safety_score:.4f}",
        fig,
        top_features
    )

# Create Gradio interface
with gr.Blocks() as app:
    gr.Markdown("# Country Safety Predictor")
    
    with gr.Row():
        # Freedom slider
        freedom_slider = gr.Slider(
            label="Freedom Score (0 = Least Free, 1 = Most Free)",
            minimum=0,
            maximum=1,
            value=0.5,
            step=0.01
        )
        
    with gr.Row():
        # Text box for safety prediction
        safety_text = gr.Textbox(label="Predicted Safety:", value="")
        
    with gr.Row():
        # Plot output for safety vs freedom
        plot_output = gr.Plot(label="Safety vs Freedom Relationship")
        
    with gr.Row():
        # Dataframe display for top features
        features_output = gr.Dataframe(label="Top Features Affecting Safety")
    
    # Set up the interface
    freedom_slider.change(
        fn=update_prediction,
        inputs=freedom_slider,
        outputs=[safety_text, plot_output, features_output]
    )

# Run the app
if __name__ == "__main__":
    app.queue().launch(debug=False, share=True)  # Enable sharing for Hugging Face deployment