Python의 선형 회귀 II

2024. 1. 26. 19:00python/intermediate

선형 회귀용 Python 패키지

이제 Python에서 선형 회귀 구현을 시작할 시간입니다. 이를 위해 적절한 패키지와 해당 기능 및 클래스를 적용합니다.

NumPy 는 1차원 및 다차원 배열에 대한 많은 고성능 작업을 허용하는 기본 Python 과학 패키지입니다. 또한 많은 수학적 루틴을 제공합니다. 물론 오픈소스입니다.

NumPy에 익숙하지 않은 경우 공식 NumPy 사용자 가이드를 사용 하고 NumPy 자습서: Python의 데이터 과학에 대한 첫 번째 단계를 읽어보세요 . 또한 Look Ma, No forLoops: NumPy 및 Pure Python을 사용한 배열 프로그래밍과 NumPy 및 TensorFlow 성능 비교를 통해 NumPy를 적용할 때 얻을 수 있는 성능 향상에 대한 좋은 아이디어를 얻을 수 있습니다.

scikit-learn 패키지는 NumPy 및 기타 패키지를 기반으로 구축되어 널리 사용되는 기계 학습용 Python 라이브러리입니다. 데이터 전처리, 차원 축소, 회귀 구현, 분류, 클러스터링 등을 위한 수단을 제공합니다. NumPy와 마찬가지로 scikit-learn도 오픈 소스입니다.

scikit-learn 웹사이트 의 일반화 선형 모델 페이지를 확인하여 선형 모델에 대해 자세히 알아보고 이 패키지의 작동 방식에 대한 더 깊은 통찰력을 얻을 수 있습니다.

선형 회귀를 구현하고 scikit-learn 범위를 넘어서는 기능이 필요한 경우 statsmodels 를 고려해야 합니다 . 통계 모델 추정, 테스트 수행 등을 위한 강력한 Python 패키지입니다. 오픈소스이기도 합니다.

statsmodels에 대한 자세한 내용은 공식 웹사이트 에서 확인할 수 있습니다 .

이제 이 튜토리얼을 따라하려면 다음 패키지를 모두 가상 환경 에 설치해야 합니다 .

In [ ]:
!python -m venv lecture
!source lecture/bin/activate
In [ ]:
!python -m pip install numpy scikit-learn statsmodels

그러면 NumPy, scikit-learn, statsmodels 및 해당 종속 항목이 설치됩니다.

scikit-learn을 사용한 단순 선형 회귀

가장 간단한 사례인 단순 선형 회귀부터 시작하겠습니다. 선형 회귀를 구현할 때 다음과 같은 5가지 기본 단계가 있습니다.

  1. 필요한 패키지와 클래스를 가져옵니다.
  2. 작업할 데이터를 제공하고 최종적으로 적절한 변환을 수행합니다.
  3. 회귀 모델을 만들고 이를 기존 데이터에 맞춥니다.
  4. 모델 피팅 결과를 확인하여 모델이 만족스러운지 확인하십시요.
  5. 예측을 위해 모델을 적용합니다.

이러한 단계는 대부분의 회귀 접근 방식 및 구현에 대해 다소 일반적입니다. 자습서의 나머지 부분에서는 여러 가지 시나리오에 대해 이러한 단계를 수행하는 방법을 배우게 됩니다.

1단계: 패키지 및 클래스 가져오기

첫 번째 단계는 다음에서 패키지 numpy와 sklearn.linear_model로 부터 class.LinearRegression를 가져오는 것입니다

In [ ]:
import numpy as np
from sklearn.linear_model import LinearRegression

이제 선형 회귀를 구현하는 데 필요한 모든 기능을 갖추었습니다.

NumPy의 기본 데이터 유형은 numpy.ndarray라 부르는 어레이 타입입니다. 이 튜토리얼의 나머지 부분에서는 배열이라는 용어를 사용하여 유형 numpy.ndarray 의 인스턴스를 나타냅니다.

이 sklearn.linear_model.LinearRegression 클래스를 사용하여 선형 및 다항식 회귀를 수행하고 그에 따라 예측을 수행합니다.

2단계: 데이터 제공

두 번째 단계는 작업할 데이터를 정의하는 것입니다. 입력(회귀변수, 𝑥)과 출력(응답, 𝑦)은 배열 또는 유사한 객체여야 합니다. 이는 회귀용 데이터를 제공하는 가장 간단한 방법입니다.

In [ ]:
x = np.array([5, 15, 25, 35, 45, 55]).reshape((-1, 1))
y = np.array([5, 20, 14, 32, 22, 38])

이제 x 입력 , y 출력 이라는 두 개의 배열이 있습니다. 이 배열은 2차원 이어야 하며 더 정확하게는 하나의 열과 필요한 만큼의 행을 가져야 하기 때문에 .reshape()호출 해야 합니다 . 이것이 바로 .reshape() 의 인수 (-1, 1) 을 지정하는 것입니다.

In [ ]:
x
In [ ]:
y

보시다시피 x에는 두 개의 차원이 있고 x.shape 는 (6, 1)인 반면에 y는 단일 차원이고 y.shape는 (6,) 입니다 .

3단계: 모델 생성 및 피팅

다음 단계는 선형 회귀 모델을 만들고 기존 데이터를 사용하여 피팅하는 것입니다.

회귀 모델을 나타내는 클래스의 LinearRegression 인스턴스를 만듭니다 .

In [ ]:
model = LinearRegression()

