具有字符/字符串特征的二进制分类

Posted

技术标签:

【中文标题】具有字符/字符串特征的二进制分类【英文标题】:Binary Classification with char/string features 【发布时间】:2020-09-20 13:45:13 【问题描述】:

我目前正在研究蛋白质的二元分类问题。目标是弄清楚突变是否会将蛋白质功能从活跃变为不活跃。 突变可以发生在构成蛋白质的氨基酸链中的 4 个不同但固定的位置。所以我的特征向量由长度为 4 的字符代码组成,其中每个字符代表发生突变的 4 个位置之一的氨基酸。总共有 21 种可能的氨基酸。

我的问题是如何将这 4 个字符的字符串转换为用于我的分类的数字。 到目前为止,我尝试将每个 cahr 转换为代表该 char 大写字母的 ASCII 十进制数(例如 A->65),但这给了我只有平庸的结果。

我发现了一些关于一种热编码的信息,但我不知道如何使用它,因为除了突变中出现的总共 21 个氨基酸中的 4 个的信息之外,它们出现的位置对我来说也很重要。

这是训练数据的样本:

【问题讨论】:

【参考方案1】:

我的特征向量由长度为 4 的字符代码组成。 ..它们发生的位置对我来说很重要

将您的四字符字符串扩展为四个一字符字符串。这样每个站点就会有一个功能(我们称它们为“S1”、“S2”、“S3”和“S4”)。

这样每个蛋白质位点将独立于其他位点。

如何将这 4 个字符的字符串转换为用于我的分类的数字。

只需将 one-hot-encoding 应用于这些单字符功能中的每一个。假设您在 Scikit-Learn 环境中工作,您可以使用 sklearn_pandas.DataFrameMappersklearn.compose.ColumnTransformer 来执行此映射:

mapper = DataFrameMapper([
  (["S1", "S2", "S3", "S4"], OneHotEncoder())
])
classifier = LogisticRegression()
pipeline = Pipeline([
  ("mapper", mapper),
  ("classifier", classifier)
])
pipeline.fit(X, y)

【讨论】:

谢谢你在没有调整超参数的情况下已经很好地工作了 如果你想研究站点之间的交互,那么你可以将原来的四字符字符串拆分成多个二字符字符串(例如“S12”、“S13”、“S14”、“S23 “, 等等)。或者,一旦您对 Scikit-Learn 感到更舒服,您可以使用 PolynomialFeatures 转换器自动执行此过程。 PolynomialFeatures 转换器可以处理非数字数据吗?在我的情况下字符?如果不是,我需要将一个热编码特征传递给转换器,使用多项式特征会不会有点毫无意义,因为由于一个热编码,所有特征值都是 0 或 1,所以所有高阶多项式都会为 0 或 1。 您需要对字符串进行一次热编码,然后才能应用PolynomialFeatures。但是,如果您将单热编码执行为“稀疏结果模式”,那么大部分零不应成为(内存)问题。也许您可以尝试在某处插入特征选择器(仅测试显着突变之间的交互)。

以上是关于具有字符/字符串特征的二进制分类的主要内容,如果未能解决你的问题,请参考以下文章

用于在 Python 中匹配具有相似 ID 字符串的两个集合的分类器

如何按严重程度排序分类字符串特征?

Pandas Dataframe 将具有两个值的分类列重新映射为二进制

字符串分类特征的一种热编码

如何在 spark ml 中处理决策树、随机森林的分类特征?

什么是哈希算法?(上)