일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 코드업
- AI 데이터 분석 트랙
- 멋쟁이사자처럼
- 고객세그먼트
- 딥러닝
- ai school
- Python
- 앨리스
- 데이터분석
- 소프트맥스함수
- 코드업100제
- 코딩테스트
- 고객데이터분석
- RFM분석
- 2022 AI 온라인 실무 교육
- 기초100제
- 데이터분석가
- 캐글데이터분석
- 파이썬
- Onehot인코딩
- 시그모이드함수
- OneHotEncoding
- 데이터 분석
- 코드업 기초100제
- 멋사 ai
- 데이터마케팅분석
- ai 스쿨 7기
- 머신러닝
- RFM
- 멋쟁이사자처럼 ai school 7기
- Today
- Total
초봉5센티미터
TIL 23. 머신러닝(회귀) 본문
파생변수 만들거나 데이터 변형할때는 train데이터와 test데이터 둘다 적용해야함
7:3 이나 8:2 로 나누는 과정은 hold-out-validation
- cross validation은 속도가 오래걸린다는 단점이 있기도 하지만 validation의 결과에 대한 신뢰가 중요할 때 사용. 예를 들어 사람의 생명을 다루는 암여부를 예측하는 모델을 만든다거나 하면 좀 더 신뢰가 있게 검증을 해야함.
- hold-out-validation 은 한번만 나눠서 학습하고 검증하기 때문에 빠르다는 장점이 있다. 하지만 신뢰가 떨어지는 단점이 있다. hold-out-validation 은 당장 비즈니스에 적용해야 하는 문제에 빠르게 검증해보고 적용해 보기에 좋다
- 클래스를 예측할 때 True, False로 예측하기도 하지만 멀티클래스 일 때는 특정 클래스의 확률을 예측하기도 한다.
그래서 예시의 측정공식은 logloss라는 공식을 사용다 엔트로피와 비슷하지만 다르다
MAE
- 모델의 예측값과 실제 값 차이의 절대값 평균
- 절대값을 취하기 때문에 가장 직관적임
MSE
- 모델의 예측값과 실제값 차이의 면적의(제곱)합
- 제곱을 하기 때문에 특이치에 민감하다.
RMSE
- MSE에 루트를 씌운 값
- RMSE를 사용하면 지표를 실제 값과 유사한 단위로 다시 변환하는 것이기 때문에 MSE보다 해석이 더 쉽다.
- MAE보다 특이치에 Robust(강하다)
RMSE: 오차가 클수록 가중치를 주게 됨(오차 제곱의 효과)
RMSLE: 오차가 작을수록 가중치를 주게 됨(로그의 효과)
캐글
도시 자전거 공유 시스템의 사용 예측
데이터셋 소개
* datetime - hourly date + timestamp
* season - 1 = spring, 2 = summer, 3 = fall, 4 = winter
* holiday - whether the day is considered a holiday
* workingday - whether the day is neither a weekend nor holiday
* weather - 1: Clear, Few clouds, Partly cloudy, Partly cloudy
2: Mist + Cloudy, Mist + Broken clouds, Mist + Few clouds, Mist
3: Light Snow, Light Rain + Thunderstorm + Scattered clouds, Light Rain + Scattered clouds
4: Heavy Rain + Ice Pallets + Thunderstorm + Mist, Snow + Fog
* temp - temperature in Celsius
* atemp - "feels like" temperature in Celsius
* humidity - relative humidity
* windspeed - wind speed
* casual - number of non-registered user rentals initiated
* registered - number of registered user rentals initiated
* count - number of total rentals
출처: Bike Sharing Demand | Kaggle
라이브러리 로드
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
데이터셋 로드
- season 은 계절로 1,2,3,4로 ordinal encoding(순서가 있는 값)으로 인코딩이 되어 있다.
- weather 는 1이면 맑은 날, 2는 흐린날, 3은 눈,비 오는 날, 4는 폭우, 폭설, 우박 내리는 날
- temp - 섭씨 기온
- atemp - 체감온도
train = pd.read_csv("data/bike/train.csv")
test = pd.read_csv("data/bike/test.csv")
결측치 확인
# 결측치 확인
# 결측치가 없다.
train.isnull().sum()
test.isnull().sum()
datetime 0
season 0
holiday 0
workingday 0
weather 0
temp 0
atemp 0
humidity 0
windspeed 0
dtype: int64
datetime을 연, 월, 일, 시, 분, 초의 파생변수로 변환하자
# 연,월,일,시,분,초를 피쳐로 사용하기 위해 파생변수 생성
train["datetime"] = pd.to_datetime(train["datetime"])
train["year"] = train["datetime"].dt.year
train["month"] = train["datetime"].dt.year
train["day"] = train["datetime"].dt.day
train["hour"] = train["datetime"].dt.hour
train["minute"] = train["datetime"].dt.minute
train["second"] = train["datetime"].dt.second
test["datetime"] = pd.to_datetime(test["datetime"])
test["year"] = test["datetime"].dt.year
test["month"] = test["datetime"].dt.year
test["day"] = test["datetime"].dt.day
test["hour"] = test["datetime"].dt.hour
test["minute"] = test["datetime"].dt.minute
test["second"] = test["datetime"].dt.second
train데이터에 해준것은 test에도 해줘야함
EDA
train.hist(figsize = (12,10), bins = 50);
test.hist(figsize = (12,10), bins = 50);
train과 test 데이터셋의 분포가 비슷하다는것을 확인할 수 있다.
sns.scatterplot(data = train, x = "windspeed", y = "count")
windspeed는 구하고자하는 값(count)와 상관이 없는것을 확인가능하다.
humidity(습도)도 마찬가지로 count와 상관이 있어 보이지 않는다
기온과 체감온도의 관계를 알아보자
sns.scatterplot(data = train, x = "temp", y = "atemp")
둘은 높은 상관관계를 가지고 있다 (다중공선성)
그리고 atemp 11~12 구간에서 10개의 값이 잘못 기입된 것으로 예측할 수 있다
학습, 예측 데이터셋 만들기
# label_name : 정답값
label_name = "count"
label_name
예측하고자 하는 값
# feature_names : 학습, 예측에 사용할 컬럼명(변수)
feature_names = train.columns.tolist()
feature_names.remove(label_name)
feature_names.remove("datetime")
feature_names.remove("casual")
feature_names.remove("registered")
feature_names.remove("month")
feature_names.remove("day")
feature_names.remove("minute")
feature_names.remove("second")
feature_names.remove("atemp")
feature_names.remove("humidity")
feature_names.remove("windspeed")
feature_names
위의 EDA에서 count와의 상관이 없는 변수들 삭제
# 학습(훈련)에 사용할 데이터셋 예) 시험의 기출문제
X_train = train[feature_names]
print(X_train.shape)
X_train.head(2)
# 예측 데이터셋, 예) 실전 시험 문제
X_test = test[feature_names]
print(X_test.shape)
X_test.head(2)
# 학습(훈련)에 사용할 정답값 예) 기출문제의 정답
y_train = train[label_name]
print(y_train.shape)
y_train.head(2)
머신러닝 알고리즘
랜덤포레스트의 회귀를 사용하여 예측해보도록 하겠습니다.
from sklearn.ensemble import RandomForestRegressor
model = RandomForestRegressor(random_state = 42, n_jobs = -1)
model
하이퍼 파라미터는 별다르게 설정하지 않았습니다.
교차검증
# 모의고사를 풀어서 답을 구하는 과정과 유사합니다.
# cross_val_predict는 예측한 predict의 값을 반환하여 직접 계산해 볼 수 있다.
# 다른 cross_validate, cross_val_score는 스코어를 조각마다 직접 계산하여 반환해 준다.
from sklearn.model_selection import cross_val_predict
y_valid_pred = cross_val_predict(model, X_train, y_train, cv = 5, n_jobs = -1, verbose = 2)
y_valid_pred
평가하기(RMLSE)
from sklearn.metrics import mean_squared_log_error
rmlse = mean_squared_log_error(y_train, y_valid_pred) ** 0.5
rmlse
0.5101068831223765
학습과 예측
y_predict = model.fit(X_train,y_train).predict(X_test)
# 피처의 중요도
sns.barplot(x = model.feature_importances_, y = model.feature_names_in_)
* 본글은 멋쟁이사자처럼 ai 스쿨의 강의 내용과 자료를 참고하여 제작하였습니다.
'교육 > 멋쟁이사자처럼 AI School 7기' 카테고리의 다른 글
TIL 25. 머신러닝 Scaling (0) | 2022.11.09 |
---|---|
TIL 24. 머신러닝 Feature Engineering (0) | 2022.11.08 |
TIL 22. 타이타닉 피처엔지니어링 (0) | 2022.11.02 |
TIL 21. 머신러닝 - 타이타닉 (0) | 2022.11.01 |
TIL 20. 머신러닝 - 회귀의 측정지표와 그리드서치,랜덤서치 (1) | 2022.10.31 |