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 값이 낮아짐
- 규제를 적용할수록 사용하는 특성의 수가 감소
- 특정변수(데이터)가 중요할 때
'Computer Engineering > 머신러닝' 카테고리의 다른 글
영화리뷰 분석 (0) | 2023.06.20 |
---|---|
Logistic_SVM_손글씨 숫자 데이터 분류 실습 (0) | 2023.06.19 |
선형회귀 (0) | 2023.06.16 |
Ensemble 유방암 데이터 분류 실습 (0) | 2023.06.15 |
타이타닉 데이터 실습_앙상블 (0) | 2023.06.15 |
댓글