Notice
Recent Posts
Recent Comments
Link
«   2025/09   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Archives
Today
Total
관리 메뉴

yooonicode

머신러닝 + 딥러닝 - ch 3-1, 3-2, 3-3 본문

데이터분석

머신러닝 + 딥러닝 - ch 3-1, 3-2, 3-3

yooonii 2023. 10. 12. 20:08

ch 3-1 ; k-최근접 이웃 회귀 알고리즘

 

지도학습 알고리즘 - 분류 / 회귀

- k-최근접 이웃 분류 알고리즘 | 예측하려는 샘플에 가장 가까운 샘플 k개를 선택한 후, 샘플들의 클래스를 확인하여 다수 클래스를 새로운 샘플의 클래스로 예측하기

- k-최근접 이웃 회귀 알고리즘 | 분류와 같이, 예측하려는 샘플에 가까운 샘플 k개를 선택하고 이웃한 샘플의 타깃은 클래스가 아닌 수치가 되지만, 수치들의 평균을 구하면 예측 타깃값을 낼 수 있음

 

✨ 데이터 준비

✨ 산점도 그리기

✨ train_test_split을 통해서 훈련과 테스트 세트로 나누기

✔️ 만약 test_array.reshape(2,2)라면 오류가 발생하게 되는데, 원본 배열의 원소는 4개이기 때문

➡️ 2차원 배열로 변경한다

 

-1을 넣게되면 자동으로 맞춰줌

 

✨ 결정 계수(R^2)

- k-최근접 이웃 회귀 모델 임포트 하여 훈련시

- 점수 확인

✨ 분류는 "정확도"라고 불렀으나 이 점수를 회귀에서는 "결정계수"라고 부르며

계산은 이렇게함

- mean_absolute_error를 이용하여 타깃과 예측의 절댓값 오차를 평균하여 반환받기

- 만약 훈련세트를 넣어 정확도를 평가한다면?

✔️ 과대적합 : 훈련세트에서 좋았으나 테스트에서는 나쁜 경우

- 훈련 세트에만 잘 맞는 모델이라 테스트 세트, 나중의 적용에 대해서 잘 동작하지 않음

✔️ 과소적합 : 테스트 세트의 점수가 높거나 두 점수가 모두 낮은 경우

- 모델이 너무 단순하여 훈련세트에 적절하게 훈련되지 않은 경우, 훈련 세트가 전체를 대표한다고 가정하기 떄문에 훈련세트를 가장 잘 학습하는 것이 중요함

➡️ 확인 결과, 테스트 세트의 점수가 더 높으니 과소적합임을 확인하고, 모델을 더 복잡하게 만들기 위한 코드⬆️

 

- 복잡한 모델과 단순한 모델을 만들어 k-최근접 이웃 회귀 모델의 k 값을 1, 5, 10으로 바꾸며 훈련하기, 농어의 길이를 5에서 45까지 바꾸면서 그래프로 나타내

 


ch 3-2 ; 선형회귀

- k-최근접 이웃의 한계성?

 

- 데이터 준비

- 모델 준비, 데이터 나누기

최근접 이웃개수를 3으
길이가 50인 농어 무게 예측

1033g로 예측했는데, 실제 무게는 훨씬 많이 나가게 됨

- 길이가 커질 수록 농어의 무게가 증가하는 경향이 있으나, 50cm에서 가장 가까운 것은 45cm 근방이기 때문에 무게들을 평균하게 됨. 이웃 샘플 타깃을 구하면

- 농어가 많이 커져도 무게가 늘어나지 않는 문제가 발생함

- 가장 큰 농어가 포함되도록 훈련 세트를 다시 만들어야 하나, 다른 알고리즘을 사용해도 됨


✨ 선형 회귀

- 대표적인 회귀 알고리즘, 간단하고 성능이 뛰어나 처음 배우는 알고리즘 중 하나

