我在机器学习算法方面是新手。我广泛阅读了scikit-learn网站和其他Stack Overflow的帖子,这让我使用RandomForestClassifier和LinearSVC构建了我的第一个机器学习算法。
我正在处理医疗记录。每位患者的住院期间可能(或不可能)与一个对应并发症的代码相关联(如出血、感染、心脏病发作等)。
使用经过CountVectorizer和tfidfTransformer处理和转换的记录,我可以准确预测大部分代码。然而,我想向我的训练数据集中添加更多数据:住院天数、手术次数、手术名称、ICU住院时长等…
在浏览网络和Stack Overflow后,我最终将所有连续/二元/缩放值添加到我的词频数组中。
例如:[0,0,0.34,0,0.45,0, 2, 45]
(最后两个数字是添加的数据,而之前的数字匹配countvectorizer和tfdif.fit_transform(train_set)的结果)
然而,这对我来说似乎是一种粗糙的组合数据方式,大量的词可能会掩盖其他数据。
我尝试将数据设置为:[[0,0,0.34,0,0.45,0],[2],[45]]
,但这不起作用。
我在网上搜索了,但没有找到真正的线索,尽管我可能不是第一个遇到这个问题的人…:p
谢谢你的帮助
编辑:
谢谢你详细而有价值的回答。我非常感激。然而,0-1的范围到底是什么:是{predict_proba}的值(http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html#sklearn.ensemble.RandomForestClassifier.predict)吗?我理解分数是预测模型的准确性。那么,当你有所有基于每个变量的预测时,你是将它们全部平均吗?最终,我在处理多个输出,我猜这不是问题,因为我可以为每个输出获得一个预测(顺便说一下,predict_proba(X)给我一个类似[array([[0.,1.]]), array ([[0.2,0.8]])…..]的数组,使用随机森林分类器。我猜其中一个数字是输出的概率,但我还没有探索这一点!)
回答:
你最初的简单追加到列表中的解决方案是正确的。然而,你应该考虑这意味着什么。如果你有100个词并添加两个额外的特征,每个特定的词将获得与添加的特征相同的“权重” – 也就是说 – 你的添加的特征在模型中不会被特别重视。此外,你在说最后一个特征值为45的特征是倒数第四个特征(0.45)的100倍。
一种常见的解决方法是使用集成模型。不是将这些特征添加到你的词列表中并进行预测,而是首先仅使用词构建一个预测模型。该预测将在0-1范围内,并捕捉文章的“情感”。然后,缩放你的其他变量(最小-最大缩放器,正态分布等)。最后,将词的分数与最后两个缩放变量结合起来,并在类似[.86,.2,.65]的列表上运行另一个预测。通过这种方式,你已经将所有词转换为一个情感分数,你可以将其用作一个特征。
希望这对你有帮助。
根据你上面的更新进行的编辑
是的,在这种情况下你可以使用predict_proba,但如果一切都正确缩放,并且你使用1/0作为类的目标,你不需要predict_proba。关键是将词的预测与其他变量结合起来。你不是平均预测,你是从预测中进行预测!这被称为集成学习。使用你的预测输出作为特征训练另一个模型。这是你需要做的流程图。