시계열 분석이 중요한 이유
1. 예측 및 추세 분석
2. 의사 결정 지원
3. 이상 탐지
4. 자원 할당과 계획

시계열 활용
1. 금융 분석
2. 수요 예측
3. 자연재해 예측
4. 건강관리
5. 에너지 예측 및 최적화
6. 교통 및 운송 분석
7. 경제 분석
8. 환경 모니터링

주요 시계열 분석 기법
1. 이동평균
2. 지수평활법
3. ARIMA
4. SARIMA
5. Prophet
6. LSTM
7. VAR

이 외에도 선형 회귀, 의사결정나무, 랜덤포레스트 등 다양한 기법 사용하여 시계열 데이터에 활용

시계열 데이터의 구성 요소 : 추세
1. 상향추세 : 시간이 지남에 따라 데이터가 점진적으로 증가(긍정)
2. 하향추세: 시간이 지남에 따라 데이터가 점진적으로 감소
3. 평평한 추세: 큰 변동이 없을 때

 

시계열 데이터의 몇가지 특징

1. 시간 의존성
2. 계절성
3. 추세

결측치는 시계열 데이터에서 누락되었거나 기록되지 않은 것으로 데이터 분석과 예측에 부정적인 영향을 미칠 수 있도 모델의 퀄리티를 하락 시킨다.그래서 결측치 처리를 해주어야 한다.

결측치 처리해야하는 이유

1. 데이터 왜곡 방지
2. 예측 정확도 향상
3. 유의미한 데이터 분석 

이를 위해 데이터를 예측 모델에 적합하게 변형하거나 제거해줘야 한다.

결측치 확인 방법
1. 데이터셋 요약 정보 확인 info()나 describe 메서드 이용하여 결측치 확인
2. 시각화 : 히트맵이나 누락 데이터 플롯 사용, 흰색 또는 다른 색상의 데이터 확인
3. 조건식: pandas의 isnull() 또는 isna() 메서드 이용, 또 마이너스 값도 찾을 수 있다.
4. 결측차 개수 확인 isnull().sum()메서드 사용하여 각열의 결측치 개수 확인

 

결측치의 빈도 및 패턴 분석방법
결측치의 빈도 및 패턴 분석하는 것은 결측치를 어떻게 처리할지 전략을 세울 때 필요하다.
그러나 패턴을 갖고 있는 경우는 드물며 갖고 있다면 특정 기간에 대한 패턴이 나타나는 경우가 많다->이 경우 그 기간만 빼고 작업

1. 결측치 개수 확인
2. 결측치의 위치 확인
3. 시각화
4. 시계열 분석 

 

시계열 데이터 전저치 방법 1. 결측치 삭제
장점
1. 간단하고 직관적으로 결측치 처리
2. 시계열 데이터 특성 유지하며 결측치 삭제
3. 시계열 데이터에서는 시간적 연속성이 중요하므로 시간적 흐름 유지할 수 있다는 장점

단점
1. 데이터 손실
2. 결측치가 많으면 데이터셋의 크기가 크게 축소
3. 해당 시점의 데이터 패턴이나 특성 파악 불가

결측치가 적거나 다른 변수와 상관관계가 적을 때만 사용하는 게 좋은 방법

 

시계열 데이터 전처리 방법 2.선형보간

선형보간 원리
1. 결측치 앞과 뒤에 있는 유효한 데이터 포인트 찾는다
2. 해당 유효한 데이터 포인트의 값과 위치를 사용하여 둘 사이에 값 채워넣는다

결측치 앞뒤 데이터의 경향성을 이용하여 대체하기 때문에 해당 데이터의 추세와 패턴을 잘 따라가지만 선형적인 방법에서만 사용할 수 있다.

 

주로 사용되는 세 가지 보간법
1. 선형 보간 : 주어진 두 점을 직선으로 연결
주로 시계열에서 간단하고 빠른 결측치 보완이 필요할 때 사용(예시 : 온도)

2. 스플라인 보간 : 주어진 데이터를 부드러운 곡선으로 연결
주로 데이터 셋이 크고 곡석의 특징을 정확하게 파악해야할 때 사용(예시: 경제 지표)

3. 최근접 이웃 보간 : 결측치를 가장 가까운 이웃의 값으로 채운다
주로 이산적인 데이터나 이상치에 민감하지 않을 때 사용한다.(예시: 추세나 변동성 파악)
        
