728x90
#1 불균형한 데이터 분포 전처리하기
#2 (Random Forest) train-test 분할 및 간단한 모델 학습
#3 Validation 데이터 분할, K-fold 교차검증 

1. 분포 상태 확인 후 그룹화

 data.apply(lambda x : len(x.unique()))

모든 인덱스에 대한 값을 한꺼번에 반환하기

  • apply: 데이터프레임["컬럼"].apply(함수명)=> 해당 함수를 우리가 기존에 정의한 데이터프레임 중 A컬럼에 대해 적용df['A'].apply(plus_one) / df['A'].apply(lambda x : x+1)
  • lambda: lambda 매개변수 : 표현식 => 함수를 딱 한 줄만으로ex. (lambda x,y: x + y)(10, 20)
  • len, unique메소드 이용 : unique는 데이터에 고유값들이 어떠한 종류들이 있는지 알고 싶을때 사용하는 메소드

https://wikidocs.net/64
https://koreadatascientist.tistory.com/115
https://jaaamj.tistory.com/112

 

2. 요소 개수를 기준으로 세 개의 그룹으로 분할

2.1 group_1: 2개 이하

이진변수 인코딩(0과 1로 표현)

data['gender'] = data['gender'].replace(['F', 'M'], [0, 1])

 

2.2 group_2: 2개 초과 10개 이하

(연속형 숫자) 극소수의 2초과 값 모두 2로 변환
data.loc[data['child_num']>2, 'child_num'] = 2​

(문자) sklearn의 preprocessing 가운데 LabelEncoder()를 통해 문자형 카테고리를 숫자형으로 변환
label_encoder = preprocessing.LabelEncoder()

for x in ['income_type', 'edu_type', 'family_type', 'house_type']:
  data[x] = label_encoder.fit_transform(data[x])
  print(data[x].unique,"\n---")​

 

2.3 group_3: 10개 초과

(연속형 숫자, 요소 종류가 아주 많을 때)
마찬가지 구간화하되 group_2처럼 통일시키는 게 아니라 구간을 여러 개로 만들어버림:
- numpy의 histogram 메소드(bins=) 통해 bin_dividers 생성
- pandas의 cut 메소드(bins=) 통해 데이터를 실제로 분할
- 그러나 위 결과는 연속형이 아닌 이산형 dtype이므로 pandas의 factorize 함수 통해 int로 변환
=> 일련의 과정을 하나의 함수로 단순화하기.
def make_bin(array, n):
  array = -array #대부분의 요소가 음수이므로 양수로 변환 ★★★
  _, bin_dividers = np.histogram(array, bins = n)
  cut_categories = pd.cut(array, bins = bin_dividers, include_lowest = True, 
                          labels = list(range(n)))
  bined_array = pd.factorize(cut_categories)[0]
  return bined_array​

*value_counts나 plot 사용하려면 numpy-array가 아닌 pandas-Series 형태여야 함. => pd.Series(~)

 

https://www.youtube.com/watch?v=AWfgyln0EOM 

모두 데이콘 합시다아

728x90

+ Recent posts