일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 아이엠어바텐더
- 프로그래머스
- Django
- 설계
- 백준
- 파이썬
- GIT
- count
- 슬라이싱
- where
- Len
- 단어 공부
- html
- Join
- ORDER BY
- YOLOv5
- 프로젝트
- 코딩테스트 연습
- sql
- 데이터
- 파이썬 몫
- date_format
- SQL 고득점 Kit
- 파이썬 슬라이싱
- python
- pcce 기출문제
- List Comprehension
- map
- css
- Python3
- Today
- Total
nan + nan = 2nan
[ML][210909] 선형회귀분석 본문
머신러닝
- 기계 학습 : 기계를 가르친다
- 기계를 어떻게 가르칠 것인가? 에 따라 두가지 형태로 나눠 생각한다.
- Supervised Learning(지도 학습)
- Unsupervised Learning(비지도 학습)
지도학습 (Supervised Learning)
- 데이터에 Label(정답)이 미리 정해져 있을 때 가능
- 프로그램에 입력 값을 주면 출력 값을 기계가 알아서 예측해서 출력해주는 형태
- 지도 학습은 또 다시 Regression (회귀) 와 Classification (분류) 로 세분화
- Regression (회귀) : 연속된 값, 수치, 즉 '얼마나'를 예측
- Classification (분류) : 연속적이지 않은 값, '무엇'을 예측
비지도학습 (Unsupervised Learning)
- 레이블이 정해져 있지 않은 데이터를 기반으로 데이터의 고유한 구조나 패턴을 익히는 것
- Clustering(군집화) : 데이터에서 패턴과 구조를 찾아 그룹을 지어줌
선형회귀 (LinearRegression)
- 시험 성적은 공부 시간이 늘어날 수록 잘 나온다
- 생선의 길이가 길면, 무게는 높아진다.
- 다른 변수에 영향을 주는 값 (독립변수) => X와 변수 X에 의해 종속적으로 변하는 값 (종속변수) => y로 구성
- x를 독립 변수, y를 종속 변수
- 선형 회귀는 한 개 이상의 독립 변수 x와 y의 선형 관계를 모델링
- 독립 변수 X가 1개라면, 단순 선형회귀
- 독립 변수 X가 2개 이상이라면, 다중 선형회귀
단순선형 회귀모델 [Simple linear regression]
- Independent variable (독립변수) x에 따라 Dependent variable (종속변수) y가 변함
- 종속변수 y와 한 개의 독립변수 x와의 선형 상관 관계를 모델링하는 회귀분석 기법
- y = wx + b
Import and create the model
- 선형회귀분석을 위해 import 하고, 해당 모델링을 이용해서 예측 값을 알아가는 과정이다.
from sklearn.linear_model import LinearRegression
your_model = LinearRegression()
your_model.fit(x_trainig_data, y_training_data) # 학습모델 생성 => 이를 통해 예측
your_model.coef_ : contains thecoefficients # 계수를 나타냄. 기울기
your_model.intercept_ : contains the intercept # 절편
predictions = your_model.predict(your_x_data)
your_model.score() = returns the coefficient of determination R(예측 결과)
Part.1) 모집단과 표본집단의 분산 / 표준편차 계산
import numpy as np
import pandas as pd
x = [20, 25, 30, 34, 40]
# np.var(x) / std(x) => 옵션으로 ddof = 0 (기본 값 / 모집단), ddot = 1 (표본집단)
print('---- Numpy 를 이용한 모집단 분산 / 표준편차 -----')
print(np.var(x)) # 분산
print(np.std(x)) # 표준편차
print('---- Numpy 를 이용한 표본집단 분산 / 표준편차 -----')
print(np.var(x, ddof = 1)) # 분산
print(np.std(x, ddof = 1)) # 표준편차
numpy와 pandas를 이용해본다.
우선 Numpy 사용할 때, 분산과 표준편차를 구하는 방법이다.
해당 데이터 리스트 변수 뒤에 .var(해당 변수) / .std(해당 변수) 로 출력 가능하다.
이는 모집단과 표본집단, 2가지 방법으로 나뉜다.
앞서 말했던 방법은 모집단에 해당하는 데이터의 분산과 표준편차를 구하는 방법이고,
표본집단을 구하고 싶다면, 변수 뒤에 ddof = 1 을 넣어주면
각 집단에 해당하는 분산과 표준편차를 출력 가능하다.
## print 내용
---- Numpy 를 이용한 모집단 분산 / 표준편차 -----
48.160000000000004
6.939740629158989
---- Numpy 를 이용한 표본집단 분산 / 표준편차 -----
60.2
7.758865896508329
Pandas를 이용하는 방법도 크게 다르지 않다. 우선, DataFrame 내에 변수를 설정해주고
동일한 방법으로 사용 가능하다. 단, Pandas는 표본집단이 기본 값으로 설정이 되어있기 때문에,
모집단 값을 출력할 때 ddof를 0으로 설정해주면 동일한 내용으로 출력 가능하다.
df = pd.DataFrame({"x" : x})
print('---- Pandas 를 이용한 모집단 분산 / 표준편차 -----')
print(df.var(ddof = 0))
print(df.std(ddof = 0)) # Pandas 는 표본집단이 기본 값, ddof = 0으로 설정 시 모집단으로 설정 가능 / Numpy는 모집단
print('---- Pandas 를 이용한 표본집단 분산 / 표준편차 -----')
print(df.var())
print(df.std())
## print 내용
---- Pandas 를 이용한 모집단 분산 / 표준편차 -----
x 48.16
dtype: float64
x 6.939741
dtype: float64
---- Pandas 를 이용한 표본집단 분산 / 표준편차 -----
x 60.2
dtype: float64
x 7.758866
dtype: float64
Part2) 상관계수 R 값 계산
- 상관 관계의 정도를 파악하는 상관계수
x = [20, 25, 30, 34, 40]
y = [26, 30, 40, 48, 66]
import pandas as pd
import numpy as np
df = pd.DataFrame({'x':x, 'y':y})
display(df)
display(df.corr())
display(df.corr(method='pearson')) # 같은 값. 생략 가능
print()
print(df['x'].corr(df['y']))
std = df['x'].std(), df['y'].std()
mean = df['x'].mean(), df['y'].mean()
df['계산 x'] = (df['x']-mean[0]) / std [0]
df['계산 y'] = (df['y']-mean[1]) / std [1]
df['곱셈'] = df['계산 x'] * df['계산 y']
display(df)
r = (df['곱셈'].sum()) / (len(df['계산 y']) - 1)
print('상관계수 R은 %.3f입니다.' %r )
part.3) 기울기 구하기
방법 1) 상관계수를 구하고 기울기 구하기
방법 2) 기울기를 구하고 상관계수를 구하기
기울기 = 상관계수 * 표준편차 y / 표준편차 x
#방법 1)
## W = R * Sy / Sx
### 기울기
w = r * std [1] / std [0]
print(w)
### 절편
b = mean[1] - (mean[0] * w)
print(b)
### 선형회귀 공식을 이용한 차트 작성 y_hat
df['lr'] = w * df['x'] + b
display(df)
## 해당 값들을 산점도와 직선 그래프로 나타냄
import matplotlib.pyplot as plt
plt.plot(df['x'], df['y'], 'ro')
plt.plot(df['x'], df['lr'])
plt.show()
# 예측 함수를 만들어 값 도출
def prediction(newX):
print(w * newX + b)
prediction(25)
####sklearn을 이용한 선형회귀식 적용
%matplotlib inline
from sklearn.linear_model import LinearRegression
model = LinearRegression()
x = df['x'].values.reshape(-1, 1)
y = df['y'].values.reshape(-1, 1)
model = model.fit(x, y)
### x 값 대입 시 반드시 2차원
print(model.predict([[20]]))
print(model.coef_) # w (기울기)
print(model.intercept_) # b (절편)
-------------------------------------------------
# MSE (평균제곱오차) = (실제값 - 예측값) ^2 / 크기
# 오답에 가까울수록 큰 값 출력
# 정답에 가까울수록 작은 값 출력
from sklearn.metrics import mean_squared_error
# 평균제곱오차
y_hat = model.predict(x)
mean_squared_error(y, y_hat)
-------------------------------------------------
plt.plot(x, y, 'ro')
plt.plot(x, model.predict(x))
plt.show()
싸이킷런을 이용했을 때와 손코딩 했을 때의 그래프 값이 동일하다.
손코딩은 싸이킷런 내 함수들이 어떻게 작동하는지 알아보기 위함이다.
선형회귀식이 앞으로 시작하는 머신러닝에서 많이 적용된다고 하니,
책을 보면서도 한 번 제대로 익혀봐야겠다.
통계 지식은 1학년 때 들었던 경영통계가 전부이자 마지막이었던 것 같다...
하루 하루 치이면서 어제보다 하나라도 더 배운 놈이 되자.
'Statistics > Machine Learning' 카테고리의 다른 글
[인턴] Data Cleansing 및 Undersampling, Modeling (0) | 2022.04.27 |
---|---|
[인턴] EDA 및 데이터 정제 (0) | 2022.04.15 |
[개인프로젝트] 영화 추천 알고리즘 (0) | 2022.03.17 |
[인턴] AI 병해충 진단 서비스 App 개발 (0) | 2022.03.15 |
[데이터 분석]구글 트렌드를 이용한 20대 대선 분석_1 (0) | 2022.03.15 |