[변수 처리] 011011 같은 값을 multiple label encoding 으로 만들어주기
2019. 7. 16. 17:29ㆍ분석 Python/Data Preprocessing
예를 들어
사과 배 딸기 귤 바나나
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
'분석 Python > Data Preprocessing' 카테고리의 다른 글
[변수 처리] Python에서 범주형 변수(Categorical) 다루기 (0) | 2019.09.13 |
---|---|
[ 변수 처리] 파이썬 결측치 대체 알고리즘 비교 예시 (4) | 2019.09.10 |
[변수 생성] AutoEncoder로 파생변수 만들기 -2 (모델링 파트) Catboost (0) | 2019.06.02 |
[변수 생성] AutoEncoder로 파생변수 만들기 (0) | 2019.06.02 |
[ 변수 생성] pandas groupby 와 merge로 파생변수 넣기 (0) | 2019.05.21 |