ESMATUGBA commited on
Commit
de0c75e
·
verified ·
1 Parent(s): 096b848

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +38 -33
app.py CHANGED
@@ -1,20 +1,27 @@
1
  import streamlit as st
2
  import os
 
3
 
4
- # --- JAVA VE ÇEVRESEL AYARLAR ---
5
- # Hugging Face (Debian tabanlı) üzerinde Java'nın varsayılan yolu budur
6
- os.environ["JAVA_HOME"] = "/usr/lib/jvm/java-17-openjdk-amd64"
 
 
 
 
 
 
7
 
8
  from pyspark.sql import SparkSession
9
  from pyspark.ml.classification import LogisticRegressionModel
10
  from pyspark.ml.feature import VectorAssembler
11
 
12
- # --- SAYFA AYARLARI ---
13
- st.set_page_config(page_title="Kalp Hastalığı Tahmini", page_icon="🫀")
14
- st.title("🫀 Kalp Hastalığı Risk Tahmini")
15
- st.markdown("Spark MLlib kullanılarak geliştirilmiş makine öğrenmesi modelidir.")
16
 
17
- # --- SPARK OTURUMU BAŞLATMA ---
18
  @st.cache_resource
19
  def get_spark():
20
  return SparkSession.builder \
@@ -24,36 +31,35 @@ def get_spark():
24
 
25
  spark = get_spark()
26
 
27
- # --- MODELİ YÜKLEME ---
28
  @st.cache_resource
29
  def load_heart_model():
30
- # heart_model klasörünün içindeki data ve metadata'yı okur
31
- model_path = "heart_model"
32
- return LogisticRegressionModel.load(model_path)
33
 
34
  try:
35
  model = load_heart_model()
36
- st.success("✅ Model başarıyla yüklendi!")
37
  except Exception as e:
38
- st.error(f"❌ Model yükleme hatası: {e}")
39
- st.info("Lütfen 'heart_model' klasörünün ve içindeki 'data'/'metadata' klasörlerinin doğru yüklendiğinden emin olun.")
40
 
41
- # --- KULLANICI GİRİŞ ALANLARI ---
42
- st.sidebar.header("Hasta Verilerini Girin")
43
 
44
  def user_input_features():
45
- age = st.sidebar.number_input("Yaş", 1, 120, 50)
46
- sex = st.sidebar.selectbox("Cinsiyet (1: Erkek, 0: Kadın)", [1, 0])
47
- cp = st.sidebar.selectbox("Göğüs Ağrısı Tipi (0-3)", [0, 1, 2, 3])
48
- trestbps = st.sidebar.number_input("Dinlenme Kan Basıncı", 50, 250, 120)
49
- chol = st.sidebar.number_input("Kolesterol", 100, 600, 200)
50
- fbs = st.sidebar.selectbox("Açlık Kan Şekeri > 120 (1: Evet, 0: Hayır)", [0, 1])
51
- restecg = st.sidebar.selectbox("Dinlenme EKG Sonucu (0-2)", [0, 1, 2])
52
- thalach = st.sidebar.number_input("Maksimum Kalp Atış Hızı", 50, 250, 150)
53
- exang = st.sidebar.selectbox("Egzersize Bağlı Anjin (1: Evet, 0: Hayır)", [0, 1])
54
  oldpeak = st.sidebar.number_input("Oldpeak", 0.0, 10.0, 1.0)
55
  slope = st.sidebar.selectbox("Slope (0-2)", [0, 1, 2])
56
- ca = st.sidebar.selectbox("Renkli Damar Sayısı (0-4)", [0, 1, 2, 3, 4])
57
  thal = st.sidebar.selectbox("Thal (0-3)", [0, 1, 2, 3])
58
 