이 문은 LinearRegression 인스턴스인 변수 model을 생성합니다. 다음과 같은 여러 선택적 매개변수를 LinearRegression에게 제공할 수 있습니다.

  • fit_intercept는 True 이면 절편 𝑏₀을 계산하거나 False 일 경우 0 과 같다고 간주하는 부울 입니다 . 기본값은 .True 입니다.
  • normalize은 True일 경우 입력 변수를 정규화하기로 결정하는 부울입니다 . 기본값은 False 입니다. 이 경우 입력 변수를 정규화하지 않습니다.
  • copy_X는 입력 변수를 복사(True)할지 덮어쓸지(False)를 결정하는 부울입니다. 기본값은 True입니다.
  • n_jobs은 정수이거나 None 입니다. 이것은 병렬 계산에 사용되는 작업 수를 나타냅니다. 기본값은 None 으로, 일반적으로 하나의 작업을 의미합니다. -1 은 사용 가능한 모든 프로세서를 사용한다는 의미입니다.

위에서 정의한 대로 모든 매개변수의 기본값을 사용합니다 .

이제 모델 사용을 시작할 시간입니다. 먼저 model 위에 .fit()을 호출해야 합니다.

In [ ]:
model.fit(x, y)

.fit()과 함께 를 사용하면 기존 입력 및 출력 및 x, y를 인수로 사용하여 가중치 𝑏₀ 및 𝑏₁의 최적 값을 계산합니다 . 즉,.fit()은 모델에 적합합니다. 변수 model 자체인 self 를 반환합니다 . 그렇기 때문에 마지막 두 명령문을 다음 명령문으로 바꿀 수 있습니다.

In [ ]:
model = LinearRegression().fit(x, y)

이 명령문은 이전 두 명령문과 동일한 작업을 수행합니다. 단지 더 짧을 뿐입니다.

4단계: 결과 얻기

모델을 피팅한 후에는 결과를 얻어 모델이 만족스럽게 작동하는지 확인하고 해석할 수 있습니다.

.score()가 model을 호출하여 결정 계수 𝑅²를 얻을 수 있습니다.

In [ ]:
r_sq = model.score(x, y)
print(f"coefficient of determination: {r_sq}")

.score()를 실행하였을 때, 인수는 예측변수 x와 응답 y이고 반환 값은 𝑅²입니다.

model의 속성은 𝑏₀ 계수를 나타내는 .intercept_ 이고 .coef_ 는 𝑏₁ 입니다.

In [ ]:
print(f"intercept: {model.intercept_}")
In [ ]:
print(f"slope: {model.coef_}")

위의 코드는 𝑏₀ 및 𝑏₁을 얻는 방법을 보여줍니다. .intercept_는 스칼라이고 .coef_ 는 배열이라는 것을 알 수 있습니다 .

참고: scikit-learn에서는 관례 에 따라 뒤에 오는 밑줄이 속성이 추정됨을 나타냅니다. 이 예에서 .intercept_및 는 .coef_추정값입니다.

𝑏₀의 값은 약 5.63입니다. 이는 𝑥가 0일 때 모델이 반응 5.63을 예측한다는 것을 보여줍니다. 𝑏₁ = 0.54 값은 𝑥이 1 증가할 때 예측 반응이 0.54 증가한다는 것을 의미합니다.

y2차원 배열로도 제공할 수 있다는 것을 알 수 있습니다 . 이 경우 비슷한 결과를 얻게 됩니다.

In [ ]:
new_model = LinearRegression().fit(x, y.reshape((-1, 1)))
print(f"intercept: {new_model.intercept_}")

보시다시피 이 예제는 이전 예제와 매우 유사하지만 이 경우에는 .intercept_는 단일 요소 𝑏₀로 구성된 1차원 배열이고 .coef_는 단일 요소 𝑏₁로 구성된 2차원 배열입니다.

5단계: 반응 예측

만족스러운 모델이 있으면 기존 데이터나 새 데이터를 사용하여 예측에 사용할 수 있습니다. 예측된 응답을 얻으려면 .predict() 사용하십시오.

In [ ]:
y_pred = model.predict(x)
print(f"predicted response:\n{y_pred}")

.predict() 를 적용할 때, 회귀 변수를 인수로 전달하고 해당 예측 응답을 얻습니다. 이는 반응을 예측하는 것과 거의 동일한 방법입니다.

In [ ]:
y_pred = model.intercept_ + model.coef_ * x
print(f"predicted response:\n{y_pred}")

이 경우에는 x 의 각 요소를 model.coef 와 곱하고 _model.intercept_를 결과물에 더하면 됩니다 .

여기의 출력은 차원에서만 이전과 다릅니다. 예측된 응답은 이제 2차원 배열이지만 이전 사례에서는 1차원이었습니다.

1차원 수를로 줄이면 이 두 가지 접근 방식은 동일한 결과를 산출합니다. x를 model.coef_와 곱할 때 x를 .x.reshape(-1), x.flatten(), 혹은 x.ravel()로 대체하는 것에 의해 이를 수행할 수 있습니다

실제로 회귀 모델은 종종 예측에 적용됩니다. 이는 적합 모델을 사용하여 새로운 입력을 기반으로 출력을 계산할 수 있음을 의미합니다.

In [ ]:
x_new = np.arange(5).reshape((-1, 1))
x_new
In [ ]:
y_new = model.predict(x_new)
y_new

여기 .predict()에 새로운 회귀 분석기 x_new에 적용되어 y_new 응답이 생성됩니다. 이 예제에서는 0은 포함하고 5는 배제하는, 즉, 0, 1, 2, 3및 4인 배열을 생성하기 위하여 numpy로 부터 arange()을 사용합니다.

'python > intermediate' 카테고리의 다른 글

Python 이름의 단일 및 이중 밑줄 I  (1) 2024.01.28
Python의 선형 회귀 III  (1) 2024.01.27
Python의 선형 회귀 I  (1) 2024.01.25
Python3 중급 주제  (0) 2024.01.24
프롬프트 엔지니어링 실제 사례  (1) 2024.01.23