Spaces:
Runtime error
Runtime error
Update app.py
Browse files
app.py
CHANGED
|
@@ -3,6 +3,7 @@ from sklearn.model_selection import train_test_split, GridSearchCV
|
|
| 3 |
from sklearn.preprocessing import MinMaxScaler, LabelEncoder
|
| 4 |
from sklearn.metrics import accuracy_score
|
| 5 |
from concrete.ml.sklearn import XGBClassifier as ConcreteXGBClassifier
|
|
|
|
| 6 |
|
| 7 |
|
| 8 |
# Örnek dosyalar
|
|
@@ -15,12 +16,17 @@ EXAMPLE_XLSX = [
|
|
| 15 |
]
|
| 16 |
|
| 17 |
|
| 18 |
-
# Global
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
|
|
|
|
|
|
|
| 22 |
|
| 23 |
|
|
|
|
|
|
|
|
|
|
| 24 |
SELECTED_FEATS = [
|
| 25 |
"Cari Oran",
|
| 26 |
"Dönen Varlıklar / Aktif (%)",
|
|
@@ -178,8 +184,10 @@ scaler_sel = MinMaxScaler().fit(X_tr[COLS])
|
|
| 178 |
Xtr_sel = scaler_sel.transform(X_tr[COLS])
|
| 179 |
final_model = ConcreteXGBClassifier(n_bits=8, **best_params, random_state=42)
|
| 180 |
final_model.fit(Xtr_sel, ytr_e)
|
| 181 |
-
|
| 182 |
-
|
|
|
|
|
|
|
| 183 |
|
| 184 |
|
| 185 |
|
|
@@ -190,71 +198,72 @@ for i, col in enumerate(COLS, 1):
|
|
| 190 |
|
| 191 |
# ------------------------ FONKSİYONLAR ------------------------
|
| 192 |
def generate_keys():
|
| 193 |
-
global
|
| 194 |
-
|
| 195 |
-
|
| 196 |
-
|
| 197 |
-
|
| 198 |
-
|
| 199 |
-
raise gr.Error("Anahtar üretilemedi.")
|
| 200 |
-
|
| 201 |
-
return keys.evaluation.serialize()[:120].decode() + "..."
|
| 202 |
-
|
| 203 |
|
| 204 |
|
| 205 |
def encrypt_excel(file):
|
| 206 |
-
global
|
| 207 |
-
|
| 208 |
-
|
| 209 |
-
|
|
|
|
|
|
|
|
|
|
| 210 |
|
| 211 |
-
enriched = compute_ratios(
|
| 212 |
X_input = enriched[COLS].dropna()
|
| 213 |
scaled = scaler_sel.transform(X_input)
|
| 214 |
-
|
| 215 |
-
if keys is None or keys.evaluation is None:
|
| 216 |
-
raise gr.Error("Anahtarlar hazır değil. Lütfen önce 'Anahtar Oluştur'a tıklayın.")
|
| 217 |
|
| 218 |
-
|
| 219 |
-
return str(
|
| 220 |
|
| 221 |
|
| 222 |
def run_fhe():
|
| 223 |
-
global
|
| 224 |
-
|
| 225 |
-
|
| 226 |
-
|
| 227 |
-
|
| 228 |
-
|
| 229 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 230 |
|
| 231 |
def decrypt_result():
|
| 232 |
-
if
|
| 233 |
raise gr.Error("Henüz tahmin yapılmadı.")
|
| 234 |
-
|
| 235 |
-
return encoder.inverse_transform([
|
|
|
|
|
|
|
| 236 |
|
| 237 |
# -------------------- Gradio UI -------------------- #
|
| 238 |
with gr.Blocks(theme=gr.themes.Default(primary_hue="blue")) as demo:
|
| 239 |
gr.Markdown("# Denetçi Görüşü Tahmin Uygulaması (FHE)")
|
| 240 |
|
| 241 |
gr.Markdown("## 1. Anahtar Oluştur")
|
| 242 |
-
key_btn = gr.Button("🔑 Anahtar Oluştur
|
| 243 |
-
key_out = gr.Textbox(label="Evaluation Key
|
| 244 |
key_btn.click(generate_keys, outputs=key_out)
|
| 245 |
|
| 246 |
gr.Markdown("## 2. Excel Yükle")
|
| 247 |
file_in = gr.File(file_types=[".xlsx"], label="Excel Dosyası")
|
| 248 |
-
encrypt_btn = gr.Button("🔐 Veriyi Şifrele
|
| 249 |
-
enc_out = gr.Textbox(label="Şifreli
|
| 250 |
encrypt_btn.click(encrypt_excel, inputs=file_in, outputs=enc_out)
|
| 251 |
|
| 252 |
-
gr.Markdown("## 3.
|
| 253 |
-
run_btn = gr.Button("🚀
|
| 254 |
-
|
| 255 |
-
run_btn.click(run_fhe, outputs=time_box)
|
| 256 |
|
| 257 |
-
gr.Markdown("## 4.
|
| 258 |
decrypt_btn = gr.Button("🔓 Tahmini Göster")
|
| 259 |
result_box = gr.Textbox(label="Tahmin Edilen Görüş")
|
| 260 |
decrypt_btn.click(decrypt_result, outputs=result_box)
|
|
|
|
| 3 |
from sklearn.preprocessing import MinMaxScaler, LabelEncoder
|
| 4 |
from sklearn.metrics import accuracy_score
|
| 5 |
from concrete.ml.sklearn import XGBClassifier as ConcreteXGBClassifier
|
| 6 |
+
from concrete.ml.deployment import FHEModelDev, FHEModelClient, FHEModelServer
|
| 7 |
|
| 8 |
|
| 9 |
# Örnek dosyalar
|
|
|
|
| 16 |
]
|
| 17 |
|
| 18 |
|
| 19 |
+
# Global değişkenler
|
| 20 |
+
client = None
|
| 21 |
+
server = None
|
| 22 |
+
encrypted_input = None
|
| 23 |
+
encrypted_output = None
|
| 24 |
+
COLS = []
|
| 25 |
|
| 26 |
|
| 27 |
+
fhe_dir = "fhe_model_artifacts"
|
| 28 |
+
key_dir = "client_keys"
|
| 29 |
+
|
| 30 |
SELECTED_FEATS = [
|
| 31 |
"Cari Oran",
|
| 32 |
"Dönen Varlıklar / Aktif (%)",
|
|
|
|
| 184 |
Xtr_sel = scaler_sel.transform(X_tr[COLS])
|
| 185 |
final_model = ConcreteXGBClassifier(n_bits=8, **best_params, random_state=42)
|
| 186 |
final_model.fit(Xtr_sel, ytr_e)
|
| 187 |
+
final_model.compile(Xtr_sel)
|
| 188 |
+
|
| 189 |
+
dev = FHEModelDev(path_dir=fhe_dir, model=final_model)
|
| 190 |
+
dev.save()
|
| 191 |
|
| 192 |
|
| 193 |
|
|
|
|
| 198 |
|
| 199 |
# ------------------------ FONKSİYONLAR ------------------------
|
| 200 |
def generate_keys():
|
| 201 |
+
global client
|
| 202 |
+
if not os.path.exists(key_dir):
|
| 203 |
+
os.makedirs(key_dir)
|
| 204 |
+
client = FHEModelClient(path_dir=fhe_dir, key_dir=key_dir)
|
| 205 |
+
serialized_eval_keys = client.get_serialized_evaluation_keys()
|
| 206 |
+
return str(serialized_eval_keys[:100]) + "..."
|
|
|
|
|
|
|
|
|
|
|
|
|
| 207 |
|
| 208 |
|
| 209 |
def encrypt_excel(file):
|
| 210 |
+
global encrypted_input
|
| 211 |
+
if client is None:
|
| 212 |
+
raise gr.Error("Lütfen önce 'Anahtar Oluştur'a tıklayın.")
|
| 213 |
+
|
| 214 |
+
df = pd.read_excel(file.name, header=None).set_index(0).T.reset_index(drop=True)
|
| 215 |
+
df.columns = df.columns.str.strip()
|
| 216 |
+
df.rename(columns={"Desc": "Periyot"}, inplace=True)
|
| 217 |
|
| 218 |
+
enriched = compute_ratios(df)
|
| 219 |
X_input = enriched[COLS].dropna()
|
| 220 |
scaled = scaler_sel.transform(X_input)
|
|
|
|
|
|
|
|
|
|
| 221 |
|
| 222 |
+
encrypted_input = client.quantize_encrypt_serialize(scaled)
|
| 223 |
+
return str(encrypted_input[:120]) + "..."
|
| 224 |
|
| 225 |
|
| 226 |
def run_fhe():
|
| 227 |
+
global server, encrypted_output
|
| 228 |
+
if encrypted_input is None:
|
| 229 |
+
raise gr.Error("Veri şifrelenmemiş.")
|
| 230 |
+
|
| 231 |
+
server = FHEModelServer(path_dir=fhe_dir)
|
| 232 |
+
server.load()
|
| 233 |
+
|
| 234 |
+
eval_keys = client.get_serialized_evaluation_keys()
|
| 235 |
+
encrypted_output = server.run(encrypted_input, eval_keys)
|
| 236 |
+
return "Tahmin tamamlandı."
|
| 237 |
+
|
| 238 |
|
| 239 |
def decrypt_result():
|
| 240 |
+
if encrypted_output is None:
|
| 241 |
raise gr.Error("Henüz tahmin yapılmadı.")
|
| 242 |
+
prediction = client.deserialize_decrypt_dequantize(encrypted_output)
|
| 243 |
+
return encoder.inverse_transform([int(prediction[0])])[0]
|
| 244 |
+
|
| 245 |
+
|
| 246 |
|
| 247 |
# -------------------- Gradio UI -------------------- #
|
| 248 |
with gr.Blocks(theme=gr.themes.Default(primary_hue="blue")) as demo:
|
| 249 |
gr.Markdown("# Denetçi Görüşü Tahmin Uygulaması (FHE)")
|
| 250 |
|
| 251 |
gr.Markdown("## 1. Anahtar Oluştur")
|
| 252 |
+
key_btn = gr.Button("🔑 Anahtar Oluştur")
|
| 253 |
+
key_out = gr.Textbox(label="Evaluation Key")
|
| 254 |
key_btn.click(generate_keys, outputs=key_out)
|
| 255 |
|
| 256 |
gr.Markdown("## 2. Excel Yükle")
|
| 257 |
file_in = gr.File(file_types=[".xlsx"], label="Excel Dosyası")
|
| 258 |
+
encrypt_btn = gr.Button("🔐 Veriyi Şifrele")
|
| 259 |
+
enc_out = gr.Textbox(label="Şifreli Veri")
|
| 260 |
encrypt_btn.click(encrypt_excel, inputs=file_in, outputs=enc_out)
|
| 261 |
|
| 262 |
+
gr.Markdown("## 3. Tahmini Gerçekleştir (Server)")
|
| 263 |
+
run_btn = gr.Button("🚀 Tahmini Başlat")
|
| 264 |
+
run_btn.click(run_fhe, outputs=gr.Textbox(label="Durum"))
|
|
|
|
| 265 |
|
| 266 |
+
gr.Markdown("## 4. Sonucu Deşifre Et")
|
| 267 |
decrypt_btn = gr.Button("🔓 Tahmini Göster")
|
| 268 |
result_box = gr.Textbox(label="Tahmin Edilen Görüş")
|
| 269 |
decrypt_btn.click(decrypt_result, outputs=result_box)
|