각각의 보간법은 데이터의 특성과 분석 목적에 따라 선택되어야 한다

 

결측치를 대처하는 또 다른 방법

1.평균값 대처
결측치를 해당 변수의 평균값으로 대처

 

효과:
1. 간편하다
2. 데이터의 중심 경향성 유지
3. 표본 편향 감소

한계:
1. 정보 손실
2. 변동성 왜곡
3. 상관관계 왜곡

 

2. ARIMA 모델을 사용한 결측치 처리

 

시계열 모델을 사용한 결측지 예측과 대체에 대한 몇가지 주의
-결측치 예측 모델은 학습 데이터에 의존하므로, 예측 범위를 넘어선 시간대의 결측치에 대해서는 정확한 예측이 어렵습니다. 따라서, 모델을 적용할 시계열 데이터 범위를 신중하게 선택

- 결측치 예측 모델은 데이터의 패턴과 특성을 기반으로 예측하므로, 시계열 데이터에 시간적인 의존성이 존재해야 한다. 만약 데이터에 대한 시간적 의존성이 없는 경우 다른 대체 방법 고려

- 결측치 예측 모델의 성능은 예측 변수의 품질과 결측치의 분포에 따라 달라지니  예측 변수의 품질이 낮거나 결측치의 비율이 높을 경우 모델의 성능이 저하될 수 있다.

-결츨치 예측 모델은 예측 결과의 불확실성을 포함 할 수 있다.

-모델의 선택과 하이퍼파라미터 조정에 주의, 적절한 모델 선택과 모델 파라미터 튜닝을 통해 예측 성능을 향상

 

결측치 처리 전후 데이터 품질 평가 방법 소개

1. 결측치 비율 확인 

2. 기술 통계량 확인

3. 시각화

4. 예측 성능 평가

 

결측치 처리 과정에서 고려해야할 것

1. 결측치의 패턴 파악

2. 데이터의 특성 유지

3. 적절한 대처 방법 선택

 

결측치 처리 과정에서 고려해야 할 사항

1. 모델 선택과 평가 - 오버 피팅 반지하고 적절한 평가 지표 고르기

2. 전체 데이터 셋 고려

 

실제 응용 사례

금융: 주식 시장에서 결측된 가격 데이터를 처리하여 주가 예측 모델 구축

의료: 결측치 처리하여 질병 예측 모델이나 치료 효과 평가

고객 분석: 결측치 처리하여 고객 데이터에서 결측치 처리하여 활용

기상 예측: 결측치 처리하여 재난 대비나 농업에 활용

자동화 및 제조분야:  결측치 처리하여 이상 감지 고장 예측

'machine_learning' 카테고리의 다른 글

통계 - 공분산과 상관행렬  (0) 2023.06.01
[통계] 시계열 데이터-이상치  (0) 2023.05.31
통계기반의 데이터분석(1)  (1) 2023.05.22
MLOps (2) Azure의 ML service  (0) 2023.05.08
MLOps (1) Azure의 ML service  (0) 2023.05.04

아나콘다 :

-아나콘다는 머신러닝이나 데이터 분석 등에 사용하는 여러가지 패키지가 기본적으로 포함되어있는 파이 썬 배포판

-분야를 파이썬으로 접근하고자 할 때 세팅이 매우 간단

-또한, 파이썬 가상 환경을 구축하는데도 유용

-내부적으로 conda라는 환경/패키지 관리자가 존재하며 이 conda를 통해 패키지를 설치하거나 가상 환경을 관리

-하나의 가상 공간을 만들어서 버전별로 만들어져 있어서 버전관리에 용이

 

아나콘다를 설치 후 프롬프트를 열 때는 무조건'관리자 권한'으로 열어줄 것


 

1. 가상환경 만들고 들어가기

# 가상 환경 만들기
conda create -n AI python=3.8   # 여기서 AI는 원하는 대로 환경명을 지어주면 된다

# 가상환경 접속
conda activate AI

2. 가상환경에 주피터 노트북 설치

# 생성된 가상환경으로 접속하는 명령어
conda activate AI 

# 가상환경에 jupyter notebook 설치
pip install jupyter notebook 
pip install ipykernel

