221116 0801번 : 선형회귀 / 0802번, 13번 강의 파일 : 그라디언트 부스팅 트리 모델, 경사하강법, 엑스트라 트리 모델 / 0803번 : 접착어, XGBoost, lightgbm, GOSS, EFB, CatBoost
멋쟁이 사자처럼 AI스쿨 7기, 박조은 강사님 강의
221114
✅0701 실습파일
기술통계
- 결측치가 있는지
- 이상치가 있는지
- 표준편차는 어떤지
- 단순 기술통계 값을 확인하는게 아니라 특이점이 없는지
- 수치 범위의 개수가 작다면 범주형 데이터에 가깝기 때문에 nunique로 추가 확인
히스토그램
- 수치 데이터의 분포 확인
- 왜도, 첨도를 통해 너무 뾰족하지 않은지 -> 한쪽에 데이터가 몰려 있는지 확인
- 너무 한쪽에 치우쳐 있지 않은지 확인
- 정규 분포 형태인지 확인
- 막대가 떨어져 있다면 수치 데이터가 아니라 범주형 데이터가 아닌지
- 전처리를 한다면 학습과 예측에 도움이 될만한 피처엔지니어링 기법이 무엇이 있을지 고민!
결측치
- 변수가 너무 많기 때문에 결측치가 있는 데이터만 가져와서 본다.
이상치
- 이상치 있을 때 어떻게 처리해야 할까?
- 이상치를 평균이나 중앙값 등으로 대체하면 데이터의 왜곡이 될 수 있으니 주의가 필요하다.
- 현실세계에서 풀어야 할 문제 중에는 이상치를 탐지하는 문제도 있다.
희소값
- 범주형 데이터 중에서 빈도가 적게 등장하는 값
- 보는 이유는, one-hot-encoding을 했을 때 범주가 적은 값을 피처로 만들어주면 연산에 시간이 더 오래걸릴 수도 있고
- 오버피팅(과대적합)이 일어날 수도 있다.
- 너무 적은 값을 학습해서 일반화 하기 때문에
- Q. 희소값이라면, 원핫인코딩 할 때 어떻게 처리할까?
- 이산화는 ordinal, one-hot-encoding 2가지를 할 수 있다.
- 기타로 묶어서 data binning, 아예 결측치로 처리하고 pd.get_dummies 혹은 OneHotEncoder를 사용했을 때 인코딩하지 않는다.
- train.select_dtypes(include="object").nunique().nlargest(10) : 범주형 변수의 개수가 많은 것 중에서 빈도가 균일한지 아닌지를 보기 위해 nunique()를 통해 범주가 많은게 어떤 변수인지 확인
스케일링
- 트리 기반 모델에서는 피처 스케일링이 필요없다. : ❓상대적 크기의 관계가 같기 때문에
- 트리 기반 모델에서 피처 스케일링이 필요 없어도 트랜스포메이션은 하면 도움이 된다.
- Q. 표준정규분포 형태로 만들기 위해서는 스케일링이 먼저다, 로그 변환이 먼저다? : 로그변환이 먼저!
- Q. 왜 데이터를 정규분포 형태로 만들어주면 머신러닝이나 딥러닝에서 더 나은 성능을 낼까?
- 너무 한쪽에 몰려 있거나, 치우쳐 있을 때보다 고르게 분포 되어 있다면 데이터의 특성을 고르게 학습할 수 있다.
- Q. 음수인 값이 너무 뾰족하거나 치우쳐져 있어서 로그를 취하기 위해서는 어떻게 전처리 해야 할까?
- 최소값이 1이 되도록 더한다.
- Q. 예를 들어 -1000이 가장 작은 값이라면 얼마를 모든 값에 더하고 로그 변환을 해주면 될까? : 1001
- Q. -1000에 1001을 더해서 로그변환을 해주었다. 원래 값으로 다시 복원하려면 어떻게 해야할까?
- 지수 변환 후 -1001 : np.exp(x) - 1001
- np.expm1을 보면 exp를 먼저 하고 m1으로 1을 나중에 빼주게 된다. (바이크쉐어링 실습)
- inverse_transform
이산화
- Equal width binning : 절대평가, 히스토그램, pd.cut(), 고객 구매 금액으로 나눔
- Equal frequency binning : 상대평가, pd.qcut(), 고객 수로 등급을 나눔
- cut, qcut은 RFM 기법에서도 종종 사용되는 방법으로 비즈니스 분석에서 다룰 예정이다.
- Recency, Frequency, Monetary
- 고객이 얼마나 최근에, 자주, 많이 구매했는지
- Q. 이산화를 하는 이유? 연속된 수치 데이터를 구간화한다. 머신러닝 알고리즘에 힌트를 줄 수 있다.
- 트리모델이라면 잘게 데이터를 나누지 않아 일반화 하는데 도움이 될 수 있다.
- EDA를 통해 어떻게 나누는 것이 예측에 도움이 될지 확인한다.
- 연속된 수치데이터를 나누는 기준에 따라 모델 성능에 영향을 주는데, 오히려 잘못 나누면 성능이 떨어질 수 있다.
- cut은 히스토그램의 bins와 유사하다.
인코딩
- .cat.codes -> Ordinal Encoding 방식 : 순서가 있는 명목형 데이터에 사용. ex) 1분기 ,2분기, 3분기, 4분기
- get_dummies -> One-hot-encoding 방식 : 순서가 없는 명목형 데이터. 좋아하는 음료, 주류의 종류 등
- 예를들어 iris 꽃의 품종이 3가지인데, 이 값을 label로 지정할 때 예전 사이킷런에서는 꼭 인코딩 해줘야만 동작이 되었다.
- 버전이 업데이트 되면서 범주값을 그대로 입력해도 잘 동작한다.
- 딥러닝 등에 사용할 때 label 값을 인코딩해주어야 하는데, 그 때도 사이킷런을 함께 사용하기도 한다.
- Q. LabelEncoder, OrdinalEncoder의 입력값의 차이?
- LabelEncoder 입력이 1차원 y 값, OrdinalEncoder 입력이 2차원 X 값
- X 독립변수, 시험의 문제, 2차원 array 형태, 학습할 피처
- y 종속변수, 레이블, target, 정답, 시험의 답안, 1차원 벡터
- 💡 label_name = " " 1차원 y 값 / feature_names = [" ", " ", " "] 2차원 array X값 으로 이해하니 쉽게 이해가 되었다!
- 0401번 실습 파일에 X, y 가 설명되어 있다.
- 딥러닝에서는 x를 보통 소문자로 사용하는데, 아마도 추측하기로는 x에 꼭 2차원만 들어가는게 아니라서로 보여진다. 2차원 이상도 들어간다. ex) 이미지
- Q. 인코더 3가지의 공통점은 ? 범주형 데이터를 수치형 데이터로
원핫인코딩
- ❗ test에는 fit을 해주지 않는 것에 주의
- Q. Found unknown categories [nan] in column 0 during transform 에러는 어떻게 해결할 수 있을까?
- OneHotEncoder(handle_unknow = 'ignore')
- 최신버전에는 빈도가 적은 값에 대해 기타로 처리하는 min_frequency 기능도 추가. 기타 값에 대해 따로 전처리 해주지 않아도 기타로 처리해 준다.
- ❗ 꼭 원핫인코딩 했을 때는, train, test 피처의 수가 같은지 확인!!
- print(train_ohe.shape, test_ohe.shape)
Polynomial
- Q. 구분이 잘 안되는 값에 대해 power transform을 해주기도 하는데, 반대로 너무 차이가 많이 나는 값을 줄일 때 사용할 수 있는 방법?
- 정답이 있기 보다는 EDA를 해보고 어떤 스케일링을 하면 머신러닝 모델이 값을 학습하는데 도움이 될지 고민해보면 좋다.
- root, log transform도 해볼 수 있지만 변환이 답은 아니다. 성능이 올라가고 안올라가고 EDA를 통해 확인해보고 왜 점수가 오르내리는지 확인해보는 습관을 길러보자.
분산기반 필터링
- object 써줘도 되고, 대문자 O도 가능
- value_counts(1) : normalize = 1
- normalize=True는 고유값 개수를 센 뒤 총개수로 나눠준 것을 한번에 해준다. : 전체합이 1인 상태에서 모든 값을 비중으로 나누어서 반환
- MSZoning, LandContour, LotConfig, Condition1, RoofStyle, BsmtFinType2, HeatingQC, KitchenQual, GarageQual, GarageCond가 하나의 범주에 90% 이상 모여있다.
상관관계
- sns.heatmap(corr, annot=True, fmt=".2f", cmap="coolwarm", vmax=1, vmin=-1, mask=mask)
- loc[행, 열]
✅0702 실습파일
concat
- 장점 : 전처리를 한번만 해도 된다.
- 단점 : test에만 등장하는 데이터를 피처에 사용하면 안되는 대회 정책이 있을 때 정책 위반이 될 수 있다.
- 단점 : 현실에서는 불가능한 방법이다.
첨도, 왜도, 로그변환
- train["SalePrice_log1p"] = np.log1p(train["SalePrice"])
결측치
- 결측치 수와 비율을 함께 보고 싶다면 합계와 비율을 구해서 concat으로 합쳐준다.
- df = df.drop(null_feature, axis=1)
- columns = null_feature로 지정하면 axis 지정 안해도 된다.
- 어떤 피처가 삭제되었는지 확인하기 위해
- train 컬럼으로 비교하게 되면 label 값(SalePrice) 까지 함께 보이기 때문에 test랑 비교하였다.
상관계수
- corr.loc[abs(corr["SalePrice"])>0.6, "SalePrice"].index
- corner=True 위에 것은 날리고 본다.
결측치 채우기
- 범주형 변수는 결측치를 채우지 않으면 따로 인코딩하지 않는다.
- 없는 값도 의미를 부여하고자 할 때는 채울 수 있다.
데이터 타입 바꾸기
- 수치 데이터의 nunique 구해서 어떤 값을 one-hot-encoding 하면 좋을지 찾아본다.
- 수치데이터를 그대로 ordinal encoding 된 값을 사용해도 되지만
- 범주값으로 구분하고자 하면 category나 object 타입으로 변환하면 원핫인코딩 할 수 있다.
- df.select_dtypes(include="number") : "number", np.number 다 가능
- df[num_to_str_col] = df[num_to_str_col].astype(str) : 문자 형태로 변경하게 되면 나중에 pd.get_dummies로 인코디 했을 때 원핫인코딩을 한다.
첨도, 왜도
- 피어슨 : 정상은 3, 피셔 : 정상은 0
- SalePrice는 왜도가 양수가 나오겠다
- train["SalePrice_log1p"].skew(), train["SalePrice_log1p"].kurt()
- 로그 변환해주면 첨도, 왜도가 0에 가깝게 나온다.
📌 JD
- 관심표현 : 2016년 DAU가 300만. 요즘 DAU가 어느 정도 되는지?
- AB테스트 : 오바마 대통령 투표 버튼 색을 빨간색, 파란색/ 버튼의 높이
- 설정만 바꿀 뿐만 아니라 데이터가 수집이 될 수 있도록 해야 한다.
- 얼마나 노출되었는지, 랜덤하게 잘 노출되었는지, 노출 된 것 중 2개가 얼마나 클릭이 되었는지
- Q. 회사 앱을 사용해 보았는지, 혹시 AB테스트를 해본다면, 어떤 걸로 변경해보고 싶은지?
- Q. SQL로 관리하는 데이터와 파일로 관리하는 데이터는 어떻게 구분해서 관리할까?
- sql에 저장하는 데이터는 실시간으로 사용해야 하는 데이터, 파일로 관리하는 데이터는 로그성 데이터
- Q. SQL로 실시간으로 관리할 데이터를 저장한다면 어떤 데이터가 있을까?
- 로그인, 장바구니, 결제, 회원가입정보, 각종 status 값(게임의 캐릭터 위치, 캐릭터 정보, 게임머니, 캐릭터 장비 인벤토리 정보)
- 이런 종류의 데이터는 쌓이는 용량이 어느 정도냐에 따라 의사결정을 할 수도 있는데 아카이빙할 데이터는 대부분 파일로 저장한다.
- 실시간으로 보여주어야 하는 현재 status 값만 DB에 저장해서 사용하기도 한다.
- status값을 업데이트 해서 SQL로 관리하고 아카이빙할 데이터는 파일로 저장한다.
- 아카이빙 : 보통 보관과 같은 의미로 사용되지만, 오래되거나 사용 빈도가 낮은 데이터들을 용량 확보나 장기 보관을 위해 따로 보관하는 의미로도 사용된다.
- "데이터를 통해 서비스에 몇 명이 접속하는지, 그분들이 얼마나 많은 상품을 조회하고 얼만큼 구매로 이어지는지 확인할 수 있거든요. 그 과정을 통해 어느 페이지에서 사람들이 이탈하는지도 확인할 수 있었죠."
- Q. 채용공고에 있었던 어떤 지표로 이 표현을 설명할 수 있을까? DAU Daily Active User
- AARRR, Funnel : 분석을 통해 얼마나 많은 사람이 와서 물건을 살펴보고, 회원가입, 구매전환, 친구추천, 재구매로 이어지는지?
- Churn : 얼마나 많은 사람들이 어느 페이지에서 이탈하는지?
퀴즈 - 10/10문제
X는 feature, 독립변수, 2차원 array 형태, 학습할 피처, 예) 시험의 문제
댓글