赞
踩
1、Python数据分析:对饮食与健康数据的分析与可视化
2、Python机器学习:Scikit-learn简单使用
3、Python深度学习:Tensorflow简单使用
本文旨在对以往学习的相关内容进行总结回顾,通过Tensorflow对饮食与健康数据进行分析,侧重体现神经网络、梯度下降法部分特点:
TensorFlow是一个由Google开发的开源机器学习框架,用于构建和训练各种机器学习模型。它是一个强大的数值计算库,特别适用于深度学习任务,如神经网络的构建和训练。
笔者选择理由:
弗朗索瓦·肖莱称为Keras之父。
Keras 是一个高层神经网络 API,用于构建和训练深度学习模型。它是一个建立在低层深度学习框架之上的用户友好的接口,旨在快速实现和实验各种深度学习模型。
它有几个特点:
代码如下:
import numpy as np
import pandas as pd
import warnings ## Filter warnings
warnings.filterwarnings('ignore')
from sklearn.model_selection import train_test_split ## 划分数据集
from tensorflow.keras.models import Sequential ## 导入Keras中Sequential很重要
# 构建模型的层和激活方法
from tensorflow.keras.layers import Dense, Activation
# 数据处理的辅助工具
from tensorflow.keras import utils```
对数据导入及处理,在以上两个文件基础上。
#数据导入及处理 df_1 = pd.read_csv(r'D:\Pytharm\Practice\sjfenxilast\sti_sc.csv') df_1.drop_duplicates(keep='first',inplace=True) #删除重复 df_1['Age'] = df_1['Age'].apply(int) #原数据年龄有太多小数 df = df_1[df_1['Age'] < 31] #原数据基本是30以下的,只选取小于30部分 #只保留饮食习惯属性和基础信息属性 df_diet = [] df_diet=df.loc[:,['Age','Weight','Height','FAVC','FCVC','NCP','CH2O','NObeyesdad']] #将文本类型属性转换为数字类型 df_diet.loc[df_diet['FAVC'] == 'yes', 'FAVC_'] = 1 df_diet.loc[df_diet['FAVC'] == 'no', 'FAVC_'] = 0 df_diet.drop(['FAVC'], axis="columns", inplace=True)#删除列 #也可以使用map,replace dict = {'Insufficient_Weight' : 0, 'Normal_Weight' : 1, 'Overweight_Level_I' : 2, 'Overweight_Level_II':3,'Obesity_Type_I' : 4,'Obesity_Type_II' : 5,'Obesity_Type_II' : 6} df_diet["BMIex"] = df_diet["BMIex"].map(dict) df_diet["NObeyesdad"] = df_diet["NObeyesdad"].map(dict)#有空代表没换完 #修改部分列索引,方便调用,此次BMI评价直接使用给定值 df_diet.rename(columns={'NObeyesdad': 'BMIex', 'FAVC_': 'FAVC'}, inplace=True) #将BMIex放到最后,检测相关数据 df_diet=df_diet[['Age','Weight','Height','FAVC','FCVC','NCP','CH2O','BMIex']]
其中,本文依然选取30岁以下人群数据,并将各属性转化为数值型。
本部分用Kears进行部分操作,期望使用神经网络完成两类问题:
本部分为了用Keras实现二分类问题,对身体状况进行分类,首先需要更改数据标签,将正常体重(‘Normal_Weight’)视为健康,其他视为不健康。
##No表示不健康,Yes表示健康
dict = {0: "No", 1: "Yes", 2: "No", 3: "No", 4: "No", 5: "No", 6: "No"}
df_diet["BMIex"] = df_diet["BMIex"].map(dict)
print(df_diet)
依然以最后一列作为标签,No表示不健康,Yes表示健康。但期望输入还得是数字需要转化下。
为了建立模型并检验模型,需要将原数据进行划分,分为训练集和测试集。分类问题一般情况都需要进行热编码。热编码一般应用情况:
from tensorflow.keras import utils ## 数据处理相关 from sklearn.model_selection import train_test_split ## 数据集划分 from sklearn.preprocessing import OneHotEncoder ## 将数据集划分为训练集和测试集,7:3 train_X, test_X, train_y, test_y = train_test_split(X, y, train_size=0.7, test_size=0.3, random_state=0) dict = {"No": 0, "Yes": 1} df_diet["BMIex"] = df_diet["BMIex"].map(dict) print("编码前") print(train_y) ## # 进行热编码 def one_hot_encode_object_array(arr): # 去重获取全部的类别 uniques, ids = np.unique(arr, return_inverse=True) # 返回热编码的结果 return utils.to_categorical(ids, len(uniques)) # 训练集热编码 train_y_ohe = one_hot_encode_object_array(train_y) # 测试集热编码 test_y_ohe = one_hot_encode_object_array(test_y) print("编码前") print(train_y) print("编码后") print(train_y_ohe)
可以看到,原理的字符型标签变成了二进制型0,1。
数据处理后就可构建网络了,一般使用sequential方式。
## 利用sequential方式构建空模型
model = Sequential()
# 隐藏层1,激活函数是relu引入非线性,输入由input_shape指定
# 添加输入层和第一个隐藏层
model.add(Dense(units=10, activation='relu', input_dim=(7,)))
#model.add((10, activation="relu", input_shape=(7,)))
# 添加第二个隐藏层
model.add(Dense(units=10, activation='relu'))
# 添加输出层(二分类,一个神经元,sigmoid激活函数,softmax常用是多分类)
model.add(Dense(units=1, activation='sigmoid'))
如果没有relu(非线性)等激活函数,原Dense层将只包含点积分和加法,只能做线性。
本部分是二分类问题需要sigmoid激活函数,多分类也就输出层不同,改为:
model.add(Dense(7,activation="softmax"))
还需要设置损失函数和优化器。对于二分类问题,输出是个概率值,最好使用二元交叉熵损失。
# 优化器和损失,监测精度
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
本例用adm优化器,指标用精确度。不知是否书老了,书里常用rmsprop明显感觉adam好,网上也是用adam多。
# 模型训练:epochs,训练样本送入到网络中的次数,batch_size:每次训练的送入到网络中的样本个数
model.fit(train_X, train_y_ohe, epochs=50, batch_size=7, verbose=1)
# 计算模型的损失和准确率
loss, accuracy = model.evaluate(test_X, test_y_ohe, verbose=1)
print("Accuracy = {:.2f}".format(accuracy))
准确度0.73
激活函数需要
model.add(Dense(units=1, activation='linear')) # 线性激活函数适用于回归问题
损失函数用均方误差
model.compile(optimizer='adam', loss='mean_squared_error') # 使用均方误差作为损失函数
回归问题需要加入一列索引,因为得有作为每行特征的值,类似文件2,此处就不写了。和分类很相似的。
本部分就写这了,笔者仅尝试过Keras几个分类回归问题,对卷积神经网络仅了解原理,进行了部分简单练习未进行项目练习,本计划完成手写识别,可惜没时间了。再写意义也不大了。
时间也快转钟了。零点是人为定义的结束,太多事情本身都没意义,不过是人为强加的理解,共识的理解又形成了所谓文明的东西。
本阶段总结也到此结束吧,期望在动荡的半年后圆梦清华,为本科的学习也来个结束。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。