Simple&Multiple Linear Regression in P.
2017 년 5 월 9 일
파이썬에서 선형 회귀에 대한 간단한 소개안녕 모두! "NumPy 라이브러리를 " 간략히 소개 한 후 , Python으로 모델을 작성하는 방법에 대해 간략하게 소개하고 싶었습니다. 아주 기본적인 모델 인 선형 회귀 모형보다 더 나은 곳을 찾고 싶습니까? 이것은 기계 학습에 관한 첫 번째 게시물이 될 것이고 앞으로 더 복잡한 모델에 대해 쓸 계획입니다. 계속 지켜봐! 하지만 지금은 선형 회귀에 초점을 맞추자.이 블로그 포스트에서는 선형 회귀의 개념과 주로 파이썬에서의 구현에 중점을두고 자합니다.선형 회귀 분석 은 두 변수 (단순 선형 회귀) 또는 더 많은 변수 (다중 선형 회귀 변수) - 종속 변수 및 독립 변수 간의 선형 관계를 검사하는 통계 모델입니다. 선형 관계는 기본적으로 하나 이상의 독립 변수가 증가하거나 감소 할 때 종속 변수가 증가하거나 감소한다는 것을 의미합니다.
보시다시피 선형 관계는 양수 (독립 변수가 올라가고 종속 변수가 올라갑니다) 또는 음수 (독립 변수가 올라가고 종속 변수가 내려갑니다) 일 수 있습니다. 앞서 말했듯이, 파이썬에서 회귀 모델을 구현하는 데 초점을 맞출 것이므로 회귀 분석에서 수학에 대해 너무 많이 파고 들지는 않을 것입니다.하지만 조금 짚어 보겠습니다. 그것에 대한 블로그 게시물을 원할 경우 주저하지 말고 답장을 보내주십시오!\
변수 Y와 X 사이의 관계는 다음 방정식으로 표현됩니다.
Y'i = mX + b
이 방정식에서 Y 는 종속 변수 또는 예측 또는 추정하려는 변수입니다. X는 독립 변수입니다. 우리가 예측을하기 위해 사용하는 변수입니다. m은 회귀선의 기울기입니다 . X 가 Y 에 미치는 영향을 나타냅니다 . 즉, X 가 1 단위 증가 하면 Y 는 정확히 m 단위 증가합니다 . ( "완전 공개" : 이것은 X 와 Y 가 선형 관계를 가지고있는 경우에만 해당 하며, 거의 모든 선형 회귀 사례에서 이것은 사실이 아닙니다!) b 는 Y- 절편이라고도하는 상수 입니다. X가 0이면 Yb와 같을 것입니다 ( 주의 : 이전의 전체 공개를 참조하십시오!). 이것은 실생활에서 반드시 적용 할 수있는 것은 아닙니다. 우리는 X 와 Y 사이의 정확한 관계를 항상 알 거나 정확한 선형 관계를 가질 수 없습니다.이러한 경고는 우리를 단순 선형 회귀 ( Simple Linear Regression , SLR)로 안내합니다. SLR 모델에서 데이터를 기반으로 한 모델을 작성합니다 - 기울기 및 Y 절편은 데이터에서 파생됩니다. 게다가 우리는 X 와 Y 사이의 관계를 필요로하지 않는다.정확히 선형이어야합니다. SLR 모델에는 데이터의 오류 (잔차라고도 함)도 포함됩니다. 나는 나중에 그 자리에 지나치지 않을 것이지만, 잔차는 기본적으로 Y의 실제 값과 Y의 예측 / 추정 된 값 사이의 차이입니다. 선형 회귀에서 우리는 유의해야합니다. 연속 변수를 예측하려고합니다. 회귀 모형에서 우리는 "가장 잘 맞는 선"을 찾아 이러한 오류를 최소화하려고 노력하고 있습니다. 오류의 회귀 선은 최소화 될 것입니다. 우리는 가능한 한 제로에 가깝게 검은 선의 길이를 (또는 더 정확하게, 파란색 점의 거리) 빨간색 선에서 최소화하려고 노력하고 있습니다. 그것은 " 평균 자승 오차 (MSE) 또는 "오차 제곱 의 합 "(SSE)을 최소화하는 것과 관련이있다. "잔여 제곱 합"이라고도합니다. (RSS)하지만이 블로그 게시물의 범위를 벗어날 수 있습니다 :-)
대부분의 경우, 우리는 하나 이상의 독립 변수를 가질 것입니다 - 우리는 여러 변수를 가질 것입니다; 최소 두 개의 독립적 인 변수와 최대 수백 (또는 이론적으로는 수천 개의) 변수가 될 수 있습니다. 이 경우 다중 선형 회귀 모델 (MLR)을 사용합니다. 회귀 방정식은 단순 회귀 방정식과 거의 동일합니다. 더 많은 변수가 있습니다.
Y'i = b0 + b1X1i + b2X2i
이것으로이 글의 수학 부분을 마칩니다. Python으로 구현할 준비가 되셨습니까?
파이썬에서의 선형 회귀
Statsmodels 및 scikit-learn을 사용하여 Python에서 선형 회귀를 수행하는 두 가지 주요 방법이 있습니다 . Scipy 라이브러리 를 사용하는 것도 가능 하지만, 필자가 언급 한 다른 두 라이브러리만큼 일반적이지는 않다. 두 가지 모두에서 선형 회귀를 살펴 보겠습니다.
통계 모델의 선형 회귀
Statsmodels 은 "다양한 통계 모델을 평가하고 통계 테스트 및 통계 데이터 탐색을 수행하는 데 필요한 클래스와 함수를 제공하는 Python 모듈"입니다 (문서에서 제공)
Pandas 및 NumPy 에서와 마찬가지로 Statsmodels을 가져 오거나 설치하는 가장 쉬운 방법은 Anaconda 패키지를 사용하는 것 입니다. 어떤 이유로 다른 방법으로 설치하는 데 관심 이있는 경우이 링크를 확인 하십시오 . 설치 한 후에는 사용하기 위해 매번 가져와야합니다.
보스턴 주택 가격 데이터 세트
===========================
노트
------
데이터 세트의 특성 :
: 인스턴스의 수 : 506
: 번호 의 속성 : (13) 숫자 / 범주 예측
: 중간 값 (속성 14) 보통 대상
: 속성 정보 (순서대로) :
- 마을에서 인당 범죄율 당 CRIM
- 25,000 평방 피트 이상에 대한 많은 지역으로 구분 택지의 ZN 비율을
- 마을 당이 아닌 소매 사업 에이커의 인더스 비율
- CHAS 찰스 강 더미 변수 (= 1의 경우 기관의 경계 강, 그렇지 않으면 0)
- NOX 질소 산화물 농도 (천만 당 부분)
- 주거 당 RM 평균 객실 수
- 1940 년 이전에 건설 된 소유주 점유자 수의 AGE 비율
- 5 개의 보스턴 고용 센터로의 DIS 가중 거리
- 방사형 고속도로에 대한 RAD 지수
- 10,000 달러 당 TAX 전체 가치 재산세 비율
- 잠정치
마을
별 동성애 교사 비율 - B 1000 (Bk - 0.63) ^ 2 여기서 Bk는 마을의 흑인 비율 - LSTAT %는 인구의 하위 상태
- MEDV $ 1000의 소유자가 거주하는 주택의 중간 값
: 누락 된 속성 값 : 없음
: 작성자 : Harrison, D. and Rubinfeld, DL
이것은 UCI ML 주택 데이터 세트의 사본입니다.
http://archive.ics.uci.edu/ml/datasets/Housing
이 데이터 세트는 카네기 멜론 대학에서 유지되는 StatLib 라이브러리에서 가져 왔습니다.
data.feature_names 및 data.target을 실행 하면 독립 변수 및 종속 변수의 열 이름이 각각 인쇄됩니다. 의미, Scikit-learn은 이미 집값 / 가격 데이터를 목표 변수로 설정했으며 다른 13 개의 변수가 예측 변수로 설정되었습니다. 이 데이터 세트에서 선형 회귀를 실행하는 방법을 살펴 보겠습니다.
첫째, 우리는 더 쉽게 분석 할 수 있도록 판다 데이터 프레임으로 데이터를로드하고 집값의 중앙값을 목표 변수로 설정해야합니다.
import numpy as np
import pandas as pd
# 데이터 / 예측자를 사전 설정된 피쳐 이름으로 정의합니다.
df = pd.DataFrame (data.data, columns = data.feature_names)
# 대상 (주택 값 - MEDV)을 다른 DataFrame
target = pd.DataFrame .target, columns = [ "MEDV"])
여기서 한 것은 데이터 세트를 가져 와서 판다 데이터 프레임으로로드하는 것입니다. 그 후에 데이터 세트에 미리 설정된 독립 변수 인 예측 변수 (df)를 설정합니다. 우리는 또한 목표 - 종속 변수 또는 우리가 예측 / 추정하려고 시도하는 변수를 설정하고 있습니다.
다음으로 우리는 선형 회귀 모델에 적합하길 원할 것입니다. 우리는 종속 변수에 대한 좋은 예측 인자라고 생각하는 변수를 선택해야합니다. 변수 사이의 상관 관계를 확인하고, 데이터를 플롯하고, 관계를 시각적으로 검색하고, 어떤 변수에 대한 사전 연구를 수행하여 수행 할 수 있습니다 이 첫 번째 예제의 경우 RM의 평균 수와 LSTAT - 인구의 낮은 지위의 백분율을 취해 봅시다. Statsmodels는 기본적으로 상수를 추가하지 않는다는 점에 유의해야합니다. 우리의 회귀 모델에서 상수없이 먼저 보자.
## 상수없이
반입 statsmodels.api 로서 SM
X = DF [ "RM"]
Y = 대상 [ "MEDV"]
# 참고 인수 순서 차이
모델 = sm.OLS (Y, X) .fit ()
예측 = model.predict (X) # 모델로 예측하기
# 통계 모델을 출력합니다.
summary ()
출력 :
표 해석하기 - 이것은 매우 긴 표입니다. 그렇지 않습니까? 먼저 우리는 종속 변수와 모델 및 방법을가집니다. OLS 는 Least Squares 는 회귀 직선과의 거리의 제곱을 최소화하는 회귀 직선에 적합하도록하는 방법을 의미합니다 (이 게시물의 이전 섹션 참조). 날짜와 시간은 꽤 자명하다 :) 관찰의 수로서. 잔차와 모델의 Df는 "변화가 자유로운 통계의 최종 계산에서의 값의 수" 와 관련됩니다 .
3.634의 계수는 RM 변수가 1 씩 증가함에 따라 MDEV 예측 값이 3.634 증가 함을 의미 합니다. 다른 중요한 값은 R 제곱 - 우리 모델이 설명하는 분산의 비율입니다. 표준 오차 (통계의 표집 분포의 표준 편차, 가장 일반적으로 평균) 가설 검정을위한 t 점수와 p- 값 - RM 은 통계적으로 유의 한 p 값을 가짐; 에 대한 95 % 신뢰 구간이 (RM 우리의 가치있는 95 % % 신뢰에서 예측 의미 RM은사이에 3.548 로 3.759 ).
모델에 상수를 추가하려면 명령을 사용하여이를 설정해야합니다.
X = sm.add_constant(X)
여기서 X는 입력 (독립) 변수를 포함하는 데이터 프레임의 이름입니다.
수입 statsmodels.api 로서 SM # 1 임포트 statsmodels의 X를 = 안양는 [ "RM은"] ## X 보통 우리의 입력 변수 (또는 독립 변수)을 의미 Y = 대상 [ "MEDV를"] ## Y 보통 우리 출력 / 종속 변수 수단 X를 = sm.add_constant (X) ## 우리 모델에 절편 (beta_0)을 추가합시다. # 인자 순서 모델 의 차이점에 유의하십시오. = sm.OLS (y, X) .fit () ## sm.OLS (출력, 입력) 예측 = model.predict (X) # 통계 모델을 인쇄합니다. summary ()
출력 :
표 해석하기 - 상수 항으로 계수는 다릅니다. 상수가 없으면 모델을 원점을 통과하도록 강요하지만 이제는 -34.67에 y 절편이 생겼습니다 . 또한 RM 예측 변수 의 기울기 를 3.634 에서 9.1021 로 변경했습니다 .
이제 하나 이상의 변수가있는 회귀 모델을 피팅 해 봅시다. 앞서 언급 한 RM과 LSTAT를 사용할 것입니다. 모델 피팅은 동일합니다.
X = df [[ "RM", "LSTAT"]]
y = 대상 [ "MEDV"]
model = sm.OLS (y, X) .fit ()
predictions = model.predict (X)
model.summary ()
그리고 출력 :
참고 : 내 Jupyter Notebook을 업데이트했기 때문에이 표가 다르게 보입니다.
산출물 해석 -이 모델은 R- 제곱 값이 0.948보다 훨씬 높다는 것을 알 수 있습니다.이 모델은 우리의 종속 변수의 분산의 94.8 %를 설명합니다. 회귀 모델에 변수를 추가 할 때마다 R2는 더 높아지지만 R2는 매우 높습니다. RM 과 LSTAT 모두 중앙 집값을 예측 (또는 추정)하는 데 통계적으로 유의 하다는 것을 알 수 있습니다 . 당연히 RM 이 1 씩 증가 하면 MEDV 는 4.9069, LSTAT 가 1증가 하면 MEDV 는 -0.6557 씩 감소 합니다. 기억할 수 있듯이 LSTAT는 인구의 낮은 지위의 백분율이며, 안타깝게도 주택 가격의 중간 값이 낮아질 것으로 기대할 수 있습니다. 이 같은 논리로 집안에있는 방이 많을수록 일반적으로 가치가 높아집니다.
이것은 Statsmodels의 단일 및 다중 선형 회귀의 예입니다. 우리는 회귀 모델에서 우리가 원하는 모든 변수를 사용할 수있었습니다 - 최대 13 개까지! 다음으로, SKLearn에서 선형 회귀 모델을 실행하는 방법을 보여 드리겠습니다.
sklearn의 수입 linear_model
보스턴 주택 가격과 같은 데이터 세트를 사용합시다. SKLearn에서 데이터 세트를 가져 와서 보스턴 데이터 세트에로드하는 과정은 처음에는 동일합니다.
sklearn의 수입 데이터 세트 에서 데이터 세트를 가져 ## scikit 배우기
데이터 = datasets.load_boston () 데이터 세트 라이브러리에서 ## 부하 보스턴의 데이터 집합을
다음으로 Pandas에 데이터를로드합니다 (이전과 동일).
# 데이터 / 예측자를 사전 설정된 피쳐 이름으로 정의합니다.
df = pd.DataFrame (data.data, columns = data.feature_names)
# 대상 (주택 값 - MEDV)을 다른 DataFrame
타겟에 놓습니다. = pd.DataFrame .target, columns = [ "MEDV"])
이제 이전과 같이 독립 변수 ( "df"로 표시됨)와 종속 변수가있는 데이터 프레임 ( "대상"으로 표시됨)이 포함 된 데이터 프레임이 있습니다. SKLearn을 사용하여 회귀 모델을 만들어 보겠습니다. 먼저 X와 Y를 정의하겠습니다. 이번에는 데이터 프레임의 모든 변수를 사용하여 주택 가격을 예측합니다.
X = df
y = target [ "MEDV"]
그리고 나서 저는 모델에 적합합니다 :
lm = linear_model.LinearRegression ()
model = lm.fit (X, y)
lm.fit () 함수는 선형 모델에 적합합니다. 우리는 모델을 사용하여 예측을하고 싶습니다. (그래서 우리가 여기 있습니다!) 그래서 lm.predict ()를 사용합니다 :
predictions = lm.predict (X)
print (예측) [0 : 5]
print 함수는 y에 대한 처음 5 개의 예측을 출력합니다 (전체 목록을 "save room"에 인쇄하지 않았습니다.) [0 : 5]를 제거하면 전체 목록이 인쇄됩니다.
[30.00821269 25.0298606 30.5702317 28.60814055 27.94288232]
lm.predict ()는 선형 모델을 사용하여 y (종속 변수)를 예측합니다. SKLearn을 사용하여 선형 회귀를 실행할 때 Statsmodels에서와 같이 예쁜 테이블을 얻지 못한다는 것을 알았을 것입니다 (알았어, 그다지 예쁜 것은 아니지만 꽤 유용합니다). 우리가 할 수있는 것은 내장 함수를 사용하여 점수, 계수 및 추정 된 절편을 반환하는 것입니다. 그것이 어떻게 작동하는지 보자 :
lm.score (X, y)
이 출력을 줄 것입니다 :
0.7406077428649428
이것은 우리 모델의 R² 점수입니다. 아마 기억 하듯이, 이것은 예측의 분산의 백분율입니다. 관심이 있으시면 "); background-size: 1px 1px; background-position: 0px calc(1em + 1px);">여기를 읽어보십시오 . 다음으로 예측 인자에 대한 계수를 확인해 봅시다.
lm.coef_
배열 ([-1.07170557e-01, 4.63952195e-02, 2.08602395e-02,
2.68856140e + 00, -1.77957587e + 01, 3.80475246e + 00,
7.51061703e-04, -1.47575880e + 00, 3.05655038e-01 ,
-1.23293463e-02, -9.53463555e-01, 9.39251272e-03,
-5.25466633e-01]
그리고 요격 :
lm.intercept_
그 결과는 다음과 같습니다.
36.491103280363134
앞에서 언급 한 여러 회귀 방정식의 모든 부분 (추정 / 예측)입니다. coef_와 intercept_에 대한 자세한 내용은 설명서를 참조하십시오.