회귀(Regression)
분류(Classification)
cf)
import matplotlib.pyplot as plt
import seaborn as sns
## SalePrice의 확률밀도함수를 그려보겠습니다
sns.displot(df['SalePrice'], kde=True)
## 평균과, 중간값으로 수직선을 그려보겠습니다.
plt.axvline(df['SalePrice'].mean(), color='blue')
plt.axvline(df['SalePrice'].median(), color='red');
기준 모델 (Baseline Model)
예측 모델을 구체적으로 만들기 전에 가장 간단하면서도 직관적이면서 최소한의 성능을 나타내는 기준이 되는 모델을 기준모델이라고 한다.
의미 :
최소한의 노력으로 만들어낸 모델인만큼 우리가 만들어야 할 예측모델은 이 모델보다는 좋아야한다.
## predict: 우리가 정한 기준모델인 평균으로 예측을 합니다
predict = df['SalePrice'].mean()
## 평균값으로 예측할 때 샘플 별 평균값과의 차이(error)를 저장합니다
errors = predict - df['SalePrice']
## mean_absolute_error(MAE), error에 절대값을 취한 후 평균을 계산합니다.
mean_absolute_error = errors.abs().mean()
#기준모델을 그립니다.
x = df['GrLivArea']
y = df['SalePrice']
predict = df['SalePrice'].mean()
errors = predict - df['SalePrice']
mean_absolute_error = errors.abs().mean()
sns.lineplot(x=x, y=predict, color='red')
sns.scatterplot(x=x, y=y, color='blue');
예측모델(Predictive Model)
scatterplot에 가장 잘 맞는(best fit) 직선을 그려주면 그것이 회귀 예측모델이 된다.
회귀선은 잔차 제곱들의 합인 RSS(residual sum of squares)를 최소화 하는 직선이다. RSS는 SSE(Sum of Square Error)라고도 말하며 이 값이 회귀모델의 비용함수(Cost function)가 됩니다. 머신러닝에서는 이렇게 비용함수를 최소화 하는 모델을 찾는 과정을 학습이라고 한다.
잔차 : 잔차(residual)는 예측값과 관측값 차이다.
오차 : 오차(error)는 모집단에서의 예측값과 관측값 차이를 말한다.
여기서 계수 α 와 β 는 RSS를 최소화 하는 값으로 모델 학습을 통해서 얻어지는 값이다. 이렇게 잔차제곱합을 최소화하는 방법을 최소제곱회귀 혹은 Ordinary least squares(OLS)라고 부른다.
보간(interpolate) :
데이터의 최솟값, 최댓값 사이의 값 중 데이터가 없는 값을 예측
외삽(extrapolate) :
데이터의 최솟값, 최댓값 밖의 값을 예측
선형회귀 직선은 독립변수(independent variable, x)와 종속변수(dependent variable, y) 간의 관계를 요약해 준다.
종속변수는 반응(Response)변수, 레이블(Label), 타겟(Target)등으로 불린다.
독립변수는 예측(Predictor)변수, 설명(Explanatory), 특성(feature) 등으로 불린다.
X
로 표현하고 보통 2-차원 행렬입니다([n_samples, n_features]
). 주로 NumPy 행령이나 Pandas 데이터프레임으로 표현합니다.n_samples
) 입니다. 주로 Numpy 배열이나 Pandas Series로 표현합니다.fit()
메소드를 사용하여 모델을 학습합니다. ## Scikit-Learn 라이브러리에서 사용할 예측모델 클래스를 Import 합니다
from sklearn.linear_model import LinearRegression
## 예측모델 인스턴스를 만듭니다
model = LinearRegression()
## X 특성들의 테이블과, y 타겟 벡터를 만듭니다
feature = ['GrLivArea']
target = ['SalePrice']
X_train = df[feature]
y_train = df[target]
## 모델을 학습(fit)합니다
model.fit(X_train, y_train)
## 새로운 데이터 한 샘플을 선택해 학습한 모델을 통해 예측해 봅니다
X_test = [[4000]]
y_pred = model.predict(X_test)
print(f'{X_test[0][0]} sqft GrLivArea를 가지는 주택의 예상 가격은 ${int(y_pred)} 입니다.')
## 전체 테스트 데이터를 모델을 통해 예측해 봅니다.
X_test = [[x] for x in df_t['GrLivArea']]
y_pred = model.predict(X_test)
## 전체 예측값 입니다.
y_pred
## train 데이터에 대한 그래프를 그려보겠습니다.
plt.scatter(X_train, y_train, color='black', linewidth=1)
## test 데이터에 대한 예측을 파란색 점으로 나타내 보겠습니다.
plt.scatter(X_test, y_pred, color='blue', linewidth=1);
모델이 주택의 크기와 가격 사이에서 어떤 관계를 학습했을까?
이 질문에 대한 답을 하기 위해 LinearRegression
객체의 coef_
, intercept_
속성을 확인해 보자.
```python
## 계수(coefficient)
model.coef_
## 절편(intercept)
model.intercept_
#예측함수를 만들어 새로운 데이터를 반복해서 예측하고 coefficient의 영향을 설명해 본다.
def explain_prediction(sqft):
y_pred = model.predict([[sqft]])
pred = f"{int(sqft)} sqft 주택 가격 예측: ${int(y_pred[0])} (1 sqft당 추가금: ${int(model.coef_[0])})"
return pred
## square_feet = 4000 인 테스트 데이터로 예측
print(explain_prediction(4000))
```
from ipywidgets import interact
# 데코레이터 interact를 추가합니다.
@interact
def explain_prediction(sqft=(500,10000)):
y_pred = model.predict([[sqft]])
pred = f"{int(sqft)} sqft 주택 가격 예측: ${int(y_pred[0])} (1 sqft당 추가금: ${int(model.coef_[0])})"
return pred
```