# 가상환경에 kernel 연결
python –m ipykernel install -–user -–name 가상환경명 –-display-name 가상환경명

python –m ipykernel install -–user -–name AI –-display-name AI

3. 주피터 노트북 접속 - 특정 폴더 만들고 그 폴더 안으로 경로변경(cd) 후 해줘라

jupyter notebook

#나오는 주소 들어가기

 

 

 

주피터 노트북에서 실습 끝나면 셧다운 해주기

 


 

평균과 표준편차는 알아둬라

 

1. 정규분포는 중심을 기준으로 양쪽으로 대칭되는 분포인 종모양 분포이다.

2. 내가 히스토그램으로 시각화한 데이터가 종모양이면 정규분포인 것

3. 정규분포에서는 평균과 표준편차가 아주 중요하다


# 연속형 데이터 분석 시 고려해야 할 사항 (분포, 통계 지표 등)

 

• 중심 경향성: 연속형 데이터의 중심 경향성을 파악하는 것은 매우 중요합니다.

이를 위해 대표적으로 평균(mean), 중앙값(median), 최빈값(mode)을 계산할 수 있습니다.

이 때, 데이터의 분포가 비대칭적 이면 평균보다 중앙값이나 최빈값이 더 적합한 경우가 있습니다

 

평균: 데이터 값 다 합쳐서 개수로 나눈 값

중앙값: 크기순서대로 정렬했을 때 데이터 가운데 위치한 값

최빈값: 데이터에서 등장 가장 자주하는 값

 


연속형 데이터 분석 시 고려해야 할 사항 (분포, 통계 지표 등)

 

• 산포도: 연속형 데이터의 산포도를 파악하는 것은 중요합니다. 대표적으로 분산(variance), 표준편차(s tandard deviation), 범위(range), 사분위간 범위(interquartile range) 등을 계산할 수 있습니다, 그래프가 얼마나 퍼져있는가

 

-산포도가 너무 높은 데이터세트로 학습시키면 특정 경향에서만 테스트 잘되는 모델이 생길 수도 있다.

 

 


이상치 : 대부분의 데이터가 모여있는 데이터들 밖으로 극단적인 값으로 나타난 데이터로 제거해주어야 함, 0으로 바꾸거나 제외해주거나 삭제해줄 수 있다. 보통은 0로 바꿔준다.

 

박스플롯을 통한 실습

상자 두께가 얕고 위아래 막대에 값이 많을 수록 중앙에 값이 잘 모여있다는 뜻


상관관계 : 연속형 데이터 간의 상관관계를 파악, 상관관계는 두변수간의 관련성을 -1~1로 표현, 값이 0이면 상관관계가 없다는 것. 1일수록(같이 같이 올라가면) 상관관계가 있으며(맑은 날 우산 판매량->비가 안올 때 우산 판매량 훅 떨어짐) -1이면 음의 상관관계가 있는 것.


데이터의 종류

 

1. 이산형 데이터 : 정수형 데이터, 동전던지기 처럼 확률이나 연속되지 않은 데이터. 가능한 값이 한정되어있음

2. 데이터

 


 

당뇨병 데이터로 best model 뽑은 이후 과정 : 실험에 사용했던 데이터를 저장(Data store)&관리하고 서비스 배포

 

import numpy as np
from azureml.core import Dataset  # 데이터 관리해주는 모듈

#실험에 사용했던 데이터 넘파이로 저장
np.savetxt('feature.csv', X_train, delimiter=',')   # X_train의 내용을 features.csv라는 이름으로 저장, 구별자는 ','
np.savetxt('labels.csv', y_train, delimiter=',')

파일 두개 생성 완료

# 데이터 스토어에 업로드하는 작업

datastore = ws.get_default_datastore  # 데이터 스토어 변수로 저장

datastore.upload_files(files=['./feature.csv','./labels.csv'],   # 업로드할 (파일 현재/)경로파일 이름
						target_path = 'diabetes-experiment/', # 경로 지정
                        overwrite=True  #이전 파일이 있을 경우 덮어쓰기 
)

이제 data > datastore> workspace 선택 > 아까만든 당뇨병 실험 폴 더 안에 두개의 파일 올라가 있을 것이다.

