BASEMENT
Sklearn과 선형회귀분석 본문
1. Sklearn
머신러닝에 사용되는 지도/비지도 학습 알고리즘을 제공하는 파이썬 라이브러리
from sklearn import datasets # 내장 데이터 사용
from sklearn.model_selection import train_test_split # train, test 데이터 분할
from sklearn.linear_model import LinearRegression # 선형 회귀분석
from sklearn.linear_model import LogisticRegression # 로지스틱 회귀분석
from sklearn.naive_bayes import GaussianNB # 나이브 베이즈
from sklearn import svm # 서포트 벡터 머신
from sklearn import tree # 의사결정나무
from sklearn.ensemble import RandomForestClassifier # 랜덤포레스트
1) datasets & train_test_split
- load_boston() : 보스턴 주택가격 데이터 (회귀)
- load_breast_cancer() : 유방암 위스콘신 데이터 (분류-바이너리)
- load_diabetes() : 당뇨병 데이터 (회귀)
- load_digits(n_class) : 자릿수 데이터 (분류)
- load_iris() : 홍채 데이터 (분류-다중등급)
- load_linnerud() : linnerud 데이터 (다변량 회귀분석)
import sklearn.datasets
from sklearn.model_selection import train_test_split
iris = sklearn.datasets.load_iris()
X, y = iris['data'], iris['target']
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.7, random_state=42)
2) LinearRegression
model = LinearRegression()
model.fit(x_train, y_train)
model.predict(x_test)
model.coef_ : 추정된 모수 확인 (상수항 제외)
model.intercept_ : 추정된 상수항 확인
model.score(x_test, y_test) : 모형 성능 평가
3) LogisticRegression
from sklearn.linear_model import LogisticRegression
model = LogisticRegression(solver='lbfgs').fit(x_train, y_train)
model.predict(x_test)
model.score(x_test, y_test) # 정확도 확인
4) 나이브 베이즈
from sklearn.naive_bayes import GaussianNB
gnb = GaussianNB()
gnb.fit(x_train, y_train)
gnb.predict(x_test)
gnb.score(x_test, y_test)
5) 의사결정나무
from sklearn import tree
model = tree.DecisionTreeClassifier()
model.fit(x_train, y_train)
model.predict(x_test)
model.socre(x_test, y_test)
6) 서포트벡터머신
from sklearn import svm
model = svm.SVC(kernel='linear') # 선형=linear, 비선형=non_linear
model.fit(x_train, y_train)
model.predict(x_test)
model.score(x_test, y_test)
7) 랜덤포레스트
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier(max_dapth=2, random_state=0)
model.fit(x_train, y_train)
model.feature_importances_ # 변수 중요도 확인
model.predict(x_test)
2. 회귀분석
변수들 사이의 관계를 분석하는 방법
- X변수 : 독립변수, 예측변수
- Y변수 : 종속변수, 반응변수
- 선형회귀모델 : 예측변수와 반응변수 사이의 관계를 직선으로 표현함
- 직선식 : Y = a + bX
- 산포도 : 회귀분석을 할 때 두 변수 사이의 관련성을 대략적으로 알아보기 위함. 산포도를 통해 상관분석이나 회귀분석을 할 만한 자료인지 파악 가능
1. 단일선형회귀
종속변수 Y가 독립변수 X와 오차항에 어떻게 관련되어 있는가를 나타내는 방정식
오차항 : 독립변수 X의 값이 주어질 때 종속변수 Y의 실제값과 예측값의 차이를 나타낸 값
1) 회귀계수 추정
- 최소자승법 : 잔차를 자승한값들의 합이 최소가 되도록 표본회귀식의 a와 b를 구하는 방법
2) 적합도 검증
표본자료를 사용하여 구한 표본회귀식이 종속변수의 값을 어느정도 정확하게 예측할 수 있는가의 정도를 검증함
- 추정의 표준오차 : 표본들의 실제값들이 표본회귀선 주위로 흩어진 변동을 측정
- 결정계수 : 0~1의 값. 결정계수 값이 1에 가까울수록 정확성이 높음
- 잔차 : 회귀분석 모델의 예착값과 실제값의 차이
- MSE (Mean Squared Error) : 평균 제곱 오차. 오자를 제곱한 값들의 평균
- RMSE (Root Mean Squared Error) : MSE에서 구한 값에 루트를 적용한 값
2. 다중선형회귀분석
두 개 이상의 독립변수들과 하나의 종속 변수의 관계를 분석
수집된 데이터에 가장 적절한 회귀 직선을 구함
1) 회귀계수 추정
최소 자승법 사용
2) 적합도 검증
- 추정의 표준오차
- 결정계수
- 조정결정계수 : 독립변수의 수가 증가하면 모형이 복잡해지고, 독립변수의 상관관계가 높아져서 독립변수들간 서로 영향을 미치는 다중공선성의 문제가 발생하기 때문에 상대적인 조정이 필요
3) 다중회귀분석 예시
from sklearn import linear_model
import numpy as np
import pandas as pd
data = {'x1':[13,18,17,20,22,21], 'x2':[9,7,17,11,8,10], 'y':[20,22,30,27,35,32]}
data = pd.DataFrame(data)
X = data[['x1','x2']]
y = data['y']
data
# 다중회귀분석
linear_regression = linear_model.LinearRegression()
linear_regression.fit(X=pd.DataFrame(X), y=y)
prediction = linear_regression.predict(X=pd.DataFrame(X))
print('Bintercept_: ', linear_regression.intercept_)
print('acoef_: ', linear_regression.coef_)
# 잔차
residuals = y - prediction
residuals.describe()
# MSE, RMSE
from sklearn.metrics import mean_squared_error
from math import sqrt
mse = mean_squared_error(y, prediction)
rmse = sqrt(mse)
print('score = ', linear_regression.score(X=pd.DataFrame(X), y=y))
print('mean_squared_error = ', mse)
print('RMSE = ', rmse)
# r_squared
SSE = (residuals**2).sum()
SST = ((y-y.mean())**2).sum()
R_squared = 1 - (SSE/SST)
print('R_squared: ', R_squared)
4) 다중회귀분석 예시 - load_boston 사용
from sklearn.linear_model import LinearRegression
from sklearn import datasets
import pandas as pd
boston_house_prices = datasets.load_boston()
print(boston_house_prices.keys())
print(boston_house_prices.data.shape)
print(boston_house_prices.feature_names)
X = pd.DataFrame(boston_house_prices.data)
X.tail()
# 컬럼명을 feature_names로 변경
X.columns = boston_house_prices.feature_names
X.tail()
# Price를 y변수로 추출함
X['Price'] = boston_house_prices.target
y = X.pop('Price')
print(y)
X.tail()
# LinearRegression
linear_regression = linear_model.LinearRegression()
linear_regression.fit(X=pd.DataFrame(X), y=y)
prediction = linear_regression.predict(X=pd.DataFrame(X))
print('a value: ', linear_regression.intercept_)
print('b value: ', linear_regression.coef_)
# 잔차
residuals = y - prediction
residuals.describe()
# R_squared
SSE = (residuals**2).sum()
SST = ((y-y.mean())**2).sum()
R_squared = 1 - (SSE/SST)
print('R_squared: ', R_squared)
# MSE & RMSE
mse = mean_squared_error(y, prediction)
print(mse)
rmse = sqrt(mse)
print(rmse)
print('score = ', linear_regression.score(X=pd.DataFrame(X), y=y))
print('mean_squared_error = ', mse)
print('RMSE = ', rmse)
'Programming > Machine Learning' 카테고리의 다른 글
KNN 알고리즘 (0) | 2020.09.27 |
---|---|
모델 성능 평가 척도, ROC 커브 (0) | 2020.09.27 |
로지스틱 회귀분석 (0) | 2020.09.27 |
데이터 전처리 (0) | 2020.09.27 |
머신러닝 개요 (0) | 2020.08.16 |