[변수 처리] 011011 같은 값을 multiple label encoding 으로 만들어주기

2019. 7. 16. 17:29분석 Python/Data Preprocessing

728x90

 

예를 들어 

사과 배 딸기 귤 바나나

  1    0   1    1    1

 

같은 형태가 있을 때 이것을 다음과 같이 쪼개고 싶을 때가 있다.

사과 배 딸기 귤 바나나 

  1    0   0    0    0

  0    0   1    0    0

  0    0   0    1    0

  0    0   0    0    1

 

그럴 때 고민을 하다가 다음과 같이 처리를 해주면 된다! 

일단 위치 정보를 찾는다

np.where(train_label.values[0] == 1 )[0]

## array([141, 327, 406, 728])

지금 141번 327번 406번 728번 쪽에 있다는 것이다.

 

이걸 하는 방법은 다음과 같이 했다

 

전체 코드 

which = np.where(train_label.values[0] == 1 )[0]
mat = np.zeros((4 , 884) )
for idx , row in enumerate(mat) :
    row[which[idx]] = 1 

 

이렇게 하게 되면 위의 같이 원하는 결과가 나온다. 

 

이걸 했던 이유는 현재 추천 알고리즘을 DNNClassifier에 돌리고 싶은데, custom loss function이 안 되는 것 같으므로, 

같은 인풋에 다른 타겟을 여러 개로 한 식으로 바꾸려고 한다.

그다음 예측을 통해 확률값을 얻고(아마 softmax) 그것에 탑 몇 개를 뽑아서 이것을 추천한 것으로 뽑는 식으로 진행하려고 한다!

 

여기서 동일한 인풋을 가져야 하므로 다음과 같이 코드를 하였다.

import time
start = time.time()
total_df = pd.DataFrame([], columns = total_train.columns )
total = np.array([], dtype=np.int64).reshape( 0,len(train_label.columns) )
for i ,  df_row in zip(train_label.values , total_train.iterrows() ) :
    which = np.where(i == 1 )[0]
    mat = np.zeros(( len(which ) , 884) )
    for idx , row in enumerate(mat) :
        row[which[idx]] = 1 
    total = np.concatenate([total, mat ])
    id__ , row__ = df_row 
    if id__ % 1000 == 0 :
        print(id__)
    total_df = total_df.append([row__]*len(which) ,ignore_index=True )
print("소요시간 : " , time.time() - start )

 

엄청 느리다!

 

그냥 lowlevel로 짜게 되면 상관이 없는데,  DNNLinearCombinedClassifier 쓰려고 하니 저런 테크닉이 필요할 것 같다.

일단 결과는 나와바야 알겠지만!

728x90