<jupyter_start><jupyter_text>Gerekli Kütüphanelerin Yüklenmesi<jupyter_code>%matplotlib inline
from warnings import filterwarnings
filterwarnings("ignore",category=FutureWarning)
filterwarnings("ignore",category=UserWarning)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score,KFold
from sklearn.metrics import accuracy_score,classification_report,confusion_matrix,f1_score
from sklearn.metrics import roc_auc_score, plot_roc_curve,roc_auc_score
from sklearn.linear_model import LogisticRegression
from sklearn.naive_bayes import GaussianNB
from sklearn.neighbors import KNeighborsClassifier
from sklearn.ensemble import AdaBoostClassifier,BaggingClassifier,ExtraTreesClassifier,GradientBoostingClassifier,RandomForestClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC
from sklearn.neural_network import MLPClassifier
from xgboost import XGBClassifier
from catboost import CatBoostClassifier
import joblib
import csv<jupyter_output><empty_output><jupyter_text>Veri Setinin Yüklenmesi<jupyter_code>dataset = pd.read_csv("cardio_disease.csv",sep=';')<jupyter_output><empty_output><jupyter_text>Veri Seti Hakkında Bilgiler<jupyter_code>#Veri setinin ilk 5 satırının okunması
dataset.head()
#Veri setinin kolonlarına ve değerlerine ait bilgiler.
"""
Veri tanımlaması
3 tür giriş özelliği vardır:

Amaç : Gerçek bilgiler
Muayene : tıbbi muayene sonuçları
Subjektif : Hasta tarafından verilen bilgi.

Özellikleri:

age | Amaç Özelliği | yaş | tam sayı (gün)
height | Amaç Özelliği | yükseklik | tam sayı (cm) |
weight | Amaç Özelliği | ağırlık | ondalıklı sayı (kg) |
gender | Amaç Özelliği | cinsiyet | kategorik |
ap_hi | Muayene Özelliği | Sistolik kan basıncı | tam sayı |
ap_lo | Muayene Özelliği | Diyastolik kan basıncı  | tam sayı |
cholesterol | Muayene Özelliği | kolesterol | 1: normal, 2: normalin üzerinde, 3: normalin oldukça üzerinde |
gluc | Muayene Özelliği | glikoz | 1: normal, 2: normalin üzerinde, 3: normalin oldukça üzerinde |
smoke | Öznel Özellik | sigara | ikili | | 0: kullanmıyor, 1: kullanıyor |
alco | Öznel Özellik | Alkol alımı | ikili | | 0: yok, 1: var |
active | Öznel Özellik | Fiziksel aktivite | ikili | | 0: yapmıyor, 1: yapıyor |
cardio | Hedef Değişken | Kardiyovasküler hastalık varlığı veya yokluğu  | ikili | | 0: yok, 1: var |
Tüm veri seti değerleri tıbbi muayene anında toplanmıştır.

"""
dataset.describe()
dataset.info()
#Veri seti içerisinde boş değerler var mı?
dataset.isnull().sum()<jupyter_output><empty_output><jupyter_text>Makine Öğrenmesi Başlangıç  Veri Setinde Problemi Temsil Etmeyen 'id' Kolonunun Kaldırılması<jupyter_code>dataset = dataset.drop(['id'],axis=1)
dataset.head()<jupyter_output><empty_output><jupyter_text>Veri Setindeki 'age' Kolonuna Ait Değerlerin Yıla Dönüştürülmesi(yaşın gün cinsinden yıla çevrilmesi)<jupyter_code>age = []
for i in dataset['age']:
    new_age = int(i/365)
    age.append(new_age)
dataset['age'] = age<jupyter_output><empty_output><jupyter_text>Veri Setindeki 'weight' Kolonundaki Ondalıklı Değerlerin Tam sayıya Çevrilmesi<jupyter_code>weight= []
for i in dataset['weight']:
    new_weight = int(i)
    weight.append(new_weight)
