Yoon-gu Hwang
Initial commit: Concept Drift Simulator
3e3dc68
import gradio as gr
from drift_simulator import (
generate_sudden_drift,
generate_gradual_drift,
generate_incremental_drift,
generate_recurring_drift,
get_drift_description
)
from visualizer import create_drift_visualization
from analyzer import analyze_drift, format_analysis_summary
def simulate_and_visualize(drift_type: str):
"""๋“œ๋ฆฌํ”„ํŠธ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ + ์‹œ๊ฐํ™” + ๋ถ„์„"""
# ๋“œ๋ฆฌํ”„ํŠธ ํƒ€์ž…์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ
if drift_type == "Sudden (๊ธ‰๊ฒฉํ•œ ๋“œ๋ฆฌํ”„ํŠธ)":
X, y, drift_points = generate_sudden_drift(n_samples=1000, drift_point=500)
drift_key = "sudden"
elif drift_type == "Gradual (์ ์ง„์  ๋“œ๋ฆฌํ”„ํŠธ)":
X, y, drift_points = generate_gradual_drift(n_samples=1000, drift_start=300, drift_end=700)
drift_key = "gradual"
elif drift_type == "Incremental (์ฆ๋ถ„์  ๋“œ๋ฆฌํ”„ํŠธ)":
X, y, drift_points = generate_incremental_drift(n_samples=1000, n_steps=5)
drift_key = "incremental"
elif drift_type == "Recurring (๋ฐ˜๋ณต์  ๋“œ๋ฆฌํ”„ํŠธ)":
X, y, drift_points = generate_recurring_drift(n_samples=1000, cycle_length=250)
drift_key = "recurring"
else:
return None, "์˜ฌ๋ฐ”๋ฅธ ๋“œ๋ฆฌํ”„ํŠธ ํƒ€์ž…์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”."
# ์‹œ๊ฐํ™”
fig = create_drift_visualization(X, y, drift_points, drift_key)
# ๋ถ„์„
analysis = analyze_drift(X, y, drift_points, drift_key)
summary = format_analysis_summary(analysis)
# ์„ค๋ช… ์ถ”๊ฐ€
description = get_drift_description(drift_key)
full_summary = f"### {description}\n\n{summary}"
return fig, full_summary
# Gradio ์ธํ„ฐํŽ˜์ด์Šค
with gr.Blocks(title="Concept Drift Simulator", theme=gr.themes.Soft()) as demo:
gr.Markdown(
"""
# Concept Drift Simulator
์ปจ์…‰ ๋“œ๋ฆฌํ”„ํŠธ(Concept Drift)์˜ 4๊ฐ€์ง€ ์œ ํ˜•์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๊ณ  ์‹œ๊ฐํ™”ํ•ฉ๋‹ˆ๋‹ค.
๋“œ๋ฆฌํ”„ํŠธ ์œ ํ˜•์„ ์„ ํƒํ•˜๋ฉด ์ž๋™์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ์ฐจํŠธ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
"""
)
with gr.Row():
with gr.Column(scale=1):
drift_type_radio = gr.Radio(
choices=[
"Sudden (๊ธ‰๊ฒฉํ•œ ๋“œ๋ฆฌํ”„ํŠธ)",
"Gradual (์ ์ง„์  ๋“œ๋ฆฌํ”„ํŠธ)",
"Incremental (์ฆ๋ถ„์  ๋“œ๋ฆฌํ”„ํŠธ)",
"Recurring (๋ฐ˜๋ณต์  ๋“œ๋ฆฌํ”„ํŠธ)"
],
label="๋“œ๋ฆฌํ”„ํŠธ ์œ ํ˜• ์„ ํƒ",
value="Sudden (๊ธ‰๊ฒฉํ•œ ๋“œ๋ฆฌํ”„ํŠธ)"
)
simulate_btn = gr.Button("์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์‹คํ–‰", variant="primary")
with gr.Column(scale=2):
plot_output = gr.Plot(label="๋“œ๋ฆฌํ”„ํŠธ ์‹œ๊ฐํ™”")
analysis_output = gr.Markdown(label="๋ถ„์„ ๊ฒฐ๊ณผ")
# ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ
simulate_btn.click(
fn=simulate_and_visualize,
inputs=drift_type_radio,
outputs=[plot_output, analysis_output]
)
# ์ดˆ๊ธฐ ๋กœ๋“œ
demo.load(
fn=simulate_and_visualize,
inputs=drift_type_radio,
outputs=[plot_output, analysis_output]
)
if __name__ == "__main__":
demo.launch()