[캐글] Preprocessing, 데이터분리, LGBM 학습, feature importance 시각화

박경민·2023년 2월 16일
0

[Projects]

목록 보기
5/12
post-custom-banner

데이터 Preprocessing 수행

object feature 들을 Label Encoding 해주기 : factorize() 이용
객체형을 가진 피처들을 0과 1의 라벨을 달아주는 과정이다. 이때는 현재 학습용 데이터와 테스트용 데이터로 분리된 프레임을 결합해주는 코드가 필요하다.

결합 데이터프레임 = pd.concat([프레임1, 프레임2])
데이터 프레임을 결합한다.

app_train.shape, app_test.shape

apps = pd.concat([app_train, app_test])
apps.shape

apps의 타깃만 카운트 해주면 다음과 같다. 0.0 과 1.0 은 학습 데이터에서 나온 것이고, NaN은 테스트 데이터에서 온 것이다.

합쳐주었으므로 이제 본격적으로 라벨링을 진행해주자. dtypes 를 이용해 객체인 것만 뽑아주어 불리언 인덱싱 후 리스트로 반환하여 변수에 넣어주자. 반복문을 돌며 라벨링을 수행해준다.

#불리언 인덱싱 후 리스트로 반환
object_columns = apps.dtypes[apps.dtypes == 'object'].index.tolist()

#반복문 돌면서 factorize 수행. 기존 column 이름과 같이 넣어줌. 
for column in object_columns:
  apps[column] = pd.factorize(apps[column])[0]

이제 apps.info()로 확인해주면 더 이상 object 는 없고 숫자 dtypes 만 있는 것을 확인할 수 있다.

분리를 위해서 Null 값 일괄 반환

isnull().sum() 을 이용하면 피처별로 널 값의 개수를 셀 수 있다.

널 값이 이렇게 많은 것은 모두 테스트 데이터 때문이다. 따라서 빈 곳에 모두 -999를 넣어준다. (분리를 위해서다!)

# -999로 모든 컬럼들의 Null값 변환
apps = apps.fillna(-999)

apps.isnull().sum().head(100)

다시 분리
-999인 값을 찾아 불리언 인덱싱 하여 다시 분리해준다.

app_train = apps[apps['TARGET'] != -999]
app_test = apps[apps['TARGET'] == -999]

#테스트 데이터의 Target은 아예 삭제해야 함.(-999로 채워넣을 것이 아니라)
app_test = app_test.drop('TARGET', axis = 1, inplace = False)
app_test.shape

학습 수행, 학습 데이터에서 피처와 타깃 분리 , 학습용과 검증용 데이터 분리

학습용과 검증용 데이터는 잘 분리되어 있지만 학습용 안에서 x와 y사 분리되지 않았다.
x는 ftr_app에, y는 target_app에 넣어주자. 그리고 나서 x와 y를 다시 70, 30으로 학습과 검증을 위해 쪼개주자. 총 4개의 데이터가 만들어진다.

ftr_app = app_train.drop(['SK_ID_CURR', 'TARGET'], axis =1) #x값, 120개
target_app = app_train['TARGET'] #y값, 2개 

from sklearn.model_selection import train_test_split
train_x, valid_x, train_y, valid_y = train_test_split(ftr_app, target_app, test_size = 0.3, random_state = 2020)
train_x.shape, valid_x.shape

train_x 와 valid_x는 각각 입력변수의 테스트용과 검증용이다.

이제 LGBM으로 학습을 수행해보자.

from lightgbm import LGBMClassifier

clf = LGBMClassifier(
        n_jobs=-1, #다 쓰겠다
        n_estimators=1000, #반복횟수
        learning_rate=0.02, 
        num_leaves=32,
        subsample=0.8,
        max_depth=12,
        silent=-1,
        verbose=-1
        )

clf.fit(train_x, train_y, eval_set=[(train_x, train_y), (valid_x, valid_y)], 
        eval_metric= 'auc', verbose= 100, early_stopping_rounds= 50) #50번 반복. 성능 좋아지지 않으면 멈춘다.

valid_auc 성능이 500번과 600번 사이에 크게 좋아지지 않아 학습을 완료했다!

feature importance 시각화
피처 중요도는 plot_importance 를 이용한다.

from lightgbm import plot_importance

plot_importance(clf, figsize=(16, 32))

학습 모델 이용하여 에측, 캐글에 제출해보기

예측은 predit_proba를 사용한다.

#현재 테스트 데이터에 SK_ID_CURR이 들어가 있어 이를 제외한다.
clf.predict_proba(app_test.drop(['SK_ID_CURR'], axis = 1))

#모델 예측을 수행한다.
preds = clf.predict_proba(app_test.drop(['SK_ID_CURR'], axis = 1))[:, 1]

#예측 값을 테스트의 TARGET 에 최종적으로 넣어주고 출력해보자.
app_test['TARGET'] = preds
app_test["TARGET"].head()

#CSV 파일로 만들자
app_test[['SK_ID_CURR', "TARGET"]].to_csv('app_baseline_01.csv', index = False)
!ls

드라이브에 올라간 것을 다운받고 케글에 제출하면 점수를 확인할 수 있다.

profile
Mathematics, Algorithm, and IDEA for AI research🦖
post-custom-banner

0개의 댓글