분석 Python/Data Preprocessing
[변수 처리] 011011 같은 값을 multiple label encoding 으로 만들어주기
데이터분석뉴비
2019. 7. 16. 17:29
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