本文已参与「新人创作礼」活动,一起开启掘金创作之路
Applications of Deep Neural Networks with Keras
基于Keras的深度神经网络应用
著:Jeff Heaton 译:人工智能学术前沿
目录
1.Python基础
2.机器学习Python
3.TensorFlow简介
4.表格类数据的训练
5.正则化和Dropout
6.用于计算机视觉的卷积神经网络
7.生成对抗网络
8.Kaggle数据集
9.迁移学习
10.Keras的时间序列
11.自然语言处理与语音识别
12.强化学习
13.Advanced/Other Topics
14.其他神经网络技术
2.1 pandas介绍
Part 2.1: Introduction to Pandas
Pandas是一个开源库,为Python编程语言提供高性能、易用的数据结构和数据分析工具。它基于R编程语言中的 dataframe概念。对于这门课来说,Pandas将是我们操纵由神经网络处理的数据的主要手段。
dataframe(数据帧)是Pandas的关键组成部分。 我们将使用它来访问 auto-mpg dataset。你可以在UCI机器学习知识库中找到这个数据集。对于这个类,我们将使用Auto MPG数据集的一个版本,其中我添加了列标题。你可以在这里找到我的版本.
(raw.githubusercontent.com/jeffheaton/…)
UCI从卡内基梅隆大学维护的StatLib库中获取了这个数据集。该数据集用于1983年美国统计协会博览会。它包含398辆汽车的数据,包括每加仑英里数、气缸数、排量、马力、重量、加速度、车型年、原产地和汽车名称。
数据的读取
read_csv
下面的代码将MPG数据集加载到dataframe中:
# Simple dataframe
import os
import pandas as pd
df = pd.read_csv("https://data.heatonresearch.com/data/t81-558/auto-mpg.csv")
print(df[0:5])
显示函数提供了比仅仅打印数据帧更清晰的显示。指定最大行和列允许您对显示实现更大的控制。
设置后,新的dataframe再次打印df.
pd.set_option('display.max_columns', 7)
pd.set_option('display.max_rows', 5)
display(df)
此代码输出包含此统计信息的字典列表。该信息看起来类似于模块1中的JSON代码。要想成为合适的JSON,程序应该将这些记录添加到一个列表中,并调用Python JSON库的dumps命令。
# Strip non-numerics
df = df.select_dtypes(include=['int', 'float'])
headers = list(df.columns.values)
fields = []
for field in headers:
fields.append({
'name' : field,
'mean': df[field].mean(),
'var': df[field].var(),
'sdev': df[field].std()
})
for field in fields:
print(field)
Python程序可以将这种类似json的信息转换为数据帧,以便更好地显示。
pd.set_option('display.max_columns', 0)
pd.set_option('display.max_rows', 0)
df2 = pd.DataFrame(fields)
display(df2)
缺失值处理
Missing Values
缺失值是机器学习的现实。理想情况下,每一行数据都有所有列的值。然而,这种情况很少发生。大多数值都存在于MPG数据库中。然而,在马力( horsepower)列中缺少一些值。常见的做法是用该列的中值替换缺失的值。
程序按照这里描述的方式计算中值。下面的代码用中值替换马力( horsepower)中的任何NA值:
import os
import pandas as pd
df = pd.read_csv(
"https://data.heatonresearch.com/data/t81-558/auto-mpg.csv",
na_values=['NA', '?'])
print(f"horsepower has na? {pd.isnull(df['horsepower']).values.any()}")
print("Filling missing values...")
med = df['horsepower'].median()
df['horsepower'] = df['horsepower'].fillna(med)
# df = df.dropna() # you can also simply drop NA values
print(f"horsepower has na? {pd.isnull(df['horsepower']).values.any()}")
输出
horsepower has na? True
Filling missing values...
horsepower has na? False
处理异常值(离群值)
Dealing with Outliers
异常值是指异常高或低的值。有时异常值只是简单的错误;这是观测误差的结果。异常值也可以是真正大或小的值,可能很难处理。我们通常认为离均值有几个标准差的值是离均值有几个标准差的值。下面的函数可以删除这些值。
# Remove all rows where the specified column is +/- sd standard deviations
def remove_outliers(df, name, sd):
drop_rows = df.index[(np.abs(df[name] - df[name].mean())
>= (sd * df[name].std()))]
df.drop(drop_rows, axis=0, inplace=True)
下面的代码将删除Auto MPG数据集中马力高于或低于平均值两个标准差以上的每一行。
import pandas as pd
import os
import numpy as np
from sklearn import metrics
from scipy.stats import zscore
df = pd.read_csv(
"https://data.heatonresearch.com/data/t81-558/auto-mpg.csv",
na_values=['NA','?'])
# create feature vector
med = df['horsepower'].median()
df['horsepower'] = df['horsepower'].fillna(med)
# Drop the name column
df.drop('name',1,inplace=True)
# Drop outliers in horsepower
print("Length before MPG outliers dropped: {}".format(len(df)))
remove_outliers(df,'mpg',2)
print("Length after MPG outliers dropped: {}".format(len(df)))
pd.set_option('display.max_columns', 0)
pd.set_option('display.max_rows', 5)
display(df)
输出
Length before MPG outliers dropped: 398
Length after MPG outliers dropped: 388
删除字段
Dropping Fields
有些字段对神经网络没有价值,应该删除。下面的代码将从MPG数据集中删除名称列。
import os
import pandas as pd
df = pd.read_csv(
"https://data.heatonresearch.com/data/t81-558/auto-mpg.csv",
na_values=['NA','?'])
print(f"Before drop: {list(df.columns)}")
df.drop('name', 1, inplace=True)
print(f"After drop: {list(df.columns)}")
输出
Before drop: ['mpg', 'cylinders', 'displacement', 'horsepower', 'weight', 'acceleration', 'year', 'origin', 'name']
After drop: ['mpg', 'cylinders', 'displacement', 'horsepower', 'weight', 'acceleration', 'year', 'origin']
连接行和列
Concatenating Rows and Columns
Python可以将行和列连接在一起,形成新的数据帧。下面的代码从Auto MPG数据集的 name 和horsepower两列创建一个新的数据帧。该程序将两列连接在一起来构建一个新的数据帧。
# Create a new dataframe from name and horsepower
import os
import pandas as pd
df = pd.read_csv(
"https://data.heatonresearch.com/data/t81-558/auto-mpg.csv",
na_values=['NA','?'])
col_horsepower = df['horsepower']
col_name = df['name']
result = pd.concat([col_name, col_horsepower], axis=1)
pd.set_option('display.max_columns', 0)
pd.set_option('display.max_rows', 5)
display(result)
训练集和验证集
Training and Validation
我们必须根据机器学习模型预测从未见过的数据的能力来评估它。因此,我们经常将训练数据划分为验证和训练集。机器学习模型将从训练数据中学习,但最终将基于验证数据进行评估。
**Training Data --样本数据-**神经网络用于训练的数据。
**Validation Data-样本外数据-**机器学习模型与训练数据拟合后评估的数据。
有两种处理训练和验证数据的有效方法:
**1.Training/Validation Split (训练/验证分割)-**程序根据训练和验证(hold-out)集之间的某种比例分割数据。典型的比率是80%的训练和20%的验证。
2.K-Fold Cross Validation(K-Fold交叉验证) -该程序将数据分成几个折叠和模型。因为程序创建的模型与折叠的数量相同,所以程序可以为整个数据集生成样本外预测。
下面的代码将MPG数据分割为训练和验证集。训练集使用80%的数据,验证集使用20%的数据。图2。TRN-VAL展示了如何在80%的数据上训练模型,然后用剩下的20%进行验证。
图2。TRN-VAL:训练和验证
import os
import pandas as pd
import numpy as np
df = pd.read_csv(
"https://data.heatonresearch.com/data/t81-558/auto-mpg.csv",
na_values=['NA','?'])
# Usually a good idea to shuffle
df = df.reindex(np.random.permutation(df.index))
mask = np.random.rand(len(df)) < 0.8
trainDF = pd.DataFrame(df[mask])
validationDF = pd.DataFrame(df[~mask])
print(f"Training DF: {len(trainDF)}")
print(f"Validation DF: {len(validationDF)}")
输出
Training DF: 333
Validation DF: 65
将数据帧转换为矩阵
Converting a Dataframe to a Matrix
神经网络并不直接操作Python数据帧。神经网络需要一个数值矩阵。该程序使用数据帧的值属性将数据转换为矩阵。
df.values
您可能只希望转换一些列,而要省略名称列,请使用以下代码。
df[['mpg', 'cylinders', 'displacement', 'horsepower', 'weight',
'acceleration', 'year', 'origin']].values
将数据帧保存为CSV文件
Saving a Dataframe to CSV
本课程的许多作业都要求你保存一个数据帧提交给老师。下面的代码执行一次调动,然后保存一个新的副本。
import os
import pandas as pd
import numpy as np
path = "."
df = pd.read_csv(
"https://data.heatonresearch.com/data/t81-558/auto-mpg.csv",
na_values=['NA','?'])
filename_write = os.path.join(path, "auto-mpg-shuffle.csv")
df = df.reindex(np.random.permutation(df.index))
# Specify index = false to not write row numbers
df.to_csv(filename_write, index=False)
print("Done")
输出
Done
保存数据帧到Pickle
Saving a Dataframe to Pickle
各种软件程序可以利用文本文件存储为CSV。然而,它们确实需要更长的时间来生成,有时在转换中会损失少量的精度。另一种格式是Pickle。通常,您将输出到CSV,因为它是非常兼容的,即使在Python之外。下面的代码将数据帧存储到Pickle。
import os
import pandas as pd
import numpy as np
import pickle
path = "."
df = pd.read_csv(
"https://data.heatonresearch.com/data/t81-558/auto-mpg.csv",
na_values=['NA','?'])
filename_write = os.path.join(path, "auto-mpg-shuffle.pkl")
df = df.reindex(np.random.permutation(df.index))
with open(filename_write,"wb") as fp:
pickle.dump(df, fp)
通过以下代码行将pickle文件加载回内存。注意到索引号仍然是先前洗牌后的混乱吗?加载重建的CSV(在最后一步中)并没有保留这些值。
import os
import pandas as pd
import numpy as np
import pickle
path = "."
df = pd.read_csv(
"https://data.heatonresearch.com/data/t81-558/auto-mpg.csv",
na_values=['NA','?'])
filename_read = os.path.join(path, "auto-mpg-shuffle.pkl")
with open(filename_write,"rb") as fp:
df = pickle.load(fp)
pd.set_option('display.max_columns', 7)
pd.set_option('display.max_rows', 5)
display(df)
模块2的任务作业