如何在 scikit 学习模型中使用 Tensorflow 嵌入?

Posted

技术标签:

【中文标题】如何在 scikit 学习模型中使用 Tensorflow 嵌入?【英文标题】:How to use Tensorflow embeddings in scikit learn models? 【发布时间】:2021-09-26 12:31:39 【问题描述】:

我将尝试将text data 用于linear regression model 作为inputconverting my text data to vectors using Universal sentence encodertensorflow hub 作为预训练模型,但这给了我tf.tensors,现在我无法拆分数据scikit learn 线性回归模型的训练和测试,因为我的目标特征是连续的。

This gives me embeddings (i.e vectors of shape (1,512) for each text in my pandas dataframe text column)

import tensorflow_hub as hub
model_url = 'https://tfhub.dev/google/universal-sentence-encoder-large/5'
model = hub.load(model_url)
embeddings = model(train['excerpt'])

这就是数据的样子:

         id                  excerpt                                  target    
0   c12129c31   When the young people returned to the ballroom...   -0.340259   
1   85aa80a4c   All through dinner time, Mrs. Fayre was somewh...   -0.315372   
2   b69ac6792   As Roger had predicted, the snow departed as q...   -0.580118   
3   dd1000b26   And outside before the palace a great garden w...   -1.054013   
4   37c1b32fb   Once upon a time there were Three Bears who li...   0.247197    

这是嵌入的外观:

tf.Tensor: shape=(2834, 512), dtype=float32, numpy=
array([[-0.06747025,  0.02054032, -0.01223458, ...,  0.03468879,
        -0.04216784,  0.01212691],
       [-0.01053216,  0.01346854,  0.01992477, ...,  0.03078162,
        -0.0226634 ,  0.04429556],
       [-0.10778417,  0.01735378,  0.00803178, ...,  0.00345916,
         0.00552441, -0.02448413],
       ...,
       [ 0.0364146 ,  0.02996029, -0.06757646, ..., -0.00335971,
        -0.01381749, -0.08319554],
       [ 0.0042374 ,  0.02291174, -0.04473154, ..., -0.02009053,
        -0.00428826, -0.06476445],
       [-0.0141812 ,  0.03879716,  0.03304171, ...,  0.06709221,
        -0.05016331,  0.00868828]], dtype=float32)

现在我想将此嵌入用作线性回归模型或任何使用 scikit learn 的回归模型中的输入。但无法使用train_test_split() 拆分数据,给我错误TypeError: Only integers, slices (:), ellipsis (...), tf.newaxis (None) and scalar tf.int32/tf.int64 tensors are valid indices, got array([1434, 2653, 2620, ..., 749, 2114, 2389])

这就是我拆分数据的方式:

X_train,X_test,y_train,y_test = train_test_split(embeddings,train['target'],test_size =0.2, shuffle =True)

【问题讨论】:

看来你给的数据类型不对,能不能也加上你要拆分的数据显示? 编辑了问题 您没有尝试将输出值作为 train["target"] 给出,而是尝试将其作为 train["target"].values 给出?似乎问题出在那部分,因为由于您将其作为 train["target"] 提供,因此您提供的 pandas Series 包含除值之外的 Series 索引。 即使在使用 train['target'].values 后也出现同样的问题,看起来是嵌入格式的问题 你试过这个X_train,X_test,y_train,y_test = train_test_split(embeddings.numpy(),train['target'].to_numpy(),test_size =0.2, shuffle =True)吗? 【参考方案1】:

train_test_split 中,您正在传递一个张量。相反,您应该像这样传递 NumPy 数组-

X_train,X_test,y_train,y_test = train_test_split(embeddings.numpy(), train['target'],test_size =0.2, shuffle =True)

【讨论】:

以上是关于如何在 scikit 学习模型中使用 Tensorflow 嵌入?的主要内容,如果未能解决你的问题,请参考以下文章

深度学习计算模型/Tensor的读取和存储(PyTorch)

用scikit-learn学习LDA主题模型

如何提速机器学习模型训练

张量Tensor [机器学习的数学基础]

如何将模型 (GLM) 从 h2o 移植到 scikit-learn?

如何为scikit学习随机森林模型设置阈值