Microsoft AI School에서 지원 받은 계정을 이용해 프로야구 선수 능력 측정 모델을 구현해볼 것이다.
MS Azure의 Machine Learning Studio에서 Designer를 활용해 파이프라인을 구성하여 모델을 훈련시키고 평가할것이다.
기본적인 디자이너 관련 내용은
Azure Machine Learning을 통한 로켓 발사 여부 예측 모델 구현
Microsoft AI School에서 지원 받은 계정을 이용해 로켓의 발사일 예측 모델을 구현해볼 것이다.MS Azure의 Machine Learning Studio에서 Designer를 활용해 파이프라인을 구성하여 모델을 훈련시키고 평가할것
samdo3.tistory.com
여기에 나와있다.( 지도학습 - 분류 : 범주 예측(True/False ) )
그러므로 이 글에서는 알고리즘 관련으로 집중해서 다룰것이다.
- 데이터 세트 :
Sabermetrics = 타자를 판단하기 위한 데이터들, 계산식
KBO(한국야구위원회) 기록실에서 2000~2013년까지의 규정타석 수를 채운 타자 594명의 데이터(Sabermetrics)
( 2014년 데이터는 테스트 데이터로 사용예정 )
https://www.koreabaseball.com/Record/Player/HitterBasic/BasicOld.aspx?sort=HRA_RT

2000~2001년 데이터 : 2000_2001_hitter.csv
2002~2013년 데이터 : 2002_2013_hitter.csv
2014년 데이터 : 2014_hitter.csv
- 알고리즘 :
비슷한 능력치의 야구 선수들끼리 묶어 그룹화시켜 선수들의 능력치를 비교하려고 하니까 비지도 학습의 Clustering 사용


