python DictVectorizer 两个坑(无用字段和数字类型)

功能描述:载入一些数据,然后将其中的字符串转换为数字。
注意:我这里使用,是一种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时,如果数据类型本身是数字,请注意传入的数据类型。

哈哈,希望能帮助到别人,但是也许只有我这么傻会遇到这样的问题吧,哈哈哈==

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值