构建一个 multiclass text classifier,它将 word2vec 生成的向量作为独立变量来预测 class
Build a multiclass text classifier which takes vectors generated from word2vec as independent variables to predict a class
我正在处理患者数据。我想根据一组症状预测前 N 种疾病。
这是我的数据集示例:我总共有大约 1200 个独特的症状和大约 200 个独特的诊断
ID Symptom combination Diagnosis
Patient1: fever, loss of appetite, cold Flu
Patient2: hair loss, blood pressure Thyroid
Patient3: hair loss, blood pressure Flu
Patient4: throat pain, joint pain Viral Fever
..
..
Patient30000: vomiting, nausea Diarrohea
我打算对这个数据集做的是使用症状列为每一行患者数据使用 Word2vec 生成词向量。生成向量后,我想构建一个分类器,每行中的向量是我的自变量,诊断是目标分类变量。
我应该取向量的平均值来生成从 word2vec 生成的特征向量吗?如果是这样,是否有任何说明?
您可以将一堆症状的词向量平均在一起以获得相同维度的单个特征向量。 (如果您的词向量每个都是 100d,则将它们平均在一起得到一个 100d 的摘要向量。)
但是这样的平均比较粗糙,有一定的风险,会稀释平均中每个症状的信息。
(作为一个简化的程式化示例,假设一位护士在晚上 9 点给病人量体温,发现体温为 102.6°F。然后在早上 7 点再次测量,体温为 94.6°F。一位医生问,“我们病人的体温怎么样?”,护士说是平均值,“98.6°F”。下一个病人!”平均隐藏了重要信息:病人同时发烧和危险的体温过低。)
听起来你有一个受控的症状词汇表,只有一些已知的、有上限的、数量不是很多的症状标记:大约 1200。
在这种情况下,将这些转化为每个症状的 presence/absence 的分类向量可能比基于 word2vec 的方法效果更好。也许您有 100 种不同的症状或 10,000 种不同的症状。无论哪种方式,您都可以将它们变成一个由 1 和 0 组成的大向量,按顺序代表每种可能的症状,许多分类器都可以很好地处理该输入。
如果将症状列表视为单词文本,则文本的简单“词袋”表示本质上就是这种分类表示:1200 维 'one-hot' 向量。
除非这是一些要求您使用 word2vec 的学术练习,否则它不是一个好的起点,并且可能不是最佳解决方案的一部分。要训练良好的词向量,您需要比现有更多的数据。 (要重复使用来自其他地方的词向量,它们应该与您的域完全匹配。)
如果你有数万到数十万个术语,以及它们每个用途的许多上下文示例,那么词向量最有可能提供帮助,以绘制它们的细微变化-意味着密集共享 space。只有 30,000 'texts',每个约 3-5 个标记,只有约 1200 个独特的标记,对于 word2vec 来说是相当小的。
(我在 comments on one of your earlier questions 中提出了类似的观点。)
一旦你将每一行变成一个特征向量——无论是通过平均症状词向量,或者可能更好地创建一个词袋表示——你可以而且应该尝试许多不同的分类器,看看哪个有效最好的。
许多是彼此的直接替换,并且根据您的数据量,在一个循环中相互测试许多可能需要不到一个小时或几个小时。
如果完全不知道从哪里开始,this scikit-learn
graphical guide 的 'classifiers' 左上角区域中列出的所有内容都值得一试:
如果您想考虑更广泛的可能性,并获得一个模糊直观的想法,了解哪些可能性最能发现底层高维数据中的某些类型的“形状”,您可以查看所有这些在 this scikit-learn
"classifier comparison" page 中进行了演示,这些图形表示它们如何处理嘈杂的 2d 分类挑战(而不是您的 1200d 挑战):
我建议您一开始不要使用 word2vec,而是使用二进制向量化器。您将为您的数据获得一个 sparce 二进制矩阵。然后应用任何 multi-class classificators。两者都可以从 scikit-learn 获得。
尚不清楚向量应如何增加模型的功能。如果 word2vec 模型是在不相关的数据集上训练的,它们甚至可能适得其反。从该数据集中学习到的接近矢量可能实际上代表了您的目标的对比症状。
我正在处理患者数据。我想根据一组症状预测前 N 种疾病。
这是我的数据集示例:我总共有大约 1200 个独特的症状和大约 200 个独特的诊断
ID Symptom combination Diagnosis
Patient1: fever, loss of appetite, cold Flu
Patient2: hair loss, blood pressure Thyroid
Patient3: hair loss, blood pressure Flu
Patient4: throat pain, joint pain Viral Fever
..
..
Patient30000: vomiting, nausea Diarrohea
我打算对这个数据集做的是使用症状列为每一行患者数据使用 Word2vec 生成词向量。生成向量后,我想构建一个分类器,每行中的向量是我的自变量,诊断是目标分类变量。
我应该取向量的平均值来生成从 word2vec 生成的特征向量吗?如果是这样,是否有任何说明?
您可以将一堆症状的词向量平均在一起以获得相同维度的单个特征向量。 (如果您的词向量每个都是 100d,则将它们平均在一起得到一个 100d 的摘要向量。)
但是这样的平均比较粗糙,有一定的风险,会稀释平均中每个症状的信息。
(作为一个简化的程式化示例,假设一位护士在晚上 9 点给病人量体温,发现体温为 102.6°F。然后在早上 7 点再次测量,体温为 94.6°F。一位医生问,“我们病人的体温怎么样?”,护士说是平均值,“98.6°F”。下一个病人!”平均隐藏了重要信息:病人同时发烧和危险的体温过低。)
听起来你有一个受控的症状词汇表,只有一些已知的、有上限的、数量不是很多的症状标记:大约 1200。
在这种情况下,将这些转化为每个症状的 presence/absence 的分类向量可能比基于 word2vec 的方法效果更好。也许您有 100 种不同的症状或 10,000 种不同的症状。无论哪种方式,您都可以将它们变成一个由 1 和 0 组成的大向量,按顺序代表每种可能的症状,许多分类器都可以很好地处理该输入。
如果将症状列表视为单词文本,则文本的简单“词袋”表示本质上就是这种分类表示:1200 维 'one-hot' 向量。
除非这是一些要求您使用 word2vec 的学术练习,否则它不是一个好的起点,并且可能不是最佳解决方案的一部分。要训练良好的词向量,您需要比现有更多的数据。 (要重复使用来自其他地方的词向量,它们应该与您的域完全匹配。)
如果你有数万到数十万个术语,以及它们每个用途的许多上下文示例,那么词向量最有可能提供帮助,以绘制它们的细微变化-意味着密集共享 space。只有 30,000 'texts',每个约 3-5 个标记,只有约 1200 个独特的标记,对于 word2vec 来说是相当小的。
(我在 comments on one of your earlier questions 中提出了类似的观点。)
一旦你将每一行变成一个特征向量——无论是通过平均症状词向量,或者可能更好地创建一个词袋表示——你可以而且应该尝试许多不同的分类器,看看哪个有效最好的。
许多是彼此的直接替换,并且根据您的数据量,在一个循环中相互测试许多可能需要不到一个小时或几个小时。
如果完全不知道从哪里开始,this scikit-learn
graphical guide 的 'classifiers' 左上角区域中列出的所有内容都值得一试:
如果您想考虑更广泛的可能性,并获得一个模糊直观的想法,了解哪些可能性最能发现底层高维数据中的某些类型的“形状”,您可以查看所有这些在 this scikit-learn
"classifier comparison" page 中进行了演示,这些图形表示它们如何处理嘈杂的 2d 分类挑战(而不是您的 1200d 挑战):
我建议您一开始不要使用 word2vec,而是使用二进制向量化器。您将为您的数据获得一个 sparce 二进制矩阵。然后应用任何 multi-class classificators。两者都可以从 scikit-learn 获得。
尚不清楚向量应如何增加模型的功能。如果 word2vec 模型是在不相关的数据集上训练的,它们甚至可能适得其反。从该数据集中学习到的接近矢量可能实际上代表了您的目标的对比症状。