对于机器学习问题,我为每个样本都有一个位置功能(美国的一个州),如下所示: 整个特征向量看起来像这样:
array(['oklahoma', 'florida', 'idaho', ..., 'pennsylvania', 'alabama',
'washington'], dtype=object)
我不能用sklearn算法直接提供这个,因此我必须以某种方式将其转换为数字特征,但我不知道如何做到这一点。它们是转换这些字符串功能的最佳方法是什么? ASCII转换会起作用吗?
编辑:我希望我的每个州都有自己独特的数值。
答案 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。