TensorFlow构建模型(pandas.DataFrame数据加载)九

本文介绍如何使用TensorFlow从pandas DataFrame加载数据并训练一个心脏病预测模型。通过实际操作,展示如何处理不同类型的特征数据,包括数值型、二值型及类别型变量。
部署运行你感兴趣的模型镜像
概要

本文源自TensorFlow教程
主要讲如何使用tensorflow加载pandas DataFrame数据进行模型训练。使用心脏疾病的数据集进行一个二分类例子。本文是一个tensorflow初级入门的教程。内容较为简单,并且和之前的这篇加载csv训练模型的文章差不多,因为都是数据格式都是pandas的DataFrame。

内容
import pandas as pd
import tensorflow as tf

SHUFFLE_BUFFER = 500
BATCH_SIZE = 2

csv_file = tf.keras.utils.get_file('heart.csv', 'https://storage.googleapis.com/download.tensorflow.org/data/heart.csv')

df = pd.read_csv(csv_file)
# 目标标签
target = df.pop('target')

如果数据集中特征的数据类型是统一的,我们可以将其作为一个numpy array,使用tf.convert_to_tensor转化成一个张量。然后这个张量可以直接传入tensorflow构建的模型中进行训练。

numeric_feature_names = ['age', 'thalach', 'trestbps',  'chol', 'oldpeak']
numeric_features = df[numeric_feature_names]
tf.convert_to_tensor(numeric_features)
"""
<tf.Tensor: shape=(303, 5), dtype=float64, numpy=
array([[ 63. , 150. , 145. , 233. ,   2.3],
       [ 67. , 108. , 160. , 286. ,   1.5],
       [ 67. , 129. , 120. , 229. ,   2.6],
       ...,
       [ 65. , 127. , 135. , 254. ,   2.8],
       [ 48. , 150. , 130. , 256. ,   0. ],
       [ 63. , 154. , 150. , 407. ,   4. ]])>
"""

# 首先讲数据进行归一化,
normalizer = tf.keras.layers.Normalization(axis=-1)
normalizer.adapt(numeric_features)
normalizer(numeric_features.iloc[:3])
# 模型构建
def get_basic_model():
  model = tf.keras.Sequential([
    normalizer,  # 第一层 输入层,进行归一化
    tf.keras.layers.Dense(10, activation='relu'),  # 第一层隐藏层
    tf.keras.layers.Dense(10, activation='relu'),  # 第二层隐藏层
    tf.keras.layers.Dense(1)  # 输入层
  ])

  model.compile(optimizer='adam',
                loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
                metrics=['accuracy'])
  return model

model = get_basic_model()
model.fit(numeric_features, target, epochs=15, batch_size=BATCH_SIZE)  # loss: 0.4051 - accuracy: 0.7888

使用tf_data对对数据进行处理。Dataset.from_tensor_slices方法可以遍历dataframe的行构建数据集,每一行是一个初始向量,方法返回的是(inputs, labels)对。

numeric_dataset = tf.data.Dataset.from_tensor_slices((numeric_features, target))

for row in numeric_dataset.take(3):
  print(row)

"""
(<tf.Tensor: shape=(5,), dtype=float64, numpy=array([ 63. , 150. , 145. , 233. ,   2.3])>, <tf.Tensor: shape=(), dtype=int64, numpy=0>)
(<tf.Tensor: shape=(5,), dtype=float64, numpy=array([ 67. , 108. , 160. , 286. ,   1.5])>, <tf.Tensor: shape=(), dtype=int64, numpy=1>)
(<tf.Tensor: shape=(5,), dtype=float64, numpy=array([ 67. , 129. , 120. , 229. ,   2.6])>, <tf.Tensor: shape=(), dtype=int64, numpy=0>)
"""

numeric_batches = numeric_dataset.shuffle(1000).batch(BATCH_SIZE)

model = get_basic_model()
model.fit(numeric_batches, epochs=15)  # loss: 0.4170 - accuracy: 0.7954

将dataframe作为一个字典

# 模型可以直接训练字典类型数据集
model.fit(dict(numeric_features), target, epochs=5, batch_size=BATCH_SIZE)
# 先使用from_tensor_slices进行处理
numeric_dict_ds = tf.data.Dataset.from_tensor_slices((dict(numeric_features), target))
numeric_dict_batches = numeric_dict_ds.shuffle(SHUFFLE_BUFFER).batch(BATCH_SIZE)
model.fit(numeric_dict_batches, epochs=5)


def stack_dict(inputs, fun=tf.stack):
    values = []
    for key in sorted(inputs.keys()):
      values.append(tf.cast(inputs[key], tf.float32))

    return fun(values, axis=-1)
    
# 构建一个从inputs => x的计算过程
# ==== beigin====
x = stack_dict(inputs, fun=tf.concat)

normalizer = tf.keras.layers.Normalization(axis=-1)
normalizer.adapt(stack_dict(dict(numeric_features)))

x = normalizer(x)
x = tf.keras.layers.Dense(10, activation='relu')(x)
x = tf.keras.layers.Dense(10, activation='relu')(x)
x = tf.keras.layers.Dense(1)(x)
# ==== end====
model = tf.keras.Model(inputs, x)

model.compile(optimizer='adam',
              loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
              metrics=['accuracy'],
              run_eagerly=True)

model.fit(dict(numeric_features), target, epochs=5, batch_size=BATCH_SIZE)

numeric_dict_batches = numeric_dict_ds.shuffle(SHUFFLE_BUFFER).batch(BATCH_SIZE)
model.fit(numeric_dict_batches, epochs=5)

