Clustering
1. Clustering ( 클러스터링 : 군집화)
✅ R (Recency), F (Frequemcy), M (MonetaryValue)
2. 로그함수
✅로그(log)는 지수 함수의 역함수
✅어떤 수를 표현하기 위해 고정된 밑을 몇 번 곱하여야 하는지를 나타냄
# rfm_cluster log 변환
rfm_cluster_log = np.log(rfm_cluster + 1)
rfm_cluster_log.head(2)
💡 log 를 취할 때 왜 1을 더하고 로그를 적용할까 ?
=> x 값이 1보다 작을 때 마이너스 무한대로 수렴을 하기 때문에 가장 작은 값인 1 더하기
💡 np.log1p(x) = np.log(1+x) ▼
💡
💡음수에 로그를 적용하려면 ?
✅ Min-max scaling:
=> 데이터의 최소값을 0으로, 최대값을 1로 변환
=> 변환된 값을 다시 로그를 적용
✅ 절댓값으로 변환 후 로그 적용
=>절댓값으로 변환한 뒤 로그를 적용
=> 데이터의 분포가 한쪽으로 치우쳐져 있을 때 효과적
❗ 음수 값의 크기가 크게 작용하는 경우, 로그 변환 후 값의 차이가 크게 줄어듦
=> 원래 데이터의 특성이 완전히 바뀔 수 있음
✅ 적절한 상수 더한 후 로그 적용
=> 음수 값은 로그를 적용 X , 0 이상의 값은 가능
=> 따라서 음수 값에 상수를 더해준 후 로그를 적용
=> 상수는 1보다 크면서 음수 값의 절댓값보다 큰 값을 사용
❗ 이 방법은 음수 값이 상대적으로 작을 때 효과적
✅ Box-Cox 변환
=> Box-Cox 변환은 데이터를 정규분포에 가깝게 만들기 위해 사용하는 방법
=> 양수와 음수 모두에 대해 적용
=> 데이터가 양수이거나 0일 때 적용 가능하며, 데이터가 음수인 경우에는 일반적으로 다른 방법을 사용
❗ Box-Cox 변환은 파이썬의 scipy.stats 모듈의 boxcox 함수를 사용하여 구현할 수 있습니다.
✅ Yeo-Johnson 변환
=> Yeo-Johnson 변환은 Box-Cox 변환과 비슷한 방법으로 음수 값을 처리
❗ Box-Cox 변환에서는 음수 값을 처리하지 못하는데 비해 Yeo-Johnson 변환은 모든 값을 처리
3. Feature Scaling (스케일 조정)
✅ 머신 러닝 모델에서 사용되는 특성(feature) 데이터의 스케일(scale)을 조정하는 과정
✅ 일반적으로 특성들은 서로 다른 단위나 크기를 가짐
=> 이러한 특성들을 비교하거나 모델에 적용 전, 스케일을 조정하는 것이 중요
스케일 종류 | 특징 |
StandardScaler (=Z-score Scaling) |
평균을 빼고 표준편차(std)로 나눠줌 이름을 표준편차로 외우면 좋음 평균 0, 표준편차 1 |
MinMaxScale | 최솟값을 0, 최댓값을 1 X_scaled = (X - X.min) / (X.max - X.min) |
RobustScaler | 중간값 0 X_scaled = (X - X.median) / IQR |
스케일 조정은 모든 알고리즘에 적용한다고 성능 개선 X | |
회귀, KNN, K-means 등의 거리기반 알고리즘에 사용하면 좀 더 나은 성능 |
+ Z-score Scaling ▼
위 과정을 요약 ❗
1) 고객ID 기준 RFM 데이터셋 로드
2) RFM 값만 따로 분리
3) 로그를 적용해서 정규화(정규분포 형태로 변환)
4) StandardScaler 를 통해 평균이 0, 표준편차가 1이 되게 변환
용어 풀이
✅ ScikitLearn API 사용법
📝 fit() : 학습( StandardScaler 라면 주어진 데이터의 평균, 표준편차 등을 학습)
📝 transform() : 비지도학습에서 변환
📝 fit_transform() : 학습과 변환을 한번에 합니다.
📝 predict() : 지도학습의 분류, 회귀 등의 예측
✅ Kmeans
📝 데이터를 클러스터링하는 머신러닝 알고리즘 중 하나
📝 데이터를 n개의 클러스터(군집)로 군집화하는 방법을 찾는 것이 목표
+ K-Means 추가 설명
✅머신러닝 > 비지도학습 > 군집화 > K-means(알고리즘)
K-means : 군집분석
✅ 주어진 샘플 데이터를 k개의 cluster로 묶는 iterative 한 알고리즘
📝 각 클러스터 내 유사도는 높이고, 클러스터 외 유사도는 낮추는 것을 가정한다.
📝거리를 측정해서 해당 군집에 속하는지를 판단. 군집 간 거리 차이의 분산을 최대화
✅그룹을 나누는 과정
📝 거리 기반의 그룹간 비유사도 (dissimilarity) 와 같은 비용 함수 (cost function) 을 최소화하는 방식
=> 이 과정에서 같은 그룹 내 데이터 오브젝트 끼리의 유사도 ▲ 다른 그룹에 있는 데이터 오브젝트와의 유사도▼
✅특정 알고리즘(특히 회귀, 군집화) 한쪽에 치우친 데이터의 경우 잘 학습하지 못함
=> cut을 사용하여 데이터를 구간화
=> 혹은 log를 사용하여 정규분포로 만들어줌
✅ 지도학습과 비지도학습
📊 지도학습 / 비지도학습
범주형 | 수치형 | |
지도학습 정답 (Label) 있는 데이터를 학습 |
분류 범주형 데이터를 각 class별로 나누는 것 |
회귀 하나의 가설에 미치는 다양한 수치형 변수들과의 인과성 분석 |
비지도학습 정답 (Label) 없는 데이터를 학습 |
군집화 유사도가 높은 범주끼리 모아주는 것 분류와 다르게 정답 X |
차원축소 고차원 데이터의 차원을 축소 분석할 특성을 줄이고 한눈에 볼 수 있음 |
강화학습 | 당근과 채찍을 번갈아 사용하면서 모델이 스스로 정답을 찾아가도록 하는 알고리즘 |
📊 지도학습 / 비지도학습 Chat GPT ▼
지도학습
✅입력 데이터와 그에 상응하는 레이블(label)을 사용하여 모델을 학습시킴
✅입력 데이터와 그에 대한 출력 값을 알고 있는 상태에서 모델을 학습시킴
✅모델은 레이블 값을 예측하는 것이 목표
💡 스팸 메일 필터링을 위한 분류 모델을 만든다고 가정
이메일의 텍스트 데이터와 레이블(스팸 또는 스팸이 아님)을 사용하여 모델을 학습
=> 모델은 새로운 이메일을 입력으로 받아 스팸 여부를 예측
비지도학습
✅입력 데이터에 대한 레이블이 없는 상태에서 모델을 학습
✅ 입력 데이터 간의 패턴이나 구조를 파악하여 데이터를 분류하거나 클러스터링하는 것이 목표
💡고객들의 구매 이력을 분석하여 비슷한 소비 패턴을 가진 고객들을 클러스터링
레이블(즉, 구매 패턴이 유사한 그룹의 이름)을 미리 알수없음
=> 모델은 입력 데이터 간의 유사성을 파악하여 그룹 생성
📌지도학습은 입력 데이터와 레이블을 함께 학습하여 모델을 생성
비지도학습은 입력 데이터만을 사용하여 데이터 간의 패턴이나 구조를 파악
✅ n_cluster
📝클러스터(군집) 개수
n_clusters : int, default=8
The number of clusters to form as well as the number of
centroids to generate.
✅ random_state
📝 알고리즘 실행 시 초기 중심점 선택위해 실행하는 난수 (시드) 결정하는 매개변수
지정하지 않을 시 매번 다른 난수로 알고리즘 실행 => 지정 권장
random_state : int, RandomState instance or None, default=None
Determines random number generation for centroid initialization. Use
an int to make the randomness deterministic.
See :term:`Glossary <random_state>`.
✅ inertia_
📝 K-Means 알고리즘에서 찾은 클러스터링(군집화)의 품질을 나타내는 지표 중 하나
📝모든 클러스터의 중심점과 해당 클러스터에 속한 데이터 포인트 간 거리를 제곱한 값들의 합으로 계산
📝 K-Means 알고리즘은 iniertia 최소화 하는 방향으로 클러스터링(군집화) 수행 => 클러스터(군집) 개수 늘리면 됨
✅ Shilhouette Analysis(실루엣 분석)
📝 실루엣 분석은 각 군집 간의 거리가 얼마나 효율적으로 분리돼 있는지 표현
📝 군집화가 잘 됨 => 다른 군집과의 거리▲ 동일 군집끼리의 데이터 사이의 거리 ▼
📝 효율적으로 잘 분리 => 개별 군집은 비슷한 정도의 여유공간을 가지고 떨어져 있음
📌좋은 군집화가 되기 위한 기준 조건
ScikitLearn의 silhouette_score(실루엣 계수) 값은 0~1 사이의 값
❗ 하지만 전체 silhouette_score(실루엣 계수) 평균값과 더불어 개별 군집의 평균값의 편차가 크지 않아야 함
=> 즉, 개별 군집의 실루엣 계수 평균값이 전체 실루엣 계수의 평균값에서 크게 벗어나지 않는 것이 중요
❗ 특정 군집의 실루엣 계수 평균값만 ▲ & 다른 군집들의 실루엣 계수 평균값▼ => 좋은 군집화 X
✅ Silhouette_score (실루엣 계수)
📝 K-Means 알고리즘에서 찾은 클러스터링(군집화)의 품질을 나타내는 지표 중 하나
📝 클러스터 내의 데이터 포인트 간 거리▼ (비슷한 특성을 가진) / 클러스터 간의 거리▲ (다른 특성을 가진) 높은 값
클러스터 내의 데이터 포인트 간 거리▲ (비슷한 특성을 가진) / 클러스터 간의 거리▼ (다른 특성을 가진) 낮은 값
📝-1에서 1 사이의 값
=> 1에 가까울수록 좋은 클러스터링 결과
=> 0에 가까울수록 그다지 좋지 않은 클러스터링 결과
=> -1에 가까울수록 클러스터링 결과가 잘못된 경우
✅ Elbow_method
📝 K-Means 클러스터링에서 적절한 클러스터 개수를 결정하기 위한 방법 중 하나
📝 클러스터 개수를 늘리면서 kmeans.inertia_ 값의 변화 확인
kmeans.inertia_ 값은 클러스터 개수가 증가함에 따라 감소
✅ Pycaret
📝 scikit-learn 패키지를 기반으로 개발된 자동으로 머신러닝을 수행하는 파이썬 라이브러리 (Auto-ML)
📝 classification(분류), regression(회귀), Clustering, Anomaly Detection 등 다양한 모델을 지원
https://pycaret.gitbook.io/docs/learn-pycaret/examples
✅머신러닝/딥러닝에서 추상화도구(Scikit-learn, TensorFlow, PyTorch, Transformer, FastAI 등) 장점과 단점 ▼
장점
- 개발 시간 단축과 정확성 향상
- 재사용성
- 하드웨어 가속
단점
- 빠르게 실행 할 수 있는 장점있는 반면에 어떻게 동작하는지 알 수 없다. (매커니즘 이해도 부족)
- 사용법이 비교적 간단한 반면 내가 원하는 방식으로 사용하기 어렵다.
- 일부 원하는 기능이 구현되어있지 않을 수 있으며 개발자가 구성할 수 있는 옵션이 적을 수 있다.
- 메모리 사용의 증가
- 특정 프레임워크나 라이브러리에 종속될 우려가 있어 일반성이 부족할 수 있다.
상관관계
✅ Pairplot
📝그리는 이유=> scatter : 아주 많은 시간 소요
=> 샘플만 추출해서 시각화를 진행해야 조금 빠르게 시각화를 출력가능
실,골,플이 잘 나뉘는지 시각화
📝 공식문서 Doc ▼
✅ 데이터의 각 숫자 변수가 단일 행의 Y축과 단일 열의 X축에 걸쳐 공유되도록 축 그리드를 생성
✅ 대각선 플롯은 다르게 처리
✅ 각 열에 있는 데이터의 한계 분포를 표시하기 위해 단변량 분포 플롯이 생성
✅ 변수의 하위 집합을 표시하거나 행과 열에 서로 다른 변수를 플롯할 수도 있음
✅ 몇 가지 일반적인 스타일을 쉽게 그릴 수 있도록 고안된 PairGrid의 상위 수준 인터페이스
✅ 더 많은 유연성이 필요한 경우 PairGrid를 직접 사용
📝 파라미터 ▼
seaborn.pairplot(data, *, hue=None, hue_order=None, palette=None, vars=None, x_vars=None, y_vars=None, kind='scatter', diag_kind='auto', markers=None, height=2.5, aspect=1, corner=False, dropna=False, plot_kws=None, diag_kws=None, grid_kws=None, size=None)
✅ 상관관계
Q. 현실세계에서 양의 상관이 있는 것과 음의 상관이 있는것 무엇이 있을까요 ❓
- 양의 상관
교육 수준과 소득 수준.
기온과 아이스크림 판매량
회사규모와 평균연봉
- 음의 상관
체중과 운동량
강수량과 관광객 수
Q. 상관 계수를 볼 때 주의해야 할 점이 있다면? 어떤 점이 있을까요 ❓
✅ 상관관계 != 인과관계
✅ 상관 계수가 0이면 선형 상관관계가 없는 것. 다른 모양의 관계가 있을 수 있다.
✅ 심슨의 역설을 주의
✅ 샘플의 크기가 작으면 결과가 왜곡될 수 있음
✅ 이상치(outliers)에 민감하다.
💡상관 계수는 이상치(outliers)에 매우 민감
=> 이상치가 있을 경우 상관 계수의 값이 크게 왜곡될 수 있음. 이상치를 먼저 확인하고 제거한 후 상관 계수를 계산
✅ Anscombe's quartet(앤스컴 콰르텟)
1) 시각화의 중요성
2) 특이치 및 주영향관측값(influential observation)의 영향 표현
✅ 데이터 사우루스
📝 Anscombe's quartet(앤스컴 콰르텟)영향을 받아 만들어진 또 다른 데이터셋
📝 박스플롯의 단점 설명하는 데이터셋
https://blog.revolutionanalytics.com/2017/05/the-datasaurus-dozen.html
📝 raw data가 바뀌어도 boxplot의 형태가 변하지 않음 -> 단점 보완한 violin plot
📝 scatter plot은 하나하나 점을 찍어서 시간이 너무 오래 걸림 . 통계적 추정을 나타내는 box plot/violin plot
❗ 다중공선성 주의
✅ 다중공선성(Multicollinearity)
📝 두 변수 사이에 강한 상관관계가 있는 경우에는 다중공선성이 발생
📝 이 경우에는 회귀분석 등 다른 방법을 사용하여 문제해결 필요
📊 다중공선성 Chat GPT ▼
✅ 상관관계와 인과관계
📝상관이 있는 것만으로는 인과가 있다고는 단정하지 못하고, 인과의 전제에 지나지 않음
'상관은 인과를 함축하지 않는다 (Correlation does not imply causation)'
과학이나 통계학에서 사용되는 어구.
2개의 변수의 상관이 자동적으로 한 편이 이제 한 편의 원인을 의미한다는 것은 아닌 것을 강조
(물론, 그러한 관계가 있는 경우를 완전하게 부정하는 것이 아니다)
📌정형데이터
X => 문제, 2차원, 독립변수, feature
y=> 정답, 1차원, 종속변수, target, label
📌머신러닝 관련 강의 및 도서
✅ 인프런 강의 (혼자 배우는 머신러닝)
https://www.inflearn.com/course/%ED%98%BC%EC%9E%90%EA%B3%B5%EB%B6%80-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EB%94%A5%EB%9F%AC%EB%8B%9D
✅ 그로스해킹
📌RickiePark(Writer & translator for ML/DL) 깃허브
https://github.com/rickiepar
'Python > ▶ 머신러닝' 카테고리의 다른 글
9주차 TIL 1일차 머신러닝( One-hot encoding, Random Forest ) (0) | 2023.03.13 |
---|