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 1-3, 2-1, 2-2 본문

데이터분석

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

yooonii 2023. 10. 6. 15:19

😺 1-1, 1-2 ; 코랩 사용법, 머신러닝의 역사, 사이킷런, 파이토치 등의 설명

 

📖 1-3 마켓과 머신러닝

👻 생선 분류 문제(도미)

- 캐글에 공유된 데이터 셋, fish-market을 이용함

- 머신러닝은 기준을 스스로 찾아내고, 이 기준을 이용하여 생선이 도미인지 아닌지를 판별해냄

(왜도미지)

 

- 도미와 빙어를 분류하는 binary classification(이진 분류) 진행, bream and smelt

- 길이와 무게를 특성이라고 부르며, 특성은 데이터의 특징을 말함

- 길이를 x축, 무게를 y축으로 하는 산점도 그래프를 그려줌 - scatter 사용

✔️ 과학 계산용 그래프를 그리는 대표적 패키지는 맷플롯립

✔️ 임포트 ; 따로 만들어둔 파이썬 패키지를 사용하기 위해 불러오는 명령

- 생선의 길이가 길수록 무게가 많이 나감, 선형적인 그래프 출력

- 빙어는 크기도 작고 무게도 가벼움,  scatter 함수 연달아 두번 사용해줌

👻 도미와 비슷하게 선형적 구조를 띄지만, 증가폭이 다름

- 즉, 빙어는 무게가 길이에 영향을 덜받음

 

😺 K-최근접 이웃 알고리즘

- 도미와 빙어를 하나의 데이터로 합쳐 하나의 리스트로 만들어줌

- 사이킷런을 사용할 것이므로, 세로방향으로 늘어뜨린 2차원 리스트를 만들어주어야 함

길이 무게
길이길이 무게무게키로
길이길이 무게무게키로

⬆️ 이런 식으로,,

sol1) 파이썬의 zip() 함수, list comprehension 구문 사용하기

zip()은 나열된 리스트의 각각에서 하나씩 원소를 꺼내서 반환함

잘되엇죵?

타겟데이터를 만드는 작업도 필요함

1이 도미, 0이 빙어로 세팅함

- 곱셈연산자 사용하여 빠르게 채워줌

임포트하여 객체로 만들어줌

- fit() 메서드를 활용하여 학습데이터, 타겟데이터 전부 집어넣어서 model training.

- 얼마나 잘되었는지 평가시키는 메서드 score() 이용하여 0~1사이의 값 반환해줌

정확히 분류했으므로 정확도 100%


😺 최근접 이웃 알고리즘의 세부적 이해

클러스터링의 일종인가

- 만약에 그래프에 알 수 없는 임의의 세모를 찍어서 뭔지 예측하려면

아마 근처가 도미들이니까 도미라고 판단하겠음

학습시킨 모델도 그런지 확인하려고

predict() 메서드 사용하여 예측하게 해봄

- 가장 가까운 직선거리에 어떤 데이터가 있는지를 살피면 됨

- 단점 : 데이터가 아주 많은 경우 사용하기 어려움, 데이터 크기 때문에 메모리 많이 필요하고 직선거리 계산도 오래걸림

fit_X 속성에는 fish_data 들어있고, _y 속성에는 fish_target 가지고 있음을 확인할 수 있음

➡️ k-최근접 알고리즘은 훈련되는 게 없음.. 전달한 데이터를 기존 데이터 바탕으로 분석하는 일만 할 뿐임

 

✔️ 그렇다면 가까운 몇 개의 데이터를 참고하는가?

➡️ 클래스의 기본값은 5인데, n_neighbors 매개변수를 이용하여 세팅해줄 수 있음

애초에 49개로 잡아버리면 도미가 35개로 대다수를 차지하므로 어떤 것을 넣어도 도미가 될 것임

도미만 올바르게 맞히기 때문에 score()와 35/49가 같은 값임을 확인할 수 있음

SciKit-Learn의 KNeighborsClassifier 매개변수 더 알아보기
n_neighbors : 이웃의 개수 지정, 기본값 5
+ p 매개변수로 거리를 재는 방법을 지정 가능 1: 맨해튼 거리, 2: 유클리디안 거리(기본값)

n_jobs : 사용할 CPU 코어 지정 가능, -1로 설정하면 모든 CPU 코어를 사용하며 이웃간의 거리 계산 속도를 높일 수 있으나 fit 메서드에는 영향을 주지 않음

😺 정확도가 1 아래로 내려가기 시작하는 n의 값을 찾는 코드


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

머신러닝 알고리즘 : 지도학습 or 비지도학습

지도학습 비지도학습
- 데이터와 정답을 입력과 타깃이라 부르며, 입력+타깃을 훈련데이터라고 부름
- 입력으로 사용된 길이와 무게를 특성이라고 함
✔️ 타깃이 있으니 알고리즘이 정답을 맞히는 것을 학습함
ex) k-최근접 이웃 알고리즘
- 정답을 사용하지 않으므로 맞힐 수가 없고
대신 데이터 파악이나 변형에 도움을 준다