- 사이킷런으로 구현할 수 있으며 LinearRegression클래스에도 fit(), score(), predict() 메서드가 있음

- 선형회귀로 구현한다면 1241g으로 예측하는데, 직선을 그려보고 알아보면

- 근데 그래프 아래가 뭔가 이상함

- 무게가 0g 이하로 내려갈 수 없음

 

✨ 다항 회귀

- 최적의 곡선을 찾는 방법

- 농어의 길이를 제곱해서, 원래 데이터의 앞 열에 붙인다면

- column_stack() 함수를 이용하여 두 배열을 나란히 붙이기

- 브로드 캐스팅이 적용되어 새롭게 만든 데이터 셋의 크기를 확인하면

- train_poly를 사용하여 다시 훈련하기, 타깃값은 그대로 사용하는 것이 중요힘

- 계수와 절편을 나타내면 위의 값을 출력하고,

➡️ 무게 = 1.01 * 길이^2 - 21.5 * 길이 + 116.05를 나타냄

➡️ 다항식, 다항식을 사용한 선형회귀를 다항 회귀

- 모델을 평가한다면, 아직 테스트 점수가 조금 더 높음, 과소적합


ch 3-3 ; 특성 공학과 규제

- 고차항을 손수 넣기에는 불편함

- 2개의 특성을 사용한다면 평면을 학습함

- 3개의 특성이면? 그릴 수 없게 되지만 여전히 학습은 가능함

 

➡️ 농어 길이, 높이, 두께를 함께 사용하고, 각각 제곱하여 추가한 후

각 특성을 서로 곱해 새로운 특성을 만드는 작업을 특성 공학이라고 함

 

- 판다스를 사용하여 다운로드 후, 데이터 프레임에 저장하기

- 넘파이 배열로 변환하여 훈련시키기

- perch_full과 perch_weight을 불러왔으면 훈련과 테스트 세트로 나누기

✨ 사이킷런 변환기

- 특성을 만들고 전처리 하는 클래스들을 변환기라고 부르는데,

- 변환기들은 모두 fit(), transform()을 제공함

- PolynominalFeatures 클래스를 임포트하고, 2와 3으로 이루어진 샘플을 이용해서 fit과 transform을 적용시켜봄

➡️ 기본적으로 각 특성을 제곱한 항을 추가하고, 특성끼리 곱한 항을 추가함

➡️ 4는 2*2, 6은 2*3, 9는 3*3, 1은?

 

1은.. 

선형방정식의 절편은 숫자 * 1의 형태라서 1을 추가해줌

근데 필요없으니까

제외해줌

- 이를 이용해서 학습시킨다면

배열의 크기를 확인해주고

polynominalfeatures 클래스를 활용하여 9개의 특성이 어떻게 만들어졌는지 확인,

get_feature_names_out()을 호출하여 9개의 특성이 어떤 입력의 조합으로 만들어졌는지 확인할 수 있음

 

✨ 다중 회귀 모델 훈련

- LinearRegression 클래스를 임포트 하고, train_poly를 사용하여 모델을 훈련시킨다

- 과소적합 문제는 나타나지 않음

- degree 매개변수를 사용하여 고차항의 최대 차수를 지정하고, 만든 특성의 개수가 55개임을 확인할 수 있음

(열의 개수가 특성의 개수를 말함)

- 이를 이용해 다시 훈련한다면 정확도가 0.99,

- 테스트 점수는 음수를 띄게됨. 특성의 개수를 늘리면 정확도가 높아지며 overfitting 발생함

 

✨ 규제

- 머신러닝 모델이 훈련 세트를 과도하게 학습하지 못하도록 방해하는 것

- 과대적합을 막는것, 선형 회귀의 경우 특성에 곱해지는 계수의 크기를 작게 만드는 것

- StandardScaler를 사용하여 규제를 적용하기 앞서 정규화 진행함

