Eggs Sunny Side Up
본문 바로가기
Computer Engineering/머신러닝

선형회귀_LinearRegression_보스턴 주택가격 실습

by guswn100059 2023. 6. 19.

LinearRegression

판단

LinearRegression의 단점 : 모델이 잘못되었을 때 개설할 수 없다.

==> 규제(정규화)를 가해서 해결

 

규제 : 선형모델에서 가중치(w)에 영향을 주는 것 --> 모델에 개입한다.

1. L1 규제(Lasso) : LinearRegression + L1 규제

    - 모든 w에 특정값만큼 규제를 가하겠다. 

    - 가중치가 0이 되어 사용하지 않는 특성이 생김 --> 특성 선택

    - 특정 데이터가 중요할 때 사용

 

2. L2 규제(Ridge) : LinearRegression + L2 규제

    - 모든 가중치(w)에 특정 %만큼의 규제를 가하겠다.

    - 규제를 많이 가해도 전체 가중치는 사용

    - 전체 데이터가 고르게 중요할 때 사용

    - 가중치가 0은 되지 않음

 


### 문제 정의
- 보스턴 주택 가격 데이터를 사용하여 주택 가격을 예측해보자
- 회귀모델
- LinearRegression, RGDRegressor

### 데이터 수집

import warnings
warnings.filterwarnings('ignore')

from sklearn.datasets import load_boston
boston = load_boston()

boston # bunch 객체

boston.keys()

#### 문제와 정답으로 구성

import pandas as pd

# X, y
X = pd.DataFrame(boston['data'], columns=boston['feature_names'])
y = pd.DataFrame(boston['target'], columns=['price'])

#### 문제와 정답 합치기

total = pd.concat([X, y], axis=1)
total

![image.png](attachment:image.png)

### 데이터 전처리

#### 특성 확장
- 특성들끼리 곱해서 새로운 특성을 만들자

col = X.columns
col

# 1. 전체 컬럼을 순서대로 꺼내오는 for문
for i in range(col.size) :
    
    # 2. 1번에서 꺼내온 컬럼명과 전체 컬럼의 수
    for j in range(i, col.size):
        # i*j = n
        X[col[i] + '*' + col[j]] = X[col[i]]*X[col[j]]

X.shape

X.columns

# 확장된 특성에 의해 값이 좋아짐 --> 질이 좋은 데이터를 구해야 하는 이유

#### 스케일링
- 주의사항 : 데이터 전처리 마지막 단계에서 사용
             데이터의 결측치가 없어야 하므로

from sklearn.preprocessing import StandardScaler

standard = StandardScaler()

X.head()

# 평균이 0, 분산이 1이 되는 학습
standard.fit(X)

# 학습한 기준으로 변환
X_trans = standard.transform(X)
X_trans

### 탐색적 데이터 분석(EDA)

#### 상관관계 분석
- 피어슨 상관계수 : 두 컬럼간의 선형도 판단
- 컬럼 간의 상관도(선형관계)를 확인

# 관계를 시각적으로 확인해보기
import seaborn as sns
import matplotlib.pyplot as plt

plt.figure(figsize=(12, 12))
sns.heatmap(total.corr(), annot=True)
plt.show()

# heatmap : 시각적으로 뚜렷하게 차이를 확인 => 데이터 전처리를 할 때 우선순위의 판단 근거
# 활용 예시: 모델이 학습하는데 시간이 많이 걸린다
#             --> 데이터를 줄여야 함(서비스를 제공함에 따른 시간을 줄이고자 할 때)
#             - 가지고 있는 컬럼들 중에서 상관도가 낮은 것부터 삭제하고
#             - 추가적으로 전처리를 해야 하는데 시간이 부족?
#             - 상관도가 높은 것부터 전처리를 시행하여 좀 더 효율적

### 모델 선택 및 하이퍼 파라미터 튜닝

# 수학적 공식을 이용한 해석적 모델
from sklearn.linear_model import LinearRegression
lr_model = LinearRegression()

# 경사하강법
from sklearn.linear_model import SGDRegressor
sgd_model = SGDRegressor()

#### 규제를 적용시킨 모델 꺼내오기

from sklearn.linear_model import Ridge, Lasso

#### 훈련과 평가 데이터로 분리

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=10)

### 학습

lr_model.fit(X_train, y_train)

sgd_model.fit(X_train, y_train)

### 예측

lr_model.score(X_train, y_train)

sgd_model.score(X_train, y_train)

lr_model.score(X_test, y_test)

sgd_model.score(X_test, y_test)

#### Ridge 활용하기

# ridge의 하이퍼 파라미터(alpha) 튜닝

def ridge_alpha(alpha):
    ridge = Ridge(alpha=alpha) # -무한대 ~ +무한대, 일반적으로 사용하는 구간 : 0.001 ~ 1000
    ridge.fit(X_train, y_train) # 학습
    print('train_score : ', ridge.score(X_train, y_train)) # 결과를 확인하겠다.
    print('test_score : ', ridge.score(X_test, y_test))

ridge_alpha(0.001)
# alpha 기본값 = 1
# alpha 값이 증가 : 규제를 늘리겠다 ==> 모델이 복잡해지는 것을 막겠다(과대적합일 때 사용)
# alpha 값이 감소 : 규제를 줄이겠다 ==> 모델이 단순해지는 것을 막겠다(과소적합일 때 사용)

#### Ridege 정리
- 규제를 줄이면 test score 상승
- 과대적합보다는 과소적합 or 일반화에 가까운 상황
- 전체 데이터가 고르게 중요할 때 사용

#### Lasso 활용하기

import numpy as np

def lasso_alpha(alpha):
    lasso = Lasso(alpha=alpha) # -무한대 ~ +무한대, 일반적으로 사용하는 구간 : 0.001 ~ 1000
    lasso.fit(X_train, y_train) # 학습
    print('train_score : ', lasso.score(X_train, y_train)) # 결과를 확인하겠다.
    print('test_score : ', lasso.score(X_test, y_test))
    # 선택된 특성 데이터 확인
    print('사용한 특성의 수 :  ', np.sum(lasso.coef_ != 0)) # 넘파이 추가

lasso_alpha(0.01)

#### Lasso 정리
- 규제를 적용할수록 score 값이 낮아짐
- 규제를 적용할수록 사용하는 특성의 수가 감소
- 특정변수(데이터)가 중요할 때

댓글