본문 바로가기

머신러닝/혼자 공부하는 머신러닝

8강 특성 공학과 규제 알아보기

이 글은 https://www.youtube.com/watch?v=PLECEclz0p4&list=PLJN246lAkhQjoU0C4v8FgtbjOIXxSs_4Q&index=8 보고 공부한 글입니다.

 

지난 시간에

50cm농어의 무개를 찾으려고 k-최근접 이웃을 사용하니 범위 밖에 값을 예측하기 힘들다.

 

그래서 선형 회귀 모델을 사용했다.

 

특성 1개만 사용하면 x축과 y축을 사용한 1개의 직선 방정식만 나오게 된다.

 

 

다중회귀 

multiple regression, multinamial(다항)

여러개의 변수를 사용하는 회귀 

 

우리는 길이 특성만 사용했었다.

 

이제는 높이, 두께 데이터를 사용해 본다. 이러면 산점도(그래프) 를 그릴 수 없다.

 

 

 

 

 

 

판다스로 데이터 준비 

판다스란? 파이썬 과학 라이브러리

 

핵심 객체는 데이터 프레임

 

데이터 프레임은 다차원 배열이다.

ex) 1열은 실수, 2열은 문자열 

 

마치 엑셀과 비슷하다.

 

열(col)에 특성이 있다.

 

행에 샘플이 있다.

 

read_csv는 첫번 째 행에 이름이 들어간다.

 

numpy배열로 바꿀 때는 to_numpy()를 호출하면 된다.

 

이제 perch_full은 열이 3개, 열이 42개 있는 numpy배열이 되었다.

 

 

 

 

다항 특성 만들기 

길이, 높이, 두께 특성 뿐만 아니라 제곱한것도 사용하고, 서로 곱해서 사용해본다.

 

수동으로 하지 않고 사이킷 런에서 한다.

 

PolynomialFeatures에서 자동으로 해준다.

degree=2가 기본값인데 제곱항을 만들어준다는 표시이다.

 

[2,3]의 가상의 샘플을 넣은 것이다.

 

transform()을 사용하면

2의 제곱,

3의제곱,

2*3 이 나오게 된다.

 

왜 1이 나오는가?

절편(+하는값)을 위해 가상의 특성 1을 추가하는 경우가 있다.

 

LinearRegression, KN- = 추정기(Estimator)

모델링을 해준다.

fit(훈련),predict(예측),score(결과)

 

PolynomialFeatures = 변환기(Transformer)

특성을 조정해준다.

fit, transform

여기서 fit은 훈련하지 않는다. 변환해주는 것이다.

 

fit, transform을 합쳐서 fit_transform()이란걸 만들었다.

사실 fit은 기능을 안할 때도 있다

 

 

 

 

 

LinearRegression 

절편을 위한 특성을 빼기 위해서 include_bias를 false로 지정했다. 기본값은 true이다.

 

transform()으로 훈련 세트를 변환해보자

train_poly라는 배열을 얻었다. 변화된 배열이다!

 

모양은 42개의 행이 있고 9개의 열이 있다.

 

9개의 열은 9개의 특성과 같다.

 

poly객체의 get_feature_names()를 해서 열의 특성을 알아보자.

 

x0 = 그래로

x1 = 높이 특성 그대로

x0 x1 = 0번 특성과 1번 특성의 곱

 

 

transform()으로 테스트 세트를 변환해보자

test_poly라는 배열을 얻었다. 변화된 배열이다!

 

새롭게 poly객체를 만들어서 사용해도 된다. 하지만 훈련세트에서 변환했던 변환을 테스트세트에도 적용하는 습관을 가져야 한다.

 

 

LinearRegression을 만들어서 훈련시키고

훈련세트에서 점수와 테스트 세트에서 점수를 확인한다.

 

 

 

 

 

 

더 많은 특성 만들기

degree값을 5로 늘려서 만들어 본다.

 

결과를 보면 특성이 55개나 된다.

 

훈련세트의 결과는 거의 완벽하다

 

테스트 세트에는 음수가 나왔다 최악이다.

어마어마하게 과대 적합이 된것이다.

 

