2024.02前Python学习小结
1、Python数据分析:对饮食与健康数据的分析与可视化
2、Python机器学习:Scikit-learn简单使用
3、Python深度学习:Tensorflow简单使用
文章目录
前言
本文旨在对以往学习的相关内容进行总结回顾,通过Tensorflow对饮食与健康数据进行分析,侧重体现神经网络、梯度下降法部分特点:
- 详细叙述神经网络和梯度下降内容
- 练习方法为主,不太注重准确度
- 代码尽量详细说明
一、技术简介
TensorFlow简介
TensorFlow是一个由Google开发的开源机器学习框架,用于构建和训练各种机器学习模型。它是一个强大的数值计算库,特别适用于深度学习任务,如神经网络的构建和训练。
笔者选择理由:
- 常用就TensorFlow和PyTorch,都差不多
- 笔者看的弗朗索瓦·肖莱的“Python 深度学习”,里面用的TensorFlow
- 另外,非常推荐斋藤康毅的“深度学习入门”。笔者一口气读完,酣畅淋漓。作者用平实的语言讲解了卷积神经网络各部分知识,徐徐展开很有魅力。
Keras简介
弗朗索瓦·肖莱称为Keras之父。
Keras 是一个高层神经网络 API,用于构建和训练深度学习模型。它是一个建立在低层深度学习框架之上的用户友好的接口,旨在快速实现和实验各种深度学习模型。
它有几个特点:
- 和Scikit-learn类似有着简洁高效的API
- 丰富的检查方法用来观察模型
- 包含在TensorFlow2.0内
二、数据处理
1.引入库
代码如下:
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```
2.数据导入及处理
对数据导入及处理,在以上两个文件基础上。
#数据导入及处理
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进行部分操作,期望使用神经网络完成两类问题:
- 将样本数据分为健康和不健康两类(二分类问题)
- 由部分数据估算体重(回归问题)
1.二分类问题
数据导入及简单处理
本部分为了用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表示健康。但期望输入还得是数字需要转化下。
数据集划分及热编码
为了建立模型并检验模型,需要将原数据进行划分,分为训练集和测试集。分类问题一般情况都需要进行热编码。热编码一般应用情况:
- One-Hot编码常用于分类任务,类别标签通常需要热编码
- 在深度学习中,热编码将类别标签转换为固定长度的二进制向量,使其能够成为神经网络的输入。
- 非数值型标签
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
2.回归问题
激活函数需要
model.add(Dense(units=1, activation='linear')) # 线性激活函数适用于回归问题
损失函数用均方误差
model.compile(optimizer='adam', loss='mean_squared_error') # 使用均方误差作为损失函数
回归问题需要加入一列索引,因为得有作为每行特征的值,类似文件2,此处就不写了。和分类很相似的。
总结
本部分就写这了,笔者仅尝试过Keras几个分类回归问题,对卷积神经网络仅了解原理,进行了部分简单练习未进行项目练习,本计划完成手写识别,可惜没时间了。再写意义也不大了。
时间也快转钟了。零点是人为定义的结束,太多事情本身都没意义,不过是人为强加的理解,共识的理解又形成了所谓文明的东西。
本阶段总结也到此结束吧,期望在动荡的半年后圆梦清华,为本科的学习也来个结束。