Pudding

말랑말랑말랑 곰도리 푸딩 한 입에 먹기 챌린지

Machine Learning

[혼공머신] 1주차_훈련, 테스트 셋 / 데이터 전처리

sse 2025. 1. 7. 01:17

머신러닝 책을 검색하다가 우연히 혼공학습단을 알게 되었다.

그리고 당장 신청함!!

이유 : 나는 진짜 유명한 작심삼일의 의인화임

 

사실 처음 알게 되어서

신청하면서 안될 수도 있겠다고 생각했다

하지만 내가 해냄

 

열심히!!

보다는

그저 내가 끝까지.. 남아있길... 간절히 바라고 있다.


1주차 : Ch.01 ~ Ch.02

1-1 인공지능과 머신러닝, 딥러닝

가장 처음 소단원에는 인공지능의 역사에 대한 내용이 담겨있었다.

불과 저번학기에 수강했던 내용이라 기억이 새록새록 떠오르는 느낌..

(PTSD일지도..)

 

인공일반지능/강인공지능은 처음 알게 되었는데,

사람과 구분하기 어려울 정도로 지능이 높은 친구들이라고 한다.

 

반면 아직 현실에서 볼 수 있는 친구들은 대부분 약인공지능으로,

특정 분야에 한해서만 전문가이거나, 보조 역할만 가능하다.

 

강인공지능은 현재 기술력을 생각했을 때

아직 다다르긴 힘들겠다는 결론을 쉽게 도출할 수 있다.

더해서 아직 도덕, 법에 대해서도 마땅히 정리되지 않았기 때문에...

 

머신러닝은 규칙을 직접 프로그래밍하지 않아도

스스로 규칙을 학습하는 알고리즘으로,

대표적인 라이브러리는 사이킷런이다.

 

딥러닝은 인공 신경망을 기반으로 한 방법들을 통칭하여 부르는 것이라고 한다.

대표적인 라이브러리는 텐서플로와 파이토치로,

텐서플로는 구글, 파이토치는 Meta(전 페이스북.)에서 만든 것으로 유명하다.

 

저번 학기에 수강했던 내용을 떠올려보면,

AI > ML > RL(Representation Learning) > DL

으로 포함관계가 이루어지고,

AI but not ML 영역에는 규칙기반 시스템(Rule-Based System)

ML but not RL 영역에는 Classical ML이 있다.

 

규칙기반 시스템은 사람이 직접 데이터에서 특징을 선정하여 프로그래밍을 한다.

반면 클래식 머신러닝은 사람이 특징은 선정하지만,

이후 맵핑하고 기준을 세워 출력하는 과정은 모두 스스로 한다는 점에서 차이점이 있다.

딥러닝 같은 경우는 특징 추출부터 모든 과정을 컴퓨터가 스스로 진행한다.


1-2 코랩과 주피터 노트북

이번 소단원에는 코랩의 사용방법이 자세히 나와있다.

나는 이미 데이터분석을 공부하며 사용해 본 적이 있어

새로 알게된 내용은 따로 없었다.

 

다만, 주피터 노트북을 사용하는 것은 정말 비추x500

실제로 주변 친구들이 주피터 노트북을 설치하는 데 애를 많이 먹었다..

심지어 데스크톱도 아닌 노트북에 설치하다보니

파일도 크고 실행도 제대로 안됐다.

(노트북 살려)

 

코랩은 구글 클라우드를 사용하다보니

설치도 안해도 되고 너무 편함~~

 

참고로 코랩에서 런타임 유형을 설정할 수 있는데,

T4 GPU로 설정하면 속도가 빠르다고 한다.

사실 난 공부하며 간단한 코드만 실행시키다 보니

큰 차이는 아직 못느낌(...)

어쨋든 꿀팁이니 무료나눔합니다.


1-3 마켓과 머신러닝

이번 소단원에는 k-최근접 이웃(KNN)모델을 사용해서

이진분류하는 머신러닝 모델을 훈련하는 과정이 있다!

 

