Python에서 선형 회귀 구현

python에서 선형 회귀를 실현하고'정밀도'와'모델 복잡성'을 주목한다.

카탈로그

  • 선형 모형
  • 선형 모델을 바탕으로 회귀한다
  • 선형 회귀(일반적으로 최소 2승법)
  • 1차원 데이터에 대한 선형 회귀
  • 고차원 데이터에 대한 선형 회귀
  • 참고 문헌

  • Python으로 시작한 머신러닝
  • 선형 모형


    선형 모델은 입력 특징량의 선형 함수를 사용하여 예측한다.

    선형 모델 회귀


    회귀 문제에 사용되는 선형 모델의 예측식은 다음과 같다.
    $$y=w(0)\times x(0)+w(1)\times x(1)+w(2)\times x(2)+…+w(p)\times x(p)$$
    여기에서 $x(0)부터 x(p)$까지 견본의 특징량을 표시합니다.또한 $w$와 $b$는 학습된 모델의 매개 변수이고 $y$는 모델에서 나온 예측입니다.
    피쳐 양이 1인 경우 $w(0)$기울어지고 슬라이스가 $b$인 선입니다.
    회귀 중의 선형 모델에서의 예측은 특징량이 1인 경우 직선이고 특징량이 2인 경우 평면이며 고차원인 경우 초평면이다.
    회귀 모델을 사용하는 회귀에는 다양한 알고리즘이 존재한다.
    그것들의 차이점은 두 가지가 있다.
  • 훈련 데이터에 따라 파라미터 w와 b 방법을 학습한다
  • 모델의 복잡성을 제어하는 방법
  • 선형 회귀(일반적으로 최소 2승법)


    선형 회귀(또는 보통 최소 2승법ordinary least squares:OLS)는 가장 간단한 선형 회귀 방법이다.
    선형 회귀는 훈련 데이터에서 $w$와 $b$를 확정하여 실제 회귀 목표 y와 균일한 오차(mean squared error:MSE)를 최소화합니다.
    균일 오차
    $$MSE =\frac{1}{n}\sum_{n=0}^{p} (y −\hat{y})^2$$
    나는 오차를 상상할 수 없는 사람도 있다고 생각한다.그래서 오차를 보여 보았다.

    선형 회귀에는 초변수가 없습니다.따라서 모델의 복잡성을 제어할 수 없습니다.

    미리 준비하다

    $ pip install scikit-learn
    $ pip install mglearn
    

    1차원 데이터에 대한 선형 회귀

    from sklearn.linear_model import LinearRegression
    from sklearn.model_selection import train_test_split
    import mglearn
    
    X, y = mglearn.datasets.make_wave(n_samples=60)
    print("(サンプル数, 特徴量数): ", X.shape)
    # => (サンプル数, 特徴量数):  (60, 1)
    
    X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
    lr = LinearRegression().fit(X_train, y_train)
    
    print(f"training dataに対しての精度: {lr.score(X_train, y_train):.2}")
    print(f"test dataに対しての精度: {lr.score(X_test, y_test):.2}")
    # => training dataに対しての精度: 0.67
    # => test dataに対しての精度: 0.66
    

    시찰:


    견인 데이터와 테스트 데이터에 대해 정밀도는 매우 낮다.따라서 지나치게 적합하지 않은 것은 적합성이 부족할 가능성이 높다.
    아래의'정밀도와 모델의 복잡성'그림으로 보면 스위트룸 왼쪽에 있는 것 같다.

    선형 회귀는 1차원 데이터에 대해 모델의 복잡도가 낮고 의합 부족에 빠지기 쉽다.

    고차원 데이터의 선형 회귀

    X, y = mglearn.datasets.load_extended_boston()
    print("(サンプル数, 特徴量数): ", X.shape)
    # => (サンプル数, 特徴量数):  (506, 104)
    
    X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
    lr = LinearRegression().fit(X_train, y_train)
    print(f"training dataに対しての精度: {lr.score(X_train, y_train):.2}")
    print(f"test dataに対しての精度: {lr.score(X_test, y_test):.2}")
    # => training dataに対しての精度: 0.95
    # => test dataに対しての精度: 0.61
    

    시찰:


    견인 데이터의 정밀도는 매우 좋지만 테스트 데이터의 정밀도는 좋지 않다.이것은 지나치게 일치하는 것일 가능성이 높다.
    상술한'정밀도와 모델의 복잡성'의 그림으로 볼 때 스위트룸의 오른쪽에 왔죠.
    따라서 범용성능(테스트 데이터에 대한 정밀도)을 높이기 위해서는 모델의 복잡도를 제어해야 한다.
    그 방법에는 척추 회귀와 Lasso가 있다.

    경품


    다음 글에서 척추 회귀와 Lasso에 관한 글을 쓰려고 합니다. 이것은 모델의 복잡성을 제어하는 방법입니다.

    좋은 웹페이지 즐겨찾기