数据预读
数据集字段说明
- 编号:标识个体身份的数字;
- 性别:1表示男性,0表示女性;
- 出生年份:出生的年份;
- 体重指数:体重除以身高的平方,单位kg/m2;
- 糖尿病家族史:标识糖尿病的遗传特性,记录家族里面患有糖尿病的家属,分成三种标识,分别是父母有一方患有糖尿病、叔叔或者姑姑有一方患有糖尿病、无记录;
- 舒张压:心脏舒张时,动脉血管弹性回缩时,产生的压力称为舒张压,单位mmHg;
- 口服耐糖量测试:诊断糖尿病的一种实验室检查方法。比赛数据采用120分钟耐糖测试后的血糖值,单位mmol/L;
- 胰岛素释放实验:空腹时定量口服葡萄糖刺激胰岛β细胞释放胰岛素。比赛数据采用服糖后120分钟的血浆胰岛素水平,单位pmol/L;
- 肱三头肌皮褶厚度:在右上臂后面肩峰与鹰嘴连线的重点处,夹取与上肢长轴平行的皮褶,纵向测量,单位cm;
- 患有糖尿病标识:数据标签,1表示患有糖尿病,0表示未患有糖尿病。
解题思路
--------------------------------------------------后补-------------------------------------------------------------------
导入库
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
数据预处理
data1=pd.read_csv('比赛训练集.csv',encoding='gbk') #汉字
data2=pd.read_csv('比赛测试集.csv',encoding='gbk')
#label标记为-1
data2['患有糖尿病标识']=-1 #这是为了方便合并,先给测试集加一个label,-1和0,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了就是非常的肥胖。
在这里根据BMI范围分类一下
"""
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) # apply函数会自动遍历每一行DataFrame的数据,最后将所有结果组合成一个Series数据结构并返回。
data.head()
#糖尿病家族史
"""
无记录
叔叔或者姑姑有一方患有糖尿病/叔叔或姑姑有一方患有糖尿病
父母有一方患有糖尿病
分为3类
"""
def FHOD(a): # Family History of Diabetes
if a=='无记录':
return 0
elif a=='叔叔或者姑姑有一方患有糖尿病' or a=='叔叔或姑姑有一方患有糖尿病':
return 1
else:
return 2
data['糖尿病家族史']=data['糖尿病家族史'].apply(FHOD)
data['舒张压'].describe()
"""
舒张压范围为60-90
"""
def DBP(a):
if a<60:
return 0
elif 60<=a<=90:
return 1
else:
return 2
data['DBP']=data['舒张压'].apply(DBP)
拆分数据(特征工程结束
#将处理好的特征工程分为训练集和测试集,其中训练集是用来训练模型,测试集用来评估模型准确度
#其中编号和患者是否得糖尿病没有任何联系,属于无关特征予以删除
#根据之前的添加的-1列来拆分训练集和测试集 牛逼
train=data[data['患有糖尿病标识'] !=-1]
test=data[data['患有糖尿病标识'] ==-1]
#标签集
train_label=train['患有糖尿病标识']
#特征集
train=train.drop(['编号','患有糖尿病标识'],axis=1)
test=test.drop(['编号','患有糖尿病标识'],axis=1)
train.head()
#使用决策树方法训练数据集
model = DecisionTreeClassifier() #调过来
model.fit(train, train_label) # 拟合
y_pre=model.predict(test) #拟合完了是吧 给我他吗的测
y_pre #返回一下测试结果
#结果提交
result=pd.read_csv('提交示例.csv')
result['label']=y_pre
result.to_csv('result-de.csv',index=False)