功能描述:载入一些数据,然后将其中的字符串转换为数字。
注意:我这里使用,是一种one-hot的思想,或者可以理解为词袋或二进制。例如:笔有三类:钢笔、铅笔、毛笔。那么就可以用三位是二进制数来表示,那么钢笔100,铅笔010,毛笔001. 这里有个很明显的缺点,当你的类型很多时,数据就会很稀疏。
先看源码:(数据和转换请看我上一篇博文)
#判断是否为数字
def is_number(s):
try:
float(s)
return True
except ValueError:
pass
try:
import unicodedata
unicodedata.numeric(s)
return True
except (TypeError, ValueError):
pass
return False
def load_data(filepath,delete_columns):
data= []
with open(filepath) as ifile:
for line in ifile:
rowList = {}#需要是字典形式,因为之后需要使用DictVectorizer()
tokens = line.strip().split(',')
columns_lenth=len(tokens)
row_label=np.linspace(0, columns_lenth-1,columns_lenth, endpoint=True)
for i in range(columns_lenth):
#删除列0,数据库的登录号
is_delete=False
for delete in delete_columns:
if i==delete:
is_delete=True
break
if is_delete:continue
token=tokens[i]
if is_number(token):
token=float(token)
rowList[str(row_label[i])]=token
data.append(rowList)
x = np.array(data)
vec = DictVectorizer()#转换字符串数据类型
dx = vec.fit_transform(x).toarray()
# 查看提取后特征的含义
print(vec.get_feature_names())
return dx
if __name__=='__main__':
delete_columns=[0]
dataset=load_data("data/yeast.data",delete_columns)
print(dataset[0])
在这里有两个地方需要注意:
1.传参时,我增加了delete_columns参数,是因为这个是类似与ID的值,我这里分析不需要。并且这是唯一的,如果转换就会需要N(数据长度)长度是值进行表示。这是我遇到的第一坑,即采用DictVectorizer转换字符串时,最好将无用的字段删除。
2.我这里使用了is_number去判断数据类型是否为字符串,这是因为我在使用时发现,读进来的数据默认是字符串类型,因此DictVectorizer会对这些实际为数字的字符串进行转换,同样出现N个值表示的情况。那么第二个坑就是:使用DictVectorizer时,如果数据类型本身是数字,请注意传入的数据类型。
哈哈,希望能帮助到别人,但是也许只有我这么傻会遇到这样的问题吧,哈哈哈==