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

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

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

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

这是训练数据的样本:

【问题讨论】:

    标签: machine-learning classification feature-extraction feature-selection feature-engineering


    【解决方案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。但是,如果您将单热编码执行为“稀疏结果模式”,那么大部分零不应成为(内存)问题。也许您可以尝试在某处插入特征选择器(仅测试显着突变之间的交互)。
    猜你喜欢
    • 2016-03-04
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    相关资源
    最近更新 更多