如何使用内置的张量流方法对特征和标签张量执行 sklearn 风格的训练测试拆分?
Posted
技术标签:
【中文标题】如何使用内置的张量流方法对特征和标签张量执行 sklearn 风格的训练测试拆分?【英文标题】:How to perform sklearn style train-test split on feature and label tensors using built in tensorflow methods? 【发布时间】:2021-01-05 23:54:05 【问题描述】:重新发布我的original question,因为即使在对清晰度进行了重大改进之后,社区也没有恢复它。
我正在寻找一种使用 TensorFlow 内置方法将特征和相应标签数据拆分为训练和测试的方法。我的数据已经存在于两个张量中(即tf.Tensor
对象),名为features
和labels
。
我知道如何使用sklearn.model_selection
轻松为numpy 数组执行此操作,如post 所示。此外,我被指出了这个method,它要求数据位于单个张量中。另外,我需要训练集和测试集是不相交的,这与 method 不同(这意味着它们在拆分后不能有共同的数据点)。
我正在寻找一种方法来使用 Tensorflow 中的内置方法来做同样的事情。
我的需求可能条件太多,但基本上需要的是与Tensorflow中sklearn.model_selection.train_test_split()
等价的方法,如下所示:
import tensorflow as tf
X_train, X_test, y_train, y_test = tf.train_test_split(features,
labels,
test_size=0.1,
random_state=123)
【问题讨论】:
我的回答对你有帮助吗@Hawklaz? 好的,谢谢。我希望有一个直接的函数来完成它,类似于它在 sklearn 中的完成方式。但这行得通。 【参考方案1】:您可以通过以下方式使用TF来实现这一点
from typing import Tuple
import tensorflow as tf
def split_train_test(features: tf.Tensor,
labels: tf.Tensor,
test_size: float,
random_state: int = 1729) -> Tuple[tf.Tensor, tf.Tensor, tf.Tensor, tf.Tensor]:
# Generate random masks
random = tf.random.uniform(shape=(tf.shape(features)[0],), seed=random_state)
train_mask = random >= test_size
test_mask = random < test_size
# Gather values
train_features, train_labels = tf.boolean_mask(features, mask=train_mask), tf.boolean_mask(labels, mask=train_mask)
test_features, test_labels = tf.boolean_mask(features, mask=test_mask), tf.boolean_mask(labels, mask=test_mask)
return train_features, test_features, train_labels, test_labels
我们在这里所做的是首先创建一个随机均匀张量,其大小与数据长度相同。
然后我们根据test_size
给出的比率创建布尔掩码,最后我们使用tf.boolean_mask
提取相关部分进行训练/测试
【讨论】:
以上是关于如何使用内置的张量流方法对特征和标签张量执行 sklearn 风格的训练测试拆分?的主要内容,如果未能解决你的问题,请参考以下文章