오늘은 어제 시작했던 캐글 playground 경쟁분야 모델 만들기 수업을 진행했다.
내일 AutoML만 적용하면 끝난다
피처엔지니어링 전략 수립
ord_

ord_1 ,2는 등급으로 파악된다.
3,4,5는 의미를 알 수 없는 글자이기 때문에 알파벳 순으로 순서를 적용하는 컨셉을 잡는다.
시간
순서는 존재하나, 서열은 존재하지 않는다. 순환형
월요일~화요일, 월요일~수요일 시간의 거리 개념이 아닌, 단지요일에 대한 구분값으로 원핫인코딩을 적용한다.

EDA를 통한 데이터 분석 및 학습에 사용할 데이터 확인
- 현재 : 모든 데이터 사용, 원핫 인코딩 적극 도입
- 목표
- 피처 데이터
- 고유값의 비중 검사
- 데이터의 불균형도 검사
- 타겟 데이터
- 정답 1의 확률, 비율 체크
- 피처의 고유값별 타겟 데이터의 비율 점검
- 피처 데이터
- 시각화 도구
- seaborn
- 수치형 : displot()
- 범주형 : countplot()
- seaborn
기본적 사용할 함수 정의

먼저 정답 컬럼 0 과 1 의 빈도를 체크한다,
0인 답이 더 많다는 해석 도출함


per 값이 해당 컬럼의 빈도 퍼센트이다, 이를 차트에 표기하기 위한 코드다.
bin_xx
- 위의 정답의 비율이 다른 컬럼의 고유값별 나눠서 체크할 경우 유지되는가? (0이 크고, 1이 작은)
- 해당 비율 유지 여부
- 비율 역전 여부
- 동일 비율이 나오는 컬럼 체크
- 만약 전부 제각각으로 구성된다면 => 학습에 도움이 됨(변별력을 가지므로) -> 모두 학습에 사용함.

먼저 bin 컬럼을 모두 가져와서 담아준다. 변수명들을 잘 기억해둬야 한다 끝까지 가기 때문에

이제 bin 컬럼 5개를 각각 차트를 그려본다, 그리고 hue= 를 이용해서 정답과 오답, 0 과 1 의 비율 또한 차트에 추가


... bin 5 까지 나온다
nom_xx
- 범주형 데이터
- 데이터 교차 분석표 도입
- cross-tabulation
- 범주형 데이터간 분석 시 활용
- 빈도, 통계량을 교차로 행렬 방식으로 표기한 형태
- 데이터 교차 분석표 도입

예시로 nom_0 컬럼의 값을 정답과 비교하는 표를 만들었다.


위의 기능을 수행하는 함수를 만들었다. 함수명 = make_cross_tabul
이제 데이터프레임, 컬럼명, 정답 입력하면 자동으로 교차분석표를 만들어준다.
교차분석표 + 포인트 플롯 = 혼합차트 구성

컬럼의 고유값 별로 정답 1의 비율을 선으로 연결하여 추세를 파악할 수 있는 시각화 자료 포인트플룻을 만든다.


시각화 하는 이유는
이 피쳐(컬럼)이 학습에 도움이 되는지에 대한 여부 파악이다
차트를 그리며 대상 컬럼을 확인한다.
각 컬럼을 먼저 담아주며 교차분석표를 획득하고
바 차트를 그려준다, 그리고 포인트 플롯이 바 차트 위에 올라가게 ax를 설정해준다.



ord_ xx 체크

ord또한 똑같이 담아주고 아까 사용했던 바 차트와 포인트 플롯 만들어주는 함수 그냥 넣어주기만 하면 된다.
함수 만들어두면 이렇게 재활용하기에 아주 좋다.





ord_1 ~ 2 를 제외하고는 모두 우상향적 선형구조를 가지고 있다.
그러니 ord_1~2의 순서를 정답으로 조절하여 같은 성향을 따르는지 체크해야 한다.

데이터를 object에서 category로 변형시켜주는 코드를 사용한다, 타입을 변경한다. = astype

둘 다 선형구조를 가지고 있는것을 확인

day,month도 같은 방식으로 체크해준다.
모든 데이터를 체크했다, 이제 데이터를 합치고 학습하기 전 데이터를 전처리하고 가공할 시간이다.
피처 엔지니어링 (전처리, 데이터 가공)
피처 인코딩
- 문자열 => 수치화, 기타 => 수치화
bin의 값은 T : F 라서 이를 학습시키려면 수치형으로 변환시켜줘야한다.


컬럼명을 바꿀때 사용했던 함수 apply()를 통해서 결과를 바꿔준다, map()함수도 가능하고 람다함수를 통해서 값을 넣어줬다.


정상적으로 변환된 모습
nom_

문자열을 수치형으로 변환시키기 위해서 원핫인코딩을 사용한다.

