choi jeongeun
Upload app.py
0bc485a verified
import gradio as gr
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
# ------------------------
# 1. ๋ฐ์ดํ„ฐ ๋กœ๋“œ
# ------------------------
df = pd.read_excel("Restaurants.xlsx")
df["๊ฐ€๊ฒฉ๋Œ€"] = df["๊ฐ€๊ฒฉ๋Œ€"].astype(float)
# Synthetic label ์ƒ์„ฑ
ideal_budget = 12000
df["budget_diff"] = abs(df["๊ฐ€๊ฒฉ๋Œ€"] - ideal_budget)
df["label"] = np.where(
(df["ํ‰์ "] >= 4.0) & (df["budget_diff"] <= 3000),
1,
0
)
# ๋จธ์‹ ๋Ÿฌ๋‹์šฉ ์ธ์ฝ”๋”ฉ
df_ml = pd.get_dummies(df, columns=["์Œ์‹์ข…๋ฅ˜", "์—ฐ๋ น์ธต", "๋ฐฉ๋ฌธ๋ชฉ์ "])
X = df_ml.drop(columns=["์‹๋‹น๋ช…", "๋ฆฌ๋ทฐ", "์œ„์น˜(์ง€ํ•˜์ฒ ์—ญ)", "label"])
y = df_ml["label"]
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
# ------------------------
# 2. ML ๋ชจ๋ธ (HuggingFace์—์„œ 100% ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ LogisticRegression)
# ------------------------
model = LogisticRegression(max_iter=500)
model.fit(X_train, y_train)
df["predict_score"] = model.predict_proba(X)[:, 1]
# ------------------------
# 3. ์ถ”์ฒœ ํ•จ์ˆ˜
# ------------------------
def recommend_ai(region, food_type, budget, age):
# ----- ๊ธฐ๋ณธ ํ•„ํ„ฐ -----
filtered = df[(df["์œ„์น˜(์ง€ํ•˜์ฒ ์—ญ)"] == region) &
(df["์Œ์‹์ข…๋ฅ˜"] == food_type)]
if filtered.empty:
return "์กฐ๊ฑด์— ๋งž๋Š” ์‹๋‹น์ด ์—†์Šต๋‹ˆ๋‹ค."
filtered = filtered.copy()
# ----- ๐Ÿ”ฅ ์˜ˆ์‚ฐ ํ•„ํ„ฐ: budget - 3000 ~ budget + 3000 -----
min_price = budget - 3000
max_price = budget + 3000
filtered = filtered[(filtered["๊ฐ€๊ฒฉ๋Œ€"] >= min_price) &
(filtered["๊ฐ€๊ฒฉ๋Œ€"] <= max_price)]
if filtered.empty:
return f"์˜ˆ์‚ฐ ๋ฒ”์œ„({min_price}์› ~ {max_price}์›)์— ๋งž๋Š” ์‹๋‹น์ด ์—†์Šต๋‹ˆ๋‹ค."
# ์˜ˆ์‚ฐ ์ฐจ์ด
filtered["user_budget_diff"] = abs(filtered["๊ฐ€๊ฒฉ๋Œ€"] - budget)
# ์ตœ์ข… ์ ์ˆ˜ ๊ณ„์‚ฐ
filtered["final_score"] = (
filtered["predict_score"] * 0.7 +
(1 / (filtered["user_budget_diff"] + 1)) * 0.3
)
# Top 5
result = filtered.sort_values("final_score", ascending=False).head(5)
top = result.iloc[0]
# -----------------------------
# ๐Ÿ† TOP 1 ์ถœ๋ ฅ
# -----------------------------
output = ""
output += "<div style='font-size:20px; font-weight:bold; margin-bottom:10px;'>"
output += "๐Ÿ†โœจ <b>AI์˜ 1๋“ฑ ์ถ”์ฒœ ์‹๋‹น!</b> โœจ๐Ÿ†"
output += "</div>"
output += "<div style='font-size:16px; line-height:1.7;'>"
output += f"โญ <b>{top['์‹๋‹น๋ช…']}</b><br>"
output += f"๐Ÿ“ ์œ„์น˜: {top['์œ„์น˜(์ง€ํ•˜์ฒ ์—ญ)']}<br>"
output += f"๐Ÿฑ ์ข…๋ฅ˜: {top['์Œ์‹์ข…๋ฅ˜']}<br>"
output += f"๐Ÿ’ฐ ๊ฐ€๊ฒฉ๋Œ€: {int(top['๊ฐ€๊ฒฉ๋Œ€'])}์›<br>"
output += f"โญ ํ‰์ : {top['ํ‰์ ']}<br>"
output += f"๐Ÿ’ฌ ๋ฆฌ๋ทฐ: {top['๋ฆฌ๋ทฐ']}<br>"
output += "</div>"
# ----- ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ ๊ตฌ๋ถ„์„  -----
output += "<div style='font-family:monospace; margin: 12px 0 10px 0;'>"
output += "=" * 80
output += "</div>"
# -----------------------------
# ๐Ÿ“Œ ๊ทธ ์™ธ ์ถ”์ฒœ ์‹๋‹น๋“ค
# -----------------------------
output += "<div style='margin-top:5px; margin-bottom:10px;'>"
output += "<h3 style='margin:0; padding:0;'>๐Ÿ“Œ ๊ทธ ์™ธ ์ถ”์ฒœ ์‹๋‹น๋“ค</h3>"
output += "</div>"
for _, row in result.iloc[1:].iterrows():
output += "<div style='font-size:14px; line-height:1.55; margin-top:8px; margin-bottom:12px;'>"
output += f"โญ {row['์‹๋‹น๋ช…']}<br>"
output += f"๐Ÿฑ {row['์Œ์‹์ข…๋ฅ˜']} | ๐Ÿ’ฐ {int(row['๊ฐ€๊ฒฉ๋Œ€'])}์› | โญ {row['ํ‰์ ']}<br>"
output += f"๐Ÿ’ฌ {row['๋ฆฌ๋ทฐ']}<br>"
output += "<div style='margin:10px 0 6px 0; border-bottom:1px solid #ccc;'></div>"
output += "</div>"
return output
# ------------------------
# 4. Gradio UI
# ------------------------
with gr.Blocks() as demo:
gr.Markdown("## ๐Ÿค– AI ๊ธฐ๋ฐ˜ ๋จธ์‹ ๋Ÿฌ๋‹ ์„œ์šธ ๋ง›์ง‘ ์ถ”์ฒœ ์‹œ์Šคํ…œ")
region = gr.Dropdown(
choices=sorted(df["์œ„์น˜(์ง€ํ•˜์ฒ ์—ญ)"].unique()),
label="์ง€ํ•˜์ฒ ์—ญ ์„ ํƒ"
)
food_type = gr.Dropdown(
choices=sorted(df["์Œ์‹์ข…๋ฅ˜"].unique()),
label="์Œ์‹ ์ข…๋ฅ˜"
)
budget = gr.Slider(
5000, 30000, value=12000, step=500,
label="์˜ˆ์‚ฐ(์›): ์˜ค์ฐจ๋ฒ”์œ„ ยฑ 3,000์›์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค."
)
age = gr.Dropdown(
choices=sorted(df["์—ฐ๋ น์ธต"].unique()),
label="์—ฐ๋ น์ธต"
)
btn = gr.Button("๐Ÿ” AI ์ถ”์ฒœ๋ฐ›๊ธฐ")
output_box = gr.HTML()
btn.click(
recommend_ai,
inputs=[region, food_type, budget, age],
outputs=output_box
)