7. AI AND MACHINE LEARNING VTU LAB | READ NOW
MACHINE LEARNING VTU LAB – Bayesian Network-heart disease
Program 7. WRITE A PROGRAM TO CONSTRUCT AN ABAYESIAN NETWORK CONSIDERING MEDICAL DATA. USE THIS MODEL TO DEMONSTRATE THE DIAGNOSIS OF HEART PATIENTS USING STANDARD HEART DISEASE DATA SET. YOU CAN USE JAVA/PYTHON ML LIBRARY CLASSES/API.
Program Code – lab7.py
import pandas as pd data=pd.read_csv("heartdisease.csv") heart_disease=pd.DataFrame(data) print(heart_disease) from pgmpy.models import BayesianModel model=BayesianModel([ ('age','Lifestyle'), ('Gender','Lifestyle'), ('Family','heartdisease'), ('diet','cholestrol'), ('Lifestyle','diet'), ('cholestrol','heartdisease'), ('diet','cholestrol') ]) from pgmpy.estimators import MaximumLikelihoodEstimator model.fit(heart_disease, estimator=MaximumLikelihoodEstimator) from pgmpy.inference import VariableElimination HeartDisease_infer = VariableElimination(model) print('For age Enter { SuperSeniorCitizen:0, SeniorCitizen:1, MiddleAged:2, Youth:3, Teen:4 }') print('For Gender Enter { Male:0, Female:1 }') print('For Family History Enter { yes:1, No:0 }') print('For diet Enter { High:0, Medium:1 }') print('For lifeStyle Enter { Athlete:0, Active:1, Moderate:2, Sedentary:3 }') print('For cholesterol Enter { High:0, BorderLine:1, Normal:2 }') q = HeartDisease_infer.query(variables=['heartdisease'], evidence={ 'age':int(input('Enter age :')), 'Gender':int(input('Enter Gender :')), 'Family':int(input('Enter Family history :')), 'diet':int(input('Enter diet :')), 'Lifestyle':int(input('Enter Lifestyle :')), 'cholestrol':int(input('Enter cholestrol :')) }) print(q['heartdisease'])
MACHINE LEARNING Program Execution – lab7.ipynb
Jupyter Notebook program execution.
import pandas as pd data=pd.read_csv("heartdisease.csv") heart_disease=pd.DataFrame(data) print(heart_disease)
age Gender Family diet Lifestyle cholestrol heartdisease 0 0 0 1 1 3 0 1 1 0 1 1 1 3 0 1 2 1 0 0 0 2 1 1 3 4 0 1 1 3 2 0 4 3 1 1 0 0 2 0 5 2 0 1 1 1 0 1 6 4 0 1 0 2 0 1 7 0 0 1 1 3 0 1 8 3 1 1 0 0 2 0 9 1 1 0 0 0 2 1 10 4 1 0 1 2 0 1 11 4 0 1 1 3 2 0 12 2 1 0 0 0 0 0 13 2 0 1 1 1 0 1 14 3 1 1 0 0 1 0 15 0 0 1 0 0 2 1 16 1 1 0 1 2 1 1 17 3 1 1 1 0 1 0 18 4 0 1 1 3 2 0
from pgmpy.models import BayesianModel model=BayesianModel([ ('age','Lifestyle'), ('Gender','Lifestyle'), ('Family','heartdisease'), ('diet','cholestrol'), ('Lifestyle','diet'), ('cholestrol','heartdisease'), ('diet','cholestrol') ]) from pgmpy.estimators import MaximumLikelihoodEstimator model.fit(heart_disease, estimator=MaximumLikelihoodEstimator) from pgmpy.inference import VariableElimination HeartDisease_infer = VariableElimination(model)
print('For age Enter { SuperSeniorCitizen:0, SeniorCitizen:1, MiddleAged:2, Youth:3, Teen:4 }') print('For Gender Enter { Male:0, Female:1 }') print('For Family History Enter { yes:1, No:0 }') print('For diet Enter { High:0, Medium:1 }') print('For lifeStyle Enter { Athlete:0, Active:1, Moderate:2, Sedentary:3 }') print('For cholesterol Enter { High:0, BorderLine:1, Normal:2 }') q = HeartDisease_infer.query(variables=['heartdisease'], evidence={ 'age':int(input('Enter age :')), 'Gender':int(input('Enter Gender :')), 'Family':int(input('Enter Family history :')), 'diet':int(input('Enter diet :')), 'Lifestyle':int(input('Enter Lifestyle :')), 'cholestrol':int(input('Enter cholestrol :')) }) print(q['heartdisease'])
For age Enter { SuperSeniorCitizen:0, SeniorCitizen:1, MiddleAged:2, Youth:3, Teen:4 } For Gender Enter { Male:0, Female:1 } For Family History Enter { yes:1, No:0 } For diet Enter { High:0, Medium:1 } For lifeStyle Enter { Athlete:0, Active:1, Moderate:2, Sedentary:3 } For cholesterol Enter { High:0, BorderLine:1, Normal:2 } Enter age :1 Enter Gender :1 Enter Family history :0 Enter diet :1 Enter Lifestyle :0 Enter cholestrol :1 +----------------+---------------------+ | heartdisease | phi(heartdisease) | +================+=====================+ | heartdisease_0 | 0.0000 | +----------------+---------------------+ | heartdisease_1 | 1.0000 | +----------------+---------------------+
Alternative – alt lab7.ipynb
import bayespy as bp import numpy as np import csv from colorama import init from colorama import Fore, Back, Style init()
# Define Parameter Enum values #Age ageEnum = {'SuperSeniorCitizen':0, 'SeniorCitizen':1, 'MiddleAged':2, 'Youth':3, 'Teen':4} # Gender genderEnum = {'Male':0, 'Female':1} # FamilyHistory familyHistoryEnum = {'Yes':0, 'No':1} # Diet(Calorie Intake) dietEnum = {'High':0, 'Medium':1, 'Low':2} # LifeStyle lifeStyleEnum = {'Athlete':0, 'Active':1, 'Moderate':2, 'Sedetary':3} # Cholesterol cholesterolEnum = {'High':0, 'BorderLine':1, 'Normal':2} # HeartDisease heartDiseaseEnum = {'Yes':0, 'No':1} #heart_disease_data.csv
with open('heart_disease_data.csv') as csvfile: lines = csv.reader(csvfile) dataset = list(lines) data = [] for x in dataset: data.append([ageEnum[x[0]],genderEnum[x[1]],familyHistoryEnum[x[2]],dietEnum[x[3]],lifeStyleEnum[x[4]],cholesterolEnum[x[5]],heartDiseaseEnum[x[6]]]) # Training data for machine learning todo: should import from csv data = np.array(data) N = len(data)
# Input data column assignment p_age = bp.nodes.Dirichlet(1.0*np.ones(5)) age = bp.nodes.Categorical(p_age, plates=(N,)) age.observe(data[:,0]) p_gender = bp.nodes.Dirichlet(1.0*np.ones(2)) gender = bp.nodes.Categorical(p_gender, plates=(N,)) gender.observe(data[:,1]) p_familyhistory = bp.nodes.Dirichlet(1.0*np.ones(2)) familyhistory = bp.nodes.Categorical(p_familyhistory, plates=(N,)) familyhistory.observe(data[:,2]) p_diet = bp.nodes.Dirichlet(1.0*np.ones(3)) diet = bp.nodes.Categorical(p_diet, plates=(N,)) diet.observe(data[:,3]) p_lifestyle = bp.nodes.Dirichlet(1.0*np.ones(4)) lifestyle = bp.nodes.Categorical(p_lifestyle, plates=(N,)) lifestyle.observe(data[:,4]) p_cholesterol = bp.nodes.Dirichlet(1.0*np.ones(3)) cholesterol = bp.nodes.Categorical(p_cholesterol, plates=(N,)) cholesterol.observe(data[:,5])
# Prepare nodes and establish edges # np.ones(2) -> HeartDisease has 2 options Yes/No # plates(5, 2, 2, 3, 4, 3) -> corresponds to options present for domain values p_heartdisease = bp.nodes.Dirichlet(np.ones(2), plates=(5, 2, 2, 3, 4, 3)) heartdisease = bp.nodes.MultiMixture([age, gender, familyhistory, diet, lifestyle, cholesterol], bp.nodes.Categorical, p_heartdisease) heartdisease.observe(data[:,6]) p_heartdisease.update() # Sample Test with hardcoded values #print("Sample Probability") #print("Probability(HeartDisease|Age=SuperSeniorCitizen, Gender=Female, FamilyHistory=Yes, DietIntake=Medium, LifeStyle=Sedetary, Cholesterol=High)") #print(bp.nodes.MultiMixture([ageEnum['SuperSeniorCitizen'], genderEnum['Female'], familyHistoryEnum['Yes'], dietEnum['Medium'], lifeStyleEnum['Sedetary'], cholesterolEnum['High']], bp.nodes.Categorical, p_heartdisease).get_moments()[0][heartDiseaseEnum['Yes']])
# Interactive Test m = 0 while m == 0: print("\n") res = bp.nodes.MultiMixture([int(input('Enter Age: ' + str(ageEnum))), int(input('Enter Gender: ' + str(genderEnum))), int(input('Enter FamilyHistory: ' + str(familyHistoryEnum))), int(input('Enter dietEnum: ' + str(dietEnum))), int(input('Enter LifeStyle: ' + str(lifeStyleEnum))), int(input('Enter Cholesterol: ' + str(cholesterolEnum)))], bp.nodes.Categorical, p_heartdisease).get_moments()[0][heartDiseaseEnum['Yes']] print("Probability(HeartDisease) = " + str(res)) #print(Style.RESET_ALL) m = int(input("Enter for Continue:0, Exit :1 "))
Enter Age: {'SuperSeniorCitizen': 0, 'SeniorCitizen': 1, 'MiddleAged': 2, 'Youth': 3, 'Teen': 4}1 Enter Gender: {'Male': 0, 'Female': 1}0 Enter FamilyHistory: {'Yes': 0, 'No': 1}0 Enter dietEnum: {'High': 0, 'Medium': 1, 'Low': 2}2 Enter LifeStyle: {'Athlete': 0, 'Active': 1, 'Moderate': 2, 'Sedetary': 3}2 Enter Cholesterol: {'High': 0, 'BorderLine': 1, 'Normal': 2}1 C:\Anaconda3\lib\site-packages\bayespy\inference\vmp\nodes\categorical.py:43: FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated; use `arr[tuple(seq)]` instead of `arr[seq]`. In the future this will be interpreted as an array index, `arr[np.array(seq)]`, which will result either in an error or a different result. u0[[np.arange(np.size(x)), np.ravel(x)]] = 1 Probability(HeartDisease) = 0.5 Enter for Continue:0, Exit :1 1
Download Dataset