본문 바로가기
부트캠프(LIKELION AIS7)/수업

[AI스쿨 7기, 8주차] cat.codes, dayofweek, log1p, np.expm1, neg_root_mean_squared_error, 피처엔지니어링, 희소값, plt.axhline

by aimaimee 2023. 4. 25.

221108, 0601번 실습파일 : cat.codes / 0602실습파일 : dayofweek, log취하기, expm1으로 복원, DAU, neg_root_mean_squared_error/ 피처엔지니어링 강의파일 / 0701번 실습파일 : 이상치, 희소값

 

멋쟁이 사자처럼 AI스쿨 7기, 박조은 강사님 강의

221108

✅0601 실습 파일

day

  • day는 train과 test를 나누는 기준.
  • train은 19일까지만 있고 test는 20일 이후 데이터가 있다.
  • 1~19일까지 학습한 것을 바탕으로 20일 이후의 데이터를 예측하면 예측에 도움이 안될 수 있다.

month

  • 월 그래프에서는 월을 넣어주는게 나아보이지만 연도에서는 2배까지 차이가 날 때도 있어서 예측하는데 혼란이 생길 수 있다.

season

  • Q. train.groupby("season")["month"] 이 코드를 어떻게 완성하면 season에 해당하는 월을 잘 요약해서 볼 수 있을까?
  • describe() , .unique()

Q. 연월을 가져오는 실습 어디에서 했을까?

  • 서울 코로나

year-month

  • train["year-month"] = train["datetime"].astype(str).str[:7]
  • Q. 어떻게 인코딩 하면 좋을까?
  • cat.codes 하면 24개월이 있으니까 0~23까지 코드 형태로 인코딩 되었다.

✅0602 실습 파일

상대경로는 현재 경로를 기준으로 하는 경로. ex) ./ 현재경로 ../ 상위 경로
절대경로는 전체 경로를 다 지정하는 경로. ex) 윈도우 C: 부터 시작하는 경로
base path = "data/bike" 와 "./data/bike" 는 같다.

Q. 0602번 파일에서 추가된 컬럼? test["dayofweek"]
https://pandas.pydata.org/docs/reference/series.html#datetimelike-properties
Q. dayofweek는 어디에서 실습했는지?
코로나 확진 데이터에서 요일을 구할 때, 처방내역 분석할 때 처방일자의 요일을 구할 때

log
log를 count 값에 적용하면 뾰족하게 한 쪽에 있던 분포가 좀 더 완만한 분포가 된다.
데이터에 따라 skewed 된 분포가 정규분포에 가까워지기도 한다.
log를 취한 값을 사용하면 이상치에도 덜 민갑하게 된다.
Q. 왜 정규분포가 되면 머신러닝이나 딥러닝에서 좋은 성능을 낼까?
특성을 제대로 학습하기 어렵기 때문에 정규분포로 되어 있다면 특성을 고르게 학습할 수 있다.
log1p == np.log( +1)

np.exp
test는 count 값이 없기 때문에 하지 않는다.
train["count_expm1"] = np.exp(train["count_log1p"]) - 1
Q. 이 실습에서 보이는 인상적인 부분? 원래 값으로 돌아왔다.
exponential : 지수 함수.
np.exp 지수함수, np.log로 취했던 값을 원래 값으로 복원할 수 있다.
log를 취할 때는 1을 더하고 로그를 취한다, 지수함수를 적용할 때는 반대의 순서로 복원해야 순서가 맞다.
np.exp로 지수함수를 적용하고 -1을 하면 로그 취했던 순서를 복원
count == np.expm1(np.log1p()) 같은 값

Q. 왜 count에 log를 취하고 다시 지수함수로 복원을 했을까?
log 값으로 예측하고 예측값을 복원하기 위해

실무에서는 보통 비즈니스 평가지표를 더 많이 사용한다. 경진대회나 실습에서 사용하는 평가지표는 모델의 성능을 측정해서 객관화 해보기 위해 사용
모델의 비즈니스 문제 해결 목적이 DAU(Daily Active User)를 올리는 것이라면 DAU를 측정
매출을 늘리고 싶다면 매출액이 늘어났는지, 구매자수가 늘어났는지 등을 평가

