221115 0702 : 변수바꾸기, RMSE, extend, Kfold, r2_score, pd.Series, imputation, 수치형 범주형 데이터 전처리 / 0801 익명화 데이터, Ridge, Lasso, ElasticNet, 몰두센, ELT, ETL
멋쟁이 사자처럼 AI스쿨 7기, 박조은 강사님 강의
221115
✅0702 실습파일
결측치
결측치가 많다고 삭제하는게 무조건 나은 방법이 아닐 수 있다.
이상치, 특이값을 찾는다면 오히려 특정 값이 신호가 될 수 있다.
범주형 데이터라면 결측치가 많더라도 채우지 않고 인코딩하면 없는 값은 0으로 채워지게 된다.
대신 희소한 행렬이 생성된다.
수치 데이터라면 잘못 채웠을 때 오해할 수 있으니 주의해야 한다.
언제 어떤 방법을 사용해야 할 지 모르겠다면 노트북 필사를 여러 개 해보고 다양한 데이터셋을 다뤄보는 것을 추천
왜도, 첨도
정확한 수치까지 모르더라도 시각화를 해보면 알 수 있다.
변수가 100개 그 이상이라면?
Anscombe's Quartet 데이터를 생각해 보면? 요약된 기술 통계는 데이터를 자세히 설명하지 못하는 부분도 있다.
그래서 왜도와 첨도는 변수가 수백개 될 때 전체적으로 왜도와 첨도가 높은 값을 추출해서 전처리 할 수 있다.
어제 실습했던 예를 보면 왜도나 첨도가 높은 값을 추출해서 변환하는 전처리를 진행할 수도 있다.
pandas, numpy 등으로 기술통계를 구해보면 왜도, 첨도(기본 값 피셔의 정의 일 때) 0에 가까울 때 정규분포에 가까운 모습이다.
변수 바꾸기
수치형 변수를 대체할 때는 원래의 값이 너무 왜곡되지 않는지도 주의
중앙값(중간값), 평균값 등으로 대체할 수 있지만, 당뇨병 실습에서 했던 회귀로 예측해서 채우는 방법도 있다.
인슐린을 채울 때 당뇨병 여부에 따라 대표값을 구한 것처럼 다른 변수를 참고해서 채워볼 수도 있다.
로그 변환
당뇨병 데이터에 있던 대부분의 0으로 된 데이터가 현실세계에서 생각했을 때 0이 될 수 없는 값. 혈당, 인슐린수치, 혈압
여기에서는 화장실 수, 2층면적, 지하면적, 주차장면적 은 해당 시설이 없다면 0이 될 수 있다.
전처리 할 때 현실세계에서 해당 값이 0이 될 수 있는지 없는지 고민
범주형 변수
범주형 데이터는 없는 값은 변수로 생성하지 않기 때문에, 결측치를 남겨두어도 상관없다.
label_name
- label_name 변수에 예측에 사용할 정답 값 지정하기
- Submissions are evaluated on Root-Mean-Squared-Error(RMSE)
between the logarithm of the predicted value
and the logarithm of the observed sales price.
Taking logs means that errors in predicting expensive houses and cheap houses will affect the result equally. - 2억->4억으로 예측하는 집값은, 100->110억으로 예측했을 때 어디에 더 패널티를 줄 것인지
- MAE => 1)2억차이, 2)10억
- MSE => 1)4억차이, 2)100억차이
- RMSLE => 1) np.log(2) == 2.69억 2) np.log(10) == 2.3
- 로그값은 작은 값에 더 패널티를 주고, 값이 커집에 따라 완만하게 증가
feature_names
- append 봉지과자를 통째로 넣음, extend 봉지 과자를 뜯어서 낱개로 넣음
- 과자의 봉지는 iterable 혹은 컨테이너라고 부른다.
- list.append(x)는 리스트에 전달받은 요소(x)를 추가하는 메서드이며,
- list.extend(iterable)은 순환 가능한 요소(iterable)를 인자로 받으며, 해당 컨테이너 안에 있는 모든 요소들을 리스트에 추가한다.
- SalePrice는 꼭 빼기. 확인하고 싶다면, feature_names.remove("SalePrice") 하고 오류가 나면 없는 것.
- 3SsnPorch
- 다른 데이터에도 같은 값이 들어있는 변수가 있을 때도 있다.
- 사용, 제거 다 해보고 점수차이가 없다면 제외하는게 낫다.
- 이상치 탐지와 같이 특정 징후를 표현하는 중요한 역할을 한다면 두는게 나을 수 있다.
- pairplot과 같이 시각화 했을 때 수치 변수끼리의 상관을 보여주듯 일단 비교해보고 사용여부를 결정
데이터셋 만들기
X_train = df_ohe.loc[train.index]
X_test = df_ohe.loc[test.index]
y_train = train[label_name]
모델
- KFold를 사용해서 분할
- 분할에 random_state를 사용할 수 있다.
- r2_score
- 다른 오차측정 방법은 작을수록 오차가 적음을 의미하지만
- r^2 score는 1에 가까운 큰 값일수록 잘 예측한 값이다.
학습과 훈련, 제출
- 중요도 상위 피처 : 너무 많아서 중요도 시각화가 잘 안된다.
- 시리즈형태로 만들어준다. pd.Series(model.featureimportances)
- index한 것을 feature_names_in에 넣어준다.
- nlargest로 상위 피처만 본다.
- 제출
- 리더보드에 있는 점수와 동일한 스케일 점수를 미리 계산해 보기 위해서는 로그 적용한 값으로 계산해주지만
- 제출할 때는 지수함수를 적용해서 원래 스케일로 복원하여 제출한다.
- ⛔ 주의! 내부에서 평가할 때는 제출받은 값에 로그를 취해서 점수를 평가하는데
- 제출할 때는 지수함수를 적용해서 제출해야 한다.
Q. 수치형 데이터에 할 수 있는 전처리?
- 결측치 대체(Imputation)
- 수치형 변수를 대체할 때는 원래 값이 너무 왜곡되지 않는지 주의
- 중앙값(중간값), 평균값 등의 대표값으로 대체할 수도 있지만, 당뇨병 실습에서 했던 회귀로 예측해서 채우는 방법도 있다.
- 당뇨병 실습에서 했던 인슐린을 채울 때, 당뇨병 여부에 따라 대표값을 구한 것처럼 다른 변수를 참고해서 채워볼 수 있다.
- 스케일링 : Standard, Min-Max, Robust
- 변환 : log
- 이상치(너무 크거나 작은 범위를 벗어나는 값) 제거 혹은 대체
- 오류(잘못된 값) 제거 혹은 대체
- 이산화 : cut, qcut
Q. 범주형 데이터에 할 수 있는 전처리? - 결측치 대체(Imputation)
- 인코딩 : label, ordinal, one-hot-encoding
- 범주 중에 빈도가 적은 값은 대체
https://www.kaggle.com/code/serigne/stacked-regressions-top-4-on-leaderboard
✅ 0801 실습파일
제조 데이터는 생산 공정 센서 데이터를 주로 사용한다.(온도,습도, 위치, 환경 등에 대한 데이터)
센서 데이터는 해당 센서 제품에 따라 로그를 기록할 때 DB에 기록하기도 하고, 파일로 기록하기도 한다.
단점 : anonymized set of variables. 익명화되어 있다.
스웨덴 가정용 식품 제조업체 다프가드 Dafgards
Q. 이전에도 피자에 치즈가 적절히 뿌려졌는지를 확인하는 머신 비전 시스템을 설치했지만, 이는 여러 개의 토핑이 있는 피자의 결함은 감지하지 못했다. => 어떻게 해석할 수 있을까?
- 기존 피자치즈가 적절히 뿌려졌는지 확인하는 데이터에만 과대적합(오버피팅)이 되어 새로운 데이터가 들어왔을 때 일반화하지 못했다.
https://it.donga.com/32538/ => 프로젝트 적용 혹은 내가 어떤 산업에서 기여할 수 있을지 고민해 보면 좋겠다.
선형회귀(Linear Regression)
- 보완한 모델 : Ridge, Lasso, ElasticNet
Q. 왜 이렇게 데이터를 제공할까?
- 보안 이슈
- 4륜구동 4WD
- X는 feature, 독립변수
- y는 label, 종속변수
- y : 제조 과정에서 테스트 단계에 드는 시간을 예측
EDA
- train_one_idx
- 두 번 실행하면 이미 삭제되어 없는 값이기 때문에 KeyError가 발생한다.
- test 값 삭제할 때도 train 기준으로 삭제한다. 피처엔지니어링에서도 train을 기준으로 했던 것처럼.
- 히트맵
- 정답인 y를 제외하고 어떤 값이 크고 작은지 확인
원핫인코딩
- drop = "if_binary" 는 둘 중 하나는 삭제
- handle_unknown="ignore" : test에는 등장하지만 train에는 없다면 무시하는데
- train으로 피처의 기준을 만드는데, test에 train 에 없는 값이 있다면 그 값은 피처로 만들지 않는다.
- ⛔ fit은 train에만 한다. test에는 fit 하지 않는다. train을 기준으로 삼기 위해서
- test는 transform만 한다.
- OneHotEncoder는 전체 데이터를 변환하기 때문에 범주가 아닌 수치데이터도 모두 인코딩한다.
- 그래서 범주값 데이터만 따로 넣어 인코딩 해주어야 한다.
- pd.get_dummies의 장점은 이런 전처리 없이 범주 데이터만 OneHotEncoding 한다는 점
- 너무 많아지기 때문에 숫자는 제외하고 생성(select_dtypes(exclude="number")
📌JD
- SQL 용량이 너무 크면 데이터 파일 형태로 추출해서 파이썬으로 분석하는 형태로 진행하기도 한다.
- 몰두센 : 몰로코, 두나무, 센드버드
창업자분이 유튜브 머신러닝 개발자 출신이라서 구글 관련 제품을 많이 쓰지 않을까.
GCP(Google Cloud Platform), AWS, MS Azure : 클라우드 제품군 이름, 해당 제품군을 사용하는 회사
보통은 free_tier라고 무료로 사용할 수 있는 쿠폰 등을 제공하기도 하지만, 배우는데 비용이 든다.
클라우드에 데이터가 DB 혹은 파일 형태로 적재되어 있다.
ELK와 같은 제품군을 사용하기도 하는데, 엘라스틱서치 관련 제품군 명칭
데이터 엔지니어 직군에는 클라우드 제품군 이름이 들어가는 경우가 더 많다.
왜냐하면 클라우드에 실제로 적재하는 업무를 하기 때문에 - ELT(Extract, Loading, Transformtion), ETL(Extract, Transformation, Loading)
- 기본적인 소양을 갖추기 위해 추천
- https://www.integrate.io/blog/etl-vs-elt/
- https://blog.naver.com/freepsw/222276087707
- https://www.itworld.co.kr/news/160710
퀴즈
8/10문제
2. 숫자로 된 데이터를 문자열 타입으로 변경한다면 사이킷런이나 겟더미즈로 원핫인코딩 시 어떻게 될까? df[num_to_str_col].astype(str)
-> 인코딩된다.
8. 이상치에 덜 민감하게 동작하는 측정 공식 : Huber loss, Quantile loss / squared loss, absolute loss
댓글