라벨(정답)을 주고 학습을 시키는 것
- Classification(분류)
- Regression(회기)
출력이 연속된 값이다.
비지도 학습은 Label이 없다.
- 군집
- 차원 축소
ex) 주택의 넓이과 가격이라는 데이터가 있고 주택가격을 예측
그렇다면 Linear Regression(선형 회기) 직선 값을 구하기 위해 파라미터를 구하는 방법은?
이렇게 생긴 데이터를 하나의 직선으로 만든다면
!pip install statsmodels
import pandas as pd
data = {'x':[1., 2., 3., 4., 5.], 'y':[1., 3., 4., 6., 5.]}
df = pd.DataFrame(data)
df
y ~ x
: y = ax+b import statsmodels.formula.api as smf
lm_model = smf.ols(formula="y ~ x", data=df).fit()
lm_model.params
x 기울기: 1.1
b: 0.5
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
sns.lmplot(x='x', y='y', data=df);
plt.xlim([0, 5])
resid = lm_model.resid
resid
⭐녹색선: 평균
분모: 참값이 가지는 평균으로부터의 오차(분산과 비슷)
분자: 예측값의 평균으로부터의 오차
import numpy as np
mu = np.mean(df.y)
y = df.y
yhat = lm_model.predict() # 예측값
np.sum((yhat - mu)**2 / np.sum((y - mu)**2))
lm_model.rsquared
sns.distplot(resid, color='black')
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
data_url = 'https://raw.githubusercontent.com/PinkWink/ML_tutorial/master/dataset/ecommerce.csv'
data = pd.read_csv(data_url)
data.head()
data.drop(['Email', 'Address', 'Avatar'], axis=1, inplace=True)
data.info()
plt.figure(figsize=(12, 6))
sns.boxplot(data=data)
plt.figure(figsize=(12, 6))
sns.boxplot(data=data.iloc[:, :-1]);
plt.figure(figsize=(12, 6))
sns.boxplot(data=data['Yearly Amount Spent']);
plt.figure(figsize=(12, 6))
sns.pairplot(data=data)
뭔가 큰 상관 관계를 가지고 있다라고 하기에는 좀 어려워 보인다.
큰 상관관계를 보이는 것은 멤버쉽 유지 기간
plt.figure(figsize=(12, 6))
sns.lmplot(x='Length of Membership', y='Yearly Amount Spent', data=data);
import statsmodels.api as sm
X = data['Length of Membership']
y = data['Yearly Amount Spent']
lm = sm.OLS(y, X).fit()
lm.summary()
회기 리포트
📍수치의 의미 해석하기
pred = lm.predict(X)
sns.scatterplot(x=X, y=y)
plt.plot(X, pred, 'r', ls='dashed', lw=3);
sns.scatterplot(x=y, y=pred)
plt.plot([min(y), max(y)], [min(y), max(y)], 'r', ls='dashed', lw=3);
sns.scatterplot(x=y, y=pred)
plt.plot([min(y), max(y)], [min(y), max(y)], 'r', ls='dashed', lw=3)
plt.plot([0, max(y)], [0, max(y)], 'b', ls='dashed', lw=3)
plt.axis([0, max(y), 0, max(y)])
상수항이 없어 0부터 시작되고 있다.
X = np.c_[X, [1]*len(X)]
X[:5]
lm = sm.OLS(y, X).fit()
lm.summary()
x1,const가 생겼고 R-squared가 작아졌다.
AIC(내가 만들어낸 모델이 나의 데이터를 얼마나 잘 반영하는가 즉, 손실 수치)가 낮아졌다 -> 좋은것
R-squared 수치를 무조건 믿으면 안된다.
pred = lm.predict(X)
sns.scatterplot(x=X[:, 0], y=y)
plt.plot(X[:, 0], pred, 'r', ls='dashed', lw=3);
-참 값 vs 예측 값
sns.scatterplot(x=y, y=pred)
plt.plot([min(y), max(y)], [min(y), max(y)], 'r', ls='dashed', lw=3);
from sklearn.model_selection import train_test_split
X = data.drop('Yearly Amount Spent', axis=1)
y = data['Yearly Amount Spent']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=13)
import statsmodels.api as sm
lm = sm.OLS(y_train, X_train).fit()
lm.summary()
pred = lm.predict(X_test)
sns.scatterplot(x=y_test, y=pred)
plt.plot([min(y_test), max(y_test)], [min(y_test), max(y_test)], 'r', ls='dashed', lw=3);
"이 글은 제로베이스 데이터 취업 스쿨 강의를 듣고 작성한 내용으로 제로베이스 데이터 취업 스쿨 강의 자료 일부를 발췌한 내용이 포함되어 있습니다."