Warm up
- 파라미터(Parameter) : 데이터를 통해 구해지며, 모델 내부적으로는 구해지지 않으며, 조정되지 않는다. ex) 모집단의 평균과 표준편차 등
- 하이퍼 파라미터(Hyper Parameter) : 모델링을 할 때 사용작 직접 세팅해주는 값. ex) learning rate 등
- 다중공선성(Multicollinearity) : 한 독립변수가 다른 독립변수들과 완벽히 선형 독립이 아닌 경우.
- 이 문제를 확인 할 수 있는 방법
- 상관관계 분석을 통해 : 0.9 이상이면 문제.
- 회귀분석의 공선성 확인 : 공차한계(Tolerance)가 0.1보다 작거나 VIF(Variance Inflation Factor, 분산팽창요인)이 10 이상이면 문제.
- 이러한 문제를 해결하기 위한 방법
- 변수가 다르게 구분될 수 있게 문항들을 추가. 그래서 상관도를 낮추거나
- 변수를 다른 것으로 변경
- 이 문제를 확인 할 수 있는 방법
- 첫 번째 그림은 bias가 크고 variance가 작음. 세 번째 그림은 bias는 작고 variance가 큼.
- 그럴 때, vias를 조금 가지더라도 제일 작은 variance를 가지는 모델을 만드는 게 최적.
- 이를 위해서는, 1. 특성 개수를 줄이기 2. 정규화를 수행
- 즉, 파라미터들을 정규화 방법을 shrinkage method이라고 하고, 이런 정규화 컨셉을 처음 도입한 모델이 Ridge Regression.
- Ridge Regression : 람다 값이 클 수록 리지회귀의 계수 추정치는 0에 가까워짐. 약간 learning rate같은 느낌으로 베타를 조절하는 버튼 같음. (출처) : https://rk1993.tistory.com/entry/Ridge-regression%EC%99%80-Lasso-regression-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0
Ridge regression(릿지 회귀)와 Lasso regression(라쏘 회귀) 쉽게 이해하기
Ridge regression와 Lasso regression를 이해하려면 일단 정규화(regularization)를 알아야합니다. 첫번째 그림을 보면 직선 방정식을 이용하여 선을 그었습니다. 데이터와 직선의 차이가 꽤 나네요. 정확한
rk1993.tistory.com
- 여기서 𝛌의 값을 조절해주면서 정규화의 강도를 조절해줄 수 있다.
- 𝛌가 0으로 갈수록 다른 회귀계수들이 회귀식에 끼치는 영향이 커지고, 𝛌가 커지면 커질수록 다른 회귀계수들은 0에 가까워지며 그에 따라서 다른 회귀계수들이 회귀식에 끼치는 영향이 작아진다. 𝛌가 너무 커지면 기준 모델(평균값)과 다르지 않게 되므로 적당한 값을 넣어주어야 한다.
- Categorical data는 데이터에 우선순위가 있는 경우(nominal)와 순서가 없는 경우(ordinal)으로 나뉜다.
- 많은 머신러닝 모델들은 문자열을 처리하지 못하기 때문에 숫자형으로 바꾸어주어야 한다.단순히 1, 2, 3, 4와 같이 양적인 측정을 할 수 있는 숫자로 바꿔줄 경우 데이터에 순위가 생겨 분석에 차질이 생길 수 있다.따라서 nominal일 경우 각 항목마다 columns을 나누어서 1, 0, 0, 0 / 0, 0, 1, 0 이런 식으로 인코딩을 해주어야한다.이것이 바로 one-hot encoding이다. (출처) : https://soranhan.tistory.com/13
[TIL-210201] Ridge Regression
1. Categorical data(범주형 자료)처리: One-hot encoding Categorical data는 데이터에 우선순위가 있는 경우(nominal)와 순서가 없는 경우(ordinal)으로 나뉜다. 아래의 방법은 nominal를 처리하는 방법이다...
soranhan.tistory.com
Session
- 원핫인코딩을 하면, 카테고리가 너무 많은 경우(high cardinlity)에 변수들이 모든 차원에 더해지게 됨.
#그냥 원핫인코딩
df = pd.get_dummies(df, prefix=['City'])
#불필요한 요소를 없앤 더미코딩
df = pd.get_dummies(df, prefix=['City'], drop_first=True)
- 원핫인코딩 순서
from sklearn.linear_model import LinearRegression
#그냥 선형회귀
model = LinearRegression()
model.fit(df[['독립변수 컬럼','독립변수 컬럼']], df['종속변수 컬럼'])
#원핫코딩 한 회귀
df_oh = pd.get_dummies(df, prefix=['City'])
model_dum = LinearRegression()
model_dum.fit(df[['독립변수 컬럼','독립변수 컬럼']], df['종속변수 컬럼'])
- 카테고리 인코더 순서
#훈련 데이터랑 테스트 데이터를 나눠주고
!pip install category_encoders
from category_encoders import OneHotEncoder
#원핫 인코딩
encoder = OneHotEncoder(use_cat_names = True)
X_train = encoder.fit_transform(X_train)
X_test = encoder.transform(X_test)
- 특성공학 : 과제에 적합한 특성을 만들어내는 과정. 아래는 순서.
#train test 나누고
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)
#선택된 특성들 출력
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]
- 몇 개의 k를 선택해야 하는지는 해 보면서 확인을 해야함. 그래서 1~10개정도까지는 다 돌려보는 게 좋음.
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')
- 릿지 리그레션에서는
- 람다가 커질수록 회귀계수들을 0으로 수렴시킴. 덜 중요한 특성의 개수를 줄이는 효과가 있음.
- 반대로 0에 가까워지면 다중회귀모델이 됨. 별 차이 없음.
- 일반화가 잘 되는 람다값을 찾는 걸 정규화라고 얘기함.
- 알파값(람다값)을 올릴수록 기준모델(보통 평균값)과 같아짐(즉 수평이 되어버림=기울기가 작아짐).
- 적절한 알파값을 구하는 것은 특별한 공식이 있는 것은 아니고, 여러 알파값을 가지고 검증실험을 해보면 됨. 교차검증(Cross-validation)을 사용해 훈련, 검증 데이터로 나누어 검증실험을 진행하면 됨. 여기서는 Ridge CV를 제공.
from sklearn.linear_model import RidgeCV
alphas = [0.01, 0.05, 0.1, 0.2, 1.0, 10.0, 100.0]
ridge = RidgeCV(alphas=alphas, normalize=True, cv=3)
ridge.fit(ans[['x']], ans['y'])
- ridge 회귀 식이랑 mae 받는 코드
for alpha in [0.001, 0.01, 0.1, 1.0, 10.0, 100.0]:
feature = 'sqft_living'
print(f'Ridge Regression, with alpha={alpha}')
model = Ridge(alpha=alpha, normalize=True)
model.fit(X_train[[feature]], y_train)
# Get Test MAE
y_pred = model.predict(X_test[[feature]])
mae = mean_absolute_error(y_test, y_pred)
print(f'Test MAE: ${mae:,.0f}')
- 패널티 값이 커질수록 회계계수가 작아짐.
Quiz Coding
- profiling
import pandas_profiling
pr = df.profile_report()
pr
- encoder = OneHotEncoder(use_cat_names = True) 에서 use 어쩌구는 이전에 사용했던 컬럼 이름을 그래도 사용한다.
- 테스트 데이터는 테스트할 때 써야하니까 트레인 데이터만 학습시킨다
## 학습데이터에 fit_transform
X_train_selected = selector.fit_transform(X_train, y_train)
## 테스트 데이터는 transform
X_test_selected = selector.transform(X_test)
- 가장 score 높은 특성(Attribute) 뽑고 싶으면 데이터프레임으로 만들어서 ascending 해줘야함. 그냥 selector.scores_ 때려버리면 모든 특성의 score가 나옴.
#빈 데이터프레임 생성
X_train_scores = pd.DataFrame()
X_train_scores['f_regression'] = selector.scores_
X_train_scores['Attribute'] = X_train.columns
#선택된 20개만 필터링해서 내림차순으로 보기
X_train_scores = X_train_scores.sort_values('f_regression', ascending = False)
- 릿지 모델 만들어서 점수 확인하는 법
#select한 특성들만 사용하게 변수를 바꿔줘야 함.
X_train_20 = X_train[selected_names]
X_test_20 = X_test[selected_names]
model = RidgeCV(alphas=alphas, normalize=True, cv=5)
model.fit(X_train_20, y_train)
print('best alpha = ', model.alpha_)
print('best score = ', model.best_score_)
- MAE랑, R2 값 구하기
y_pred = model.predict(X_test_20)
# MAE, R^2 for test 결과 확인하기.
mae = mean_absolute_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f'Test MAE: ${mae:,.0f}')
print(f'Test R2: {r2:,.3f}\n')
도울될만한 사이트
다중공선성(Multicollinearity)이란?
위의 A를 보면, '일과 생활의 균형'과 '삶의 질'이라는 변인이 있습니다. 두 변인이 일치에 가까울 정도로 관련성(상관관계)이 높다면 문제가 발생할 수 있습니다. 그 문제를 다중공선성(Multicolli
learnx.tistory.com
머신러닝 - 13. 파라미터(Parameter)와 하이퍼 파라미터(Hyper parameter)
파라미터와 하이퍼 파라미터는 명확히 다른 개념입니다. 하지만 많은 사람들이 두 단어를 혼용해서 쓰고 있습니다. 특히, 하이퍼 파라미터를 파라미터라 칭하는 오류가 많습니다. 파라미터와
bkshin.tistory.com
Ridge regression(릿지 회귀)와 Lasso regression(라쏘 회귀) 쉽게 이해하기
Ridge regression와 Lasso regression를 이해하려면 일단 정규화(regularization)를 알아야합니다. 첫번째 그림을 보면 직선 방정식을 이용하여 선을 그었습니다. 데이터와 직선의 차이가 꽤 나네요. 정확한
rk1993.tistory.com
[TIL-210201] Ridge Regression
1. Categorical data(범주형 자료)처리: One-hot encoding Categorical data는 데이터에 우선순위가 있는 경우(nominal)와 순서가 없는 경우(ordinal)으로 나뉜다. 아래의 방법은 nominal를 처리하는 방법이다...
soranhan.tistory.com
소감
금요일~일요일까지 노느라 과제 다 못 함....ㅎ
생각보다 어렵지 않았는데 그냥 놀아버림....돌아버려
집중해서 하면 진짜 잘 할 거 같은데 집중력 장애라.....
홧팅
'[코드스테이츠]AI' 카테고리의 다른 글
[AI 부트캠프]5주차 총 복습 (0) | 2022.05.02 |
---|---|
[S2-Week1]Logistic Regression (0) | 2022.05.02 |
[Section1 Project]디자이너를 꿈꾸는 게 빠르지 않을까 (0) | 2022.04.26 |
[AI 부트캠프]3주차 총 복습 (0) | 2022.04.26 |
[AI 부트캠프]2주차 총 복습 (0) | 2022.04.11 |
댓글