-
2024-02-14스파르타/TIL(Today I Learned) 2024. 2. 15. 01:20
어제와 마찬가지로 바빠서 따로 작성하지 못했다
오늘은 어제와 달리 강의가 아니라 프로젝트관련해서 하다가 못적은 점은 다르지만 말이다이날 노션에 공부한 내용등 적어 둔것은 있지만 옮겨쓸 정도로 정리가 되어있진 않아서 나중에 자격증시험 끝나고 아마 적게 되지 않을까 싶다
(추가하여 수정)
더보기코드 패치노트
(노션에 적어둔 부분 복붙)
- 메인에 올린 부분train, test 분리하는 부분 순서 전처리 다하고나서 분리해주는 방식으로 순서를 뒷부분으로 미루기 위에 위에서 분리하던 부분 주석처리
ID가 유니크한 key, index역할일 것으로 예상되어 확인하는 부분 추가 및 제거 부분 따로 분리하여 추가- 데이터 중복 확인 및 처리중복되는 값이 있는지 pandas.dataframe.duplicated를 사용하면 아래 문서의 내용대로 각 중복값이 있는지 여부에 따라 중복값의 경우 True로 해주는 메소드인데 파라미터 설정에 따라서 기본값(keep=’first’)일경우 중복값이 있다면 첫발생의 경우 False로 나머지 중복되어 발생할 경우 True로 boolean series로 표시됨 반대로 keep=’last’로 해준다면 각 중복 값 집합의 마지막 발생이 False로 설정되고 나머지 모든 값 True로 설정됨그리고 값 종류가 의미 동일한데 형식 불일치하게 겹치는 부분이 근로시간에 있어서 그 부분 기존에 쓰던 if로 해당 문자열 바꾸는 식으로 통일하던 부분 바로 replace가 더 간단명료한듯하여 그방식으로 바꿔줌
- pandas.DataFrame.duplicated — pandas 2.2.0 documentation
- 우선 데이터가 값 종류들에 어떤 것들이 있는지 파악하여 동일한 의미를 갖는데 형식이 일치 되지 않은 것들이 있는지 확인
- 그리고 히스토그램 간단히만해서 그려준 부분 kde를 추가해서 그려준 것으로도 추가해줌 →차후 필요에 따라 기존의 자동 y축 스케일 로그로 바꾸는 기능 추가 고려 → 그리고 추가로 그냥 바로 그렸을 때는 이상치가 존재하여 분포 확인에 어려움이 있음kde의 경우 문서내용 번역기 돌려서 볼경우 아래와 같다
- 커널 밀도 추정(Kernel Density Estimation, KDE)이라는 걸 그려주는데 이게 뭐냐면 주어진 데이터셋의 확률 밀도 함수(probability density function, PDF)를 추정하는 비모수적(non-parametric) 방법이라고 함 자세한 것은 더 알아봐야 알 수 있겠으나 대강 히스토그램의 분포를 선그래프로 그리기 위해 가우시안 함수 등으로 합쳐 표현한 듯 생각됨
- True인 경우 커널 밀도 추정치를 계산하여 분포를 평활화하고 플롯에 하나 이상의 선으로 표시합니다. 단변량 데이터에만 관련됩니다.
- seaborn.histplot — seaborn 0.13.2 documentation
- 그리고 각 범주별 상대도수를 나타내는 heat map (피쳐 vs 타겟)를 그려주어 각 변수별 범주에 따라 대출등급분포가 어떻게 되는지 확인해보는 부분을 추가했다 →이 부분을 통해 근로기간과 주택소유상태는 크게 영향을 주지 않음을 확인할 수 있었다
- 그리고 시각화 부분에서 수치형 데이터 시각화에 바이올린 그래프 추가해줌
- 범주형 컬럼 리스트 실제 데이터 컬럼 순서대로 순서 맞추기
- 그리고 전체 컬럼, 수치형 컬럼, 범주형 컬럼 직접 찾아서 명시할 필요없이 함수로 자동 저장하는 방식 추가해줌 단, category_col의 경우는 전체 컬럼 - 수치형 컬럼 해준 방식으로 해줘서 순서가 컬럼순서를 따르지 않는 문제가 있어서 set과 difference등을 쓰는 방식을 해봤는데 잘 안되서 결국 리스트 컴프리헨션 방식으로 해줌
- 값 형식 통일 시켜주기 순서 위에서 확인하고 바로 수정하는 쪽으로 변경
- 아직 메인에 안올린 부분z-score를 기반으로 몇을 기준으로 하면 몇개가 제거될 수 있는지와 그렇게 했을 때 데이터를 처리해줌(창완님이 하심) z-score기반으로 각 열에 대해서 이상치 몇개 있다고 확인하여 dict형태로 리턴해주는 함수 추가하심
- (추가로 같이 작업해주던 부분 완료 안되서 다음날로 이월)
- 결과적으로 z-score=7을 thershold로 했을 때 적당하다고 판단하여 이상치 처리를 해주었으나, 부채_대비_소득_비율은 45이상의 값들이 데이터 전반 경향성에서 벗어난 데이터들이 확인됨 그래서 추가적으로 제거해줌
수치형 데이터에 대해서도 대출등급에 따라 나눠서 그려볼려고 시도했으나 의도했던 느낌과 다르게 아예 보기힘들게 그려져서 중단
더보기레퍼런스에서 사용한 패키지
- sklearn.feature_selection.rfecv
한 모델에 대해 특성을 어떤 것을 선택해서 하면 좋을지 확인해주는 모듈 - sklearn.feature_selection.RFECV
- from sklearn.model_selection
- from sklearn.model_selection import cross_val_score, cross_validatesklearn.model_selection.cross_val_scorescikit-learn에서의 cross-validation(교차검증)즉, accuracy_score, f1_score, recall_score, precision_score 를 ****cross_validate, cross_validate
- 교차 검증을 위한 Cross_val_score() 함수 사용법
- sklearn.model_selection.cross_validate
- 모델의 성능 평가하는 것으로 앞써 예측한 값에 각기 사용하여 평가지표를 내주던 accuracy_score, f1_score, recall_score, precision_score 중 하나?를 지정하여 여러 번 평가 내림으로써 교차검증을 함으로써 모델의 성능을 평가한다고 생각하면 될 것 같다
- from sklearn.model_selection import KFold, StratifiedKFoldsklearn.model_selection.StratifiedKFold — scikit-learn 0.19.2 documentation그냥 바로는 못보고 for문에 사용해보면 볼수있는 iterator(반복자)느낌인듯하다
- 예시는 아래와 같다KFold(n_splits=4, random_state=None, shuffle=False) TRAIN: [1 2 3] TEST: [0] [[3 4] [5 6] [7 8]] [[1 2]] ['b' 'c' 'd'] ['a']TRAIN: [0 1 3] TEST: [2] [[1 2] [3 4] [7 8]] [[5 6]] ['a' 'b' 'd'] ['c']
- TRAIN: [0 1 2] TEST: [3] [[1 2] [3 4] [5 6]] [[7 8]] ['a' 'b' 'c'] ['d']
- TRAIN: [0 2 3] TEST: [1] [[1 2] [5 6] [7 8]] [[3 4]] ['a' 'c' 'd'] ['b']
- # kfold 써보기 import numpy as np from sklearn.model_selection import KFold X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]]) y = np.array(['a', 'b', 'c', 'd']) kf = KFold(n_splits=4) kf.get_n_splits(X) print(kf) for train_index, test_index in kf.split(X): print("TRAIN:", train_index, "TEST:", test_index) X_train, X_test = X[train_index], X[test_index] y_train, y_test = y[train_index], y[test_index] print(X_train,'\\n', X_test,'\\n', y_train,'\\n', y_test ,'\\n')
- 5등분하면 0/ 1,2,3,4 1/ 0,2,3,4 이런식으로 나눠지는데 train으로 1,2,3,4 test로 0 이런식으로 조합?경우의수? 만큼 반복하여 리턴해주는 것 같다
- 대략적으로 데이터를 몇 등분해서 조합을 맞춰서
- sklearn.model_selection.KFold — scikit-learn 0.19.2 documentation
더보기추가 아이디어
앙상블 모델 (Stacking)
Voting과 Stacking, 그리고 여러 모델끼리 조합
Stacking(ET+XGB+DT+RF)
[Private 1위] Stacking(ET+XGB+DT+RF)
feature_importance확인를 통해 여러 파생변수를 생성
클래스 불균형를 해소하기 위해 Stratified K-fold와 class_weight를 사용
- 이상치 제거 방식[Private 5위] XGBoost, 이상치 처리
- def remove_outliers(data, column_name, grade_column='대출등급', alpha=0.00044): data_no_outliers = pd.DataFrame() for grade in data[grade_column].unique(): subset = data[data[grade_column] == grade] lower_limit = subset[column_name].quantile(alpha / 2) upper_limit = subset[column_name].quantile(1 - alpha / 2) subset_no_outliers = subset[(subset[column_name] >= lower_limit) & (subset[column_name] <= upper_limit)] data_no_outliers = pd.concat([data_no_outliers, subset_no_outliers]) return data_no_outliers cols = train.select_dtypes(exclude=object).columns for col in cols: train = remove_outliers(train, col, '대출등급')
- 파생변수 생성
- 파생변수대출금액_대비_총상환원금_비율, 대출금액_대비_총상환이자_비율
- train['월대출'] = train['대출금액'] / (train['대출기간']*24 + 36) train['월대출대비소득'] = (train['연간소득'] /12) / train['월대출'] train['연체계좌비율'] = train['연체계좌수'] / train['총계좌수'] train['최근2년간연체여부'] = train['최근_2년간_연체_횟수'].apply(lambda x : 1 if x>0 else 0)
- 상환원금/대출금액, 총상환이자/대출금액, (총상환원금+총상환이자)/대출금액
- 배깅이 뭐였지..? 그리고 총상환이자 vs 총상환원금 잘 볼려고 세제곱해줘서 보기도 했네
- [private 4th] Feature Engineering, Bagging
- 살짝 전체적인 설명 직접 해보는부분?
- 고객 대출등급 분류 해커톤 코드 공유(private 25th, XGBoost)
(아래 부분 chat gpt에게 물어본 부분들인데 그냥 복붙하면 링크가 복사가 안되서 블로그에선 생략)
더보기튜터링 숙제
튜터님께 뒤늦게 나마 도움을 받기위해 찾아갔으나 상황이 안좋아서(배정된 튜터님 두분중 한분은 설연휴와 완전히 겹쳐서 아예 튜터링이 안되셨고, 한분은 오직 수요일만 가능한데 우리를 제외하고 3팀인가 4팀을 혼자서 튜터링해주고 계셔서 시간이 안되었음) 사실상 제대로 상황전달이나 도움을 받기는 힘들었고 아래 부분 준비해오면 우선적으로 금요일날 튜터링 해주신다고 하셨다(나중에 수정하는 관계로 미리 얘기를 적어두면 결국 튜터님께 보여드릴 정도로 깔끔히 진행해서 정리를 못하는 바람에 못보여드렸고, 뒤늦게나마 하긴 했지만 이미 늦기도 했고 꽤 늦은 시간까지 다른 팀들 튜터링 해주고 계셔서 결국 피드백을 못받고 혼자서 진행하게 되었다)
결과에 대한 논리적 해석이 들어가야함 Train을 EDA하면서 얻은 인사이트를 통해 test와 y_test를 매칭시켜서 그것이 맞게 나타났는지 마지막으로 어떤 것들이 영향을 많이 주는지
EDA와 feature_importance
EDA에서 얻은 인사이트 모델별로 성능들을 비교해서 비교표 스캐일링 등 선택에 대한 조합에 대하여 정리 시각화 자료들(가장 중요한 자료들로) 논리적 해석부분 정리 늦어도 점심 1시, 2시쯤
'스파르타 > TIL(Today I Learned)' 카테고리의 다른 글
2024-02-16 (0) 2024.02.17 2024-02-15 (0) 2024.02.16 2024-02-13 (0) 2024.02.14 2024-02-09~2024-02-12(설날연휴) (0) 2024.02.14 2024-02-08 (1) 2024.02.08 - 메인에 올린 부분train, test 분리하는 부분 순서 전처리 다하고나서 분리해주는 방식으로 순서를 뒷부분으로 미루기 위에 위에서 분리하던 부분 주석처리