我在 Python 的机器学习 scikit-learn 包中使用 SVM 分类器。我的特征是整数。当我调用 fit 函数时,我收到用户警告“Scaler 假定浮点值作为输入,得到 int32”,SVM 返回它的预测,我计算混淆矩阵(我有 2 个类)和预测精度。我试图避免用户警告,所以我将这些功能保存为浮点数。确实,警告消失了,但我得到了一个完全不同的混淆矩阵和预测准确性(令人惊讶的是准确度要低得多)有人知道它为什么会发生吗?更可取的是,我应该将特征作为浮点数还是整数发送?谢谢!
问问题
3188 次
1 回答
8
您应该将它们转换为浮点数,但实现方式取决于整数特征实际表示的内容。
你的整数是什么意思?它们是类别成员指标(例如:1 == 运动、2 == 商业、3 == 媒体、4 == 人......)还是具有顺序关系的数值度量(3 大于 2大于 1)。例如,您不能说“人”大于“媒体”。这是没有意义的,并且会混淆机器学习算法给它这个假设。
因此,应将分类特征转换为将每个特征分解为每个可能类别的几个布尔特征(值为 0.0 或 1.0)。查看 scikit-learn 中的DictVectorizer 类,以更好地理解我所说的分类特征的含义。
如果有数值,只需将它们转换为浮点数,并可能使用 Scaler 将它们松散地置于 [-1, 1] 范围内。如果它们跨越几个数量级(例如单词出现的计数),那么采用计数的对数可能会产生更好的结果。更多关于特征预处理的文档和文档这部分的示例:http: //scikit-learn.org/stable/modules/preprocessing.html
编辑:还阅读本指南,其中包含有关特征表示和预处理的更多详细信息:http ://www.csie.ntu.edu.tw/~cjlin/papers/guide/guide.pdf
于 2012-09-02T18:40:49.890 回答