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
n = 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(1, len(X_train.columns)+1)
# 1 부터 특성 수 만큼 사용한 모델을 만들어서 MAE 값을 비교 합니다.
for k in range(1, len(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 |