Part 2.1 pandas介绍

217 阅读7分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

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])

Part 2.1 pandas介绍

显示函数提供了比仅仅打印数据帧更清晰的显示。指定最大行和列允许您对显示实现更大的控制。

设置后,新的dataframe再次打印df.

pd.set_option('display.max_columns', 7)
pd.set_option('display.max_rows', 5)
display(df)

Part 2.1 pandas介绍

此代码输出包含此统计信息的字典列表。该信息看起来类似于模块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)

Part 2.1 pandas介绍

Python程序可以将这种类似json的信息转换为数据帧,以便更好地显示。

pd.set_option('display.max_columns', 0)
pd.set_option('display.max_rows', 0)
df2 = pd.DataFrame(fields)
display(df2)

Part 2.1 pandas介绍

缺失值处理

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

Part 2.1 pandas介绍

删除字段

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)

Part 2.1 pandas介绍

训练集和验证集

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:训练和验证

Part 2.1 pandas介绍

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

Part 2.1 pandas介绍

您可能只希望转换一些列,而要省略名称列,请使用以下代码。

df[['mpg', 'cylinders', 'displacement', 'horsepower', 'weight',
       'acceleration', 'year', 'origin']].values

Part 2.1 pandas介绍

将数据帧保存为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)

Part 2.1 pandas介绍

模块2的任务作业

github.com/jeffheaton/…