# 저장된 정보 가져오기
feature_dataset = Dataset.Tabular.from_delimited_files(path=[(datastore,'diabetes-experiment/features.csv')])
label_dataset = Dataset.Tabular.from_delimited_files(path=[(datastore,'diabetes-experiment/labels.csv')])
# best model 등록하는데 필요한 패키지 
                      
import sklearn 
from azureml.core import model Model
from azureml.core.resource_configuration import ResourceConfiguration
# 시스템에 모델의 등록
model = Model.register(workspace=ws, 
				model_name = 'diabetes-experiment-model', # 모델 이름
                model_path = f'./{str(best_run.get_file_names()[0])}', # 모델의 경로, f붙임으로써 format형태로 지정
                model_framework=Model.Framework.SCIKITLEARN,     # 학습에 사용한 프레임워크 저장
                model_framework_version=sklearn.__version__,    # 프레임워크 버전
                sample_input_dataset = feature_dataset,
                sample_output_dataset=label_dataset,
                resource_configuration=ResourceConfiguration(cpu=1, memory_in_gb=0.5),  # 해당 모델을 돌리는데 필요한 cpu와 메모리
                description='Ridge regression model to predict diabetes progression', # 설명
                tags= {'area':'diabetes', 'type':'regression'}
                              
)

모델이 등록된 걸 볼 수 있다.

배포하고 나면 endpoint도 생길 것이다

# 모델 잘 등록이 되었는지 확인
print('Model name: ', model.name)
print('Model Version:', model.version)

    출력>
    Model name:  diabetes-experiment-model
    Model Version: 1

 

이제 모델을 실제로 배포해보자

# 모델의 배포
service_name = 'diabetes-service'

service = Model.deploy(ws, service_name, [model], overwrite=True)  # 워크스페이스 지정, 서비스 이름지정, 모델지정-여러개를 한꺼번에 배포할 수 있어서 리스트 타입으로 지정, 덮어쓰기 지정
service.wait_for_deployment(show_output=True) # 배포하는 중간 아웃풋 보여주기

 

배포된 모습

 

 

1. endpoint

2. 테스트 가능

 

# Notebook에서도 아래와 같이 예측 테스트 해볼 수 있다

import json

 


input_payload = json.dumps({
    'data': X_train[0:2].values.tolist(),
    'method': 'predict'
})

 

output = service.run(input_payload)

 

print(output)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

MLOps = 머신러닝 엔지니어링 + 데이터 엔지니어링 + 인프라 +Ops

머신러닝의 유지보수 과정

프로세스를 잘짜서 모든 케이스를 해결할 수 있도록.. 최대한 사람이 개입하지 않고 프로세스를 돌려 해결하는 게 베스트. 

 


(1) 리소스그룹 만들기 : azure machine learning 

검토+만들기


(2) 생성한 ML service는 바로 사용하는 게 아니라 또 웹(azure machine learning studio)에서 열어서 사용해야한다

 

 

(3) 가상 머신 생성

Azure ml studio > compute

+new해서 새로운 컴퓨트 자원을 추가

4core면 충분, 예제 위주라 메모리 많이 불필요하니  standard_DS3_v2로 선택

 

 

(4) Designer

샘플들을 사용해서 ML을 사용할 수도 있지만 새로운 컴포넌트 만들어보자

tool(1), canvas(2) area로 나눠져있다

tool area의 component에서 data input and output에서 enter data manually 드래그 해서 canvas area에 drop

수작업으로 데이터를 입력하겠다는 모듈로 더블 클릭하여 값을 넣을 수 있다, 값 입력 후 save

그 후 데이터 누른 상태로, setting >가상머신 할당

compute instance에서 내가 아까 만든 vm할당해준다

 

그후 submit 버튼 눌러서 실험 세팅장을 만든다

이제 job detail 보면 가상 머신이 계산하는 거 볼 수 있다

 

계산 완료

계산 다 되었으면 dataset 우클릭 > previes data 해본다

=>간단한 분석 결과 확인 가능

저 막대그래프 같은 것은 히스토그램으로 데이터의 분포를 나타낸다.


학습용/테스트용으로 쪼개기

데이터 트랜스포메이션(데이터 전처리하는 도구)> slipt data 를 아까 만든 데이터에 연결(데이터를 끌고와서 연결)

 slipt data 더블클릭하여 설정

