Open danbi5228 opened 2 years ago
# 2차 방정식으로 비선형 데이터 생성 (잡음 포함)
m = 100
X = 6 * np.random.rand(m, 1) - 3
y = 0.5 * X**2 + X + 2 + np.random.randn(m, 1)
# 각 특성을 제곱(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]])
실제 원래 함수: y = 0.5x12 + 1.0x1 + 2.0 + 가우시안 잡음
예측모델: y = 0.56x12 + 0.93x1 + 1.78
특성이 여러 개일 때 다항 회귀는 이 특성 사이의 관계를 찾을 수 있음
PolynomicalFeatures: 주어진 차수까지 특성간의 모든 교차항을 추가함
규제가 추가된 선형 회귀 버전
규제항은 훈련하는 동안에만 비용 함수에 추가, 모델 성능은 규제가 없는 성능 지표로 평가
α는 하이퍼파라미터로 모델을 얼마나 많이 규제할지 조절
α=0이면 릿지 회귀는 선형 회귀와 같아짐
α가 아주 크면 모든 가중치가 거의 0에 가까워지고 데이터의 평균을 지나는 수평선이 됨 *½을 곱한 것은 미분하면 2를 곱해 깔끔하게 떨어지게 하기 위함 (비용함수는 최적화를 위해 미분가능해야 하기 때문)
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]])
from sklearn.linear_model import SGDRegressor
sgd_reg = SGDRegressor(penalty="l2") sgd_reg.fit(X, y.ravel()) # ravel: 다차원 배열을 1차로 평평하게 바꿔주는 함수 sgd_reg.predict([[1.5]])
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
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)
- 훈련 데이터의 오차가 선형 회귀 모델보다 훨씬 낮음
- 두 곡선 사이에 공간이 있음. (= 과대적합 모델의 특징)
- 더 큰 훈련세트를 사용하면 두 곡선이 점점 가까워짐
- 과대적합 모델을 개선하는 한 가지 방법은 검증 오차가 훈련 오차에 근접할 때까지 더 많은 훈련 데이터를 추가하는 것
- 편향/분산 트레이드오프
- 모델의 일반화 오차는 세 가지 다른 종류의 오차로 표현할 수 있다
- 편향: 잘못된 가정으로 인한 것. 편향이 큰 모델은 훈련 데이터에 과소적합되기 쉬움
- 분산:훈련 데이터에 있는 작은 변동에 모델이 과도하게 민감하게 반응해서 나타나는 것. 자유도가 높은 모델이 높은 분산을 가지기 쉬움. 분산이 큰 모델은 훈련 데이터에 과대적합되기 쉬움
- 줄일 수 없는 오차: 데이터 자체에 있는 잡음 때문에 발생. 이 오차를 줄일 수 있는 유일한 방법은 데이터에서 잡음을 제거하는 것
- 트레이드오프: 모델의 복잡도가 커지면 통상적으로 분산이 늘어나고 편향이 줄어듦. 모델의 복잡도가 줄어들면 그 반대