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