군집화 알고리즘 : 데이터간의 유사도를 정의, 그 유사도에 따라 군집을 형성하는 알고리즘 (비지도 학습의 대표적인 예)
=> 유사도를 바탕으로 군집 내 응집도와 군집 간 분리도를 최대화하는 방식으로 군집 구성
(군집 내 응집도 = 덩어리 안에서 요소끼리 서로 얼마나 가까운지/군집 간 분리도= 밖에서 덩어리끼리 얼마나 먼지)
계층적 군집화 : 개체 간 거리에 따라 클러스터 계층을 표현하는 방식
=> 비슷한 개체끼리 서로 묶어가며 클러스터를 만들어가는 방법
=> 데이터 변경에 따른 연산량 문제가 있음
분할적 군집화 : 계층 관계가 없는 다수의 군집을 만드는 방법, 직관적인 시각화 가능
=> K-means clustering, DBSCAN
(By Incheol - 자작, CC BY-SA 4.0, https://commons.wikimedia.org/w/index.php?curid=39732666)
k-means clustering : 가장 일반적으로 사용되는 분할적 군집 알고리즘
=> 거리의 평균을 적용한 중심점, 클러스터링의 개수(K)를 미리 정하고,
초기 중심점을 설정한 후 알고리즘에 따라 중심점 갱신을 반복
=> 초기 중심점의 위치에 따라 군집 결과가 달라질 수있어 나쁜 위치의 중심일때 local optima에 빠질수있음
( local optima : 국소 최적해, 기울기가 0이 되어 더 이상 중심 이동에 대한 업데이트를 하지않고 멈추는 것 )
=> 그러므로 초기화 방법으로 K-means++, Ramdom seed 사용
Ramdom seed : 가장 많이 사용되는 초기화 방법, 임의로 초기화 점을 선택
K-means++ : 초기 중심값들이 최대한 서로 멀리 떨어지도록 선택, Random seed보다 빠르게 수렴함
=> 군집의개수(K)도 적당한 수의 의미있는 군집을 표현하는 K 결정 필요
=> K-means의 군집화 결과를 판단하는 방법 :

엘보우 기법(SSE = 오차제곱합) : 군집 내 유사도 최대화
실루엣 : 군집 내 유사도 최대화 + 군집 간 유사도 최소화
DBSCAN : 밀도의 개념으로 군집을 형성(높은 밀도)
=> 군집 결과를 통해 noise 제거 가능(낮은밀도)
=> 밀도로 연결된 임의의 패턴을 찾음, 희박한 데이터에 대한 성능 안좋음(고차원 데이터에 저성능)
1. 리소스 그룹 만들기
2. Machine Learning Studio에서 컴퓨팅 생성
3. 데이터세트 등록
2000_2001_hitter.csv
2002_2013_hitter.csv
2014_hitter.csv
3개의 데이터 등록시킴
4. 머신러닝 디자이너 시작
5. 데이터세트 전처리

< 불필요한 컬럼 제외 >
학습에 유의미한 데이터만 남기기 위해 필요 없는 컬럼들을 없애줄거임


모든 컴포넌트에 열 YrPlayer,OPS,ISO,SECA,RC/27,wOBA,XR,TA,RC 추가후 저장
< 데이터 병합 >
저 3가지 데이터를 모두 합쳐줄거임( 컬럼명이 모두 같으니까 병합 가능, 컬럼명이 다르면 오류남! )

Add Rows : 밑에 이어서 붙이는거, 열이 같아야함
Add Columns : 옆에 이어서 붙이는거, 행이 같아야함
< 정규화 및 표준화 >
수치 데이터들이 단위가 각자 다르니까 표준화 필요


- 변환 방법 : ZScore ( 모든 값을 z-점수로 변환해 정규화 시키는 함수 )
- Use 0 for constant columns when checked : 숫자 열에 단일 불변 값이 포함되어 있는 경우 이러한 열이 정규화 작업에 사용되지 않음
- 열 타입 : Double ( 실수 형식의 모든 데이터를 표준 편차 1로 표준화 시킴 )
6. 주성분 분석
차원의 저주 : 다양한 Sabermetrics 지표들 때매 데이터의 차원이 증가하면, 차원의 수에 비해 학습데이터의 수가 줄어들면서 발생하는 문제( 데이터 희박해짐 )
=> 과대적합의 문제 => 데이터의 차원을 줄일 수 있는 방법 필요( 데이터 개수를 늘리거나 )
(데이터의 차원 = 독립변수의 수)
차원 축소 : 변수(feature)의 개수를 줄임 ( 고차원 데이터 -> 저차원 데이터 )
=> 서로 상관관계가 없는 변수(feature)들만 남기는 것이 목표
차원이 줄어들면 정보일부 손실됌 => 축소시 feature들이 가진 분산의 특징을 유지해야함
- 변수 선택 : 기존 feature 중에서 선택( 원래 변수를 유지 ), 상관관계 없으면 feature 삭제
- 변수 추출 : 기존 feature들로부터 새로운 feature 추출 및 생성, feature 간 상관관계에 따라 차원 축소 쉬움
비지도학습 + 변수 추출 => PCA (Principal Component Anlaysis)
주성분 분석(PCA) : 독립변수들(features)의 분산을 가장 넓게 표현하는 주성분(새로운 축,PC)을 찾는 작업
=> 데이터의 분산을 최대한 보존하는 새로운 축(주성분)을 찾고, 그 축에 데이터를 사영시킴
( 새로운 축을 구성하는 feature = 기존 feature의 선형 조합 )
=> 분산이 큼 = 원래 데이터의 분포를 잘 설명가능
=> 주성분을 기존 변수(feature)의 수만큼 찾은후 몇 개의 차원으로 축소할지 정함
PC1 : 첫번째 주성분( 가장 큰 분산 ), PC2 : 두번째 주성분 ( 두번째로 큰 분산 ) ... => 몇개의 차원으로?

Scree Plot으로 주성분의 개수를 정할 수 있음
=> eigenvalue = 각 주성분들이 분산을 설명하는 비율에 대한 그래프(시각화)
=> 보통 빨간줄인 엘보우 포인트까지 주성분 사용(3개)
PCA 찾는 방법 :
표준화 => 공분산 행렬 계산 => 주성분 계산 => Feature Vector 생성 => 데이터 조정
PCA 분석은 Scikit learn의 decomposition 내에 있는 PCA 구현을 이용하기 위해 파이썬 코드를 사용할 것이다.

“Execute Python Script” 컴포넌트 올린후 연결

이런 기본 형식이 있어서 여기에 맞게 작성해야함
아래의 파이썬 코드 내용을 위에 복붙

요약하자면, 이름을 제외한 기존의 8개의 컬럼 개수만큼 주성분을 찾고(PC1 ~ PC8), 맨 앞 컬럼에 이름 부분을 붙임
< 주성분 확인 >
저장하고 파이썬 코드를 실행시키고 데이터 미리보기를 통해 확인


이렇게 우리가 남긴 필요한 8개의 열들에서 그 선수의 데이터를 종합해 PC1에서 PC8까지 차원을 나눠서 표현함
PC1이 가장 그선수의 데이터를 잘 표현하는 것(90%) 그 다음 PC2(5%) …
=> 이 퍼센트는 표준편차를 확인하면 분산도 확인가능하니까 알수있음 ( 분산이 높을수록 퍼센트가 높은 것 )
그래서 PC1, PC2만 뽑아낼것이다.( 만약에 PC3까지 비율이 높으면 거기까지 포함해서 뽑아내야함 )

필요한 열만 남기기 위해 "Select Columns in Dataset"를 연결하고, 열 편집에 PC1,PC2,YrPlayer 추가후 저장
7. 데이터 분리

2000~2013년 데이터(훈련)랑 2014년 데이터(테스트)를 분리시킬 것이다.
2000~2013년 데이터 개수가 594개이고, 2014년 데이터개수가 55개니까
Fraction of rows = 0.9152
Randomized split = False (랜덤으로 뽑으면 안되니까)
8. 모델링 알고리즘 선택

군집 알고리즘인 "K-Means Clustering" 컴포넌트 사용
- 중심점(군집) 개수 : 4
- 초기화 알고리즘 : K-Means++
- Metric : Euclidean 거리
- 정규화/표준화 : False ( 정규화 아까해서 안해야함 )
- 반복 횟수 : 100
9. 군집 모델 학습(훈련)

“Train Clustering Model” 컴포넌트 추가후 알고리즘과 훈련 데이터 연결
열편집 – PC1,PC2 입력후 저장( target값 )
10. 군집 모델 예측

“Assign Data to Clusters” 컴포넌트 추가후 훈련된 모델과 테스트 데이터 연결
2014년 데이터로 어느 군집에 포함될지, 중심점에서의 거리값이 얼마일지 예측하는 것이다.
< Assign Data to Clusters 결과 확인 >

군집 0,1,2,3으로 4개로 나눠졌고, 선수마다 각 군집 중심점까지와 떨어진 거리를 알 수 있다.
( 각각 거리가 가장 짧은 군집에 속해진걸 볼 수 있음 )
11. 군집 모델 평가

“Evaluate Model” 컴포넌트 추가후 연결
평가 지표로 분리도, 응집도, 군집 내의 데이터 개수, 분산을 파악한다.
< Evaluate Model 결과 확인 >

- 다른 중심점과의 평균 거리 : 분리도 확인
=> 다른 군집과의 거리가 높을수록 특정한 특징이 있다는것(멀리떨어짐)
- 군집 중심과의 평균 거리 : 응집도 확인
=> 군집끼리의 거리가 낮을수록 자기들끼리 군집이 잘되어있다는 것( 높으면 퍼져있음 )
- 군집 내의 데이터 개수
- 중심점에서 가장 멀리있는 데이터의 거리 : 분산 파악
=> 클러스터 센터(데이터의 중심)에서의 거리를 볼수 있음 => 멀면 불안정
적당히 무난하고 잘 뭉쳐져서 나온 군집은 1번,
공격력 젤 좋은 군집은 3번으로 해석할 수 있다.
'클라우드' 카테고리의 다른 글
| Azure Machine Learning을 통한 자전거 렌탈 수요 예측 모델 구현(회귀) (1) | 2024.10.13 |
|---|---|
| Azure Machine Learning을 통한 로켓 발사 여부 예측 모델 구현(분류) (0) | 2024.10.13 |
| Azure Machine Learning을 이용해 Stable Diffusion 사용하기 (1) | 2024.09.29 |
| Microsoft Azure VM에 블로그 만들기 (10) | 2024.09.29 |