[python] linear regression with numpy

김보현·2024년 8월 14일
0

DeepLearning

목록 보기
3/4
DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)

dropnapandas 라이브러리에서 제공하는 메서드이다.
데이터프레임에서 결측치(NaN, Null 등)가 있는 행 또는 열을 삭제하는 데 사용된다.

주요 인자:

  • axis: 결측치를 기준으로 제거할 축을 지정한다.

    • axis=0 (기본값): 결측치가 있는 행을 삭제한다.
    • axis=1: 결측치가 있는 열을 삭제한다.
  • how: 모든 값이 결측치인지, 일부 값이 결측치인지에 따라 삭제를 결정한다.

    • how='any' (기본값): 하나라도 결측치가 있으면 삭제한다.
    • how='all': 모든 값이 결측치인 경우에만 삭제한다.
  • thresh: 특정 행 또는 열에서 결측치가 아닌 값의 최소 개수를 지정한다. 지정된 개수 이상이 아닌 경우 삭제된다.

  • subset: 특정 열이나 행만을 대상으로 결측치를 제거한다. 리스트 형태로 열 이름을 지정한다.

  • inplace: True로 설정하면 원본 데이터프레임을 수정한다. False일 경우(기본값), 수정된 데이터프레임을 반환한다.

예제

data = dataset.dropna(subset=['PM10', 'PM25'])

설명:

  • subset=['PM10', 'PM25']: PM10PM25 열을 기준으로 결측치가 있는 행을 제거한다. 이 열들 중 하나라도 결측치가 있다면 해당 행이 삭제된다.
  • 이 경우, PM10 또는 PM25 열에 결측치가 포함된 모든 행이 제거되며, 그 결과는 새로운 데이터프레임 data에 저장된다.
    data 데이터프레임에는 PM10PM25 열에 결측치가 없는 행만 포함되게 된다.

데이터프레임을 traintest로 분할하는 코드

인덱스를 이용해 iloc 메서드를 사용하여 데이터를 분할할 수 있다.

모델 정의

linear regression
W=(XTX)1XTyW = (X^T * X)^-1 * X^T * y

self.weights = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y)
  1. fit 함수:

    • X에 절편(bias) 항 추가: np.hstack((np.ones((X.shape[0], 1)), X))를 사용하여 입력 데이터 X의 앞에 절편에 해당하는 항(모든 값이 1인 열)을 추가합니다.
    • 가중치 계산: 최소 제곱법(closed form 솔루션)을 사용하여 가중치를 계산합니다. 이 식은 W = (X^T * X)^-1 * X^T * y로 표현됩니다.
    • bias와 가중치 추출: 계산된 가중치 벡터에서 첫 번째 값은 bias가 되고, 나머지 값들은 weights로 저장됩니다.
  2. predict 함수:

    • X에 절편 항 추가: fit 함수에서 한 것처럼 입력 데이터 X의 앞에 절편에 해당하는 항을 추가합니다.
    • 예측: X와 가중치 및 절편을 곱하여 예측값을 계산합니다. y_pred = X.dot(np.hstack((self.bias, self.weights)))를 통해 수행

오답노트

np.zeros 함수에서 괄호를 두 번 사용하는 이유는 배열의 형상(Shape)을 지정하기 위해서입니다. np.zeros 함수는 주어진 형상에 맞는 배열을 생성합니다. 이 형상은 튜플로 전달되며, 튜플은 여러 차원을 가질 수 있습니다.

np.zeros의 형상 인자:

  • np.zeros(shape): 여기서 shape는 생성할 배열의 형상을 나타내는 튜플입니다.

예를 들어, np.zeros((2, 3))은 2x3 배열을 생성합니다. 튜플 (2, 3)은 배열의 행과 열의 개수를 지정하는 것입니다.

예시:

  1. 1차원 배열:

    arr = np.zeros(3)
    print(arr)  # Output: [0. 0. 0.]
    • 이 경우, 3은 1차원 배열의 크기를 지정하는 단일 값입니다. 이 값은 튜플 (3,)로 해석됩니다.
  2. 2차원 배열:

    arr = np.zeros((2, 3))
    print(arr)
    # Output:
    # [[0. 0. 0.]
    #  [0. 0. 0.]]
    • 여기서는 2x3 배열이 생성됩니다. shape 인자는 (2, 3)으로, 2개의 행과 3개의 열을 지정합니다.

params['b1']에 사용된 이유:

params['b1']는 은닉층의 바이어스 벡터입니다. 각 은닉 유닛마다 하나의 바이어스가 필요하며, 여기서 num_hiddens는 은닉 유닛의 수를 의미합니다.

  • np.zeros((1, num_hiddens))는 1xnum_hiddens 크기의 2차원 배열을 생성합니다. 이 배열은 하나의 행(1)과 num_hiddens개의 열로 구성됩니다.
  • 두 개의 괄호 (1, num_hiddens)는 이 배열이 2차원임을 나타냅니다.

이와 같이 2차원 배열로 생성하는 이유는, 행렬 연산 시 일관된 형상을 유지하기 위함입니다. 특히, 입력 데이터와의 행렬 곱에서 바이어스가 올바르게 더해지도록 하기 위해 이 형상으로 지정됩니다.

간단히 말해, np.zeros((1, num_hiddens))에서 두 개의 괄호는 2차원 배열(1xnum_hiddens)을 생성하는 데 필요합니다.

accuracy = np.mean(predictions == labels)는 분류 모델의 정확도를 계산하는 간단한 코드입니다. 이 코드를 이해하기 위해 다음 사항들을 살펴보겠습니다.

코드

  • predictions == labels:

    • 이 비교 연산은 predictions 배열과 labels 배열의 요소별 비교를 수행합니다.
    • 각 요소가 동일한 경우 True, 다를 경우 False를 반환합니다.
    • 이 결과는 TrueFalse로 구성된 불리언 배열을 생성합니다.
  • np.mean(predictions == labels):

    • True1로, False0으로 간주됩니다.
    • np.mean 함수는 불리언 배열의 평균을 계산합니다. 즉, True 값(즉, 맞춘 경우)의 비율을 계산하게 됩니다.
    • 이 값은 전체 예측 중에서 얼마나 많은 예측이 실제 라벨과 일치했는지를 나타내며, 정확도로 해석할 수 있습니다.

예시

import numpy as np

# 가정: 예측 값과 실제 라벨 값이 다음과 같다고 합시다.
predictions = np.array([0, 1, 2, 3, 4])
labels = np.array([0, 1, 2, 2, 4])

# 정확도 계산
accuracy = np.mean(predictions == labels)
print(f'Accuracy: {accuracy:.2f}')

실행 결과:

이 예제에서

  • predictions == labelsarray([ True, True, True, False, True])를 반환합니다.
  • np.mean([ True, True, True, False, True])4/5 = 0.8(즉, 80%)를 반환합니다.

따라서 accuracy0.8 또는 80%가 됩니다.

예측 결과와 실제 라벨 간의 일치도를 평가하여 분류 모델의 정확도를 계산.
전체 데이터 중에서 예측이 얼마나 정확했는지를 비율로 나타내며, 분류 모델의 성능을 간단하게 평가

profile
Fall in love with Computer Vision

0개의 댓글