[AI] Regression : Scikit - Learn

Ik·2022년 7월 17일
0

Data

목록 보기
11/34

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에 가까울수록 좋은 성능
      • 방법
        1. np.sqrt(MSE)
        2. mean_squared_error(squared=False)
      ```python
      # 교차검증을 이용해 구한 RMSE
      score = cross_val_score(lr, X, y, scoring='neg_mean_squared_error', cv=5) # scoring defalut : r2
      # 결과 부호 반대로 나오기 때문에 (*-1)연산해줘야 한다
    • R^2 (R square, 결정계수)
      • 평균으로 예측했을 때 오차(총 오차) 보다 모델을 사용했을 때 얼마 만큼 더 좋은 성능을 내는지를 비율로 나타낸 값
      • 1에 가까울수록 좋은 성능
      from sklearn.metrics import r2_score
      r2 = r2_score(Label, 예측값)
  • make_regression
    • 회귀에 사용되는 Dataset 생성
X, y = make_regression(n_samples=1000,    # data point(semple)의 개수, (Table 데이터: 행수)
                       n_features=1,      # feature의 개수, (table 데이터: 열수)
                       n_informative=1,   # Target(정답)에 영향을 주는 Feature 개수
                       noise=50,          # 잡은, 모델이 찾을 수 없는 값의 범위 지정(패턴에서 벗어난 값의 크기)
                                               # 0~50사이의 값을 model에 random하게 넣음
                                               # 현재 가지고 있는 feature로 학습이 부족(noise 발생)한 부분을 커버하기 위해
                                               # 우리가 더 모르는 Feature의 특징 파악 위해사용
                       random_state=0)
  • Regression
    from sklearn.linear_model import LinearRegression
    # 모델 생성
    lr = LinearRegression()
    # 학습
    lr.fit(X, y)
    • 가중치와 절편
      • 가중치와 결과값의 방향성 같음
        • 가중치 양수, 증가하면 결과값 증가
      model.coef_  # Feature에 곱하는 가중치
      model.intercept_  # 모든 Feature가 0일 때 예측값, bias(상수값)

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

데이터 전처리

  • 범주형
    • one_hot_encoding
      • get_dummies()
        • one_hot_encoding 중에 하나를 제거해주는 것, class가 m개라면 m-1개로 만듬
          • 0과 1로만 구성되어있기에 하나가 없어도 같은 효과 볼 수 있다
      df2 = pd.get_dummies(df, columns=[''])  # 특정 열만
      df2 = pd.get_dummies(df, columns=['']),  drop_first=True)   # 첫번째 class요소만 만듬
  • 연속형
    • 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
# 생성할  Feature의 최고차항 차수를 지정(2: X+X**2, 3: X+X**2, X**3)
# degree가 너무 큰 경우 Overfitting 발생
poly_f = PolynomialFeatures(degree=2,     
                            include_bias=False)  # 상수항을 추가할 것인지 여부(True: 모든 값이 1인 Feature가 추가)
# 데이터 전처리 : 학습 및 실행 
X_poly = poly_f.fit_transform(X)
# 모델 학습 : 회귀 모델 객체 생성 및 학습
lr2 = LinearRegression()
lr2.fit(poly처리된 Feature, Label)

Regularization

Regularization?

  • 선형 회귀 모델에서 과대적합(Overfitting) 문제를 해결하기 위해 가중치(회귀계수)에 페널티 값을 적용한다
  • Overfitting = DATA에 비해 MODEL이 복잡한 경우이며 이를 개선하기 위해서는
    1. 데이터를 더 수집 ==> 현실적으로 불가능한 경우 많다
    2. Feature selection
      • 불필요한 Feature 제거
    3. 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보다 더 급격하게 규제 변화

Ridge Regularization : L2규제

  • 손실함수에 규제항을 추가
    • 손실함수(Loss Function) : 모델의 예측한 값과 실제값 사이의 차이를 정의하는 함수
  • 규제정도 (alpha, a)
    • 0에 가까울수록 규제가 약해진다
      • 0일 경우는 선형회귀와 동일
  • 기본적으로 Ridge 사용
from sklearn.linear_model import Ridge
# 객체 생성
ridge1 = Ridge(random_state=0)  # defalut : alpha = 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) #alpha 페날티(규제강도), l1_ratio: Lasso 비율
# 학습
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)

0개의 댓글