본문 바로가기

Machine Learning/머신러닝 완벽가이드 for Python

ch5.6_2 선형 회귀 모델의 성능향상을 위한 피처 엔지니어링(실습)

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값이 작아지기는 하지만, 변동성이 커서 과적합의 가능성 존재.그래서 무난하게 로그 변환을 하는 것이 많이 쓰인다.