njs03332 / ml_study

3 stars 0 forks source link

2022/04/27~2022/05/03 #27

Open danbi5228 opened 2 years ago

danbi5228 commented 2 years ago
danbi5228 commented 2 years ago

4.3 다항회귀

# 2차 방정식으로 비선형 데이터 생성 (잡음 포함)

m = 100
X = 6 * np.random.rand(m, 1) - 3
y = 0.5 * X**2 + X + 2 + np.random.randn(m, 1)

image

# 각 특성을 제곱(2차 다항)하여 새로운 특성으로 추가 ; 특성 하나 추가

from sklrean.preprocessing import PolynomialFeatures

poly_features = PolynomicalFeatures(degree=2, include_bias=False) # include_bias = True ; 0차항도 생성
X_poly = poly_features.fit_transform(X)
X[0] # array([-0.75275929])
X_poly[0] # array([-0.75275929, 0.56664654])

# X_poly : 원래 특성 X + 특성의 제곱
# Linear Regression 적용
lin_reg = LinearRegression()
lin_reg.fit(X_poly, y)
lin_reg.intercept_, lin_reg.coef_ # array([1.78134581]) , array([[0.93366893, 0.56456263]])

image

givitallugot commented 2 years ago

4.5 규제가 있는 선형 모델

4.5.1 릿지 회귀

모델 예시

정규방정식으로 릿지 회귀 적용

from sklearn.linear_model import Ridge

ridge_reg = Ridge(alpha=1,
                 solver="cholesky",
                 random_state=42)
ridge_reg.fit(X,y)
ridge_reg.predict([[1.5]])

확률적 경사 하강법에서 릿지 회귀 사용

sgd_reg = SGDRegressor(penalty="l2") sgd_reg.fit(X, y.ravel()) # ravel: 다차원 배열을 1차로 평평하게 바꿔주는 함수 sgd_reg.predict([[1.5]])

njs03332 commented 2 years ago

4.4 학습 곡선

def plot_learning_curves(model, X, y): X_train, X_val, y_train, y_val = train_test_split(X,y, test_size=0.2) train_errors, val_errors = [], [] for m in range (1, len(X_train)): model.fit(X_train[:m], y_train[:m]) y_train_predict = model.predict(X_train[:m]) y_val_predict = model.predict(X_val) train_errors.append(mean_squared_error(y_train[:m], y_train_predict)) val_errors.append(mean_squared_error(y_val, y_val_predict)) plt.plot(np.sqrt(train_errors), "r-+", linewidth = 2, label = "train set") plt.plot(np.sqrt(val_errors), "b-", linewidth = 3, label = "validation set") plt.xlabel("size of train set") plt.ylabel("RMSE") plt.legend()



- 단순 선형 회귀 모델의 학습 곡선
![image](https://user-images.githubusercontent.com/37107740/166443439-55141bee-859e-4cc1-9af0-3172922ff88e.png)
  - 훈련 데이터 성능: 1~2 샘플이 있을 때는 완벽한 성능, 샘플이 추가됨에 따라 완벽한 학습이 불가능해짐 (오차가 상승하다 어느 정도 평편해짐)
  - 검증 데이터 성능: 훈련 샘플이 적을 때는 검증 오차가 매우 큼, 훈련 샘플이 추가됨에 따라 검증 오차가 천천히 감소하나 오차의 감소가 완만해짐
  - 과소적합된 모델의 전형적인 모습 (= 두 곡선이 수평한 구간을 만들고 꽤 높은 오차에서 매우 가까이 근접해 있음)
  - 모델이 과소적합되어 있다면 훈련 샘플을 더 추가해도 효과가 없음. 더 복잡한 모델을 사용하거나 더 나은 특성을 선택해야 함
- 10차 다항 회귀 모델의 학습 곡선
![image](https://user-images.githubusercontent.com/37107740/166443462-3d47f9c0-bce8-4a3f-a720-5a6e1405d359.png)
  - 훈련 데이터의 오차가 선형 회귀 모델보다 훨씬 낮음
  - 두 곡선 사이에 공간이 있음. (= 과대적합 모델의 특징)
  - 더 큰 훈련세트를 사용하면 두 곡선이 점점 가까워짐
  - 과대적합 모델을 개선하는 한 가지 방법은 검증 오차가 훈련 오차에 근접할 때까지 더 많은 훈련 데이터를 추가하는 것
- 편향/분산 트레이드오프
  - 모델의 일반화 오차는 세 가지 다른 종류의 오차로 표현할 수 있다
    - 편향: 잘못된 가정으로 인한 것. 편향이 큰 모델은 훈련 데이터에 과소적합되기 쉬움
    - 분산:훈련 데이터에 있는 작은 변동에 모델이 과도하게 민감하게 반응해서 나타나는 것. 자유도가 높은 모델이 높은 분산을 가지기 쉬움. 분산이 큰 모델은 훈련 데이터에 과대적합되기 쉬움
    - 줄일 수 없는 오차: 데이터 자체에 있는 잡음 때문에 발생. 이 오차를 줄일 수 있는 유일한 방법은 데이터에서 잡음을 제거하는 것
  - 트레이드오프: 모델의 복잡도가 커지면 통상적으로 분산이 늘어나고 편향이 줄어듦. 모델의 복잡도가 줄어들면 그 반대