(설정)split row: 데이터 열단위로 쪼개고

          0.7 : 학습용/테스트용 데이터를 70 : 30로 쪼개겠다

          randomized : true(데이터 섞기)

          random seed : 랜덤을 정해진 값으로 섞기

 

 

학습 모델

Train model 드래그 드롭해서 학습용 데이터와 알고리즘(머신러닝 알고리즘 > 리니어 리그리션)을 넣어준다

 

 

그 후 train model 더블클릭하여 label column> edit column 해서 label column 지정해줌


학습 모델 평가

score model (데이터 별로 하나하나 평가)꺼내와서 훈련된 모델과 테스트 데이터를 넣어준다 

 

이제 전체적으로 모델을 종합 평가를 해주는 게 필요 

Evaluate model 꺼내서 score model 에 연결 , ( 이 모델은 자동으로 리니어 리그리션과 연동이 돼어 자동으로 알고리듬에 맞는 평가지표 사용함)

 

 

이제 가장 기본적인 모델을 만든 것이다.

submit 해서 실행 시킨다, tool area에서 job detail로 작업 현황과 결과보기


결과 확인

split data에서 데이터 나눈 거 확인

evaluate_model 우클릭 프리뷰 데이터로 오류 측정도 보기


모델 활용하여 서비스 운영

 

완성된 모델 위에 publish 버튼 선택

이름 지어주고 클라우드에 publish

서비스 눌러서 들어가보자

overview에 REST endpoint documentation 를 복붙해보면 API를 호출할 수 있는 스펙이 나온다

복붙할 주소
스펙

더보기

chat gpt를 사용하여  REST endpoint documentation 를 파이썬 코드로 호출하는 방법을 작성해달라고 하는 건 꿀팁

, API key 필요하다고 하면....흠

 

 


두번째 방법 : Automated ML

이번 예제에서는 타이타닉 데이터의 일부를 사용한다

 

 

데이터만 넣으면 전반적인 머신러닝 과정  알아서 모두 해준다(배포 이전까지), 전처리 과정이나, 알고리즘도 여러개 다 돌려보고 평가하여 그 중 가장 잘맞는 방식을 찾을 수 있게 해준다.

더보기

<전반적인 머신러닝 과정 설명>

데이터를 가지고 오면 raw data가 되고 여기서 우리가 필요한 형태로 데이터 전처리 과정을 거쳐야한다.

그때 필요한 메타데이터를 따로 관리하기도 하고 그래서 전처리를 해서 나온것이 features(feature engineering)

 

그리고 이 feature를 가지고 트레이닝과 테스트셋으로 나눠서 트레이닝셋에 알고리즘을 먹이고 파라메타를 조정한다. 여기서 데이터를 학습해서 넣은 것이 모델이다.

 

그리고 이 모델에 테스트셋을 넣어 평가해보고 괜찮으면 저장하고 배포한 것이 API

 

1. Automates ML > Create a new Automated ML job 눌러서 시작

 

2. 데이터를 먼저 만들어주자

create 눌러 시작

이미 예제 파일이 로컬에 있음으로 from local file을 체크하고 넘어간다

저장 공간을 지정

업로드할 파일 선택

데이터의 구조 보기 

file format : delimited 구분자로 구별되어있다

 

 

ㄴ보면서 빼줘야할 column을 미리 생각해보자

-첫번째 열

-name

-티켓번호

 

schema(구조)에서는 아까 빼버린 옵션을 꺼버리면 된다

그리고 결과적으로 예측을 할 survived가 0, 1의 정수형으로 되어있는데 컴퓨터는 이 값이 그냥 숫자로 착각할 수도 있기 때문에 삶과 죽음 값 2개 밖에 없음을 나타내기 위해 bool타입으로 바꿔준다

전체적인 overview에서 create까지 눌러주면 DataSet이 만들어진 것(안보이면 refresh)

 

3. 

만들어진 데이터 셋 누르고 next 눌러 새로운 job을 만든다

이름 짓고/ 라벨 데이터 정하고 / 이걸 돌린 컴퓨터 설정(지난 과정에서 만든 vm)

 

4. 어떤 문제를 풀것인지 체크 (타이타닉 예제는 산자/죽은 자를 나누는 classification 문제)

deep learning을 누르면 dl까지 해주고 아니면 sklearn만 사용. 이번엔 체크해보자