알고리즘의 성능을 제대로 평가하려면 훈련 데이터와 평가에 사용할 데이터가 각각 달라야함

- 평가를 위한 다른 데이터의 준비 혹은 이미 준비된 데이터 중 일부를 떼어 사용하는 것

- 테스트 세트 / 훈련 세트로 나눔

리스트 만들기
제대뢰 되어있는지를 확인, 하나하나씩을 샘플이라고 부름

처음 35개를 훈련으로, 나머지 14개를 테스트로 사용할 것임

- KNeighborsClassifier를 임포트 하여 모델 객체 만들기

- 인덱스 지정하기(슬라이싱도 해보기) ⭐ 마지막 원소 전까지 되는 것을 유의할 것

- 슬라이싱해서, score()를 이용하여 평가해줌 0%

 

✔️ 뭘잘못했냐면 샘플링편향

- 테스트 세트에 빙어만 들어가있음

- 섞어놔야함: 이걸 가능하게 하는 것이 넘파이

파이썬 리스트를 넘파이 배열로 바꿔주어 array()에 리스트 전달, input_arr 출력해보기

49개의 행과 2개의 열 - 49개의 샘플과 2개의 특성인지 확인해주기

⭐ 생선 데이터 배열에서, 랜덤하게 샘플을 선택하기

- 단, input_arr와 target_arr에서 같은 위치는 함께 선택되어야 함

➡️ 아예 인덱스를 섞은 후에, 샘플을 선택하여 훈련 세트를 나누기

 

arange()를 이용하여 1씩 증가하는 인덱스를 만든 후에, 랜덤하게 섞어줌

✔️ 넘파이는 슬라이싱 외에 배열 인덱싱을 제공하는데, 1개의 인덱스가 아닌 여러개의 인덱스로 한 번에 여러 개의 원소를 선택할 수 있음

인덱스 첫번째 13이였는데 이를 확인해봄

인덱스 첫번째값 13이니까 train_input의 첫번째 원소는 input_arr의 14번째 원소 들어있을것(0부터니까)

그리고 테스트 세트까지 만들어줌

파란색이 훈련이고, 주황색이 테스트세트임, 잘 섞여있는지 확인


모델평가굿


📖 2-2 데이터 전처리

- concatenate를 이용하여 첫번째 차원에 따라서 배열을 연결해줌 - 튜플로 전달해야함

- 사이킷런으로 트레인, 테스트 세트 나누는 함수를 사용하여 나눠주었음

총 4개의 배열이 반환되므로 하나씩 저장해줌

 

테스트세트중에 10개가 도미, 3개가 빙어이므로 샘플링 편향이 조금 나타남, 무작위로 데이터를 나누었을 때에 샘플이 골고루 섞이지 않을 수 있는데, stratify 매개변수에 타깃 데이터를 전달하면 클래스 비율에 마주처서 데이터를 나눌 수 있음


- k- 최근접 이웃 훈련

왜 빙어에 가깝다고 판단하였는가...?

주변 중에 다수인 클래스를 사용하기 때문에, 이웃 샘플을 따로 구분하여 그려보고

train_input, train_target으로 가까운 점들을 확인해준 이후에,

distances를 이용하여 이웃 샘플들까지의 거리를 출력해줌

92랑 130인게 말이 안됨.... 세모 바로 왼쪽 마름모까지가 130, 가까운게 92인데 비율이 좀 이상함

y축으로 조금만 멀어져도 거리가 큰 값으로 계산되어 오른쪽 위의 도미 샘플이 이웃으로 되지 않았음

- X축 범위를 고쳤더니 산점도가 일직선으로 됨, 생선의 무게만 고려 대상이 되었음

- 두 특성이 놓인 범위가 매우 다름 = 특성간의 스케일이 다르다

- 이걸 맞춰주는 작업을 데이터 전처리(특성값을 일정한 기준으로 맞추기)

 

표준점수 ; 널리 사용하는 전처리 방법(z 점수)

- 각 특성값이 평균에서 표준편차의 몇 배만큼 떨어져 있는지를 확인함, 이를 통하여 실제 특성값과 관계 없이 동일한 조건으로 비교할 수 있음

axis = 0으로 지정한 이유는 각 특성별로 계산해야하기 때문임

출력해주고

train_scaled를 통해서 표준 점수로 변환하였음(원본에서 평균 뺴고 표준편차로 나누기)

 

➡️ 넘파이에서는 모든 행에서 mean에 있는 두 평균값을 뺴주고,  std에 저장된 표준편차를 모든 행에 적용하여 나눔

이러한 기능을 브로드캐스팅이라고 함

 

다시 학습시켜줫

이제 도미로 예측합니다

완벽함.

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

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