寻找预处理字符串功能的方法

时间:2013-11-29 16:45:52

标签: python machine-learning scikit-learn

对于机器学习问题,我为每个样本都有一个位置功能(美国的一个州),如下所示: 整个特征向量看起来像这样:

array(['oklahoma', 'florida', 'idaho', ..., 'pennsylvania', 'alabama',
   'washington'], dtype=object)

我不能用sklearn算法直接提供这个,因此我必须以某种方式将其转换为数字特征,但我不知道如何做到这一点。它们是转换这些字符串功能的最佳方法是什么? ASCII转换会起作用吗?

编辑:我希望我的每个州都有自己独特的数值。

3 个答案:

答案 0 :(得分:6)

您可以参考Label preprocessing

from sklearn import preprocessing
le = preprocessing.LabelEncoder()
le.fit(['oklahoma', 'florida', 'idaho', 'pennsylvania', 'alabama',
     'washington'])
le.classes_
# array(['alabama', 'florida', 'idaho', 'oklahoma', 'pennsylvania',
#         'washington'],
#       dtype='|S12')
le.transform(["oklahoma"])
# array([3])

答案 1 :(得分:3)

如果您只想将每个城市名称转换为唯一的数值,那么hash(text)就可以正常使用。

可能需要更复杂的哈希函数,因为每次运行Python时都不能保证这一点。实际上在Python 3.3中,每次都会以不同的方式加盐,除非你专门设置它。 hashlib模块包含各种不同的哈希算法,可能更适合。

答案 2 :(得分:3)

编辑:也许简单的数字映射可以更快,没有冲突:

import hashlib
from numpy import array

features = array(['oklahoma', 'florida', 'idaho', 'pennsylvania', 'alabama','washington'], dtype=object)

numbers = range(0, len(features))
num2string = dict(zip(numbers, features))
string2num = dict(zip(features, numbers))

# read the result
for i in num2string:
    print "%i => '%s'" % (i, num2string[i])

print "usage test:"
print string2num['oklahoma']
print num2string[string2num['oklahoma']]

您将获得数组中每个项目的简单数字序列:

0 => 'oklahoma'
1 => 'florida'
2 => 'idaho'

优点:简单和速度 缺点:如果你改变它在数组中的位置,你会得到相同字符串的不同数字,这与散列字符串不同。

哈希的使用

您可以使用一些精心选择的hask算法来散列字符串。您必须小心哈希函数的冲突数量。如果两个数据具有相同的哈希值,您的输入中就会有一个双重数字。在此示例中,md5哈希函数用于此目的:

import hashlib
from numpy import array


def string_to_num(s):
    return int(hashlib.md5(s).hexdigest(), 16)

features = array(['oklahoma', 'florida', 'idaho', 'pennsylvania', 'alabama','washington'], dtype=object)

# hash those strings
features_string_for_number = {}
for i in features:
    hash_number = string_to_num(i)
    features_string_for_number[hash_number]=i

# read the result
for i in features_string_for_number:
    print "%i => '%s'" % (i, features_string_for_number[i])

print "usage test:"
print string_to_num('oklahoma')
print features_string_for_number[string_to_num('oklahoma')]

散列部分取自here