5 선형 회귀 모델의 성능향상을 위한 피처 엔지니어링
# 먼저 타겟값이 정규분포 형태인지 확인해보자
print(y_target.shape)
plt.hist(y_target, bins=10)
>>>
(506,)
(array([ 21., 55., 82., 154., 84., 41., 30., 8., 10., 21.]),
array([ 5. , 9.5, 14. , 18.5, 23. , 27.5, 32. , 36.5, 41. , 45.5, 50. ]),
<BarContainer object of 10 artists>)
-> 타겟값은 어느정도 정규분포 형태임을 확인
from sklearn.preprocessing import StandardScaler, MinMaxScaler, PolynomialFeatures
# 데이터 정규화(Standard, MinMax, Log)에 따라 데이터를 정규화해주는 함수
# p_degree는 다향식 특성을 추가할 때 적용. p_degree는 2이상 부여하지 않음
def get_scaled_data(method = 'None', p_degree=None, input_data=None):
if method == 'Standard':
scaled_data = StandardScaler().fit_transform(input_data)
elif method == 'MinMax':
scaled_data = MinMaxScaler().fit_transform(input_data)
elif method == 'Log':
scaled_data = np.log1p(input_data)
else:
scaled_data = input_data
if p_degree != None:
scaled_data = PolynomialFeatures(degree=p_degree,
include_bias=False).fit_transform(scaled_data)
return scaled_data
# 피처 엔지니어링 case의 수는 모두 6개
# 정규화(3개) : 표준정규분포화, 최대/최소 정규화, 로그 변환
# 다항식(2개) : 1차, 2차 다항식
# 원본 데이터 # 표준정규분포화 # 표준정규분포화 + 2차 다항식
scale_methods = [(None, None), ('Standard', None), ('Standard', 2),
# 최대/최소 정규화 # 최대/최소 정규화 + 2차 다항식 # 로그 변환
('MinMax', None), ('MinMax', 2), ('Log', None)]
# Ridge의 alpha값을 다르게 적용하고 다양한 데이터 변환방법에 따른 RMSE 추출.
alphas = [0.1, 1, 10, 100]
i = 1
for scale_method in scale_methods:
X_data_scaled = get_scaled_data(method=scale_method[0], p_degree=scale_method[1],
input_data=X_data)
print('\n case{0}: 변환 유형:{1}, Polynomial Degree:{2}'.format(i, scale_method[0], scale_method[1]))
get_linear_reg_eval('Ridge', params=alphas, X_data_n=X_data_scaled,
y_target_n=y_target, verbose=False)
i += 1
case1: 변환 유형:None, Polynomial Degree:None
alpha 0.1일 때 5 폴드 세트의 평균 RMSE: 5.788
alpha 1일 때 5 폴드 세트의 평균 RMSE: 5.653
alpha 10일 때 5 폴드 세트의 평균 RMSE: 5.518
alpha 100일 때 5 폴드 세트의 평균 RMSE: 5.330
case2: 변환 유형:Standard, Polynomial Degree:None
alpha 0.1일 때 5 폴드 세트의 평균 RMSE: 5.826
alpha 1일 때 5 폴드 세트의 평균 RMSE: 5.803
alpha 10일 때 5 폴드 세트의 평균 RMSE: 5.637
alpha 100일 때 5 폴드 세트의 평균 RMSE: 5.421
case3: 변환 유형:Standard, Polynomial Degree:2
alpha 0.1일 때 5 폴드 세트의 평균 RMSE: 8.827
alpha 1일 때 5 폴드 세트의 평균 RMSE: 6.871
alpha 10일 때 5 폴드 세트의 평균 RMSE: 5.485
alpha 100일 때 5 폴드 세트의 평균 RMSE: 4.634
case4: 변환 유형:MinMax, Polynomial Degree:None
alpha 0.1일 때 5 폴드 세트의 평균 RMSE: 5.764
alpha 1일 때 5 폴드 세트의 평균 RMSE: 5.465
alpha 10일 때 5 폴드 세트의 평균 RMSE: 5.754
alpha 100일 때 5 폴드 세트의 평균 RMSE: 7.635
case5: 변환 유형:MinMax, Polynomial Degree:2
alpha 0.1일 때 5 폴드 세트의 평균 RMSE: 5.298
alpha 1일 때 5 폴드 세트의 평균 RMSE: 4.323
alpha 10일 때 5 폴드 세트의 평균 RMSE: 5.185
alpha 100일 때 5 폴드 세트의 평균 RMSE: 6.538
case6: 변환 유형:Log, Polynomial Degree:None
alpha 0.1일 때 5 폴드 세트의 평균 RMSE: 4.770
alpha 1일 때 5 폴드 세트의 평균 RMSE: 4.676
alpha 10일 때 5 폴드 세트의 평균 RMSE: 4.836
alpha 100일 때 5 폴드 세트의 평균 RMSE: 6.241
-> 선형 회귀의 Feature engineering시 Polynomial degree(다항식 차수)가 2를 적용하면 RMSE값이 작아지기는 하지만, 변동성이 커서 과적합의 가능성 존재.그래서 무난하게 로그 변환을 하는 것이 많이 쓰인다.
'Machine Learning > 머신러닝 완벽가이드 for Python' 카테고리의 다른 글
ch.5.8 회귀 트리 (0) | 2022.10.13 |
---|---|
ch.5.7 로지스틱 회귀 (0) | 2022.10.13 |
ch5.6_1 선형 회귀 모델을 위한 피처 엔지니어링 (0) | 2022.10.13 |
ch5.5_5.6 Polynomial 회귀와 overfittng, 규제 선형 모델 (실습) (0) | 2022.10.13 |
ch.5.6 규제 선형 회귀 (릿지, 라쏘, 엘라스틱넷) (0) | 2022.10.13 |