next 하기전 view additional configuration settings에서 Primary metric(지표) 정해주고

Blocked model에서 아예 시도도 안해도 될 것같은 알고리듬을 정해준다.

exit criterion은 시간이 얼마나 걸렸을 때 그만 중단시킬지 정해주는 것

max concurrent iteration은 몇개를 동시에 돌릴지 정한다(올릴 수록 돈도 많이 듦^^)

 

그 후 저장하고 next

 

4. validate and test, 모델 평가방법

validatio type: (1)train-validation split 은 학습/테스트용으로 쪼개서 해서 테스트 (2)user validation data 테스트용 데이터 따로 줘서 사용

finish를 눌러준다

completed되기 전 만들어지는 과정에서도  models 들어가면 만들어지며 list up되는 과정 볼 수 있다

 

알고리즘 중 같은 정확도라면 duration이 짧은 게 좋다(여기선 standardScalerWrapper로 전처리, XGBoostClassifier가 알고리듬)

눌러서 들어가보면 그 모델에 대한 설명 볼 수 있다, /view generated code 하면 코드도 활용 가능./Metric을 보면 해당 알고리즘의 지표들을 보여준다./Data transformation에서는 데이터 전처리 과정을 볼 수 있다.


세번째 방법 : Notebooks

이번에는 당뇨병 데이터를 예제로 사용

 

 

파일을 새로 만들어준다

python 버전 바꾸기

애저 쪽 기능을 다 쓰려면 인증을 눌러줘야한다!

 

# Azure Machine Learning은 Microsoft에서 
# Workspace는 머신 러닝 프로젝트의 모든 구성 요소를 포함하는 최상위 개체

# 애저 쪽 기능 임포트
from azureml.core import Workspace

# 워크스페이스 쪽 현재상황 보는 참조 변수 만들기
ws = Workspace.from_config()

# 워크스페이스의 이름 및 다른 몇가지 정보 더보기
print('Workspace name:' + ws.name,
        'Azure region:' + ws.location,
        'Subscription ID:' + ws.subscription_id,
        'Resurce group:' + ws.resource_group
)

실험 공간? 워크 스페이스 내에 또 연구실이 있고 이 안에서 파이썬을 돌리도록 되어있다.

# 실험 공간을 준비
from azureml.core import Experiment

# 실험을 할 땐 워크스페이스에 만들어주고 실험의 이름도 지정
experiment = Experiment(workspace=ws, name='diabetes-experiment')
더보기

jobs > experiment 탭에 들어가보면 실험실 만들어진거 볼 수 있다

# 데이터 준비
from azureml.opendatasets import Diabetes

# 데이터 쪼개는 데 쓰는 모듈 임포트
from sklearn.model_selection import train_test_split

#pandas 데이터 프레임 형태로 보기, 이미 보관된 데이터를 가져오는 거라 get_tabular를 이용,dropna()로 빠진 행 지우기
x_df = Diabetes.get_tabular_dataset().to_pandas_dataframe().dropna()

# Y값만 꺼내서 저장
y_df = x_df.pop('Y')

# 데이터 쪼개기
X_train, X_test, y_train, y_test = train_test_split(x_df, y_df, test_size=0.2, random_state=66)

# 쪼개진거 확인
print(X_train)

pandas 데이터 프레임 형태로 보기 단계의 표. Y(당뇨)가 라벨이 될것이고 나머진 Feature이 될 것이다

# 모델 훈련, 로그, 모델 파일 관리

# 알고리듬/ 평가지표/ 저장 모듈 부르기
from sklearn.linear_model import Ridge
from sklearn.metrics import mean_squared_error
from sklearn.externals import joblib

# 수학적 도구 임포트
import math

# 학습을 시키기 위한 alpha 값 만들기(성능 비교위해)
alphas = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1]

# 테스트
#for alpha in alphas:
#    
#    model = Ridge(alpha=alpha)   
#    model.fit(X_train, y_train)   # 데이터 학습
#    y_pred = model.predict(X_test) # 예측 결과 저장
#    mse = mean_squared_error(y_test, y_pred)   # 오류 저장
#    
#    print('model_alpha={0}, mse={1}'.format(alpha, mse))  # 결과 보기

오류 측정을 rmse로 바꿔서 해주기 (mse에 루트준 값), 실험 로그 남기기 

