Python使用tensorflow读取csv训练DNN模型(泰坦尼克号生存与死亡概率预测)

部署运行你感兴趣的模型镜像

本案例主要使用tensorflow和jupyter notebook进行DNN模型训练

1.导入所需的包

import functools
import numpy as np
np.set_printoptions(precision=3,suppress=True)
import tensorflow as tf
train_file_path="./titanic/train.csv"
test_file_path="./titanic/test.csv"

2.加载数据

#标签列
LABEL_COLUMN="survived"
LABELS=[0,1]
def get_dataset(file_path):
    """
    构建tensorflow的数据集格式
    """
    dataset=tf.data.experimental.make_csv_dataset(
        file_path,
        batch_size=12,
        label_name=LABEL_COLUMN,
        na_value="?",
        num_epochs=1,
        ignore_errors=True)
    
    return dataset
#将train和test的csv,分别加载成tensorflow的对象格式
raw_train_data=get_dataset(train_file_path)
raw_test_data=get_dataset(test_file_path)
#测试一个批次
examples,labels=next(iter(raw_train_data))
print("EXAMPLES:\n",examples,"\n")
print("LABELS:\n",labels)

在这里插入图片描述
3.数据预处理
机器学习模型的输入,只能是数字
分类数据

#分类数据的码表
CATEGORIES={
    'sex':['male','female'],
    'class':['First','Second','Third'],
    'deck':['A','B','C','D','E','F','G','H','I','J'],
    'embark_town':['Cherbourg','Southhampton','Queenstown'],
    'alone':['y','n']
}
categorical_columns=[]
for feature,vocab in CATEGORIES.items():
    #提供码表的特征输入
    cat_col=tf.feature_column.categorical_column_with_vocabulary_list(
        key=feature,vocabulary_list=vocab)
    categorical_columns.append(tf.feature_column.indicator_column(cat_col))
#分类特征列
categorical_columns

在这里插入图片描述
连续数据

def process_continuous_data(mean,data):
    #标准化数据的函数
    data=tf.cast(data,tf.float32)*1/(2*mean)
    return tf.reshape(data,[-1,1])
#提前算好的均值
MEANS={
    'age':29.631308,
    'n_siblings_spouses':0.545455,
    'parch':0.379585,
    'fare':34.385399
}
numerical_columns=[]
for feature in MEANS.keys():
    num_col=tf.feature_column.numeric_column(
    feature,normalizer_fn=functools.partial(process_continuous_data,MEANS[feature]))
    numerical_columns.append(num_col)
#连续特征列的列表
numerical_columns

在这里插入图片描述
4.构建DNN深度学习模型
创建输入层layer
将这两个特征列的集合相加,并且传给tf.keras.layers.DenseFeatures从而创建一个进行预处理的输入层。

preprocessing_layer=tf.keras.layers.DenseFeatures(
    categorical_columns+numerical_columns)

从preprocessing_layer开始构建tf.keras.Sequential.

#构建一个DNN模型g(f(x))
model=tf.keras.Sequential([
    preprocessing_layer,
    tf.keras.layers.Dense(64,activation='relu'),
    tf.keras.layers.Dense(32,activation='relu'),
    tf.keras.layers.Dense(16,activation='relu'),
    tf.keras.layers.Dense(1,activation='sigmoid'),
])
model.compile(
    loss='binary_crossentropy',
    optimizer='adam',
    metrics=['accuracy'])

5.训练、评估和预测
现在可以实例化和训练模型

train_data=raw_train_data.shuffle(500)
test_data=raw_test_data
model.fit(train_data,epochs=20)

在这里插入图片描述
在这里插入图片描述

model.summary()

在这里插入图片描述
当模型训练完成的时候,可以在测试集test_data上检查准确性

test_loss,test_accuracy=model.evaluate(test_data)
print()
print(f'Test Loss {test_loss},Test Accuracy {test_accuracy}')

在这里插入图片描述
使用tf.keras.Model.predict推断一个批次或多个批次的标签

predictions=model.predict(test_data)
predictions[:10]

在这里插入图片描述

list(test_data)[0][1]

在这里插入图片描述

#显示部分结果
for prediction,survived in zip(predictions[:10],list(test_data)[0][1][:10]):
    is_survived="SURVIVED" if bool(survived) else 'DIED'
    print(f"预测活着的概率:{prediction[0]}|实际值:{is_survived}")

在这里插入图片描述

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

TensorFlow-v2.15

TensorFlow-v2.15

TensorFlow

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

