machine-learning - 如何将一对向量提供给分类器以对相似/不相似进行分类
问题描述
我正在尝试将文档向量对(Doc2Vec,每个文档 300 个特征)分类为相似/不相似。我尝试了具有附加功能(如文档大小等)的距离测量(余弦等),但没有达到完美的结果,特别是因为我怀疑只有一些功能对我的问题有意义。
将两个向量提供给分类器(LogisticRegression、SVM 等)的简单但有效的方法是什么?
- 我已经测试了从另一个向量中减去一个向量并将绝对结果用作特征向量:
abs(vec1 -vec2)
但这比距离混乱更糟糕 - 我还尝试了两个向量的串联,结果也更差。我怀疑维度加倍会增加训练样本的需求,至少对于某些分类器而言?
是否有最先进的方法来分类特征向量之间的相似性或关系?或者,如果有并发的方法,对于哪个问题/分类器更喜欢哪一个?
解决方案
通常,您的目标是对文档进行矢量化(例如 via Doc2Vec
),以提供向量之间的相似性是有用的连续相似性度量的向量。(通常这是余弦相似性,但在某些情况下,欧几里得距离也可能值得尝试。)
如果从阶段出来的向量Doc2Vec
还没有表现出这一点,那么首先要做的是调试和优化该过程。这可能涉及:
- 仔细检查所有内容,包括过程的记录输出,以查找错误
- 调整文档预处理,以确保保留显着的文档特征并丢弃噪声
- 调整
Doc2Vec
元参数和模式,以确保生成的向量对最终目标中重要的相似性类型敏感。
Doc2Vec
如果没有关于您的数据大小和特征、到目前为止的选择/代码和最终目标的更多详细信息,很难说更多关于改进该步骤的信息。
您如何确定两个文档是否“足够相似”?你需要多少这样的评估数据来帮助Doc2Vec
以可重复的、定量的方式对不同的模型进行评分。(能够进行这种自动评分将让您测试更多的Doc2Vec
排列。)是否有文档对的示例,其中简单的 doc-vector cosine-similarity 运行良好或运行不佳?
到目前为止,我在您选择的单词中看到了两个危险信号:
- “没有达到完美的结果”——获得“完美”的结果是一个不切实际的目标。考虑到项目的资源和对复杂性的容忍度,您想找到接近最新技术的东西
- “每个文档 300 个功能” -
Doc2Vec
并没有真正找到独立的“300 个功能”。它是一个 300 维的“密集”“嵌入”向量。每个方向——不仅仅是 300 个轴——都可能是有意义的。因此,即使某些“方向”对您的需求更为重要,它们也不太可能与精确的尺寸轴完全相关。
可能对(v1 - v2)
差异或(v1 || v2)
串联的分类器可以帮助改进“是否足够相似”的决定,但您需要大量的训练数据,并且可能需要一个非常复杂的分类器。
推荐阅读
- c++ - fmt::dynamic_format_arg_store 替换/实现 std::format
- java - com.google.gson.stream.MalformedJsonException 错误:如何解决?
- scala - 是否有一个 Scala stdlib 函数可以将 Stream[Byte] 转换为 Stream[InputStream] ,其中每个 InputStream 都是 N 元字节以纯粹的惰性方式?
- html - 如何在轮播中隐藏单个幻灯片
- java - 为什么要实现 Hibernate @OneToMany 关系我收到此错误?“实体映射中的重复列:XXX.Address 列:id”
- vue.js - 我如何让按钮隐藏未完成的任务
- kubernetes - 有没有办法为 helm post-install hook 启用 shareProcessNamespace?
- opengl - 多个视口与多个帧缓冲区之间的使用差异是什么?
- reactjs - 如何在 MUI 5 的断点属性中访问主题?
- java - 收藏
使用 Stream API 时无法转换为 int