인코딩 된 데이터를 살펴보면 기존에는 컬럼수가 5에서 원핫 인코딩 이후 25로 올라간것을 확인할 수 있다.
- 고유값이 너무 많다 -> 원핫으로 처리함
- 만약, 테스트데이터에도 고유값이 존재한다면
- 각각 원핫인코딩 하는 방식은 정보손실이나 등등 오류가 나올수 있음
- 전략
- 훈련 + 테스트 병합 후 원핫 인코딩 훈련 -> 다시 각각 인코딩 처리 진행
- nom_0
4는 그러지 않을까? (기본적으로 합쳐서 진행하는것이 합리적임. 일단 04번은 없는것을 알고있어서 그냥 진행함
- 만약, 테스트데이터에도 고유값이 존재한다면

nom_5~9는 조금 다른 점이 있는데 train 파일과 test 파일의 내용을 병합시켜준 후 인코딩을 진행했다.
원래 이전의 bin, nom_0~4도 병합 후 인코딩을 하는것이 맞지만 이번에는 데이터를 파악하고 있기 때문에 생략했다.
**원래는 병합하고 인코딩해야된다!!**
ord_xx 인코딩

ord_ 같은 경우에는 인코딩 시 순서형 데이터를 학습시키기 때문에 원핫 인코딩이 아니라 순서형 인코딩을 적용했다.
데이터가 잘 적용된 모습이다.

day, month도 마찬가지로 원핫인코딩을 실시해준다.
이제 모든컬럼의 인코딩이 끝났다. 이제 데이터를 정규화하여 전체의 예측 정확도를 올리는 피처스케일링을 작업한다.
피처 스케일링
- 목표
- 스케일링 -> 데이터를 정규화 -> 특정 목표치(평균값,표준편차, 등)으로 데이터 전체를 조정할 수 있음 => 왜? 예측 정확도를 높이기 위해서 정규분포 혹은 기타 분포에 유사하도록 조정하는 통상 작업
- 대상
- ord_xx :

- StandardScaler
- 가장 많이 보편적으로 사용
- 정규분포를 따르도록 데이터를 조정
- 평균 0, 표준편차 1(데이터의 퍼짐)
- x = (x-평균)/표준편차
- MinMaxScaler
- 최소값 0, 최대값 1, 나머지는 맞춰서 조정
- 모든 데이터는 0 ~ 1에 위치
- 단점 : 이상치가 존재하면 대부분 데이터가 좁은 공간에 몰릴 수 있음
- x = (x-x(min))/(x(max)-x(min))
- RobustScaler
- 중앙값 0을 기준 변환
- 사분위수 기준 전체데이터의 50%가 중앙에 밀집되도록 변환
- 이상치 영향을 최소화 하기 위한 전략
- MaxAbsScaler
- 절대값의 최대값을 1로 설정
- 0 ~ 1 데이터 조정
- 이상치 영향 받음
스케일링 종류 설명

우리는 minmaxscaler를 사용해서 최소값은 0, 최대값은 1로 설정하는 스케일링을 작업했다.
데이터 병합
- 데이터의 일부가 원핫인코딩 + 압축형태를 취하므로, 모든 데이터는 동일하게 CSR(압축포맷) 형태로 진행해야함
- 원핫인코딩 데이터는 그대로 사용
- 나머지 데이터는 압축처리함

모든 데이터를 하나로 병합했다, 그리고 압축처리하는것이다. 원핫인코딩에 값이 너무 많으니까네
모델 구축
- 머신러닝 알고리즘 이용하여 데이터를 주입 후 학습 진행
베이스라인 구축
# 1. 모듈 가져오기
from sklearn.linear_model import LogisticRegression # 이진 분류용 알고리즘
from sklearn.model_selection import train_test_split # 데이터 분할
# 2. 데이터 준비 및 분할
X = final_train_data_csr # 피처 데이터
y = train['target'] # 레이블(정답) 데이터
# 분할 비율 -> 85:15 지정
# 정답 0과 1의 비율은 69:31 이었음 -> 불균형 ->
# 해당 비율을 훈련/테스트로 나눠줘도 유지하겠다 -> 층화 적용
# 데이터가 쪼개져서 분할되어도 항상 비율은 유지됨 69:31의 정답간 비율은 유지됨
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.15, stratify=y, random_state=42)
print(X_train.shape, X_test.shape, y_train.shape, y_test.shape )
# 3. 알고리즘 생성
clf = LogisticRegression()
# 4. 학습 : 훈련용 데이터 주입 후 학습
clf.fit(X_train, y_train)
# 5. 예측
# 테스트 데이터 준비
X_ = final_train_data_csr # 피처 데이터
y_ = train['target']
pred_y = clf.predict(X_) # 테스트 데이터 주입 -> 모델 예측
print( pred_y)
# 6. 평가 : 정답, 예측값 비교 -> 스코어링
from sklearn.metrics import accuracy_score, classification_report
# 정확도
print('정확도', accuracy_score(y_, pred_y)) # 1.0 = 100% , 과적합 => 데이터를 증가시켜라
# 레포트
print('레포트', classification_report(y_, pred_y))
현재 거의 최종 코드, 근데 예측파트부턴 내가 해서 틀릴수도 있다
이 부분부터 내일 AutoML을 이용해서 수업하기로 해서 오늘의 수업은 여기까지