Regression
Regression?
- 예측할 값(Target)이 연속형(continuous) 데이터(float)인 지도 학습(Supervised Learning)
- 틀린 정도가 평가 기준
- 평가 지표
- MSE (Mean Squared Error)
- 실제 값과 예측값의 차를 제곱해 평균 낸 것
- 0에 가까울수록 좋은 성능
from sklearn.metrics import mean_squared_error
mse = mean_squared_error(Label, 예측값)
- RMSE (Root Mean Squared Error)
- MSE는 오차의 제곱한 값이므로 실제 오차의 평균보다 큰 값이 나온다
- 0에 가까울수록 좋은 성능
- 방법
- np.sqrt(MSE)
- mean_squared_error(squared=False)
```python
score = cross_val_score(lr, X, y, scoring='neg_mean_squared_error', cv=5)
- R^2 (R square, 결정계수)
- 평균으로 예측했을 때 오차(총 오차) 보다 모델을 사용했을 때 얼마 만큼 더 좋은 성능을 내는지를 비율로 나타낸 값
- 1에 가까울수록 좋은 성능
from sklearn.metrics import r2_score
r2 = r2_score(Label, 예측값)
- make_regression
X, y = make_regression(n_samples=1000,
n_features=1,
n_informative=1,
noise=50,
random_state=0)
Regression - Voting
- VotingRegressor
from sklearn.ensemble import VotingRegressor
from sklearn.linear_model import LinearRegression
''' 여러 모델들을 학습한다 했을 때
knn_reg = KNeighborsRegressor(n_neighbors=3)
tree_reg = DecisionTreeRegressor(max_depth=2)
rf_reg = RandomForestRegressor(n_estimators=200, max_depth=2)
gb_reg = GradientBoostingRegressor(n_estimators=200, max_depth=1)
lr_reg = LinearRegression()
estimators = [("knn",knn_reg), ('random forest',rf_reg), ('Gradient Boosting', gb_reg), ('linear reg',lr_reg)]
vote_reg = VotingRegressor(estimators)
vote_reg.fit(X_train, y_train)
'''
pred_train = vote_reg.predict(X_train)
pred_test = vote_reg.predict(X_test)
Linear Regression
데이터 전처리
- 범주형
- 연속형
- Feature Scaling
- StandardScaler
Logistic Regression
- 선형회귀 알고리즘을 이용한 이진 분류 모델
- 선형회귀 처럼 입력 특성(Feature)에 가중치 합을 계산한 값을 로지스틱 함수를 적용해 확률을 계산
- 로지스틱 함수
- 0과 1 사이의 실수를 반환
- S자 형태의 결과를 내는 sigmoid function
- Loss Function
- 종류
- Cross Entropy(로그손실-log loss)
- 모델이 예측한 정답의 확률에 대해 log를 취해 손실값을 구한다
- 확률이 틀리면 틀릴수록 log를 이용해 손실값을 크게 만드는 것이 목적
- Binary Cross Entropy
- Logistic 함수를 이용한 추론 결과에 대한 cross entropy 계산
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression(random_state=0)
lr.fit(X_train_scaled, y_train)
Polynomial Regression
- 단순한 직선형 보다 복잡한 비선형의 데이터셋을 학습하기 위한 방식
- eature가 너무 적어 y의 값들을 다 표현 하지 못하여 underfitting이 된 경우 Feature를 늘려주는 작업
from sklearn.preprocessing import PolynomialFeatures
poly_f = PolynomialFeatures(degree=2,
include_bias=False)
X_poly = poly_f.fit_transform(X)
lr2 = LinearRegression()
lr2.fit(poly처리된 Feature, Label)
Regularization
Regularization?
- 선형 회귀 모델에서 과대적합(Overfitting) 문제를 해결하기 위해 가중치(회귀계수)에 페널티 값을 적용한다
- Overfitting = DATA에 비해 MODEL이 복잡한 경우이며 이를 개선하기 위해서는
- 데이터를 더 수집 ==> 현실적으로 불가능한 경우 많다
- Feature selection
- Regularization(규제) 통해 Feature통해 곱해지는 가중치가 커지지않도록(무조건 작게가 아닌 0에 가깝게) 제한
- 종류
- Lasso : L1 규제
- Ridge : L2 규제
Lasso Regularization : L1규제
- Target에 영향을 주는 Feature가 몇 개뿐일 경우 특성의 가중치를 0으로 만들어 주는 Lasso 사용
from sklearn.linear_model import Lasso
lasso = Lasso(random_state=0)
lasso.fit(X_train_scaled, y_train)
pred_train = lasso.predict(X_train_scaled)
pred_test = lasso.predict(X_test_scaled)
Ridge Regularization : L2규제
- 손실함수에 규제항을 추가
- 손실함수(Loss Function) : 모델의 예측한 값과 실제값 사이의 차이를 정의하는 함수
- 규제정도 (alpha, a)
- 기본적으로 Ridge 사용
from sklearn.linear_model import Ridge
ridge1 = Ridge(random_state=0)
ridge1.fit(X_train_scaled, y_train)
pred_train1 = ridge1.predict(X_train_scaled)
pred_test1 = ridge1.predict(X_test_scaled)
Lasso(L1)와 Ridge(L2)
- L1
- 변수간 상관관계가 높으면 성능이 떨어진다
- 비중요 변수를 우선적으로 줄임
- 여러 개의 solution 존재 가능
- L2
- 변수간 상관관계 높아도 좋은 성능
- 크기가 큰 변수를 우선으로 줄임
- 벡터 간의 거리를 유클리디안 거리 사용
- only 한가지 solution
ElasticNet
- Lidge와 Lasso를 절충
- 특성 수가 학습 샘플 수 보다 많거나 feature간에 연관성이 높을 때는 ElasticNet을 사용
- r : 혼합비율
- r = 0 : Lidge와 유사
- r = 1 : Lasso와 유사
- 변수간 상관관계를 반영한 정규화
- 상관관계가 큰 변수를 동시에 선택/배제
from sklearn.linear_model import ElasticNet
elastic = ElasticNet(alpha=0.1, l1_ratio=0.6)
elastic.fit(X_train_scaled, y_train)
Ridge Regularization - GridSearchCV
from sklearn.model_selection import GridSearchCV
param = {"alpha":[0.01, 0.1, 1, 5, 10, 20, 30, 40, 100]}
ridge = Ridge(random_state=0)
gs = GridSearchCV(ridge, param, cv=4, scoring=['r2', 'neg_mean_squared_error'], refit='r2')
gs.fit(X_train_scaled, y_train)