0. 머신러닝
데이터로부터 유용한 예측을 하기위해 모델이라고 불리는 소프트웨어를 학습시키는 과정. 모델은 데이터 간의 수학적 관계, 규칙, 패턴을 학습한 뒤 새로운 데이터가 들어왔을 때 예측을 한다.
A. 머신러닝 방법론
① 지도학습 : 답(label)이 있는 데이터를 학습하며 데이터와 답 간의 규칙 파악
- 회귀 문제 : 연속적인 값을 예측하는 문제. ex) 주택 가격 예측, 강수량 예측
- 분류 문제 : 데이터의 특정 범주에 속할 확률을 예측하는 문제. 범주의 갯수에 따라 이진 분류 / 다중 분류 문제로 나눌 수 있다. ex) 상품 구매 여부 예측, 고양이 종 예측
* 회귀 문제와 분류 문제는 예측값, 사용 모델, 평가 지표 등이 상이하니 어떤 문제를 풀고 있는 지 정확히 파악하는 것이 중요하다
② 비지도학습 : 답이 없는 데이터를 학습하며 데이터 내의 의미있는 패턴 찾기
③ 강화학습 : 특정 환경 내에서 컴퓨터의 액션에 보상 혹은 패널티를 주며 예측. 가장 많은 보상을 받을 수 있는 전략을 찾아내는 방법
1. Linear Regression
오늘 배울 것은 머신러닝 지도학습 방법 중 하나인 '회귀 모델'. 만약 특성이 1개, 타겟이 1개라면 산점도를 그려보자. 이때 산점도의 분포와 가장 비슷한 선을 그으면 그것이 '회귀선'이다. 회귀 모델은 이 회귀선을 그어 특성에 대한 타겟값을 예측한다. 회귀선은 두 변수 간의 관계를 요약했다는 점, 데이터들과 가장 가까운 선을 그린다는 점에서 PCA와 닮았다. 다만 사용 목적이 다르다는 것을 기억하자.
이를 수학적으로 표현해보자. 실제값과 예측값의 차이를 '잔차'라고 한다. 회귀선은 기본적으로 이 '잔차'들의 제곱합을 최소로 하는 선이다.
회귀모델의 종류에는 3가지가 있다. 단순선형회귀 (특성이 1개), 다중선형회귀 (특성이 2개 이상), 다항선형회귀 (degree를 조절).
다음은 회귀 모델을 만드는 과정이다.
A. 데이터 준비
① 데이터 확인
사이즈가 충분히 크고 다양성이 확보됐는지 여부가 중요하다. 학습할 데이터가 10개 밖에 없거나, 데이터가 모두 한쪽으로 쏠려있다면 제대로 된 학습을 할 수 없기 때문이다.
② 특성과 타겟
준비된 데이터를 특성과 타겟으로 나누어준다. 특성은 독립변수로 feature라고도 불리며 x변수에 넣는다. 타겟은 종속변수로 label로도 불리며 y 변수에 넣어준다.
target = 'price'
x = df[target]
y = df.drop(target, axis=1) # 타겟 컬럼을 제외하고 모두 특성 컬럼으로!
B. 모델링
① 기준 모델 생성
본격적 모델 만들기에 앞서 기준 모델을 만들어야 한다. 가장 간단하면서도 직관적이며 최소한의 성능을 나타내는 모델을 만들어두어, 후에 만든 모델과 성능을 비교한다. 회귀문제에서는 타겟의 평균값(평균 기준모델), 분류문제에서는 타겟의 최빈 클래스 (최빈값 기준모델), 시계열 회귀문제에서는 이전 타임스탬프의 값을 기준모델로 이용한다. 그 외 선형회귀, 로지스틱 회귀 등의 간단한 예측 모델을 활용할 수도 있다.
# linear regression 기준모델
baseline = [y.mean()] * len(y) # 타겟의 평균을 리스트 안에 넣어준다
② 예측 모델 생성과 학습
모델을 생성하고, 준비된 데이터를 이용하여 학습 시킨다.
# 단순선형회귀와 다중선형회귀
from sklearn.linear_model import LinearRegression
ols = LinearRegression() # 모델 생성
ols.fit(x, y) # 준비된 데이터로 학습 시키기
y_pred = ols.predict(x) # 예측값 구하기
# 다항선형회귀
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import PolynomialFeatures
def PolynomialRegression(degree=2, **kwargs):
return make_pipeline(PolynomialFeatures(degree),
LinearRegression(**kwargs))
poly_ols = PolynomialRegression(degree=2) # degree값 2인 모델 생성
poly_ols.fit(x, y) # 학습
다항선형회귀에서는 degree 값에 따라 예측도가 차이난다. 특히 degree가 커질수록 자세한 패턴 학습이 가능하지만 너무 과하면 과적합이 올 수 있다는 점에서 적정한 degree를 찾아야 한다.
degrees = [1, 2, 3, 4, 5]
def PolynomialRegression(degree=2, **kwargs):
return make_pipeline(PolynomialFeatures(degree),
LinearRegression(**kwargs))
degree_table = pd.DataFrame(index=['Train', 'Val', 'Test'], columns=[1,2,3,4,5])
for degree in degrees:
model = PolynomialRegression(degree)
model.fit(x_train, y_train)
train_r2 = model.score(x_train, y_train)
val_r2 = model.score(x_val, y_val)
test_r2 = model.score(x_test, y_test)
degree_table[degree] = [train_r2, val_r2, test_r2]
#validation set의 에러가 가장 낮은 차수는 2!
degree_table
C. 모델 평가
① 대표적 회귀 평가 지표는 R2, MSE, RMSE, MAE
- R2 - 만약 r2가 0.72라면 '평균을 이용한 기준모델보다 72% 더 잘했다'라고 말할 수 있다. 0과 1 사이의 숫자이며 1에 가까울수록 설명력이 높다.
- MAE - 제곱 오차의 평균. 제곱을 씌워 이상치에 민감하다.
- RMSE - MSE에 루트를 씌워 이해하기 쉽도록 만든 값
- MAE - 절대오차의 평균. 이상치에 민감하지 않다.
from sklearn.metrics import r2_score, mean_absolute_error, mean_squared_error
mse = mean_squared_error(y, y_pred)
rmse = np.sqrt(mse)
mae = mean_absolute_error(y, y_pred)
r2 = r2_score(y, y_pred)
# r2는 선형회귀 평가지표의 기본이기 때문에 아래와 같이도 나타낼 수 있다
r2 = ols.score(x, y)
② 회귀계수 (Coefficients)
회귀분석에서 독립변수가 한 단위 변화함에 따라 종속변수에 미치는 영향력 크기를 회귀계수 (regression coefficient) 라 한다. 일반적으로 두 변수 사이에 상관관계가 거의 없을 때 회귀계수는 의미가 없게 된다.
예를 들면 '아파트 평수'가 특성이고 '가격'이 타겟이다. 평수의 회귀계수가 500만이라면, 1평이 증가할 때마다 주택 가격이 500만원 상승한다는 뜻이다. 회귀계수를 통해 모델을 직관적으로 해석할 수 있다.
이를 통해 특성이 타겟에 미치는 영향을 비교해볼 수도 있다. 하지만 특성마다 단위의 크기가 다르기 때문에 표준화(scale) 작업을 해주는 것이 좋다. 하지만 표준화 작업시 위의 예시와 같은 회귀식의 직관적 해석은 어려워진다.
다중선형회귀식 구하기 참고. 이렇게 직관적으로 보여서 좋지만 컬럼마다 숫자 크기가 달라 들쭉날쭉해지므로 정확한 파악을 위해서는 수치형 컬럼 스케일링을 해주어야
cofficeint = ols.coef_
'Codestates AI 부트캠프 > 2. Machine Learning' 카테고리의 다른 글
[머신러닝] 2-2 Boosting (1) | 2023.04.16 |
---|---|
[머신러닝] 2-1 Tree Based Model (0) | 2023.04.16 |
[머신러닝] 1-4 로지스틱 회귀 (Logistic Regression) (0) | 2023.04.16 |
[머신러닝] 1-3 정규화 회귀모델 (Regularized Regression) (0) | 2023.03.23 |
[머신러닝] 1-2 일반화 (Generalization) (0) | 2023.03.23 |