# 테스트
for alpha in alphas:
    
    #실험의 기록
    run = experiment.start_logging()  # 실험 시작, 로그 시작
    run.log('alpha_value',alpha)        #  로그 기록 항목1
    
    model = Ridge(alpha=alpha) # Ridge 회귀 분석 모델을 만들고,Ridge(alpha=alpha) 부분은 alpha 매개 변수를 사용하여 규제 강도를 지정 
    model.fit(X_train, y_train)   # 데이터 학습
    y_pred = model.predict(X_test) # 예측 결과 저장
    rmse = math.sqrt(mean_squared_error(y_test, y_pred))   # 오류 저장
    
    run.log('rmse', rmse)               # 로그 기록 항목2
    
    print('model_alpha={0}, rmse={1}'.format(alpha, rmse))  # 결과 보기
    
    # 모델을 파일로 저장하는 부분
    model_name = 'model_alpha_' + str(alpha) + '.pkl'  # 파일 이름 정하기
    filename = 'outputs/' + model_name        # 경로 + 모델명
    
    #joblib은 파이썬의 객체 직렬화 라이브러리로서, 메모리에 상주하는 파이썬 객체를 파일 형태로 저장하거나 읽어들이는 기능을 제공
    joblib.dump(value=model, filename = filename)   # 저장명령으로 임시저장(dump), 내용은 모델,저장할 파일의 이름
    
    # Azure ML Service 에 모델 파일을 업로드 하는 부분
    run.upload_file(name=model_name, path_or_stream=filename) 
    
    run.complete()  # 기록끝
    
    print(f'{alpha} experiment completed')

실험 완료

실험이 끝났으면 파일 창 refresh하면 훈련시킨 모델들이 저장된 걸 볼 수 있다

job 에셋 > 당뇨병 실험 들어가기

각각의 실험에 대한 모델들을 볼 수 있다.(Azure ML Service 에 모델 파일을 업로드 하는 부분)

각각의 모델에 들어가면 설정했던 alpha_value과 오류값 측정등을 볼 수 있다.

다시 해당 노트북에서 expriment 치면 리포트 등 볼 수 있다.

expriment

모델 중 가장 best 모델 탐색 후 다운로드(rmse가 가장 낮은 모델)

# Best Model을 탐색 후 다운로드 
minimum_rmse = None            # 오류도
minimum_rmse_runid = None      # 몇번 째 실험인지 인덱스

for exp in experiment.get_runs():          # 실험 돌리기
    run_metrics = exp.get_metrics();       # 평가지표 돌리기
    run_details = exp.get_details();       # 실험 디테일 돌리기(몇번째 실험인지 알기위해 사용하는 듯)

    run_rmse = run_metrics['rmse']        # 평가지표중에 rmse 돌리기
    run_id = run_details['runId']         # 디테일 중 몇번째 실험인지 돌리기

    # 가장 낮은 RMSE 값을 가진 실행 ID를 구하는 부분
    if minimum_rmse is None:             # minimum_rmse가 none일 때
        minimum_rmse = run_rmse          # 평가지표 돌리고
        minimum_rmse_runid = run_id      # minimum_rmse id 도 돌려
    else:
        if run_rmse <  minimum_rmse:      # rmse가 기존 minimum rmse보다 작으면
            minimum_rmse = run_rmse        # 걔가 새로운 minimum으로 대체 
            minimum_rmse_runid = run_id    # id도 같은 이치로 작업

print('Best run_id:  ' + minimum_rmse_runid)
print('Best run_id rmse:  ' + str(minimum_rmse))
# best 파일 이름 확인

from azureml.core import Run 
best_run = Run(experiment=experiment, run_id=minimum_rmse_runid)
print(best_run.get_file_names())

#베스트 모델 파일 다운로드
best_run.download_file(name=str(best_run.get_file_names()[0]))

#이제 파일 목록에 베스트 버전 모델이 다운로드 되어있다.

과정에 오류가 생기면 Jobs에 해당 실험들어가 뭔가 값이 빠지거나 여전히 생성중인 파일이 있는 것인지 확인하고 삭제 재실행한다

 


Data > data store

실험에 관련됐던 데이터 저장하고 관리하는 곳

 

