yooonicode
머신러닝 + 딥러닝 - ch 1-3, 2-1, 2-2 본문
😺 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이니까 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 |