먼저 도미 데이터를 가져와서 산점도 그래프까지 출력했다.

matplotlib를 분명 데이터분석 스터디 할 때 공부했는데

가물가물한 건 도대체 왜째서일까...ㅎ

 

이어서 빙어 데이터를 가져온 후

도미 데이터와 함께 산점도로 나타냈다.

 

사실 같은 figure에 그려질 줄 알고 도미 데이터 코드 한 줄을 뺐더니

빙어 데이터만 나와서 좀 당황했다.

찾아보니 plt.scatter를 호출했을 때 새 figure가 생성된다고 한다..

 

다음으로는!

두 리스트를 각각 합치고

짝을 맞추어 하나의 리스트로 만드는 과정이다.

 

다음은 fish_target.

이진분류라서 특정한 값이라기 보다는

도미이면 1, 빙어면 0으로 표시(분류)만 되어있는 리스트다.

(출력값은 한 줄로 나오는 바람에 너무 길어서 뺐다.)

 

이 코드들이 새로 배운 내용이다.

첫 번째 셀은 모델 지정

두 번째 셀은 모델 학습

세 번째 셀은 정확도 평가다.

✅fit()  #훈련
✅score()  #정확도 평가

 

모델으로는 K-NN(k-최근접 이웃)을 사용했다.

K-NN은 어떤 데이터라도 유사성을 측정할 수 있다는 장점이 있지만

적절한 k값을 선택해야 한다는 단점이 있는 모델이다.

파라미터도 지정할 수 있는게 있는 것 같았는데

이진분류이기 때문에 그냥 기본값으로 진행한 것 같다.

 

여기서 정확도가 1이 나온 이유는..

당연함.

학습시킨 똑같은 데이터로 테스트함.

문제랑 답 미리 알려주고 시험 본거랑 다를 게 없다는 뜻이다..

 

하지만 여기서 새로운 데이터를 넣었을 때..

1 = 도미 이므로

정답을 맞추는 것을 볼 수 있다.

 

✅predict()  #새로운 데이터의 정답 예측

 

k-최근접 이웃 알고리즘은 훈련되는 것은 딱히 없고

단지 데이터를 모두 가진 채로

새로운 데이터가 들어왔을 때 가까운 데이터를 찾는 것 뿐이라고 한다.

하지만 이 때문에 데이터 수가 너무 많을 때 너무 큰 메모리를 필요로 한다는 단점이 있다.

 

kn._fit_X 와 kn._y 를 출력했을 때 가지고 있는 데이터가 나오는 것을 확인할 수 있다.

 

또한 KNeighborClassifier는 파라미터로 k값을 설정할 수 있다.

✅n_neighbors=k  # k값 지정 파라미터 (기본값 = 5)

2-1 훈련 세트와 테스트 세트

머신러닝은 지도 학습비지도 학습, 강화 학습 등으로 나눌 수 있다!

✅지도학습 : 입력 데이터와 그에 대응하는 답을 사용하여 학습시킴
✅비지도 학습 : 입력 데이터만 제공하여 패턴이나 특징을 학습

 

지도학습에는 데이터에 해당하는 입력과, 답에 해당하는 타깃이 포함된

훈련 데이터가 필요하다.

 

보통 훈련 데이터를 테스트 세트훈련 세트로 나누어 사용하는데,

말 그대로 훈련 세트로 훈련을 시킨 후 테스트 세트로 정확도를 평가한다.

 

먼저 데이터를 불러와서

데이터 리스트와 타겟 리스트를 만든 후,

모델을 k-최근접 이웃으로 설정하는 과정까지는 동일하다.

 

그리고 책을 따라 35개를 훈련, 14개를 테스트 세트로 나누어서 학습을 시키면..

정확도가 0이 나온다.

 

당연함.

훈련 세트에는 도미만 있고
테스트 세트에는 빙어만 있음· · ·

 

이런 상황을 샘플링 편향이라고 한다네요..