Hierarchical Clustering의 세가지 기준

  • 클러스트의 갯수를 지정할 필요가 없다, 결과를 보고 rate를 조정
  • 접근방법은 세가지로 각각 알아보자
  • 덴드로그램 형태

(1)single linkage - 두 클러스터 내의 가장 가까운 점 사이의 거리를 기준으로 클러스터를 나눈다, 가까운 얘들끼리만 뭉치고 조금 먼 얘들은 왕따시키는 현상이 생김

(2) complete_linkage - 두 클러스트 내의 가장 먼 점의 거리를 기준으로 집단 구함.

(3) Average linakage - 두 클러스트 내에 모든 점 사이의 평균 거리를 내서 집단 구함 => 예제로 사용 x

 

보통은 complete가 제일 잘나옵니다


1. single linkage

# Hierarchical Clustering

from sklearn.cluster import AgglomerativeClustering
single_clustering = AgglomerativeClustering(linkage='single')

single_clustering.fit(data)
single_cluster = single_clustering.labels_
single_cluster             #  결과보니 분별력 없음을 알 수 있다

    출력>
    array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
           0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
           0, 0])
# 산점도
plt.scatter(data[:,0],data[:,1], c=single_cluster)

# n_cluster를 3으로 줬을 때

single_clustering = AgglomerativeClustering(n_clusters=3, linkage='single')

single_clustering.fit(data)
single_cluster = single_clustering.labels_
single_cluster             #  결과보니 분별력 없음을 알 수 있다

plt.scatter(data[:,0],data[:,1], c=single_cluster)


# 저 single이라는 기준 자체가 문제다


1. complete linkage

# complete linkage
complete_clustering = AgglomerativeClustering(n_clusters=3, linkage = 'complete')
complete_clustering.fit(data)
complete_clust = complete_clustering.labels_
complete_cluster # single 보다 변별력 생김을 알 수 있다.
plt.scatter(data[:,0], data[:,1], c = complete_cluster)

 


3. dendrogram으로 나눠지는 과정 이해하기

# 덴드로그램 (dendrogram) - 클러스터가 나눠지는 원인 볼 수 있다.
from scipy.cluster.hierarchy import dendrogram

# hierarchical Cluster의 자식 노드
children = complete_clustering.children_  #_로 끝나는 건 내부속성 이름 뒤에 붙는 경우가 많다.

distance = np.arange(children.shape[0])

# 각 클러스터 단계를 포함한 노드의 수 계산
no_of_observations = np.arange(2, children.shape[0]+2)    #

linkage_matrix = np.column_stack([children, distance, no_of_observations]).astype(float)

# 덴드로그램을 그린다
dendrogram(linkage_matrix, p = len(data), labels = complete_cluster, show_contracted=True, no_labels=True)

덴드로그램에서 x축은 데이터를 나타낸다 총 데이터 수인 178개의 점이 있을 것이다. 
위 과정에서 클러스트를 3개로 나누었음으로 그래프가 3분파로 갈라지는 상위 부분 쯤에서 잘랐을 것이다.
덴드로그램 그룹이 얼마나 잘 나눠져있는지가 분별력이 높다는 뜻

 

1. 모델 만들기

# K-Means 모델 만들기
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters = 3)         # 군집 세가지로 나누겠다.사실 이번 데이터는 high / middle / low로 라벨링 되있기때문에..원래는 이런 데이터는 classification하는 게 나음

kmeans.fit(data)                     # data를 세개의 그룹으로 쪼개갰다, 모델완

2. 만들어진 군집 확인

# 형성된 군집 확인

cluster = kmeans.predict(data)               
cluster  #  세개의 라벨 데이터로 쪼개져 있을 것이다.

    출력>
    array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
           1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
           1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 0, 2, 2, 2, 2,
           1, 2, 2, 2, 2, 1, 2, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2,
           2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
           2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0,
           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
           0, 0], dtype=int32)

3. 군집 시각화

# 형성된 군집 시각화
plt.scatter(data[:,0], data[:,1], c = cluster, linewidth=1, edgecolors='black')   # x좌표는 모든 데이터를 가져오는데 0번, y좌표는 모든 데이터를 가져오는데 1번 이용, data[:5] 이부분에서 사용하는 거 생각하면됨, 군집마다 컬러 나눠주기

+ Recent posts