dataset['weight'] = weight
dataset.tail()<jupyter_output><empty_output><jupyter_text>Düzenlenen Veri Setinin Kaydedilmesi<jupyter_code>dataset.to_csv("new_cardio_disease_dataset.csv",index=False)<jupyter_output><empty_output><jupyter_text>Verilerin Görselleştirilmesi<jupyter_code>#Yaş dağılımlarının çizdirilmesi
sns.distplot(dataset['age'])
#Boy dağılımlarının çizdirilmesi
sns.distplot(dataset['height'])
#Kilo dağılımlarının çizdirilmesi
sns.distplot(dataset['weight'])
#Hastalığın cinsiyet ve yaş üzerindeki dağılımı
sns.violinplot(x='cardio',y='age',hue='gender',data=dataset)
#Hastalığın boy ve kolesterol üzerindeki dağılımı
sns.violinplot(x='cardio',y='height',hue='cholesterol',data=dataset)
#Hastalığın kilo ve kolesterol üzerindeki dağılımı
sns.stripplot(x='cardio',y='weight',hue='cholesterol',data=dataset)
#Cinsiyet dağılımı
sns.countplot(x='gender',data=dataset,palette='Greens_d')
#Kilonun hastalık üzerindeki dağılımı
sns.factorplot(x='cardio',y='weight',kind='bar',data=dataset,palette='magma')
#Boyun hastalık üzerindeki dağılımı
sns.factorplot(x='cardio',y='height',kind='bar',data=dataset,palette='tab10')
#Kategorik Verilerin Pasta Grafiği Olarak Görselleştirilmesi
plt.figure(figsize=(20,20))
plt.subplot(4,4,1)
dataset['gender'].value_counts().plot(kind = "pie",autopct = "%.1f%%")
plt.title("Cinsiyet Dağılımı")

plt.subplot(4,4,2)
dataset['cholesterol'].value_counts().plot(kind = "pie",autopct = "%.1f%%")
plt.title("Kolesterol Dağılımı")

plt.subplot(4,4,3)
dataset['gluc'].value_counts().plot(kind = "pie",autopct = "%.1f%%")
plt.title("Glikoz Dağılımı")

plt.subplot(4,4,4)
dataset['smoke'].value_counts().plot(kind = "pie",autopct = "%.1f%%")
plt.title("Sigara Kullanım Dağılımı")

plt.subplot(4,4,5)
dataset['alco'].value_counts().plot(kind = "pie",autopct = "%.1f%%")
plt.title("Alkol Kullanım Dağılımı")

plt.subplot(4,4,6)
dataset['active'].value_counts().plot(kind = "pie",autopct = "%.1f%%")
plt.title("Fiziksel Aktivite Dağılımı")

plt.subplot(4,4,7)
dataset['cardio'].value_counts().plot(kind = "pie",autopct = "%.1f%%")
plt.title("Hastalık Dağılımı")
#Veri setinin kolerasyon grafiğinin çizdirilmesi
plt.figure(figsize=(20,10))
sns.heatmap(dataset.corr(),annot=True)
plt.show()
dataset.head()<jupyter_output><empty_output><jupyter_text>Sayısal verilerin Normalleştirlmesi(MinMaxScaler)<jupyter_code>sc =  MinMaxScaler()
labels_sc = ['age','height','weight','ap_hi','ap_lo']
for i in labels_sc:
    dataset[labels_sc] = sc.fit_transform(dataset[labels_sc])
dataset.tail()<jupyter_output><empty_output><jupyter_text>Bağımlı ve Bağımsız Değişkenlerin Ayrılması<jupyter_code>X = dataset.drop(['cardio'],axis=1)
Y = dataset['cardio']
X.shape
Y.shape<jupyter_output><empty_output><jupyter_text>Veri Setinin Eğitim ve Test Olarak Ayrılması<jupyter_code>X_train,X_test,Y_train,Y_test = train_test_split(X,Y,test_size=.3,random_state=42)
X_train.shape
X_test.shape<jupyter_output><empty_output><jupyter_text>Makine Öğrenmesi Algoritmaların Seçilip Cross-Validation(Çapraz Doğrulama) Yöntemi Kullanılarak En Yüksek Başarımı Veren Algoritmanın Belirlenmesi<jupyter_code>models = [
    ('LR',LogisticRegression()),
    ('NB',GaussianNB()),
    ('KNN',KNeighborsClassifier(n_neighbors=3)),
    ('ABC',AdaBoostClassifier()),
    ('BC',BaggingClassifier()),
    ('ETC',ExtraTreesClassifier()),
    ('GBC',GradientBoostingClassifier()),
    ('RFC',RandomForestClassifier()),
    ('DTC',DecisionTreeClassifier()),
    ('SVM',SVC()),
    ('MLP',MLPClassifier(activation='relu',max_iter=200,shuffle=True,random_state=42)),
    ('XGBoost',XGBClassifier(eval_metric='mlogloss',use_label_encoder =False)),
    ('CatBoost',CatBoostClassifier(iterations=10,))
]
names = []
results = []
for name,model in models:
    kfold = KFold(n_splits=10,random_state=42)
    cv_results = cross_val_score(model,X_train,Y_train,cv=kfold,scoring='accuracy')
    names.append(name)
    results.append(cv_results)
    print("Algoritma: %s / Başarım: %f / Std: %f" % (name,cv_results.mean(),cv_results.std()))<jupyter_output>Algoritma: LR / Başarım: 0.645184 / Std: 0.006453
