# argsort을 사용하면 배열 값이 작은 순서/큰 순서로 인덱스를 정렬할 수 있음
ary = np.array([10, 20, 30, 0])
idx = ary.argsort()
print(idx) # 내림차순 - [3 0 1 2]
print(idx[::-1]) # 오름차순 - [2 1 0 3]
from sklearn.feature_selection import chi2
from sklearn.preprocessing import MinMaxScaler
# 카이제곱 통계량
x = MinMaxScaler().fit_transform(train_x)
c2, _ = chi2(x, train_y)
# 중요도의 상윗값을 출력(상위 5개까지).
idx = np.argsort(c2)[::-1]
top_cols, top_importances = train_x.columns.values[idx][:5], corrs[idx][:5]
print(top_cols, top_importances)
from sklearn.feature_selection import mutual_info_classif
# 상호정보량
mi = mutual_info_classif(train_x, train_y)
# 중요도의 상위를 출력(상위 5개까지).
idx = np.argsort(mi)[::-1]
top_cols, top_importances = train_x.columns.values[idx][:5], corrs[idx][:5]
print(top_cols, top_importances)
import xgboost as xgb
# xgboost
dtrain = xgb.DMatrix(train_x, label=train_y)
# params = {'objective': 'binary:logistic', 'silent': 1, 'random_state': 71} # 기존
params = {'objective': 'binary:logistic', 'verbosity': 0, 'random_state': 71} # 이슈 대응 수정 2021/02/28
num_round = 50
model = xgb.train(params, dtrain, num_round)
# 중요도의 상위를 출력
fscore = model.get_score(importance_type='total_gain')
fscore = sorted([(k, v) for k, v in fscore.items()], key=lambda tpl: tpl[1], reverse=True)
print('xgboost importance')
print(fscore[:5])
GBDT에는 단순한 노이즈가 된는 특징이 있더라도 성능이 쉽게 떨어지지는 않는다. 대량 생산되는 특징 중에서는 노이즈가 되는 특징이 있을 수 있고 완전하지 않을 수 있다.
경진 대회에서는 언더샘플링 또는 특별히 가공하지 않은 기본 모델링 방법을 주로 사용하며 오버샘플링은 그다지 쓰이지 않는다.(캐글에서 SMOTE 잘 쓰이지 않음.)
참고 : 데이터가 뛰어노는 AI 놀이터, 캐글