59
  data = {
@@ -65,9 +71,8 @@ def user_input_features():
65
 
66
  input_df = user_input_features()
67
 
68
- # --- TAHMİN BÖLÜMÜ ---
69
- if st.button("Tahmin Et"):
70
- # Modelin eğitildiği sütun sırasıyla vektör oluşturma
71
  feature_cols = ['age', 'sex', 'cp', 'trestbps', 'chol', 'fbs', 'restecg', 'thalach', 'exang', 'oldpeak', 'slope', 'ca', 'thal']
72
  assembler = VectorAssembler(inputCols=feature_cols, outputCol="features")
73
  final_data = assembler.transform(input_df)
@@ -77,9 +82,9 @@ if st.button("Tahmin Et"):
77
  probability = prediction.select("probability").collect()[0][0]
78
 
79
  if result == 1.0:
80
- st.error(f"⚠️ Sonuç: Kalp Hastalığı Riski YÜKSEK! (Olasılık: %{round(probability[1]*100, 2)})")
81
  else:
82
- st.success(f"💚 Sonuç: Kalp Hastalığı Riski Düşük. (Olasılık: %{round(probability[0]*100, 2)})")
83
 
84
  st.divider()
85
- st.caption("Not: Bu uygulama sadece eğitim amaçlıdır, tıbbi tavsiye yerine geçmez.")
 
1
  import streamlit as st
2
  import os
3
+ import subprocess
4
 
5
+ # --- 1. JAVA VE ÇEVRESEL AYARLAR (JAVA & ENVIRONMENT SETTINGS) ---
6
+ try:
7
+ # Java yolunu sistemden otomatik bulur (Finds Java path automatically)
8
+ java_path = subprocess.check_output(['which', 'java']).decode('utf-8').strip()
9
+ real_java_path = os.path.realpath(java_path)
10
+ os.environ["JAVA_HOME"] = real_java_path.replace("/bin/java", "")
11
+ except:
12
+ # Hata durumunda varsayılan yol (Default path if fails)
13
+ os.environ["JAVA_HOME"] = "/usr/lib/jvm/java-17-openjdk-amd64"
14
 
15
  from pyspark.sql import SparkSession
16
  from pyspark.ml.classification import LogisticRegressionModel
17
  from pyspark.ml.feature import VectorAssembler
18
 
19
+ # --- 2. SAYFA AYARLARI (PAGE SETTINGS) ---
20
+ st.set_page_config(page_title="Heart Disease Predictor", page_icon="🫀")
21
+ st.title("🫀 Heart Disease Risk Prediction")
22
+ st.subheader("Kalp Hastalığı Risk Tahmini")
23
 
24
+ # --- 3. SPARK OTURUMU (SPARK SESSION) ---
25
  @st.cache_resource
26
  def get_spark():
27
  return SparkSession.builder \
 
31
 
32
  spark = get_spark()
33
 
34
+ # --- 4. MODELİ YÜKLEME (LOAD MODEL) ---
35
  @st.cache_resource
36
  def load_heart_model():
37
+ # heart_model klasöründen verileri çeker
38
+ return LogisticRegressionModel.load("heart_model")
 
39
 
40
  try:
41
  model = load_heart_model()
42
+ st.success("✅ Model loaded successfully! / Model başarıyla yüklendi!")
43
  except Exception as e:
44
+ st.error(f"❌ Error loading model: {e}")
45
+ st.stop()
46
 
47
+ # --- 5. GİRİŞ ALANLARI (INPUT FIELDS) ---
48
+ st.sidebar.header("Patient Data / Hasta Verileri")
49
 
50
  def user_input_features():
51
+ age = st.sidebar.number_input("Age / Yaş", 1, 120, 50)
52
+ sex = st.sidebar.selectbox("Sex / Cinsiyet (1: M, 0: F)", [1, 0])
53
+ cp = st.sidebar.selectbox("Chest Pain / Göğüs Ağrısı (0-3)", [0, 1, 2, 3])
54
+ trestbps = st.sidebar.number_input("Resting Blood Pressure / Kan Basıncı", 50, 250, 120)
55
+ chol = st.sidebar.number_input("Cholesterol / Kolesterol", 100, 600, 200)
56
+ fbs = st.sidebar.selectbox("Fasting Blood Sugar > 120 (1: Y, 0: N)", [0, 1])
57
+ restecg = st.sidebar.selectbox("Resting ECG / Dinlenme EKG (0-2)", [0, 1, 2])
58
+ thalach = st.sidebar.number_input("Max Heart Rate / Maks. Kalp Hızı", 50, 250, 150)
59
+ exang = st.sidebar.selectbox("Exercise Induced Angina (1: Y, 0: N)", [0, 1])
60
  oldpeak = st.sidebar.number_input("Oldpeak", 0.0, 10.0, 1.0)
61
  slope = st.sidebar.selectbox("Slope (0-2)", [0, 1, 2])
62
+ ca = st.sidebar.selectbox("Major Vessels / Damar Sayısı (0-4)", [0, 1, 2, 3, 4])
63
  thal = st.sidebar.selectbox("Thal (0-3)", [0, 1, 2, 3])
64
 
65
  data = {
 
71
 
72
  input_df = user_input_features()
73
 
74
+ # --- 6. TAHMİN (PREDICTION) ---
75
+ if st.button("Predict / Tahmin Et"):
 
76
  feature_cols = ['age', 'sex', 'cp', 'trestbps', 'chol', 'fbs', 'restecg', 'thalach', 'exang', 'oldpeak', 'slope', 'ca', 'thal']
77
  assembler = VectorAssembler(inputCols=feature_cols, outputCol="features")
78
  final_data = assembler.transform(input_df)
 
82
  probability = prediction.select("probability").collect()[0][0]
83
 
84
  if result == 1.0:
85
+ st.error(f"⚠️ Risk: HIGH / YÜKSEK (Prob: %{round(probability[1]*100, 2)})")
86
  else:
87
+ st.success(f"💚 Risk: LOW / DÜŞÜK (Prob: %{round(probability[0]*100, 2)})")
88
 
89
  st.divider()
90
+ st.caption("Disclaimer: This is for educational purposes only. / Tıbbi tavsiye değildir.")