buraktrk commited on
Commit
ce191d4
·
verified ·
1 Parent(s): 04d1d35

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +61 -109
app.py CHANGED
@@ -15,6 +15,11 @@ EXAMPLE_XLSX = [
15
  ]
16
 
17
 
 
 
 
 
 
18
 
19
  SELECTED_FEATS = [
20
  "Cari Oran",
@@ -128,21 +133,17 @@ def compute_ratios(df: pd.DataFrame) -> pd.DataFrame:
128
 
129
  # ------------------------ MODEL EĞİTİMİ ------------------------
130
  df = pd.read_csv("refined_data.csv")
131
- df["Görüs Tipi"] = df["Görüs Tipi"].apply(
132
- lambda x: "Olumlu" if "olumlu" in str(x).lower() else x)
133
-
134
- DROP = [
135
- "Şirket Adı", "Şirketin Kodu", "Periyot", "Yıl",
136
- "Dönen Varlıklar", "Duran Varlıklar", "Toplam Varlıklar",
137
- "Kısa Vadeli Yükümlülükler", "Uzun Vadeli Yükümlülükler", "Toplam Yükümlülükler",
138
- "Toplam Özkaynaklar", "Ana Ortaklığa Ait Özkaynaklar",
139
- "Kontrol Gücü Olmayan Kaynaklar", "Toplam Kaynaklar"
140
- ]
141
- df = df.drop(columns=DROP).dropna()
142
 
143
- X, y = df.drop(columns="Görüs Tipi"), df["Görüs Tipi"]
144
- X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.2, stratify=y, random_state=42)
 
 
145
 
 
 
 
 
146
  scaler_full = MinMaxScaler().fit(X_tr)
147
  Xtr_s = scaler_full.transform(X_tr)
148
  Xte_s = scaler_full.transform(X_te)
@@ -151,6 +152,7 @@ encoder = LabelEncoder()
151
  ytr_e = encoder.fit_transform(y_tr)
152
  yte_e = encoder.transform(y_te)
