좌충우돌 개발자의 길

8강 : 특성 공학과 규제 본문

STUDYING/머신러닝&딥러닝

8강 : 특성 공학과 규제

sustronaut 2021. 7. 18. 22:57

다중 회귀

  • 여러개의 특성을 사용함 (↔ 다항 회귀)

 

특성 공학

  • 새로운 특성을 추가하거나 특성을 발견하거나 특성끼리 조합을 하는 것
  • 머신러닝 알고리즘은 특성공학의 영향을 많이 받음

 

판다스 데이터로 준비

  • 데이터 프레임으로 되어 있는데 이는 다른 종류의 데이터 타입을 받을 수 있는 특징이 있다.
  • 엑셀과 비슷하다
  • 판다스로 원격에 있는 파일을 불러와서 넘파이 배열로 만들기
  • csv 파일
    • 한줄에 샘플 하나가 들어있음 (length, height, wiedth)
    • 콤마로 나눠진 열마다 특성 데이터가 들어있음

  • read_csv() : 파일 불러오기
  • to_numpy() : 넘파이 배열로 만들기

다항 특성 만들기

form sklearn.preprocessing import PolynomialFeatures

# degree = 2
# fit(훈련 : 새롭게 만들 특성 조합 찾기)과 
# transform(변환 : 실제로 데이터를 변환 )은 변환기 클래스
poly = PolynomialFeatures() #객체 생성
poly.fit([2,3]) #2개의 특성 2와 3으로 이루어진 샘플 적용

# 두개의 특성을 가진 샘플 [2,3]이 6개의 특성을 가진 샘플로 변환 
# 1(bias), 2, 3, 2**2, 2*3, 3*2
print(poly.transform([2,3])
[[1. 2. 3. 4. 6. 9. ]]
  • 1이 추가된 이유 : 절편을 위한 가상의 특성 1을 만드는 경우가 있다.
    • y = ax + b1 ⇒ [a, b][x, 1]
    • 하지만 사이킷런의 선형 모델은 자동으로 절편을 추가하므로 굳이 이렇게 특성을 만들 필요가 없다 → include_bias = False로 지정해 다시 특성 변환
  • PolynomialFeatures : 변환기 - 특성변환, 전처리 할 때 사용
    • 메소드 : fit, transform ⇒ fit_transform() : 두가지 한번에 처리
  • LinearKn~~, KN~~ : 추정기 - 모델링
    • 메소드 : fit, predict, score

 

LinearRegression

poly = PolynomialFeatures(include_bias=False)

poly.fit(train_input)
train_poly = poly.transform(train_input)

# 크기 보기 (샘플 개수, 특성 개수)
print(train_poly.shpae)
(42,9)

# 특성이 어떻게 만들어졌는지 확인하기 -> get_featrue_names()
poly.get_feature_names()
['x0', 'x1','x2','x0^2','x0 x1',
'x0 x2','x1^2','x1 x2','x2^2',]

test_poly = poly.transform(test_input)
  • x0^2 : 첫번째 특성의 제곱
  • x0 x1 : x0 곱하기 x1
  • degree=2 로 기본값으로 설정되어 있기에 제곱까지 나온거임

→ 이전보다 좋은 예측결과가 나옴

 

 

더 많은 특성 만들기

  • degree를 5로 늘려서 만들면 train_poly.shape에서 55개의 특성으로 늘어난 것을 볼 수 있음
  • 상당히 과대적합되었는데 이는 일부러 이렇게 만든 거고 규제라는 것을 통해 정돈할 수 있음
  • poly.fit(test_input) 은 왜 안해?
  • → 테스트 샘플은 자동적으로 fit메소드를 호출해서 따로 변환하지 않고 항상 훈련세트에서 먼저 학습한 객체를 사용해서 테스트 샘플을 변환

 

  • 규제 : 극도로 과대적합된 모델을 완화하는 역할

→ 가중치(기울기)값을 줄여서 부드러운 그래프처럼 되게 만들기

가중치 값을 적게 만들기

  • LeanerRegression은 스케일(특성의 크기)에 영향x → 굳이 안맞춰도 됨
  • BUTTT!!! 규제를 하려면 맞춰야함 → 특성의 스케일이 비슷해져야지 기울기도 비슷해짐

 

규제 전에 표준화

from sklearn.preprocessing import StandarScaler

ss= StandarScaler()
ss.fit(train_poly) # 표준편차를 각 특성마다 구하는 훈련하기 

train_scaled = ss.transform(train_poly)
test_scaled= ss.transform(test_poly)
  • preprocessing StandarScaler에서 제공하는 것으로 표준점수를 바꾸는 변환기

 

릿지 회귀

  • 사이킷런에는 규제가 되어있는 선형모델을 다른 별도의 클래스로 구현되어 잇음
  • 릿지와 라소 클래스 두가지로 나눠짐
  • 릿지 회귀는 선형회귀에 가중치^2인 L2규제를 적용한 것을 말함
  • 릿지 클래스 규제의 강도 : Ridge() 매개변수에는 alpha=1이 있는데 이를 더 높게 하면 강도가 쎄짐, 작게하면 강도가 약해짐
    • alpha같이 우리 스스로가 정해져야하는 것을 하이퍼파라미터라고 함
    • 이 alpha값을 바꿔가면서 좋은 score 점수를 찾아야함
  • 가중치는 모델 파라미터라고 불림

 

적절한 규제 강도 찾기 (릿지회귀)

  • alpha_list 보면 10의 배수로 이루어져있는데 이게 일반적임 → 그래프에서 동일한 간격이 나오도록 하기 위해 log10도 사용함

왼쪽으로 갈 수록 과대적합, 오른쪽으로 갈 수록 과소적합되어, 가장 간격이 좁은 -1인 10의 -1인 0.1 을 alpha값으로 준거임

 

라쏘 회귀

  • 가중치의 절대값을 벌칙으로 줌 → L1규제를 적용한다
  • 릿지 규제와 똑같은 방식으로 진행함
  • L1 규제보다는 L2 규제를 대다수 선호
  • 가중치를 0으로 만들어서 특성 * 가중치 → 0이 되어서 특성이 아예 사라지게하는 기능있음
print(np.sum(lasso.coef_ == 0))
40
# 이렇게 표현하여 특성이 0이 되어버린 개수를 찾을 수 있음