랜덤서치CV
score : 분류일 때는 accuracy가 기본 값.
log는 이미 count 값에 적용해 주었다는 것을 주의!
neg_root_mean_squared_error
rmse와 동일하지만 y_train의 count에 미리 log를 취해주었기 때문에 rmsle로 계산하는 것과 같다.
neg_root_mean_squared_error는 절대값을 적용했을 때 작은 값이 오차가 작은 값


✅피처엔지니어링 강의 파일

https://docs.google.com/presentation/d/16y3smuyPMgeFprNh7TAkIard0cW-99wwFa_U56WTFpM/edit?usp=share_link
https://www.kaggle.com/c/house-prices-advanced-regression-techniques/overview

Evaluation-Metric
Q. 어떻게 해석하면 좋을까? 로그를 취해서 비싼 집과 싼 집의 예측이 공평한 영향을 미칠 수 있게 해준다.

Tutorials
따라 해 보는 것을 추천

Data
Q. 주택 가격을 예측하기 위한 변수?

  • 내외관 품질, 화장실 수, 방 개수, 수영장, 지붕, 건축연도 등

Q. 변수의 분포가 편향이 되었다?

  • 정규분포와 거리가 멀다. 한쪽으로 치우쳐 있다.

histplot
overallqual, overallcond/ fullbath, halfbath은 범주형 데이터에 가깝다.

결측치
train_null = train.isnull().sum()
train_sum = train_null[train_null>0].sort_values(ascending=False)
train_na_mean = train.isnull().mean()
pd.concat([train_null, train_na_mean], axis=1).loc[train_sum.index]
pd.concat([test_na_sum, test_na_mean], axis=1).loc[test_na_sum.index]

이상치
날짜데이터인데 3333-12-21이면 이상치가 아니라 에러데이터
Q. 이상치가 학습을 방해한다는 의미?
이상치까지 학습되어 과적합의 우려. 일반화가 어려워진다. 정확도가 낮아진다.
plt.axhline(500000, c="k", ls=":")
Q. train의 정답에 이상치가 있다면 어떻게 처리하는 것이 좋을까?
정답이기 때문에 아래 실습에서 스케일링을 해 줄 것. 스케일링을 하게 되면 log를 취했던 것처럼 다시 복원도 가능하다.

희소값
빈도가 낮은 값을 희소값(Rare Values)
데이터 해석을 어렵게 하고, 머신러닝 성능을 낮출 수 있다.
적절히 처리해서 전체 경향이 뚜렷하게 드러나게 만들 수 있다.
train.select_dtypes(include="object").nunique().nlargest(10)
희소값에 대해 one-hot-encoding을 하게 되면 오버피팅이 발생할 수 있고 너무 희소한 행렬이 생성되기 때문에 계산에 많은 자원이 필요하다.
희소값을 사용하고자 한다면 1) 아예 희소값을 결측치 처리, 2) 희소값을 묶어준다.(기타 묶음)


Q. 바이크 실습에서 회원/비회원을 어떻게 사용하면 될까?
회원 따로, 비회원 따로 예측하고 더해준다.
회원+비회원 ==count
label에 회원으로 학습하고 예측 + label에 비회원으로 학습하고 예측 == 제출예측값
따로 예측해서 더해주면 score가 약간 더 올라간다.


퀴즈

10/10문제
다시 보자

  • 3번 문제. np.log(df["count"] + 1) 로 데이터를 로그변환 했을 때, 원래 값으로 변환하려면? 괄호 위치를 자세하게 볼 것!
    np.exp(df["count"] + 1)
    np.exp(df["count"] - 1)
    np.exp(df["count"]) - 1
    np.sqrt(df["count"]) - 1
  • 8번 문제. 범주형 희소값에 대한 설명으로 바르지 않을 것?
    희소값에 대해 one-hot-encoding을 하게 되면 과적합이 발생할 수 있고, 자세하게 학습이 된다.

댓글