그래서 넘파이를 활용해서 데이터를 섞어 셋을 구성했고,

오른쪽 산점도 그래프를 보면 잘 섞인 것을 확인할 수 있다.

 

이후 섞인 데이터로 훈련을 시키고 테스트해보았을 때

정확도가 1이 나온다.

테스트 셋의 입력 데이터를 활용한 예측 값과 테스트 셋의 답을 비교해도 확인할 수 있다.


2-2 데이터 전처리

✅column_stack()  # 리스트를 일렬로 세워 나란히 연결

책에서 데이터 전처리를 하며 사용한 코드인데..

완.전. 초.면. 이라 당황함

행렬으로 생각했을 때...

transpose 해서 열 방향으로 concatenate 하는 함수인 것 같다.

 

이번에는 넘파이를 활용해서 데이터를 정리하고,

사이킷런을 사용해서 학습, 테스트 셋을 나누었다.

✅random_state=n  # 랜덤 시드 설정하는 파라미터

 

여기서 파라미터 stratify에 타겟 데이터를 설정하면

비율에 맞게 데이터를 나누어 주기 때문에 샘플링 편향을 방지할 수 있다!

✅stratify=(target data)  # 비율에 맞게 데이터를 분배해주는 파라미터

 

이어서 학습을 시키면 테스트 정확도가 1이 나온다.

하지만 이상하게 도미의 데이터로 예측을 시켰을 때 빙어로 분류하는 문제가 생기게 된다....

 

최근접 이웃 5개를 보았을 때 빙어4개, 도미1개이기 때문에

빙어로 판단이 된 것이다...

 

이를 고치려면 일정한 기준으로 맞추어 주어야 한다.

그 작업이 바로 "데이터 전처리"!!!

 

이번에 사용한 전처리 방법은 표준점수이다.

✅표준점수 : (값 - 평균) / 표준편차

 

표준점수를 이용해서 변환한 결과이다.

x축과 y축 값이 일정해졌다.

⚠️여기서 predict 값도 표준 점수로 변환하는 것을 잊으면 안된다!

그리고 훈련을 시키면 정확도도 1이 나오고

이전의 데이터도 도미로 잘 예측하는 것을 볼 수 있다!

산점도로 보아도 최근접 이웃으로 도미 데이터 5개가 잡힌 것을 확인할 수 있다.


추가 과제 : 2-1 확인문제

1. 머신러닝 알고리즘의 한 종류로서 샘플의 입력과 타깃(정답)을 알고 있을 때 사용할 수 있는 학습 방법은 무엇인가요?

답은 (1) 지도학습이겠죠?!

입력 / 타깃이 모두 필요하면 지도학습,

입력으로 학습시켜 규칙을 찾을 때에는 비지도 학습!

2. 훈련 세트와 테스트 세트가 잘못 만들어져 전체 데이터를 대표하지 못하는 현상을 무엇이라고 부르나요?

답은 (4) 샘플링 편향!!

2-1 부분에서 샘플링 편향이 있었죠ㅜㅜ

도미 데이터로 훈련시키고 평가는 빙어 데이터로 하는..

정확도가 0인 전설의 모델.......

3. 사이킷런은 입력 데이터(배열)가 어떻게 구성되어 있을 것으로 기대하나요?

답은 (2) 행 : 샘플, 열 : 특성 !

입력 데이터를 만들때 특성들을 짝지어 만들기 때문에 열으로 보면 특성으로 구성이 된다.

행을 기준으로 보면, 각 행마다 짝지어진 데이터들이 있는데, 이 하나의 행을 샘플이라고 한다!


말이 너무 많아서 내용이 너무 긴가 싶지만..

시행착오나 직접 해 본 과정이 있는걸 좋아해서 어쩔 수 없다.

인공지능 전공생이지만서도 훈련셋 테스트셋 나누는 것만 봐도 되게 전문적이라고 생각햇는데..

해보니까 별거없네 ㅋ

열심히 해보자아아아아아