: 에 대해 패널티를 부여하는 방식. 주요 생성 파라미터는 alpha로, alpha가 커질 수록 회귀 계수 값을 작게 만든다.
from sklearn.linear_model import Ridge
: 에 패널티를 부여하는 방식. 불필요한 회귀 계수를 급격하게 감소시켜 0으로 만든다.
from sklearn.linear_model import Lasso
alpha
= l1_ratio
= l1_ratio = 0
이면, a=0이므로 L2규제와 동일l1_ratio = 1
이면, b=0이므로 L1 규제와 동일from sklearn.linear_model import ElasticNet
StandardScaler : 평균이 0, 분산이 1인 정규분포를 가진 데이터 세트로 변환
MinMaxScaler : 최소값이 0, 최대값이 1인 값으로 정규화 수행
스케일링/정규화를 수행한 데이터 세트에 다시 다항 특성을 적용하여 변환
⭐️로그 변환⭐️ : log함수를 적용하여 정규분포에 가까운 형태로 변환
np.log1p()
= 사용: 선형 회귀 방식을 분류에 적용한 알고리즘 (이진 분류에 뛰어남)
: 시그모이드Sigmoid 함수 최적선을 찾고 이 시그모이드 함수의 반환값을 확률로 간주해 확률에 따라 분류를 결정한다.
penalty
: 규제 유형 설정. ‘l2’, ‘l1’ (기본은 l2)C
: 규제 강도 조절하는 alpha의 역수 (1/alpha) 작을수록 규제강도 높아짐: 회귀를 위한 트리를 생성하고 이를 기반으로 회귀 예측 진행
: 리프 노드에 속한 데이터 값의 평균값으로 회귀 예측값을 계산
: 결정트리, 랜덤포레스트, GBM, LightGBM, XGBoost 등 모든 트리 기반 알고리즘은 회귀 계산 가능
(뒤에 Regressor. 예: DecisionTreeRegressor)
단, 선형 회귀와 다른 처리 방식이므로 회귀 계수를 제공하는 coef 속성은 없다. 대신 피처별 중요도를 알려주는 feature_importances 제공
def get_top_error_data(y_test, pred, n_tops = 5):
# DataFrame에 컬럼들로 실제 대여횟수(count)와 예측 값을 서로 비교 할 수 있도록 생성.
result_df = pd.DataFrame(y_test.values, columns=['real_count'])
result_df['predicted_count']= np.round(pred)
result_df['diff'] = np.abs(result_df['real_count'] - result_df['predicted_count'])
# 예측값과 실제값이 가장 큰 데이터 순으로 출력.
print(result_df.sort_values('diff', ascending=False)[:n_tops])
get_top_error_data(y_test,pred,n_tops=5)
y_target.hist()
y_log_transform = np.log1p(y_target)
y_log_transform.hist()
결괏값이 왜곡된 경우, 로그 변환 하면 좋다
y_log_transform = np.log1p(y_target)
y_log_transform.hist()
로그 변환된 것 → 원상 복구 : np.expm1(y_data)
# 타겟 컬럼인 count 값을 log1p 로 Log 변환
y_target_log = np.log1p(y_target)
# 로그 변환된 y_target_log를 반영하여 학습/테스트 데이터 셋 분할
X_train, X_test, y_train, y_test = train_test_split(X_features, y_target_log, test_size=0.3, random_state=0)
lr_reg = LinearRegression()
lr_reg.fit(X_train, y_train)
pred = lr_reg.predict(X_test)
# 테스트 데이터 셋의 Target 값은 Log 변환되었으므로 다시 expm1를 이용하여 원래 scale로 변환
y_test_exp = np.expm1(y_test)
# 예측 값 역시 Log 변환된 타겟 기반으로 학습되어 예측되었으므로 다시 exmpl으로 scale변환
pred_exp = np.expm1(pred)
evaluate_regr(y_test_exp ,pred_exp)
# 'year', month', 'day', hour'등의 피처들을 One Hot Encoding
X_features_ohe = pd.get_dummies(X_features, columns=['year', 'month','day', 'hour', 'holiday',
'workingday','season','weather'])
# X_features에서, columns=[] 들의 col을 o-h 인코딩 하겠다.
X_features_ohe.head()
+데이터 스케일링/정규화, 인코딩
+스태킹 기법 가능