- 객체 ss를 초기화한 후 train_poly를 사용하여 훈련시킴

➡️ 표준 점수로 변환한 train_scaled, test_scaled를 준비함

✔️ 선형 회귀 모델에 규제를 추가한 모델을 Lidge, Lasso라고 부르는데, 규제를 가하는 방법이 다름

 

릿지 | L2 regularization

라쏘 | L1 regularization

➡️ 일반적으로 릿지를 선호하며, 두 알고리즘 모두 계수의 크기를 줄이지만 라쏘는 아예 0으로 만들기도 함

 

릿지 구현하기

- 릿지 객체를 만들고 학습시킨 후, train과 test set에 해당하는 결정계수를 출력해줌

✔️ 과소, 과대적합을 피할 수 있음

 

- 릿지와 라쏘를 사용할 때 규제의 양을 조절할 수 있는데, 모델 객체 생성시 alpha 매개변수를 이용하여 규제의 강도를 조절할 수 있음, alpha를 크게 하면 강도가 세지므로 계수값을 줄이고 과소적합하도록 유도, alpha를 줄이면 계수 줄이는 역할이 줄어들고 선형회귀와 유사해지므로 과대적합 될 가능성 커짐

➡️ 이를 위해서, alpha 값에 대한 R^2 그래프를 그릴 수 있는데, 훈련 세트와 테스트 세트의 점수가 가장 가까울 때 최적의 alpha값이 된다.

 

 ✨ 맷플롯립 임포트하여 alpha값이 변할때마다 score() 메서드의 결과를 저장할 리스트를 만들기

- alpha의 값을 0.001에서 100까지 10배씩 증가시키며 릿지 회귀 모델을 훈련한 후, 훈련 세트의 점수와 테스트 세트의 점수를 비워둔 리스트에 저장하는 작업

- 그래프 그리기, 열배씩 늘려서 왼쪽이 너무 촘촘해지므로 로그함수로 바꾸어 지수로 표현해줌

- 파란색은 훈련, 주황색은 테스트 세트 그래프이며 왼쪽으로 갈수록 점수차가 크고(과대적합) 오른쪽으로 갈수록 훈련, 테스트 세트의 점수가 모두 낮아지게 되는 전형적인 과소적합

 ➡️ 적절한 알파값은 두 그래프가 가까운 -1, 즉 0.1을 말하며 최종 모델을 훈련한다

라쏘 구현하기

- 좋은데 또 alpha값으로 규제의 강도 조절 가능, 

😺 Convergence Warning? 최적의 계수를 찾기 위해서 라쏘는 반복적 계산을 수행하는데, 지정한 반복 횟수가 모자랄 때 발생함 횟수를 늘리기 위해 10000으로 지정함. 딱히 큰 영향을 끼치지는 않음

- 왼쪽은 과대적합, 오른쪽일수록 훈련세트와 테스트의 점수가 가까워짐, 가장 오른쪽은 크게 점수가 떨어짐, 과소 적합되는 모델. 최적의 알파값은 1, 즉 10임을 알 수 있으므로 이를 바탕으로 다시 훈련하면

lasso.coef_는 라쏘 모델의 계수값을 확인할 수 있는데 0이 되는 lasso를 세보면 약 40개인 것을 알 수 있음

55개의 특성을 넣었으나 사용한 값은 40개밖에 되지 않음

➡️ 라쏘 모델은 유용한 특성을 찾아내는 지표로도 사용할 수 있음

'데이터분석' 카테고리의 다른 글

머신러닝, 딥러닝 - ch 5  (1) 2023.11.11
머신러닝, 딥러닝 - ch 4  (1) 2023.11.03
머신러닝 + 딥러닝 - ch 1-3, 2-1, 2-2  (1) 2023.10.06
python 데이터 분석 ch 7-1, 7-2  (0) 2023.09.30
python 데이터 분석 - ch 6  (0) 2023.09.22