将几个变量的阈值放入python中的二进制分类代码中

时间:2018-10-02 11:39:40

标签: python numpy binary categorical-data

我在python中有3个变量(年龄,性别,种族),我想从中创建一个独特的分类二进制代码。首先,年龄是一个整数,我想对每个十年(10-20、20-30、30-40等),性别2值和种族包含4个值设定阈值。如何从三个初始变量中返回完整的分类代码?

3 个答案:

答案 0 :(得分:2)

这是一种返回7位代码的方法,其中年龄段的前4位,种族的后2位和性别的前1位。

4位年龄限制了总共只能有16个年龄段,这是合理的,因为它覆盖了0-159岁的年龄段。

4位年龄代码只是整数age//10的4位表示形式,它有效地将年龄值离散化为以下范围:0-9、10-19,...,150-159

种族和性别的代码只是使用race_dictgender_dict进行硬编码

def get_code(age, race, gender): #returns fixed size 7 bit code
    race_dict = {'African':'00','Hispanic':'01','European':'10','Cantonese':'11'} 
    gender_dict = {'Male':'0','Female':'1'}

    age_code = '{0:b}'.format(age//10).zfill(4)
    race_code = race_dict[race]
    gender_code = gender_dict[gender]

    return  age_code + race_code + gender_code
  

输入:年龄:25,种族:“西班牙裔”,性别:“女性”

     

7位代码:0010011

如果出于代码目的,您希望此代码为0-127之间的整数值,则可以使用int(code_str, 2)来实现。

编辑:

要从代码字符串获取numpy数组,请使用np_code_arr = np.fromstring(' '.join(list(code_str)), dtype = int, sep = ' ')

答案 1 :(得分:1)

您可以使用n+1+4维矢量编码。给定您需要的二进制代码,这将是一种实现方法。

您最初的n个条目将编码十年。 1(如果它属于那个十年),否则为0。如果是男性,则下一个(n+1)th项可能是1,如果是女性,则可能是0。同样,对于种族,1(如果属于该类别),0(其他)。

比方说,您有多达几十岁的年龄,而100岁以下。对于98岁的男性,白人,假设您从[0 0 0 0 0 0 0 0 1 1 0 1 0 0 0]年开始到10,您可以做类似100的事情。

import numpy as np

def encodeAge(i, n):
    ageCode=np.zeros(n)
    ageCode[i]=1
    return ageCode

n=10 # number of decades
dict_race={'w':[1,0,0,0],'b':[0,1,0,0],'a':[0,0,1,0],'l':[0,0,0,1]} # white, black, asian, latino
dict_age={i:encodeAge(i, n) for i in range(n)}
dict_gender={'m':[1],'f':[0]}

def encodeAll(age, gender, race):
    # encode age
    code=[]
    code=np.concatenate([code, dict_age[age//10]])
    # encode gender
    code=np.concatenate([code, dict_gender[gender]])
    # encode race
    code=np.concatenate([code, dict_race[race]])
    return code

例如encodeAll(12,'m','w')将返回array([0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 1., 1., 0., 0., 0.])

此编码比建议的其他编码稍长。

答案 2 :(得分:1)

我在这里的答案

年龄 a ,性别 g 和种族 r

code = np.array([int(i) for i in "{0:04b}{1:01b}{2:02b}".format(a//10,g,r)])

对于年龄= 58,性别= 1和种族= 3,输出为:

array([0, 1, 0, 1, 1, 1, 1])