- 作业要求:
中风预测:根据世界卫生组织(WHO)的数据,中风是全球第二大死亡原因,约占总死亡人数的11%。该数据集用于根据输入参数(例如性别,年龄,各种疾病和吸烟状况)预测患者是否可能中风。数据中的每一行都提供有关患者的相关信息。 数据下载网址为:https://mp.weixin.qq.com/s/QobTa9eN0snb9u2lXxX_iQ 使用数据集中70%训练贝叶斯模型,30%预测。 - 数据理解(字段描述):
- 实现思路
首先对数据集进行预处理,去除数量极少的性别异常值数据条目,使用均值填补体重指数(bmi)缺失值等。随机选取数据集的70%进行贝叶斯模型的训练,剩下30%进行模型测试,将模型测试结果与原切分测试数据集数据进行比对计数,计算该模型预测准确度。 贝叶斯公式: 最大似然函数:(分别求取是否中风的似然函数值进行大小比较) - 运行结果截图
贝叶斯模型测试集测试结果(三次运行结果截图如下): 几次运行结果显示模型预测准确率:94%-96% - 完整代码
import numpy as np
import pandas as pd
import random
import warnings
warnings.filterwarnings('ignore')
pd.set_option('display.max_columns', None)
pd.set_option('display.max_rows', None)
def dataProcessing(df):
df.info()
print(df.isnull().sum())
df = df.drop_duplicates()
print(df.gender.value_counts())
df = df.drop(df[df["gender"]=="Other"].index)
print(df.gender.value_counts())
df["bmi"].fillna(df["bmi"].mean(),inplace=True)
df.index = range(df.shape[0])
df.info()
return df
def randSplit(df,rate):
extract=list(df.index)
random.shuffle(extract)
df.index=extract
n=df.shape[0]
m=int(n * rate)
train=df.loc[range(m),:]
test=df.loc[range(m,n),:]
df.index=range(df.shape[0])
test.index=range(test.shape[0])
return train,test
def trainPbmodel_X(feats):
N,D=np.shape(feats)
model={}
for i in range(D):
data=feats[:,i].tolist()
keys=set(data)
N=len(data)
model[i]={}
for key in keys:
model[i][key]=float(data.count(key)/N)
return model
def trainPbmodel(datas,labs):
model={}
keys=set(labs)
for key in keys:
Pbmodel_Y=labs.count(key)/len(labs)
index=np.where(np.array(labs)==key)[0].tolist()
feats=np.array(datas)[index]
Pbmodel_X=trainPbmodel_X(feats)
model[key]={}
model[key]["PY"]=Pbmodel_Y
model[key]["PX"]=Pbmodel_X
return model
def getPbfromModel(feat,model,keys):
results={}
eps=0.00001
for key in keys:
PY=model.get(key,eps).get("PY")
model_X=model.get(key,eps).get("PX")
list_px=[]
for i in range(len(feat)):
pb=model_X.get(i,eps).get(feat[i],eps)
list_px.append(pb)
result= np.log(PY) + np.sum(np.log(list_px))
results[key]=result
return results
if __name__== '__main__':
result=[]
judge=[]
count=0
df = pd.read_csv("C:\\Users\\31998\\Downloads\\中风预测数据集.csv")
df=dataProcessing(df)
charges = df.drop(["id"], axis=1)
labels = list(charges.columns.values)
train,test=randSplit(df,0.7)
dataSet = train.values.tolist()
datas= [i[:-1] for i in dataSet]
labs=[i[-1] for i in dataSet]
model = trainPbmodel(datas,labs)
x=test[['stroke']]
x=np.array(x)
datadata=test.drop(["stroke"], axis=1)
corrDf = datadata.apply(lambda x: pd.factorize(x)[0])
feat=corrDf.values.tolist()
keys=set(labs)
for i in range(len(feat)):
result.append(getPbfromModel(feat[i],model,keys))
for key,value in result[i].items():
if(value==max(result[i].values())):
judge.append(key)
if (key == x[i][0]):
count=count+1
print(judge)
print(count)
print(count/len(feat))
|