학습 목표
미리 정의된, 가능성 있는 여러 클래스 레이블 중 하나를 예측하는 것
- 종속변수 : 반응(Response)변수, 레이블(Label), 타겟(Target)등
- 독립변수 : 예측(Predictor)변수, 설명(Explanatory), 특성(feature) 등
회귀 직선 관련 중요 개념
- 예측값 : 모델이 추정하는 값
- 잔차 : 예측값과 관측값 차이 in 표본집단(≠오차: in 모집단)
- 회귀선 : 잔차 제곱들의 합인 RSS(Residual Sum of Squares)를 최소화 하는 직선
- RSS : 회귀모델의 비용함수(Cost function), SSE(Sum of Square Error)라고도 불림
- MSE(Mean squared error) : 평균 제곱 오차
-> 빨간 사각형들의 평균값이 작은 함수가 더 나은 회귀 함수- α, β : RSS를 최소화 하는 값으로 모델 학습을 통해서 얻어지는 값
- 최소제곱회귀 or Ordinary least squares(OLS) : 잔차제곱합을 최소화하는 방법
,
,
수학산책-최소제곱법- 학습 : 비용함수를 최소화하는 모델을 찾는 과정
*선형 상관분석(Linear correlation) vs 선형 회귀분석(Linear regression)
상관분석은 두 변수의 값이 유의한 관계가 있는지, 즉 두 변수 값이 일관성을 갖고 변화하는지를 검토하기 위한 탐색적인 방법이다. (예를 들어, 한 변수 값이 증가함에 따라 다른 변수 값이 감소하는 경우) 그래서 하나의 변수 값을 다른 변수의 값으로부터 예측할 수 있다거나 그 변수들 간에 어떤 인과관계가 있는지를 보는 것에 대해서는 기대할 수 없다.
반대로, 회귀분석은 두 변수들 간의 함수관계를 설명하는데 사용되므로 하나의 변수 값으로부터 다른 변수 값을 예측할 수 있다. 함수관계는 종속변수(dependent variable)가 독립변수(independent variable)에 의해 결정이 될 수 있지만, 그 반대는 성립하지 않는 것을 의미한다. 종속변수가 독립변수에 의해 결정될 수 있지만 독립변수가 꼭 종속변수의 직접적인 원인이 될 필요가 없다는 가설에 대한 타당한 근거가 있는 경우에 회귀분석을 사용할 수 있다.(다른 원인이 있을 수도 있다라는 가정)
한마디로 대충 어림짐작하는 것 입니다. 예를 들어 밤 하늘에 달무리가 진 것을 보고 다음날 날씨가 흐릴 것을 예측하는 것과 같습니다. 보통 좋은 결과를 내기도 하지만 사람마다 편견이 존재하며 오류에 빠질 위험이 높습니다.
# pandas 포멧팅을 사용하면, 판다스 객체들의 결과에서 쉼표를 넣고 소숫점 아래는 생략하도록 설정할 수 있습니다.
# float 형식 소숫점 1자리, 쉼표 포함
pd.set_option('display.float_format', '{:,.1f}'.format)
# 기본 셋팅으로 돌아오기 위해서
# pd.set_option('display.float_format', None)
df['SalePrice'].describe()
##시각화
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');
예측 모델을 구체적으로 만들기 전에 가장 간단하면서도 직관적이면서 최소한의 성능을 나타내는 기준이 되는 모델로 최소한의 기준을 만들어 내가 만든 모델과 비교하기 위해 필요합니다.
문제별로 기준모델은 보통 다음과 같이 설정합니다.
## 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');
print(f'예측한 주택 가격이 ${predict:,.0f}이며 절대평균에러가 ${mean_absolute_error:,.0f}임을 확인할 수 있습니다.')
-> 평균 예측은 에러가 상당히 크다는 것을 알 수 있습니다.
1. df.corrwith(한 변수&나머지 모든 변수), df.corr(상관계수)
그룹 별 변수 간 상관관계 분석 (correlation with columns by groups)
2. 시각화
## 1개 독립변수 plt.scatter(df['LotArea'], df['SalePrice']);
## 2개 독립변수 sns.set(style='whitegrid', context='notebook') cols = ['GrLivArea', 'LotArea','SalePrice'] sns.pairplot(df[cols], height=2);
fit()
: 모델 학습, predict()
: 새로운 데이터 예측특성&타겟
- 특성행렬 : 주로 X 로 표현하고 보통 2-차원 행렬입니다([n_samples, n_features]). 주로 NumPy 행령이나 Pandas 데이터프레임으로 표현합니다.
- 타겟배열 : 주로 y로 표현하고 보통 1차원 형태(n_samples) 입니다. 주로 Numpy 배열이나 Pandas Series로 표현합니다.
from sklearn.linear_model import LinearRegression
# X 특성들의 테이블과, y 타겟 백터 생성
feature = ['내가 사용할 특성']
target = ['타겟']
X_train = df[feature]
y_train = df[target]
# 모델 학습(fit)
model = LinearRegression().fit(X_train, y_train)
# 만들어진 model로 test data 예측(predict)
X_test = [[x] for x in df_t['GrLivArea']]
y_pred = model.predict(X_test) # X_test로 수행
# train & test data graph
plt.scatter(X_train, y_train, color='black', linewidth=1)
plt.scatter(X_test, y_pred, color='blue', linewidth=1)
단순선형회귀 적합선/모델 시각화
Show plot data and a linear regression model fit.import seaborn as sns sns.regplot(x=df['GrLivArea'], y=df['SalePrice']) # fit_reg=False -> no regression line
## 계수(coefficient)_기울기
model.coef_
## 절편(intercept)
model.intercept_
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
## 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)} 입니다.')
>>> 4000 sqft GrLivArea를 가지는 주택의 예상 가격은 $447090 입니다.
## 전체 테스트 데이터를 모델을 통해 예측
X_test = [[x] for x in df_t['GrLivArea']]
y_pred = model.predict(X_test)
## 전체 예측값
y_pred
>>> array([[114557.82748987],
[160945.27292207],
[193084.38061182],
...,
[149696.58523066],
[122485.47405334],
[232829.74378814]])
## train 데이터에 대한 그래프를 그려보겠습니다.
plt.scatter(X_train, y_train, color='black', linewidth=1)
## test 데이터에 대한 예측을 파란색 점으로 나타내 보겠습니다.
plt.scatter(X_test, y_pred, color='blue', linewidth=1);
데이터를 입력하고 어떤 룰에 따라 답을 구해내는 일반적인 프로그래밍과 달리 머신러닝은 데이터와 답을 통해 룰을 찾아내는 방법이라고 볼 수 있습니다.
a new programming paradigm
[reference]