과대적합을 줄일 수 있는 방법이 있다. 규제(정규화) 라고 한다.

 

가만보니 poly.fit(test_input)은 왜 안하는가?

테스트 세트는 자체적으로 fit메소드를 호출해서 따로 변환하지 않고 훈련 세트에서 학습한 객체로 사용한다.

훈련세트에서 fit한걸 가지고 transform을 사용한다.

 

 

 

 

규제 

가중치(기울기) 값을 줄여서 그래프를 완화하는것

 

릿지회귀라규회귀 2가지 방법이 있다 

 

 

 

 

 

규제 전에 표준화 

특성 스케일이 비슷해져야 한다.

특성에 곱해지는 기울기가 비슷해진다.

규제 전에 표준화를 해야한다.(=스케일이 같아야 한다.)

 

사이킷런의 preprocessing을 사용한다. 

 

훈련세트에 적용한 StrandardScaler 객체를 사용해서 테스트 세트도 변환해준다.

55개의 특성이 있는 것을 표준화 한다.

 

 

 

 

 

릿지 회귀 

가중치의 절대값을 제곱으로 준다.(L2 규제)

linear_model 에 Ridge클래스를 사용한다.

 

Ridge객체에 train_scaled(표준화한 것), train_target(맞춰야될 것)을 넣어준다.

 

훈련 세트와 테스트 세트의 점수가 꽤 좋아졌다.

특성이 55개로 많지만 가중치가 너무 커지는 것 (=훈련세트에 잘 맞는것)을 억지로 막아서 테스트 세트에서도 높은 점수가 나오게 한다.

 

가중치의 제곱을 벌칙으로 사용한다.

L2규제라고도 한다.

 

 

릿지에는 alpha매개변수가 있다 기본값은 1이고

크게하면 벌칙 강도가 쎄지고 낮추면 낮아진다.

 

 

알파는 우리가 값을 정해줘야 한다.

이러한 것을 하이퍼 파라매터 라고 한다.

 

알파 값을 우리가 찾는것을 하이퍼 파라매터 탐색 라고 한다.

 

 

가중치 제곱모델 파라미터 라고 한다.

 

 

 

 

 

적절한 규제 강도 찾기 

alpha를 리스트로 만들어 보고 for문을 돌려봐서 최적의 모델을 만들어 보는 것이다.

 

alpha값을 10의 배수로 두었다. 이것이 일반적이 관례이다.

 

그래프를 그리려고 하면 0.001, 0.01 ~ 100 의 값으로 나올 것이다. 이것을 log로 바꿔서 그려봐야 한다.

np.log10()메서드를 이용해서 그려본다.

 

위 그래프를 보면 -1값이 가장 값이 높은걸 알 수 있다.즉, 10^-1값이 가장 크다는걸 알 수 있다.

 

알파 값이 커지면 규제가 커지기 때문에 훈련세트, 테스트 세트점수가 줄어들었다 과소적합된 상태이다.

 

알파 값이 작아지면 규제가 없어지니 훈련세트에만 잘 맞는 결과가 나오니 과대적합된 상태이다.

 

 

라쏘 회귀 

가중치의 절대값을 벌칙으로 준다.(L1규제)

L1이 선형회귀에 적용되면 그것이 라쏘회귀가 된다.

 

라쏘도 alpha 매게변수가 있다. 

릿지에서 했던것처럼 똑같이 알파값을 찾아본다.

 

그래프를 보면 급격하게 떨어지는 구간이 있다.

10^1에서 두 세트의 결과값이 비슷해 진다.

 

 

일반적으로 L1(라쏘), 보다는 L2(릿지) 규제를 많이 쓴다.

 

 

선형회귀에서 특성 * 가중치(기울기) 가 공식인데 

 

라쏘는 가중치를 0으로 만들어 버릴 수 있다.

라쏘는 특성을 아예 안 쓸수 있다.

그러면 특성이 아무런 의미가 없어진다. 

 

 

coef에서 0인것만 찾으면 0인것은 true로 나오는데

numpy의 sum을 하면 1로 판단되기 때문에 true의 갯수를 출력할 수 있다.

 

 

 

 

 

 

 

728x90