[Microsoft AI School 6기] 1/24(27일차) 정리 - 분류 코딩, 군집 코딩
분류 코딩
로켓발사
- 목적: 로켓발사 성공여부 예측 모델 구현
데이터 준비하기
라이브러리 및 데이터 불러오기
데이터 탐색 및 전처리
자료형 변환
해수면 압력 데이터가 object로 되어 있음
하나의 데이터가 20:52 형식으로 되어 있음
rocket['Sea Level Pressure'] = pd.to_numeric(rocket['Sea Level Pressure'], errors='coerce')
에러가 나는 경우null로 하라는 의미
-> float로
daylength 또한 10:26 이렇게 되어 있으므로 계산하여 수치형으로 전환할 수 있게 한다
시간과 분을 분리하여 24시간 기준 소수점 변환
object 타입인 변수의 데이터 분포 확인
object는 주로 범주형
-> 범주형 데이터의 빈도 수 확인
- countplot 활용
- date에 따라 발사의 여부가 달라지지는 않을 것 같음
float 타입인 데이터의 분포 확인
데이터 전처리
사용하지 않을 칼럼 제거
불필요한 칼럼을 제거하면 위와 같다.
결측치 확인 및 처리
Crewed or Uncrewed --> 'Uncrewed'로 채우기
Launched? --> 'N'으로 채우기
object 타입 변수의 결측값 채우기
mode()는 dataframe으로 리턴 받음
iloc[0] 첫 행만 가져와서 시리즈 형태로 넣음
수치형 타입의 변수의 결측값 채우기
- 평균값으로 채움
결측값이 처리되었음을 확인할 수 있다
변수 관계 시각화
location 별로 발사 성공률을 살펴보면 위와 같다
전체 자료를 시각화 해보면 다음과 같다
수치형 변수 시각화는 다음과 같다
변수 선택
인코딩
- 범주형 변수는 반드시 인코딩 해주어야 함
종속 변수 인코딩
독립변수 레이블 인코딩
원핫인코딩 - pandas dummi
레이블인코딩은 sklearn에서 불러와야 함
레이블 인코딩(Label Encoding)은 범주형 데이터를 숫자형 데이터로 변환하는 방법 중 하나
-> 머신러닝 모델이 범주형 데이터를 처리할 수 있도록 하기 위해 필요
레이블 인코딩을 적용하면 각 고유한 범주 값이 정수로 매핑
칼럼 간의 순서가 없으면 원핫 인코딩 사용
원핫인코딩을 하면 칼럼수가 너무 많을 것 같을 경우 레이블인코딩 사용
-> 상황에 따라 판단하여 사용
레이블 인코딩 결과 확인
모델링
훈련세트/테스트세트 분할
모델 생성 및 훈련
평가
분류 모델의 평가지표
정확도가 1.0인 이상한 현상이 생겼다
ROC와 AUC
1일 확률 0일 확률을 보여주는 proba 함수
predict_proba
- 각 클래스에 대한 확률을 반환
- 출력 형식: array([[p_class0, p_class1], [p_class0, p_class1], ...])
- 예: array([[0.8, 0.2], [0.3, 0.7], [0.9, 0.1]])
- 첫 번째 샘플이 클래스 0일 확률이 80%, 클래스 1일 확률이 20%.
- 두 번째 샘플이 클래스 1일 확률이 70%
ROC와 몇 AUC 그래프에서는 확률 필요
모델의 학습 결과
모델의 학습 과정을 살펴보자
tree 구조 보기
비정상적인 ROC 곡선과 결과가 이상한 Tree 를 바탕으로
왜곡된 Temp at Launch Time과 Wind speed at Launch Time을 제거하고 다시 진행하려고 한다
변수 재선택 후 재학습(훈련/평가)
훈련 및 학습
훈련 세트에 비해 테스트 세트의 정확도가 너무 떨어지면 과적합
-> 과적합이 되어 있음을 알 수 있다
tree의 max depth 설정
tree의 깊이를 제한하고 다시 수행
시각화
중간의 혼돈 행렬
좌측 상단은 N, 우측 하단은 Y를 맞춘 것
분균형 데이터 처리
- 종속 변수의 비율을 오버 샘플링으로 맞추어 보자
pip install imblearn
평가 결과
정확도가 매우 낮아졌음을 알 수 있다
GridSearchCV로 최적의 depth 찾기
최종 모델
최종 모델을 살펴 보면 위와 같은데, 결론적으로 결과가 별로 좋지 않음을 알 수 있다.
-> 여전히 과적합이 발견된다
데이터 자체의 결측치가 너무 많아 데이터의 질이 너무 좋지 않았기 때문임을 알 수 있다.
군집화
- 비지도 학습, 유사성 기반
- K-means clustering 중심 기반 군집화
- DBSCAN(Density-Based Spatial Clustering of Application with Noise) 밀도 기반 군집화
k-means clustering
원형 클러스터를 구분하는 데 적합
작은 데이터셋에서 잘 작동
구현하기 쉽고, 다른 군집 알고리즘에 비해 계산 효율성이 높음
사전에 클러스터의 개수 k를 지정해야 함
특성의 스케일이 필요
평가방법
- 엘보우 방법(elbow method)
- 실루엣 그래프(silhouette plot
DBSCAN(Density-Based Spatial Clusering of Application with Noise)
데이터의 밀도가 높은 영역을 클러스터로 정의
주요 파라미터
- Epsilon(𝜺) : 입실론. 한 점을 중심으로 하는 반경의 크기.
- MinPts : 민포인트. 입실론 주변 영역 내에 포함되어야 할 최소 데이터 포인트 수(자신 포함).
포인트 분류
- Core Point : 𝜺 반경 내에 MinPts 이상의 포인트가 있는 점
- Border Point : Core Point는 아니지만 Core Point의 𝜺 반경 내에 있는 점
- Noise Point : Core Point도 Border Point도 아닌 점으로, 이상치로 간주함
장점
- 클러스터 개수를 사전에 지정할 필요가 없다.
- 불규칙한 모양의 클러스터도 찾아낸다.
- 이상치(Noise)를 효과적으로 식별한다.
한계
- 밀도가 다양한(밀도가 오밀조밀한 클러스터와 듬성듬성한 클러스터가 함께 존재하는 경우) 클러스터를 처리하기 어려 울 수 있다.
- 고차원 데이터에서는 성능이 저하될 수 있다.
- 𝜀과 MinPts 파라미터 선택에 결과에 큰 영향을 미친다.
실습
샘플 데이터 만들기
cluster_std=0.8:
클러스터의 표준편차(데이터 흩어짐 정도)를 설정
값이 작으면 클러스터가 서로 더 밀집되고, 값이 크면 클러스터가 더 퍼지게 됨
이를 시각화해보면 다음과 같다
KMeans 디폴트 클러스터는 8개
데이터 features로 저장
군집화
군집화는 정답이 없음
-> train test를 나누지 않음
모델링
데이터 프레임에 군집화 결과인 kmeans_cluster 칼럼 추가
클러스터 중심 확인
군집 시각화 및 중심 시각화
클러스터 수 찾기
elbow 기법
클러스터 개수를 늘려가면서 이너셔의 변화를 관찰하여 최적의 클러스터 개수를 찾는 방법
inertia_: 각 데이터 포인트와 그 데이터가 속한 군집의 중심점 사이의 거리 제곱합
각 군집별 inertia를 파악
이너셔(inertia)
클러스터 중심과 클러스터에 속한 샘플 사이의 거리 제곱 합 → 클러스터의 샘플이 얼마나 가깝게 있는지를 나타내는 값
일반적으로 클러스터 개수가 늘어나면 클러스터 개개의 크기는 줄어들기 때문에 이너셔도 줄어듦
이너셔가 감소하는 속도가 꺾이는 지점을 지나면, 클러스터 개수를 늘려도 클러스터에 밀집된 정도가 개선되지 않음
이를 시각화해보면 다음과 같다
이를 통해 꺽이는 지점인 3으로 클러스터링하는 것이 가장 좋은 것을 알 수 있다.
실루엣 분석
군집에 대한 평가를 하는 것(Silhouette analysis)
- 각 군집들이 얼마나 효율적으로 분리되어 있는지 분석
- 다른 군집과의 거리는 떨어져 있고 동일 군집끼리의 데이터는 서로 가깝게 잘 뭉쳐 있는가?
- 실루엣 분석은 실루엣 계수를 기반으로 함
실루엣 계수(Silhouette coefficient)
- 군집화의 품질을 평가하는 지표.
- 각 개별 데이터 포인트가 자신의 군집에 얼마나 잘 속해 있는지, 다른 군집과는 얼마나 잘 분리되어 있는지 측정한다.
-1에서 1 사이의 값을 가지며, 1에 가까울수록 군집화가 잘 되었다고 해석할 수 있다.
- 1에 가까워질수록 근처의 군집과 더 멀리 떨어져 있다는 의미이다.
- 0에 가까워질수록 가까운 군집과 가까워진다는 의미이다.
- -값은 아예 다른 군집에 데이터포인트가 할당되었음을 뜻한다.
실루엣 계수가 클수록 군집에 잘 속해 있음을 알 수 있다
다른 군집에 클러스터가 할당된 데이터가 있는 지 확인
실루엣 계수가 음수이면 다른 군집에 속해 있음
여기에는 다른 군집에 해당된 것이 없음을 알 수 있다
평균 실루엣 계수
전체 실루엣 계수 평균
-> 숫자가 높을수록 군집화가 잘되었다고 평가할 수 있음
실루엣 시각화
- 사용자 정의 모듈 silhouette_analysis.py 이용
(김자영 강사님 제공)
- 전체 실루엣 계수의 평균값이 1에 가까울수록 좋음
- 개별 군집의 평균값의 편차가 크지 않은 것이 좋음
- 각 군집 별 실루엣 계수 평균값이 전체 실루엣 계수 평균값과 크게 벗어나지 않아야 좋음
DBSCAN
데이터 준비
데이터 시각화
kmeans로 할 경우
-> 큰원, 작은 원으로 군집화 하기 위해 BSCAN 사용
DBSCAN 객체 생성
모델 학습 결과
데이터 프레임에 추가
dbscan 시각화
dbscan으로 시각화 해보면 위와 같이 나온다
프로야구 타자 군집화
데이터 전처리
연도 별로 되어 있는 데이터를 병합하고 관찰하면 다음과 같다
변수 선택
데이터 분포 확인
데이터 스케일링
최적의 K 찾기
inertia 이용
3과 4중 무엇을 택할지 잘 모르겠으므로 둘 다 시행하여 확인한다
군집화
k=3
실루엣 점수 및 시각화
k=
실루엣 점수 및 시각화
실루엣 점수가 낮더라도 잘못 군집화된 자료가 k=4가 적기 때문에 k=4를 선택하여 하기로 하였다
군집화 결과 분석
군집의 데이터 특징 분석
군집화 후 활용을 위해 특성 파악
-> 후에 label 부여 가능
pairplot으로 그려보면 다음과 같다
실루엣
개별 데이터 실루엣 계수 칼럼 추가
잘못 군집화된 클러스터
클러스터별 중심 구하기
주성분 분석(PCA)
- 전체 주성분 계산
- 누적 분산 비율로 중요도 확인
- 주요 성분만 선택하여 차원 축소
고차원 -> 저차원
PCA()
디폴트는 모든 칼럼에 대해 실행
분산 비율
누적 분산 비율을 기준으로 잡아 차원 축소 가능
-> 2개의 주성분으로 차원 축소
주성분으로 군집화
성분 수를 줄였음에도 큰 차이가 없음을 알 수 있다
-> 데이터의 특성을 거의 그대로 가져가면서 차원 수를 줄이기 때문에 차원이 많은 경우 사용하기 좋다
군집화 형태를 보면 다음과 같다
PCA를 유무에 따른 군집 결과 비교
오늘의 간단한 후기
기본 개념들이 쉽지 않고 양이 많아 힘들었다. 그래도 역시 코드로 이해하니 내부구조를 볼 수 있어 구성을 살펴보는 데에 용이 했다. 노코딩이 많이 등장하는 추세이지만 결국 코딩이 들어갈 수 밖에 없으므로 이해를 잘 할 필요가 있는 것 같다
출처
-If any problem for references, or any questions please contact me by comments.
-This content is only for recording my studies and personal profiles
일부 출처는 사진 내에 표기되어 있습니다
본문의 내용은 학습과 개인 profile 이외의 다른 목적이 없습니다
출처 관련 문제 있을 시 말씀 부탁드립니다
상업적인 용도로 사용하는 것을 금합니다
본문의 내용을 Elixirr 강의자료 내용(김자영)을 기반으로 제작되었습니다
깃허브 소스코드의 내용을 담고 있습니다
본문의 내용은 MS AI School 6기의 강의 자료 및 수업 내용을 담고 있습니다