期末考结束,没啥事情可以做,正好愁没有机会实践tensorflow和python的数据分析,借这个机会简单的尝试下。
(单纯觉得好玩,准确率差的不是一点两点)
网址:糖尿病遗传风险检测挑战赛
`
import tensorflow as tf
from tensorflow.keras.layers import Dense
from tensorflow.keras import Model
import numpy as np
import pandas as pd
import os
因为是jupyter 所以非常方便的可以看到输入输出,但是如果希望将变量单独一行就可直接输出,需要多导一步
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
感谢DataWhale的指导,具体可看这个网址Datawhale《如何打一场数据挖掘赛事》入门版
#数据预处理
data1=pd.read_csv('比赛训练集.csv',encoding='gbk')
data2=pd.read_csv('比赛测试集.csv',encoding='gbk')
#label标记为-1
data2['患有糖尿病标识']=-1
#训练集和测试机合并
data=pd.concat([data1,data2],axis=0,ignore_index=True)
#将舒张压特征中的缺失值填充为-1
data['舒张压']=data['舒张压'].fillna(-1)
#----------------特征工程----------------
"""
将出生年份换算成年龄
"""
data['年龄']=2022-data['出生年份'] #换成年龄
"""
人体的成人体重指数正常值是在18.5-24之间
低于18.5是体重指数过轻
在24-27之间是体重超重
27以上考虑是肥胖
高于32了就是非常的肥胖。
"""
def BMI(a):
if a<18.5:
return 0
elif 18.5<=a<=24:
return 1
elif 24<a<=27:
return 2
elif 27<a<=32:
return 3
else:
return 4
data['BMI']=data['体重指数'].apply(BMI)
#糖尿病家族史
"""
无记录
叔叔或者姑姑有一方患有糖尿病/叔叔或姑姑有一方患有糖尿病
父母有一方患有糖尿病
"""
def FHOD(a):
if a=='无记录':
return 0
elif a=='叔叔或者姑姑有一方患有糖尿病' or a=='叔叔或姑姑有一方患有糖尿病':
return 1
else:
return 2
data['糖尿病家族史']=data['糖尿病家族史'].apply(FHOD)
"""
舒张压范围为60-90
"""
def DBP(a):
if 0<=a<60:
return 0
elif 60<=a<=90:
return 1
elif a>90:
return 2
else:
return a
data['DBP']=data['舒张压'].apply(DBP)
再将数据写入一个文件,准备进入神经网络。
data.to_csv('deeplearning.csv')
读入数据
data = pd.read_csv('deeplearning.csv')
data = pd.DataFrame(data)
将数据拆分出来
train=data[data['患有糖尿病标识'] !=-1]
train
test=data[data['患有糖尿病标识'] ==-1]
test
train_label=train['患有糖尿病标识']
train_label
train=train.drop(['编号','患有糖尿病标识','出生年份'],axis=1)
train
test=test.drop(['编号','患有糖尿病标识','出生年份'],axis=1)
test
转换成神经网络可读的类型
x_train = train.iloc[:,1:]
x_train = np.array(x_train.values)
x_train
y_train = train_label
y_train
神经网络建立
model = tf.keras.models.Sequential([
tf.keras.layers.BatchNormalization(),
tf.keras.layers.Dense(2, activation='softmax')
])
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.1),
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
metrics=['sparse_categorical_accuracy'])
model.fit(x_train, y_train, batch_size=32, epochs=5, validation_split=0.2, validation_freq=20)
model.summary()
model.save('my_weight.ckpt')
x_test = test.iloc[:,1:]
x_test = np.array(x_test.values)
x_test
newmodel = tf.keras.models.load_model('my_weight.ckpt')
result = []
for i in x_test:
temp = np.array(i)
temp = temp[tf.newaxis,...]
result.append(newmodel.predict(temp))
#----------------结果输出----------------
result=pd.read_csv('提交示例.csv')
result['label']=write
result.to_csv('result-deeplearning.csv',index=False)
准确率可以说是非常的垃圾了,只有72%的正确率,但试一试大炮打蚊子还是很有意思的