153
 
 
154
  grid = GridSearchCV(
155
  ConcreteXGBClassifier(n_bits=8, random_state=42),
156
  {"n_estimators": [20, 30, 50], "max_depth": [3, 4, 5], "learning_rate": [0.1, 0.2]},
@@ -159,7 +161,7 @@ grid = GridSearchCV(
159
  grid.fit(Xtr_s, ytr_e)
160
  best_params = grid.best_params_
161
 
162
- # İlk eğitim → feature importance için
163
  full_plain = ConcreteXGBClassifier(n_bits=8, **best_params, random_state=42)
164
  full_plain.fit(Xtr_s, ytr_e)
165
 
@@ -168,123 +170,73 @@ imp_df = imp_df.sort_values("imp", ascending=False).reset_index(drop=True)
168
  imp_df["cum"] = imp_df["imp"].cumsum()
169
  COLS = imp_df.loc[imp_df["cum"] <= 0.95, "col"].tolist()
170
 
171
- # Seçilen feature'lara göre final model
172
- scaler = MinMaxScaler().fit(X_tr[COLS])
173
- Xtr_sel = scaler.transform(X_tr[COLS])
174
- Xte_sel = scaler.transform(X_te[COLS])
175
-
176
  final_model = ConcreteXGBClassifier(n_bits=8, **best_params, random_state=42)
177
  final_model.fit(Xtr_sel, ytr_e)
178
- final_model.compile(Xtr_sel)
179
 
180
  print("\n🔍 Seçilen Özellikler (%95 etkili):")
181
  for i, col in enumerate(COLS, 1):
182
  print(f"{i:>2}. {col}")
183
 
184
 
 
 
 
 
 
185
 
186
- # ------------------------ Tahmin Fonksiyonu ------------------------
187
- def predict_opinion(excel_file: gr.File):
188
- if excel_file is None:
189
- raise gr.Error("Excel dosyası yükleyin.")
190
-
191
- raw_df = (
192
- pd.read_excel(excel_file.name, header=None, sheet_name=0)
193
- .set_index(0).T.reset_index(drop=True)
194
- )
195
  raw_df.columns = raw_df.columns.str.strip()
196
- raw_df = raw_df.loc[:, ~raw_df.columns.duplicated()]
197
  raw_df.rename(columns={"Desc": "Periyot"}, inplace=True)
198
- raw_df["Periyot"] = raw_df["Periyot"].astype(str).str.replace(r"\s+", " ", regex=True).str.strip()
199
-
200
  enriched = compute_ratios(raw_df)
201
  X_input = enriched[COLS].dropna()
202
- if X_input.empty:
203
- raise gr.Error("Oran hesaplanamadı – eksik sütunlar olabilir.")
204
-
205
- X_input_scaled = scaler_sel.transform(X_input)
206
- y_pred = final_model.predict(X_input_scaled, fhe="simulate")
207
- labels = encoder.inverse_transform(y_pred)
208
- return pd.DataFrame({
209
- "Periyot": raw_df.loc[X_input.index, "Periyot"],
210
- "Tahmin Görüş Tipi": labels})
211
 
 
 
 
 
 
 
212
 
213
- # Global değişkenler
214
- enc_input = None
215
- enc_output = None
216
 
217
  # -------------------- Gradio UI -------------------- #
218
  with gr.Blocks(theme=gr.themes.Default(primary_hue="blue")) as demo:
219
- gr.Markdown("# 🔐 Denetçi Görüşü Tahmin Uygulaması (FHE)")
220
-
221
- gr.Markdown("## 1️⃣ Anahtar Üret (Key Generation)")
222
- key_btn = gr.Button("🔑 Anahtarı Oluştur ve Server'a Gönder")
223
- eval_key_box = gr.Textbox(label="Evaluation Key (görsel)", lines=1)
224
-
225
- def generate_keys():
226
- final_model.fhe_circuit.keygen()
227
- return final_model.fhe_circuit.get_serialized_evaluation_keys().decode()[:120] + "..."
228
-
229
- key_btn.click(generate_keys, outputs=eval_key_box)
230
-
231
- gr.Markdown("## 2️⃣ Excel Dosyası Yükle")
232
- file_in = gr.File(file_types=[".xlsx"], label="📁 Excel Dosyası")
233
-
234
- encrypt_btn = gr.Button("🔐 Girişi Şifrele ve Server'a Gönder")
235
- encrypted_box = gr.Textbox(label="Şifreli Giriş (ilk 150 karakter)")
236
-
237
- def encrypt_excel(file):
238
- global enc_input
239
- raw_df = (
240
- pd.read_excel(file.name, header=None)
241
- .set_index(0).T.reset_index(drop=True)
242
- )
243
- raw_df.columns = raw_df.columns.str.strip()
244
- raw_df = raw_df.loc[:, ~raw_df.columns.duplicated()]
245
- raw_df.rename(columns={"Desc": "Periyot"}, inplace=True)
246
- raw_df["Periyot"] = raw_df["Periyot"].astype(str).str.strip()
247
-
248
- enriched = compute_ratios(raw_df)
249
- X_input = enriched[SELECTED_FEATS].dropna()
250
- if X_input.empty:
251
- raise gr.Error("Veri eksik veya oranlar hesaplanamadı.")
252
- scaled = scaler.transform(X_input)
253
- enc_input = final_model.fhe_circuit.encrypt(scaled)
254
- return str(enc_input)[:150] + "..."
255
-
256
- encrypt_btn.click(encrypt_excel, inputs=file_in, outputs=encrypted_box)
257
-
258
- gr.Markdown("## 3️⃣ Tahmini Şifreli Olarak Gerçekleştir (FHE)")
259
- run_btn = gr.Button("🚀 FHE Tahmini Çalıştır")
260
- time_box = gr.Textbox(label="Tahmin Süresi (sn)")
261
-
262
- def run_fhe():
263
- import time
264
- global enc_output
265
- start = time.time()
266
- enc_output = final_model.fhe_circuit.run(enc_input)
267
- return f"{time.time() - start:.2f}"
268
-
269
  run_btn.click(run_fhe, outputs=time_box)
270
 
271
- gr.Markdown("## 4️⃣ Tahmin Sonucunu Deşifre Et")
272
- decrypt_btn = gr.Button("🔓 Tahmin Sonucunu Göster")
273
- result_box = gr.Textbox(label="📌 Tahmin: Görüş Tipi")
274
-
275
- def decrypt_result():
276
- y_pred = final_model.fhe_circuit.decrypt(enc_output)
277
- return encoder.inverse_transform([y_pred])[0]
278
-
279
  decrypt_btn.click(decrypt_result, outputs=result_box)
280
 
281
- gr.Markdown("## 📎 Örnek Dosyaları Deneyin")
282
- gr.Examples(
283
- examples=EXAMPLE_XLSX,
284
- inputs=file_in,
285
- label="💾 Örnek Excel Seç",
286
- cache_examples=False,
287
- )
288
 
289
  if __name__ == "__main__":
290
  demo.launch()
 
15
  ]
16
 
17
 
18
+ # Global tanımlar
19
+ enc_input = None
20
+ enc_output = None
21
+ fhe_model = None
22
+
23
 
24
  SELECTED_FEATS = [
25
  "Cari Oran",
 
133
 
134
  # ------------------------ MODEL EĞİTİMİ ------------------------
135
  df = pd.read_csv("refined_data.csv")
136
+ df["Görüs Tipi"] = df["Görüs Tipi"].apply(lambda x: "Olumlu" if "olumlu" in str(x).lower() else x)
 
 
 
 
 
 
 
 
 
 
137
 
138
+ DROP = ["Şirket Adı", "Şirketin Kodu", "Periyot", "Yıl", "Dönen Varlıklar", "Duran Varlıklar",
139
+ "Toplam Varlıklar", "Kısa Vadeli Yükümlülükler", "Uzun Vadeli Yükümlülükler",
140
+ "Toplam Yükümlülükler", "Toplam Özkaynaklar", "Ana Ortaklığa Ait Özkaynaklar",
141
+ "Kontrol Gücü Olmayan Kaynaklar", "Toplam Kaynaklar"]
142
 
143
+ X = df.drop(columns=DROP + ["Görüs Tipi"])
144
+ y = df["Görüs Tipi"]
145
+
146
+ X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.2, stratify=y, random_state=42)
147
  scaler_full = MinMaxScaler().fit(X_tr)
148
  Xtr_s = scaler_full.transform(X_tr)
149
  Xte_s = scaler_full.transform(X_te)
 
152
  ytr_e = encoder.fit_transform(y_tr)
153
  yte_e = encoder.transform(y_te)
154
 
155
+ # Grid Search
156
  grid = GridSearchCV(
157
  ConcreteXGBClassifier(n_bits=8, random_state=42),
158
  {"n_estimators": [20, 30, 50], "max_depth": [3, 4, 5], "learning_rate": [0.1, 0.2]},
 
161
  grid.fit(Xtr_s, ytr_e)
162
  best_params = grid.best_params_
163
 
164
+ # Özellik seçimi
165
  full_plain = ConcreteXGBClassifier(n_bits=8, **best_params, random_state=42)
166
  full_plain.fit(Xtr_s, ytr_e)
167
 
 
170
  imp_df["cum"] = imp_df["imp"].cumsum()
171
  COLS = imp_df.loc[imp_df["cum"] <= 0.95, "col"].tolist()
172
 
173
+ # Final model
174
+ scaler_sel = MinMaxScaler().fit(X_tr[COLS])
175
+ Xtr_sel = scaler_sel.transform(X_tr[COLS])
 
 
176
  final_model = ConcreteXGBClassifier(n_bits=8, **best_params, random_state=42)
177
  final_model.fit(Xtr_sel, ytr_e)
178
+ fhe_model = final_model.compile(Xtr_sel)
179
 
180
  print("\n🔍 Seçilen Özellikler (%95 etkili):")
181
  for i, col in enumerate(COLS, 1):
182
  print(f"{i:>2}. {col}")
183
 
184
 
185
+ # ------------------------ FONKSİYONLAR ------------------------
186
+ def generate_keys():
187
+ global fhe_model
188
+ fhe_model.keygen()
189
+ return fhe_model.get_serialized_evaluation_keys().decode()[:120] + "..."
190
 
191
+ def encrypt_excel(file):
192
+ global enc_input
193
+ raw_df = pd.read_excel(file.name, header=None).set_index(0).T.reset_index(drop=True)
 
 
 
 
 
 
194
  raw_df.columns = raw_df.columns.str.strip()
 
195
  raw_df.rename(columns={"Desc": "Periyot"}, inplace=True)
 
 
196
  enriched = compute_ratios(raw_df)
197
  X_input = enriched[COLS].dropna()
198
+ scaled = scaler_sel.transform(X_input)
199
+ enc_input = fhe_model.encrypt(scaled)
200
+ return str(enc_input)[:150] + "..."
 
 
 
 
 
 
201
 
202
+ def run_fhe():
203
+ import time
204
+ global enc_output
205
+ start = time.time()
206
+ enc_output = fhe_model.run(enc_input)
207
+ return f"{time.time() - start:.2f}"
208
 
209
+ def decrypt_result():
210
+ y_pred = fhe_model.decrypt(enc_output)
211
+ return encoder.inverse_transform([y_pred])[0]
212
 
213
  # -------------------- Gradio UI -------------------- #
214
  with gr.Blocks(theme=gr.themes.Default(primary_hue="blue")) as demo:
215
+ gr.Markdown("# Denetçi Görüşü Tahmin Uygulaması (FHE)")
216
+
217
+ gr.Markdown("## 1. Anahtar Oluştur")
218
+ key_btn = gr.Button("🔑 Anahtar Oluştur ve Server'a Gönder")
219
+ key_out = gr.Textbox(label="Evaluation Key (görsel)")
220
+ key_btn.click(generate_keys, outputs=key_out)
221
+
222
+ gr.Markdown("## 2. Excel Yükle")
223
+ file_in = gr.File(file_types=[".xlsx"], label="Excel Dosyası")
224
+ encrypt_btn = gr.Button("🔐 Veriyi Şifrele ve Sun")
225
+ enc_out = gr.Textbox(label="Şifreli Giriş")
226
+ encrypt_btn.click(encrypt_excel, inputs=file_in, outputs=enc_out)
227
+
228
+ gr.Markdown("## 3. Şifreli Tahmini Gerçekleştir")
229
+ run_btn = gr.Button("🚀 FHE Tahmini Başlat")
230
+ time_box = gr.Textbox(label="Süre (sn)")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
231
  run_btn.click(run_fhe, outputs=time_box)
232
 
233
+ gr.Markdown("## 4. Tahmini Deşifre Et")
234
+ decrypt_btn = gr.Button("🔓 Tahmini Göster")
235
+ result_box = gr.Textbox(label="Tahmin Edilen Görüş")
 
 
 
 
 
236
  decrypt_btn.click(decrypt_result, outputs=result_box)
237
 
238
+ gr.Markdown("## 📂 Örnek Dosyalar")
239
+ gr.Examples(examples=EXAMPLE_XLSX, inputs=file_in, label="Örnek Excel Seç", cache_examples=False)
 
 
 
 
 
240
 
241
  if __name__ == "__main__":
242
  demo.launch()