以上例子的前提条件是dataframe的数据类型一致。然而实际情况并不这样。

binary_feature_names = ['sex', 'fbs', 'exang']

categorical_feature_names = ['cp', 'restecg', 'slope', 'thal', 'ca']

inputs = {}
for name, column in df.items():
  if type(column[0]) == str:
    dtype = tf.string
  elif (name in categorical_feature_names or
        name in binary_feature_names):
    dtype = tf.int64
  else:
    dtype = tf.float32

  inputs[name] = tf.keras.Input(shape=(), name=name, dtype=dtype)

preprocessed = []
# 二值特征
for name in binary_feature_names:
  inp = inputs[name]
  inp = inp[:, tf.newaxis]
  float_value = tf.cast(inp, tf.float32)
  preprocessed.append(float_value)

preprocessed
# 数值特征
normalizer = tf.keras.layers.Normalization(axis=-1)
normalizer.adapt(stack_dict(dict(numeric_features)))
numeric_inputs = {}
for name in numeric_feature_names:
  numeric_inputs[name]=inputs[name]

numeric_inputs = stack_dict(numeric_inputs)
numeric_normalized = normalizer(numeric_inputs)

preprocessed.append(numeric_normalized)

preprocessed
# 类别特征
vocab = ['a','b','c']
lookup = tf.keras.layers.StringLookup(vocabulary=vocab, output_mode='one_hot')
lookup(['c','a','a','b','zzz'])
vocab = [1,4,7,99]
lookup = tf.keras.layers.IntegerLookup(vocabulary=vocab, output_mode='one_hot')

lookup([-1,4,1])
for name in categorical_feature_names:
  vocab = sorted(set(df[name]))
  print(f'name: {name}')
  print(f'vocab: {vocab}\n')

  if type(vocab[0]) is str:
    lookup = tf.keras.layers.StringLookup(vocabulary=vocab, output_mode='one_hot')
  else:
    lookup = tf.keras.layers.IntegerLookup(vocabulary=vocab, output_mode='one_hot')

  x = inputs[name][:, tf.newaxis]
  x = lookup(x)
  preprocessed.append(x)

preprocesssed_result = tf.concat(preprocessed, axis=-1)
preprocesssed_result

preprocessor = tf.keras.Model(inputs, preprocesssed_result)

body = tf.keras.Sequential([
  tf.keras.layers.Dense(10, activation='relu'),
  tf.keras.layers.Dense(10, activation='relu'),
  tf.keras.layers.Dense(1)
])

x = preprocessor(inputs)
result = body(x)
model = tf.keras.Model(inputs, result)

model.compile(optimizer='adam',
                loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
                metrics=['accuracy'])
history = model.fit(dict(df), target, epochs=5, batch_size=BATCH_SIZE)

您可能感兴趣的与本文相关的镜像

TensorFlow-v2.9

TensorFlow-v2.9

TensorFlow

TensorFlow 是由Google Brain 团队开发的开源机器学习框架,广泛应用于深度学习研究和生产环境。 它提供了一个灵活的平台,用于构建和训练各种机器学习模型

### 如何在 TensorFlow 中集成和配置 Pandas 数据处理 为了有效地利用 Pandas 进行数据预处理并与 TensorFlow 配合工作,通常会遵循特定的工作流程。这包括加载数据Pandas 的 `DataFrame` 结构中,执行必要的清理和转换操作,最后将这些经过处理的数据传递给 TensorFlow 模型。 #### 加载和准备数据 通过 Pandas 可以方便地读取各种文件格式(CSV、Excel 等),并将它们存储在一个易于管理的表格形式内: ```python import pandas as pd data = { 'Feature1': [0.7, 1.3, 2.9], 'Feature2': [-0.8, -1.5, -2.6], } df = pd.DataFrame(data) print("原始 DataFrame:") print(df) ``` #### 处理缺失值和其他异常情况 对于任何实际应用中的数据集来说,都可能存在一些不完整的记录或者是不符合预期范围内的数值。Pandas 提供了一系列方法来识别这些问题并采取适当措施解决它们: ```python # 填充缺失值 df.fillna(value=0, inplace=True) # 删除重复项 df.drop_duplicates(inplace=True) print("\n清洗后的 DataFrame:") print(df) ``` #### 转换特征以便于建模 有时需要调整某些字段的内容使其更适合机器学习算法的要求;比如标准化连续变量使得均值接近零而方差等于一,或者创建哑编码表示分类属性等等: ```python from sklearn.preprocessing import StandardScaler scaler = StandardScaler() scaled_features = scaler.fit_transform(df[['Feature1', 'Feature2']]) df_scaled = pd.DataFrame(scaled_features, columns=['Scaled_Feature1', 'Scaled_Feature2']) print("\n缩放后的 DataFrame:") print(df_scaled) ``` #### 将 Pandas DataFrames 整合成 TensorFlow 输入管道 一旦完成了上述准备工作之后就可以考虑怎样把这些整理好的资料送入神经网络里去了。一种常见的方式就是借助 `tf.data.Dataset.from_tensor_slices()` 函数构建一个 Dataset 对象,它可以直接接受 NumPy 数组作为输入参数——而这正是由 Pandas 所产生的 Series 或者 DataFrame 底层所使用的数据类型之一: ```python import tensorflow as tf dataset = tf.data.Dataset.from_tensor_slices((dict(df),)) for batch in dataset.take(1): for key, value in batch.items(): print(f"{key}: {value}") ``` 以上过程展示了如何无缝衔接这两个强大的 Python 工具链,在实践中可以根据具体需求进一步优化和完善整个流水线设计[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值