지도학습 : 분류(Classification), 회귀(Regression)
비지도학습(레이블이 없다) : 군집, 차원축소
OLS : Ordinary Linear Least Square (최소제곱법)
!pip install statsmodels
import pandas as pd
data = {'x' : [1,2,3,4,5], 'y' : [1,3,4,6,5]}
df = pd.DataFrame(data)
import statsmodels.formula.api as smf
lm_model = smf.ols(formula='y ~ x', data=df).fit()
# y절편, 기울기
lm_model.params
# Intercept 0.5
# x 1.1
# dtype: float64
# 잔차 확인
resid = lm_model.resid
resid
잔차 평가
• 잔차는 평균이 0인 정규분포를 따르는 것 이어야 함
• 잔차 평가는 잔차의 평균이 0이고 정규분포를 따르는 지 확인
# 결정 계수 계산
import numpy as np
mu = np.mean(df['y'])
y = df['y']
y_hat = lm_model.predict()
np.sum((y_hat - mu)**2) / np.sum((y - mu)**2)
# 0.8175675675675674
lm_model.rsquared
# 0.8175675675675674
# pairplot으로 경향 확인
plt.figure(figsize=(12,6))
sns.pairplot(data=data)
# 상관이 높은 멤버쉽 유지기간만 가지고 통계적 회귀
import statsmodels.api as sm
X = data['Length of Membership']
y = data['Yearly Amount Spent']
lm = sm.OLS(y, X).fit()
• R-squared : 모형 적합도, y의 분산을 각각의 변수들이 약 99.8%로 설명할 수 있음
• Adj. R-squared : 독립변수가 여러 개인 다중회귀분석에서 사용
• Prob. F-Statistic : 회귀모형에 대한 통계적 유의미성 검정.
이 값이 0.05 이하라면 모집단에서도 의미가 있다고 볼 수 있음
• AIC : 주어진 통계 모델이 원래 데이터를 얼마나 잘 설명하는지를 평가하는 지표
=> 값이 낮을수록 해당 모델이 모델이 데이터를 잘 설명하며, 불필요한 파라미터가 적다는 것을 의미
여러 후보 모델 중에서 가장 적합한 모델을 선택할 때 유용한 도구
Cost Fnc을 최소화할 수 있다면 최적의 직선을 찾을 수 있다
# 다항식의 계수를 입력으로 받아 다항식을 생성
import numpy as np
np.poly1d([2, -1])**2 + np.poly1d([3, -5])**2 + np.poly1d([5, -6])**2
# poly1d([ 38, -94, 62])
# 최솟값 지점 구하기
!pip install sympy
import sympy as sym
theta = sym.Symbol('theta')
diff_th = sym.diff(38*theta**2 - 94*theta + 62, theta)
diff_th
Gradient Descent
랜덤하게 임의의 점 선택 ->임의의 점에서 미분(or 편미분)값을 계산해서 업데이트
**학습률(Learning Rate)
alpha는 얼마만큼 theta를 갱신할 것인지를 설정하는 값
Multivariate Linear Regression : 다변수 데이터에 대한 회귀
입력 변수가 4개인 경우:
행렬식으로 표현
# 데이터 파악을 위해 pandas로 정리
import pandas as pd
boston_pd = pd.DataFrame(boston.data, columns=boston.feature_names)
boston_pd['PRICE']=boston.target
boston_pd.head()
# Price에 대한 histogram
import plotly.express as px
fig = px.histogram(boston_pd, x='PRICE')
fig.show()
# 각 특성별 상관계수 확인
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
corr_mat = boston_pd.corr().round(1)
corr_mat
sns.heatmap(data=corr_mat, annot=True, cmap='bwr')
## 상관계수 조사 결과 price와 RM, LSTAT과 높은 상관관계가 보임
# RM과 LSTAT과 PRICE의 관계에 대해 관찰
sns.set_style('darkgrid')
sns.set(rc={'figure.figsize':(12,6)})
fig, ax = plt.subplots(ncols=2)
sns.regplot(x='RM', y='PRICE', data=boston_pd, ax=ax[0])
sns.regplot(x='LSTAT', y='PRICE', data=boston_pd, ax=ax[1])
# 데이터 나누기
from sklearn.model_selection import train_test_split
X = boston_pd.drop('PRICE', axis=1)
y = boston_pd['PRICE']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=13)
# LinearResgression을 사용
from sklearn.linear_model import LinearRegression
reg = LinearRegression()
reg.fit(X_train, y_train)
RMS로 모델 평가
성능 확인