我是 weka 的新手。我的数据包含一列学生姓名。我想在整个列中将这些名称转换为数值。例如:假设有 10 个名称 abcd ,cdef,xyz 等。我想对数据进行预处理,以便对应于每个名称有不同的数值,例如 abcd 更改为 1 ,cdef 更改为 2 等。
两行或多行也可以具有相同的名称。所以在这种情况下,相同的名称应该具有相同的值。
请帮我...
我是 weka 的新手。我的数据包含一列学生姓名。我想在整个列中将这些名称转换为数值。例如:假设有 10 个名称 abcd ,cdef,xyz 等。我想对数据进行预处理,以便对应于每个名称有不同的数值,例如 abcd 更改为 1 ,cdef 更改为 2 等。
两行或多行也可以具有相同的名称。所以在这种情况下,相同的名称应该具有相同的值。
请帮我...
Weka 支持 4 种非关系属性类型:名义、数字、字符串和日期。您可以在 Weka 手册中找到有关它们的更多信息(它可以在您下载 Weka 的同一文件夹中找到),“ARFF 标题部分”一章。
您应该找出“学生姓名”属性的类型(可能是字符串,但也可以是名义上的),并确定具有转换值(数字、名义或字符串)的属性的类型。
可能有两种情况:
(1) 如果现有属性和所需属性的类型相同(string-string 或nominal-nominal,即您只想更改值,而不是属性类型),您可以这样做
(a) 手动 - 在Weka Explorer,然后单击 Edit... 按钮,或者
(b) 使用 Weka 的 Attribute 类函数value
和setValue
.
(2) 类型不同 - Weka 属性类型无法转换,因此您必须使用转换后的值创建并插入新属性,并删除旧属性。可以在 http://weka.wikispaces.com/Programmatic+Use#Step找到如何创建新属性的示例。
据我了解,在 WEKA 的上下文中,将名称严格转换为“数字”类型似乎不是最好的方法 - WEKA 对待数字属性的方式与处理“字符串”或“名义”属性的方式不同(例如,为了运行某些“属性选择”算法,您不能使用“数字”类型 - 它们需要“离散化”或转换为名义形式)。
因此,对于您的情况,我认为您可以使用StringToNominal类将“字符串”名称转换为“名义”类型(该类充当 WEKA“过滤器”,以帮助将给定的“字符串”属性转换为类型的属性“名义”)。这也将注意重复名称 - 名称的“名义”值列表(将在您应用此过滤器后生成)将仅包含一次任何给定名称(出现任意次数)。
“名义”属性还具有隐含的优点,它们确实具有数字表示(值集中的值的索引;类似于 Java 中的“枚举”如何具有数字索引)。因此,您可以将其用作与名称对应的“数字”信息(尽管正如我之前所说,最好将其用作“名义”属性;实际上取决于您的特定用例)。
我遇到了与问题中提到的问题相同的问题,我可以通过以下方式“解决”它。
我首先应用了前面提到的 StringToNominal 过滤器(不要忘记更改属性范围(从“last”到“first-last”))。完成后,我将数据集保存为 LibSVM 格式,这会将标称值更改为数值。
然后,如果您关闭 Weka 并再次打开它,您将拥有具有相同数量特征的相同数据集,但它们将是数字的。现在应该进行一些更改,首先,使用 Normalize 过滤器对数据集中的所有数值进行规范化。之后,将 NumericToNominal 过滤器应用于最后一个属性。
然后,您将拥有一个带有数值的类似数据集。
希望这可以帮助。