加载CSV数据
请注意这是R版的本教程在TensorFlow官方网站。
本教程提供了一个如何将CSV数据从文件加载到TensorFlow数据集的示例tfdatasets.
本教程中使用的数据来自泰坦尼克号的乘客名单。该模型将根据年龄、性别、机票等级等特征,以及乘客是否独自出行,预测乘客幸存的可能性。
设置
TRAIN_DATA_URL < -“https://storage.googleapis.com/tf-datasets/titanic/train.csv”TEST_DATA_URL < -“https://storage.googleapis.com/tf-datasets/titanic/eval.csv”train_file_path < -get_file(“train_csv”TRAIN_DATA_URL)test_file_path < -get_file(“eval.csv”TEST_DATA_URL)
你可以用read.csv
,并将数组传递给TensorFlow。如果你需要扩展到一个大的文件集,或者需要一个与TensorFlow和tfdataset集成的加载器,那么使用make_csv_dataset
功能:
现在从文件中读取CSV数据并创建一个数据集。
train_dataset < -make_csv_dataset(train_file_path,field_delim =",",batch_size =5,num_epochs =1)test_dataset < -train_dataset < -make_csv_dataset(test_file_path,field_delim =",",batch_size =5,num_epochs =1)
我们可以看到数据集的一个元素:
train_dataset% > %网状::as_iterator()% > %网状::iter_next()% > %网状::py_to_r()
## $survive ## tf。张量([0 0 1 1 0)=(5)形状,dtype = int32) # # # # $ # # tf做爱。张量([b'male' b'male' b'female' b'female' b'male'], shape=(5,), dtype=string) ## ## $age ## tf.张量([20.]54.28.29.45.5),形状= (5)dtype n_siblings_spouses美元= float32) # # # # # #特遣部队。张量([0 0 1 0 0],shape=(5,), dtype=int32) ## ## $ parch# # tf。张量([0 0 0 2 0)=(5)形状,dtype = int32) # # # # $ # #特遣部队。张量([7.925 51.8625 26.]15.2458 - 28.5),形状= (5)dtype = float32) # # # # # # $类特遣部队。张量([b' third ' b' first ' b' second ' b' third ' b' first '], shape=(5,), dtype=string) ## ## $deck ## tf。张量([b'unknown' b' e ' b'unknown' b'unknown' b' c '], shape=(5,), dtype=string) ## ## $embark_town ## tf。Tensor([b'Southampton' b'Southampton' b'Southampton' b'Cherbourg' b'Southampton'], shape=(5,), dtype=string) ## ## $alone ## tf.Tensor([b'y' b'y' b'n' b'n' b'y'], shape=(5,), dtype=string)
你们可以看到make_csv_dataset
创建一个张量列表,每个张量代表一个列。这个很像Rdata.frame
,最显著的区别是TensorFlow数据集是一个迭代器——这意味着每次调用iter_next
它将从数据集中生成不同的一批行。
如上所示,CSV中的列是命名的。数据集构造函数将自动选取这些名称。如果正在处理的文件不包含第一行中的列名,则将它们以字符向量的形式传递给column_names
论点的make_csv_dataset
函数。
如果需要从数据集中省略一些列,则创建计划使用的列的列表,并将其传递到(可选)select_columns
构造函数的参数。
数据预处理
CSV文件可以包含多种数据类型。通常,在将数据输入模型之前,您希望将这些混合类型转换为固定长度的向量。
你可以使用任何你喜欢的工具(如nltk或sklearn)对数据进行预处理,并将处理后的输出传递给TensorFlow。
TensorFlow有一个用于描述常用输入转换的内置系统:feature_column
,我们将通过名为feature_spec
.
在模型内部进行预处理的主要好处是,当导出模型时,它包含预处理。通过这种方式,您可以直接将原始数据传递给模型。
首先让我们定义规范
.
规范< -feature_spec(train_dataset幸存下来~)。
现在我们可以加上步骤
我们的规范告诉我们如何转换数据。
连续的数据
对于连续数据,我们使用step_numeric_column
:
添加一个步骤后,我们需要适合
我们的规格:
然后我们可以创建一个layer_dense_features
它接收我们的数据集作为输入,并返回一个包含所有密集特征的数组:
层< -layer_dense_features(feature_columns =dense_features(规范)train_dataset% > %网状::as_iterator()% > %网状::iter_next()% > %层()
# #特遣部队。张量(# #[[48。34.375 - 1。3.) # #(40。7.225 0。0.) # #(28。8.7125 0。0. ] ## [42. 8.4042 0. 1. ] ## [33. 7.8958 0. 0. ]], shape=(5, 4), dtype=float32)
将神经网络中的所有数字特征规范化通常是个好主意。我们可以用同样的step_numeric_column
加上一个额外的参数' ':
规范< -feature_spec(train_dataset幸存下来~)。规范< -规范% > %step_numeric_column(all_numeric(),normalizer_fn =scaler_standard())
然后我们就可以创建layer_dense_features
看一下输出:
规范< -适合(规范)层< -layer_dense_features(feature_columns =dense_features(规范)train_dataset% > %网状::as_iterator()% > %网状::iter_next()% > %层()
# #特遣部队。张量(## [[-1.6755021 0.02076224 0.54201424 1.9260981]## [-0.0509259 -0.13340482 0.54201424 0.73245984]## [1.8561853 -0.3152102 -0.48006976 -0.4611784]## [1.644284 -0.38669372 -0.48006976 -0.4611784]## [-0.26282716 0.4161861 0.54201424 1.9260981]],shape=(5,4), dtype=float32)
现在,输出被缩放了。
分类数据
分类数据不能直接包含在模型矩阵中——我们需要执行某种转换,以便将它们表示为数字。在实践中,将类别变量表示为一组单热编码列是非常常见的。
方法也可以执行此转换feature_spec
API:
我们再来定义一下规范
并添加一些步骤:
规范< -feature_spec(train_dataset幸存下来~)。规范< -规范% > %step_categorical_column_with_vocabulary_list(性)% > %step_indicator_column(性)
我们现在可以看到输出:
规范< -适合(规范)层< -layer_dense_features(feature_columns =dense_features(规范)train_dataset% > %网状::as_iterator()% > %网状::iter_next()% > %层()
# #特遣部队。张量(# #[[0。1.) # #(0。1.) # #(1。0.) # #(1。0.) # #(0。 1.]], shape=(5, 2), dtype=float32)
我们可以看到这生成了两个列,分别对应列中的不同类别性
的数据集。
对数据集中的所有分类特征进行这种转换很简单:
规范< -feature_spec(train_dataset幸存下来~)。规范< -规范% > %step_categorical_column_with_vocabulary_list(all_nominal())% > %step_indicator_column(all_nominal())
现在让我们看看输出:
规范< -适合(规范)层< -layer_dense_features(feature_columns =dense_features(规范)train_dataset% > %网状::as_iterator()% > %网状::iter_next()% > %层()
# #特遣部队。张量(# #[[0。1.1.0.0.0.0.0.0. 1. 0. 0. 0. 0. 1. 0. 0. 1.] ## [1. 0. 0. 0. 1. 0. 0. 0. 0. 1. 0. 0. 0. 0. 1. 0. 1. 0.] ## [0. 1. 0. 0. 1. 0. 0. 0. 0. 0. 0. 1. 0. 1. 0. 0. 0. 1.] ## [0. 1. 0. 0. 1. 0. 0. 0. 0. 0. 0. 1. 0. 0. 1. 0. 0. 1.] ## [0. 1. 1. 0. 0. 0. 0. 1. 0. 0. 0. 0. 1. 0. 0. 0. 0. 1.]], shape=(5, 18), dtype=float32)
结合所有的
我们演示了如何使用feature_spec
接口分别用于连续数据和分类数据。还可以将所有转换合并到单个转换中规范
:
规范< -feature_spec(train_dataset幸存下来~)。% > %step_numeric_column(all_numeric(),normalizer_fn =scaler_standard())% > %step_categorical_column_with_vocabulary_list(all_nominal())% > %step_indicator_column(all_nominal())
现在,让我们把规范
看一下输出:
规范< -适合(规范)层< -layer_dense_features(feature_columns =dense_features(规范)train_dataset% > %网状::as_iterator()% > %网状::iter_next()% > %层()
# #特遣部队。张量(## [[0.93794656 0.]1.0.0.1.# # 0。0.0.0. 0. 1. ## 0. 0. 0. 1. 0. -0.5539651 ## -0.48006976 -0.4611784 0. 1. ] ## [-0.0509259 0. 1. 0. 0. 1. ## 0. 0. 0. 0. 0. 0. ## 1. 1. 0. 0. 0. -0.5659972 ## -0.48006976 -0.4611784 0. 1. ] ## [-1.9700449 1. 0. 0. 1. 0. ## 0. 0. 0. 0. 0. 0. ## 1. 0. 0. 1. 0. -0.23657836 ## 0.54201424 0.73245984 0. 1. ] ## [-0.5453621 0. 1. 0. 0. 1. ## 0. 0. 0. 0. 0. 0. ## 1. 0. 0. 1. 0. -0.5461019 ## -0.48006976 -0.4611784 0. 1. ] ## [-0.8985309 1. 0. 0. 0. 1. ## 0. 0. 0. 0. 0. 0. ## 1. 0. 0. 1. 0. 0.5683259 ## 4.63035 1.9260981 1. 0. ]], shape=(5, 22), dtype=float32)
这就结束了我们的数据预处理步骤,现在我们可以专注于建立一个训练模型。
建筑模型
我们将使用Keras顺序API构建一个模型,该模型使用我们在规范
:
模型< -keras_model_sequential()% > %layer_dense_features(feature_columns =dense_features(规范)% > %layer_dense(单位=128,激活=“relu”)% > %layer_dense(单位=128,激活=“relu”)% > %layer_dense(单位=1,激活=“乙状结肠”)模型% > %编译(损失=“binary_crossentropy”,优化器=“亚当”,指标=“准确性”)
培训、评估和预测
现在可以实例化和训练模型了。
模型% > %适合(train_dataset% > %dataset_use_spec(规范)% > %dataset_shuffle(500),时代=20.,validation_data =test_dataset% > %dataset_use_spec(规范),verbose =2)
# #时代1/20 # # 53/53 - 1 s -损失:0.5752 -准确性:0.7197 - val_loss: 0.0000 e + 00 - val_accuracy: 0.0000 e + 00 # #时代# # 53/53——2/20 0 -损失:0.4546 -准确性:0.8144 - val_loss: 0.4310 - val_accuracy: 0.8068 # #时代# # 53/53——3/20 0 -损失:0.4273 -准确性:0.8068 - val_loss: 0.4009 - val_accuracy: 0.8371 # #时代# # 53/53——4/20 0 -损失:0.4070 -准确性:0.8333 - val_loss: 0.3742 - val_accuracy: 0.8598 # #时代# # 53/53——5/20 0 -损失:0.3938 -准确性:0.8561 - val_loss:0.3579 - 0.8523 val_accuracy: # #时代# # 53/53——6/20 0 -损失:0.3824 -准确性:0.8333 - val_loss: 0.3593 - val_accuracy: 0.8598 # #时代# # 53/53——7/20 0 -损失:0.3675 -准确性:0.8182 - val_loss: 0.3362 - val_accuracy: 0.8750 # #时代# # 53/53——8/20 0 -损失:0.3647 -准确性:0.8598 - val_loss: 0.3340 - val_accuracy: 0.8598 # #时代# # 53/53——9/20 0 -损失:0.3317 -准确性:0.8788 - val_loss: 0.3158 - val_accuracy: 0.8902 # #时代# # 53/53——10/20 0 -损失:0.3411 - 0.8750精度:- val_loss: 0.3180 - val_accuracy: 0.8864 # #时代# # 53/53——11/20 0 -损失:0.3312 -准确性:0.8826 - val_loss: 0.3023 - val_accuracy: 0.8826 # #时代# # 53/53——12/20 0 -损失:0.3209 -准确性:0.8598 - val_loss: 0.3082 - val_accuracy: 0.8826 # #时代# # 53/53——13/20 0 -损失:0.3173 -准确性:0.8712 - val_loss: 0.2955 - val_accuracy: 0.8864 # #时代# # 53/53——14/20 0 -损失:0.3176 -准确性:0.8788 - val_loss: 0.2820 - val_accuracy:0.8902 # #时代# # 53/53——15/20 0 -损失:0.3172 -准确性:0.8561 - val_loss: 0.2811 - val_accuracy: 0.8977 # #时代# # 53/53——16/20 0 -损失:0.3068 -准确性:0.8902 - val_loss: 0.2851 - val_accuracy: 0.8939 # #时代# # 53/53——17/20 0 -损失:0.2970 -准确性:0.8750 - val_loss: 0.2674 - val_accuracy: 0.9053 # #时代# # 53/53——18/20 0 -损失:0.2874 -准确性:0.8826 - val_loss: 0.2665 - val_accuracy: 0.8977 # #时代# # 53/53——19/20 0 -损失:0.2823 -精度:0.8977 - val_loss: 0.2544 - val_accuracy: 0.9091 ##纪元20/20 ## 53/53 - 0s -损耗:0.2818 -精度:0.8826 - val_loss: 0.2601 - val_accuracy: 0.9091
一旦训练好模型,就可以在test_data集上检查它的准确性。
模型% > %评估(test_dataset% > %dataset_use_spec(规范),verbose =0)
# # # #[1]美元损失精度0.2602749 # # # # # # 0.9090909 [1]
你也可以用预测
推断一个批或批数据集上的标签:
批< -test_dataset% > %网状::as_iterator()% > %网状::iter_next()% > %网状::py_to_r()预测(批处理模式)
(1) # # # # # # 0.01933812 [1] [2] 0.17113033 # # # # 0.07307167 [3] [4] 0.98227388 # # 0.98028392 [5]