21년 4월 7일 

S2-Week 1 : Linear Models

 

 

Ridge Regression

 

키워드

  • 범주형(Cagegorical) 자료를 다루기 위한 원핫인코딩(One-hot encoding) 기법을 이해
  • Ridge 회귀를 통한 특성선택(Feature selection) 과정을 이해
  • 정규화(regularization)을 위한 Ridge 회귀모델을 이해하고 사용

  • ridge regression을 통해서 bias를 약간 높이게 되면 어떤 효과를 얻게 되나요?
  • 람다(패널티) 값을 크게 잡으면 어떤 효과가 있나요?

 

Feature Engineering (특성공학)

특정 애플리케이션에 가장 적합한 데이터 표현을 찾는 것

 

 

선택 가능한 특성들의 가지수를 계산하는 방법

1
2
3
4
5
6
7
8
9
10
11
12
from math import factorial
 
= len(train.columns)
 
def n_choose_k(n, k):
    return factorial(n)/(factorial(k)*factorial(n-k))
 
combinations = sum(n_choose_k(n,k) for k in range(1,n+1))
 
combinations
 
# print(f'{combinations:,.0f}')
cs

위의 코드를 입력하면 많은 방법들이 나오는데 다 수작업으로 할 수 없으니  SelectKBest를 사용해서 유용한 특성들을 찾을 수 있다.

 

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
#데이터를 훈련/테스트 데이터로 분리합니다.
target = 'price'
 
## X_train, y_train, X_test, y_test 데이터로 분리
X_train = train.drop(columns=target)
y_train = train[target]
X_test = test.drop(columns=target)
y_test = test[target]
 
 
*SelectKBest를 사용해 가장 효과적인 특성 K개를 골라본다
#target(Price)와 가장 correlated 된 features 를 k개 고르는 것이 목표입니다.
 
## f_regresison, SelectKBest
from sklearn.feature_selection import f_regression, SelectKBest
 
## selctor 정의합니다.
selector = SelectKBest(score_func=f_regression, k=10)
 
## 학습데이터에 fit_transform 
X_train_selected = selector.fit_transform(X_train, y_train)
 
## 테스트 데이터는 transform
X_test_selected = selector.transform(X_test)
 
 
X_train_selected.shape, X_test_selected.shape
 
cs

 

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
*선택된 특성을 확인해본다.
all_names = X_train.columns
 
## selector.get_support()
selected_mask = selector.get_support()
 
## 선택된 특성들
selected_names = all_names[selected_mask]
 
## 선택되지 않은 특성들
unselected_names = all_names[~selected_mask] 
 
print('Selected names: ', selected_names)
print('Unselected names: ', unselected_names)


* 특성의 수 k를 어떻게 결정하는게 좋은지 알아보자!
# features를 몇 개 선책하는 것이 좋은지 알아 봅시다.
 
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error, r2_score
 
training = []
testing = []
ks = range(1len(X_train.columns)+1)
 
# 1 부터 특성 수 만큼 사용한 모델을 만들어서 MAE 값을 비교 합니다.
for k in range(1len(X_train.columns)+ 1):
    print(f'{k} features')
    
    selector = SelectKBest(score_func=f_regression, k=k)
    
    X_train_selected = selector.fit_transform(X_train, y_train)
    X_test_selected = selector.transform(X_test)
    
    all_names = X_train.columns
    selected_mask = selector.get_support()
    selected_names = all_names[selected_mask]
    print('Selected names: ', selected_names)
 
    
    model = LinearRegression()
    model.fit(X_train_selected, y_train)
    y_pred = model.predict(X_train_selected)
    mae = mean_absolute_error(y_train, y_pred)
    training.append(mae)
    
    y_pred = model.predict(X_test_selected)
    mae = mean_absolute_error(y_test, y_pred)
    r2 = r2_score(y_test, y_pred)
    testing.append(mae)
    print(f'Test MAE: ${mae:,.0f}')
    print(f'Test R2: {r2} \n')
 
plt.plot(ks, training, label='Training Score', color='b')
plt.plot(ks, testing, label='Testing Score', color='g')
plt.ylabel("MAE ($)")
plt.xlabel("Number of Features")
plt.title('Validation Curve')
plt.legend()
plt.show()
cs

Ridge Regression

-과적합을 줄이는 간단한 방법 중 한 가지는 모델의 복잡도를 줄이는 방법입니다. 특성의 갯수를 줄이거나 모델을 단순한 모양으로 적합하는 것이다.

-Ridge 회귀는 편향을 조금 더하고, 분산을 줄이는 방법으로 정규화(모델을 변형하여 과적합을 완화해 일반화 서능을 높여주기 위한 기법)한다.

-특성을 선택하는 문제, 아웃라이어를 해결하는 것도, 다중공선성 문제도 해결하는데 쓰임

 

패널티값을 보다 효율적으로 구할 수 있는 방법이 있을까요?

교차검증을 통해 검증실험을 하면 되는데 sklearn에서 내장된 교차검증 알고리즘을 적용하는 RidgeCV를 제공한다.

 

“사이킷런 fit_transform, transform 차이점” 을 구글링 해 보시는 것도 추천드립니다. (단! 강의 세션 이후에!

 

 

 

'개발 관련자료 > ML, DL' 카테고리의 다른 글

Random Forests  (0) 2021.04.25
Decision Trees  (0) 2021.04.24
Multiple Regression  (0) 2021.04.22
Simple Regression  (0) 2021.04.22
Clustering  (0) 2021.04.21

+ Recent posts