목차
<PACE: Plan, Analze step>
Class imbalance
When a dataset has a predictor variable that contains more instances of one outcome than another.
majority class(많은 것) vs minority class(작은 것)
class 안에서 majority와 minority의 balance가 맞지 않아도 된다. 문제가 생기는 경우는 majority class가 90% 이상을 차지 할 때 이다. 이 문제를 해결하기 위한 방법은 두 가지이다.
1) upsampling
- dataset이 작을 때 유용하다.
2) downsampling
- dataset이 매우 클 때 유리하다.
뽑는 방법은 랜덤 또는 수학 formula를 쓴다.
Python1
- customer churn
고객이 은행의 서비스를 그만두는 것
1. 라이브러리
import numpy as np
import pandas as pd
2. 데이터
3. feature selection
인덱스나, 개인정보와 관련된 feature는 지운다.
churn_df = df_original.drop(['RowNumber', 'CustomerId', 'Surname', 'Gender'], axis=1)
참고로 내가 만든 모델로 인해 도출한 결과의 ethical problem을 고려할 필요가 있다. 예를 들어 gender는 성차별적인 예측이 나올 수도 있고, 사회적으로 민감한 이슈를 불러올 수 있다.
4. feature extraction
churn_df['Loyalty'] = churn_df['Tenure'] / churn_df['Age']
loyalty라는 컬럼을 새로 만든다. 이 값은 Tenure(은행 이용 년수) / Age(나이) 값으로 일생 동안 이 은행을 이용한 비율을 나타낸다.
5. feature transformation
geography는 값이 france, spain, germany 세 개의 카테고리컬 벨류이다. 이를 불리언 컬럼으로 인코딩하자.
get_dummies() 함수 이용한다.
drop_first=True를 사용하는 까닭은 새로운 컬럼을 3개가 아니라 2개만 사용하자는 뜻이다. 이렇게하면 dataset이 더 짧고 간결해진다. 만약 geography_Germany, geography_spain 모두 0이라면 이 값은 Germany france라는 뜻이다.
# Dummy encode categorical variables
churn_df = pd.get_dummies(churn_df, drop_first=True)
Python2
data
1. columns
data.columns
Index(['name', 'gp', 'min', 'pts', 'fgm', 'fga', 'fg', '3p_made', '3pa', '3p',
'ftm', 'fta', 'ft', 'oreb', 'dreb', 'reb', 'ast', 'stl', 'blk', 'tov',
'target_5yrs'],
dtype='object')
2. analze: info, isna, shape, value_counts()...
data['target_5yrs'].value_counts(normalize=True)
3. selection
여러 근거에 따라 feature을 selection했다. target value인 target_5yrs는 반드시 포함한다.
selected_data= data[['gp','min','pts','fg','3p','ft','ast','stl','blk','tov','target_5yrs']]
4. extraction
extracted_data=selected_data.copy()
extracted_data['total_points']= extracted_data['gp']*extracted_data['pts']
extracted_data['efficiency']= extracted_data['total_points']/ (extracted_data['min']*extracted_data['gp'])
extracted_data=extracted_data.drop(columns=['gp', 'pts', 'min'])