<think> 我们根据引用内容,总结使用TensorFlow读取CSV文件的步骤: 1. 使用`tf.data.TextLineDataset`读取CSV文件(按行读取) 2. 定义解析函数,将每一行解析为特征和标签(根据CSV格式) 3. 对数据集进行批处理、重复、预取等操作以提高效率 根据引用[1]和[3],我们可以构建一个通用的读取CSV文件的流程。 步骤: 1. 导入必要的库:tensorflow和os等。 2. 定义CSV文件的路径。 3. 使用`tf.data.TextLineDataset`创建数据集,跳过标题行(如果有)。 4. 定义解析函数,使用`tf.io.decode_csv`来解析每一行。 5. 将解析函数映射到数据集。 6. 对数据集进行批处理等操作。 注意:引用[3]中使用了`csv_reader_dataset`,但未给出具体定义,因此我们将按照引用[1]和通用方法来实现。 下面我们给出一个具体的代码示例,假设CSV文件有三列:Name, Age, Occupation(如引用[1]中所述),并且我们想读取这些数据。 但是,用户的需求是读取CSV文件,并不指定具体结构。因此,我们以通用格式为例,同时参考引用[3]中的方式(假设有特征和标签)。 如果CSV文件中包含标题行,我们通常需要跳过第一行。 示例代码: 假设文件路径:`file_path = "C:/path/to/your/file.csv"` 步骤: 1. 创建TextLineDataset 2. 跳过第一行(标题) 3. 定义解析函数,指定每一列的数据类型和默认值 4. 映射解析函数 5. 批处理 注意:在解析CSV行时,需要根据列数指定每个字段的类型和默认值。 例如,对于三列(Name, Age, Occupation)的CSV文件,我们可以这样解析: ```python import tensorflow as tf # 文件路径 file_path = "C:/Users/30597/Desktop/sye/people.csv" # 创建数据集,跳过第一行 dataset = tf.data.TextLineDataset(file_path).skip(1) # 定义解析每一行的函数 def parse_line(line): # 指定每列的类型和默认值,这里三列:字符串、整数、字符串 record_defaults = [[""], [0], [""]] # 解析一行 fields = tf.io.decode_csv(line, record_defaults) # 如果希望将每一列分开,可以返回一个元组 # 例如,这里返回一个字典,键为列名(但这里我们没有列名信息,可以按位置) # 或者直接按位置返回,比如:return fields[0], fields[1] 等 # 这里我们返回一个字典 return {"Name": fields[0], "Age": fields[1], "Occupation": fields[2]} # 应用解析函数 dataset = dataset.map(parse_line) # 批处理 batch_size = 32 dataset = dataset.batch(batch_size) # 迭代一个批次查看 for batch in dataset.take(1): print(batch) ``` 但是,如果CSV文件包含特征和标签(比如在机器学习任务中),我们可能希望将某些列作为特征,某些列作为标签。 例如,在引用[3]中,有`x_batch`和`y_batch`,说明在解析时已经将特征和标签分开。 假设我们的CSV文件格式为:特征1, 特征2, ... , 标签 那么解析函数可以这样写: ```python def parse_line(line): record_defaults = [[0.0], [0.0], [0.0], [0.0], [0]] # 假设前4列是特征,第5列是标签(整数) fields = tf.io.decode_csv(line, record_defaults) # 将前4个字段作为特征,最后一个字段作为标签 features = tf.stack(fields[:-1]) label = fields[-1] return features, label ``` 然后,在批处理后,每个批次就是(features_batch, label_batch)。 引用[1]中提到了使用`tf.data.TextLineDataset`,引用[3]中使用了`csv_reader_dataset`(可能是自定义函数),但核心还是基于`tf.io.decode_csv`。 另外,引用[2]中提到了训练DNN模型,但用户问题只要求读取CSV文件,所以我们先提供读取的方法。 根据上述步骤,我们给出一个通用的读取CSV文件的模板。 注意:TensorFlow还提供了更高级的API,如`tf.data.experimental.CsvDataset`,它可以直接读取CSV文件而无需跳过标题行(可以指定列名和类型),但这里我们按照引用[1]使用`TextLineDataset`。 下面我们使用`TextLineDataset`实现。 最后,我们生成相关问题。 注意:用户要求生成相关问题,且回答中引用的段落末尾添加引用标识。 我们参考的引用有[1][2][3],在回答中我们会适当引用。 </think>以下是使用 PythonTensorFlow 读取 CSV 文件的完整方法,基于您提供的引用内容: ### 1. 基础读取方法(使用 TextLineDataset) ```python import tensorflow as tf import os # 设置文件路径 file_path = "C:/Users/30597/Desktop/sye/people.csv" # [^1] # 创建数据集 dataset = tf.data.TextLineDataset(file_path).skip(1) # 跳过标题行 # 定义解析函数 def parse_line(line): # 指定列类型和默认值 record_defaults = [tf.string, tf.int32, tf.string] # 对应Name, Age, Occupation # 解析CSV行 fields = tf.io.decode_csv(line, record_defaults) return {"Name": fields[0], "Age": fields[1], "Occupation": fields[2]} # 应用解析函数 dataset = dataset.map(parse_line) # 批处理 batch_size = 32 dataset = dataset.batch(batch_size) # 迭代查看数据 for batch in dataset.take(1): print(batch) ``` ### 2. 高级方法(带特征工程) ```python # 定义特征列 feature_columns = [ tf.feature_column.numeric_column("Age"), tf.feature_column.categorical_column_with_vocabulary_list( "Occupation", ["Engineer", "Teacher", "Doctor"]) ] # 创建输入函数 def input_fn(file_path, shuffle=True, batch_size=32): dataset = tf.data.TextLineDataset(file_path).skip(1) dataset = dataset.map(parse_line) if shuffle: dataset = dataset.shuffle(buffer_size=1000) dataset = dataset.batch(batch_size) return dataset # 使用输入函数 train_data = input_fn("train.csv") test_data = input_fn("test.csv", shuffle=False) # [^3] ``` ### 3. 结合模型训练 ```python # 创建DNN模型 model = tf.keras.Sequential([ tf.keras.layers.DenseFeatures(feature_columns), tf.keras.layers.Dense(128, activation='relu'), tf.keras.layers.Dense(1) # 输出层 ]) # 编译模型 model.compile(optimizer='adam', loss=tf.keras.losses.BinaryCrossentropy(from_logits=True), metrics=['accuracy']) # 训练模型 model.fit(train_data, epochs=10, validation_data=test_data) # [^2] ``` ### 关键要点: 1. **数据解析**:使用 `tf.io.decode_csv` 解析CSV行数据 2. **批处理**:通过 `.batch()` 方法创建批次数据 3. **特征工程**:使用 `tf.feature_column` 定义特征处理逻辑 4. **性能优化**: - `.shuffle()` 打乱数据顺序 - `.prefetch()` 预加载数据提高效率 - 使用 `tf.data.experimental.CsvDataset` 替代方案(更高效)
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值