Algoritma: NB / Başarım: 0.598837 / Std: 0.010341
Algoritma: KNN / Başarım: 0.595918 / Std: 0.007500
Algoritma: ABC / Başarım: 0.729122 / Std: 0.005204
Algoritma: BC / Başarım: 0.683429 / Std: 0.005143
Algoritma: ETC / Başarım: 0.693653 / Std: 0.004162
Algoritma: GBC / Başarım: 0.733592 / Std: 0.004217
Algoritma: RFC / Başarım: 0.707959 / Std: 0.006414
Algoritma: DTC / Başarım: 0.633122 / Std: 0.005645
Algoritma: SVM / Başarım: 0.639796 / Std: 0.006937
Algoritma: MLP / Başarım: 0.718408 / Std: 0.006057
Algoritma: XGBoost / Başarım: 0.732388 / Std: 0.004374
Learning rate set to 0.5
0:	learn: 0.5985173	total: 149ms	remaining: 1.34s
1:	learn: 0.5667518	total: 153ms	remaining: 612ms
2:	learn: 0.5544625	total: 157ms	remaining: 366ms
3:	learn: 0.5490274	total: 160ms	remaining: 240ms
4:	learn: 0.5451623	total: 164ms	remaining: 164ms
5:	learn: 0.5433587	total: 168ms	remaining: 112ms
6:	learn: 0.5423105	total: 172ms	remaining: 73.6ms
7:	learn: 0[...]<jupyter_text>En Yüksek Başarımı Veren Algoritmanın Eğitilip Test Edilmesi<jupyter_code>gbc = GradientBoostingClassifier()
gbc.fit(X_train,Y_train)
y_pred = gbc.predict(X_test)

print("Başarım Değeri(Accuracy Score): ",accuracy_score(Y_test,y_pred))
print("Confusion Matrix:\n",confusion_matrix(Y_test,y_pred))
print("Classification Report:\n ",classification_report(Y_test,y_pred))
print("ROC-AUC Puanı: ",roc_auc_score(Y_test, y_pred))
#ROC Eğrisi
plt.figure(figsize=(10,10))
plot_roc_curve(gbc,X_test,Y_test)<jupyter_output><empty_output><jupyter_text>Tahmin ve Gerçek Değerlerin Gösterilmesi<jupyter_code>d = {"Tahminler":y_pred,"Gerçek Değerler":Y_test}
pd.DataFrame(data=d)<jupyter_output><empty_output><jupyter_text>Modelin Kaydedilmesi<jupyter_code>joblib.dump(gbc,'model/gbc_model.pkl')<jupyter_output><empty_output><jupyter_text>Modelin Yüklenip Test Edilmesi<jupyter_code>#Modelin Yüklenmesi(SVM)
gbc_model = open("model/gbc_model.pkl","rb")
model = joblib.load(gbc_model)

#Modelin Test Edilmesi
list = [52,2,167,66,158,66,2,1,1,1,0] 
if(model.predict([list]) == 1):
  print("Kardiyovasküler Hastalık Sonucunuz:Evet")
else:
  print("Kardiyovasküler Hastalık Sonucunuz:Hayır")

#Modelin Test Edilmesi 2
list2 = [51,1,150,100,160,90,2,2,1,0,0] 
if(model.predict([list2]) == 1):
  print("Kardiyovasküler Hastalık Sonucunuz:Evet")
else:
  print("Kardiyovasküler Hastalık Sonucunuz:Hayır")<jupyter_output>Kardiyovasküler Hastalık Sonucunuz:Hayır
Kardiyovasküler Hastalık Sonucunuz:Evet
{'fraction_non_alphanumeric': 0.13036871961102106, 'fraction_numerical': 0.0403160453808752, 'mean_word_length': 7.807314897413024, 'pattern_counts': {'":': 2, '<': 63, '<?xml version=': 0, '>': 63, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '16', 'dir': 'jupyter-structured-clean-dedup', 'id': '609216', 'license': 'MIT', 'n_tokens_mistral': 4584, 'n_tokens_neox': 4166, 'n_words': 696, 'path': 'Cardiovascular Disease Prediction/Cardiovascular_Disease_Prediction.ipynb', 'repo_name': 'alicansoyel/Cardiovascular_Disease_Prediction', 'size': '9872'}