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

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +85 -75
app.py CHANGED
@@ -1,75 +1,85 @@
1
- import streamlit as st
2
- import os
3
- import platform
4
- import zipfile
5
-
6
- # --- 1. WINDOWS HATA ENGELLEYİCİ (EN ÜSTTE OLMALI) ---
7
- if platform.system() == "Windows":
8
- os.environ['PYSPARK_PYTHON'] = "python"
9
- os.environ['PYSPARK_DRIVER_PYTHON'] = "python"
10
-
11
- from pyspark.sql import SparkSession
12
- from pyspark.ml.feature import VectorAssembler
13
- from pyspark.ml.classification import LogisticRegressionModel
14
-
15
- # --- 2. ZIP VE DOSYA YOLLARI ---
16
- current_dir = os.path.dirname(os.path.abspath(__file__))
17
- model_path = os.path.join(current_dir, "heart_model")
18
- zip_path = os.path.join(current_dir, "heart_model.zip")
19
-
20
- # Klasör yoksa ama zip varsa klasöre çıkart
21
- if not os.path.exists(model_path) and os.path.exists(zip_path):
22
- try:
23
- with zipfile.ZipFile(zip_path, 'r') as zip_ref:
24
- zip_ref.extractall(current_dir) # DİKKAT: zip'in içindeki klasör yapısı önemli
25
- except Exception as e:
26
- st.error(f"Zip dosyası açılırken hata: {e}")
27
-
28
- # --- 3. KRİTİK SPARK OTURUMU (HATA BYPASS EDİCİ) ---
29
- @st.cache_resource
30
- def get_spark():
31
- builder = SparkSession.builder.appName("HeartApp")
32
-
33
- if platform.system() == "Windows":
34
- # Windows'ta dosya erişim hatasını (NativeIO) susturan ayarlar
35
- return builder.master("local[1]") \
36
- .config("spark.driver.host", "127.0.0.1") \
37
- .config("spark.hadoop.fs.file.impl", "org.apache.hadoop.fs.RawLocalFileSystem") \
38
- .config("spark.hadoop.fs.permission.check", "false") \
39
- .getOrCreate()
40
- else:
41
- # Hugging Face (Linux) ayarları
42
- return builder.master("local[*]").getOrCreate()
43
-
44
- spark = get_spark()
45
-
46
- # --- 4. MODEL YÜKLEME ---
47
- @st.cache_resource
48
- def load_heart_model():
49
- # Model yolu kontrolü
50
- if os.path.exists(model_path):
51
- try:
52
- return LogisticRegressionModel.load(model_path)
53
- except Exception as e:
54
- # Buradaki hata hala geliyorsa Spark dosyayı bulamıyor demektir
55
- st.error(f"Spark Hatası: {e}")
56
- return None
57
- return None
58
-
59
- model = load_heart_model()
60
-
61
- # --- 5. ARAYÜZ ---
62
- st.set_page_config(page_title="Kalp Analizi", layout="wide")
63
- st.title("🫀 Kalp Hastalığı Risk Analizi")
64
-
65
- if model is None:
66
- st.error("❌ Model hala yüklenemedi!")
67
- st.info("⚠️ Lütfen şu adımı kontrol et: VS Code sol tarafta 'heart_model' klasörünün içine bak. "
68
- "Eğer içinde direkt 'data' ve 'metadata' klasörlerini görmüyorsan Spark yükleme yapamaz.")
69
- st.code(f"Şu yolu kontrol et: {model_path}")
70
- else:
71
- # Form ve tahmin kısmı buraya gelecek
72
- st.success("✅ Model başarıyla bağlandı!")
73
- with st.form("input_form"):
74
- # (Önceki form kodlarını buraya ekleyebilirsin)
75
- submit = st.form_submit_button("Tahmin Et")
 
 
 
 
 
 
 
 
 
 
 
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 \
21
+ .appName("HeartDiseasePredictor") \
22
+ .master("local[*]") \
23
+ .getOrCreate()
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 = {
60
+ 'age': age, 'sex': sex, 'cp': cp, 'trestbps': trestbps, 'chol': chol,
61
+ 'fbs': fbs, 'restecg': restecg, 'thalach': thalach, 'exang': exang,
62
+ 'oldpeak': oldpeak, 'slope': slope, 'ca': ca, 'thal': thal
63
+ }
64
+ return spark.createDataFrame([data])
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)
74
+
75
+ prediction = model.transform(final_data)
76
+ result = prediction.select("prediction").collect()[0][0]
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.")