Docker

-컨테이너를 만드는 작업등을 한다.(containerization)
-docker를 사용하는 이유는 환경 때문 : 어떤 프로그램을 만들어서 배포하면 환경이 안맞아 실행이 안되는 경우가 많다.

-파일 형태로 저장된 도커를 우리는 docker image라고 부른다
-도커 이미지로 os, bin , 라이브러리, 앱 등을 세팅을 한다.그 후 저장해서 배포한다.

 

도커의 탄생

(1) 도커 이전 : 일반적인 가상화 기술만을 사용했다. 가상화 기술은 하이퍼바이저를 사용하여 물리적 서버에서 여러 개의 가상 머신을 실행할 수 있게 해주는 기술이다. 이러한 기술을 사용하여 클라우드 서비스도 개발됐다. 또한 grid computing 개념도 소개되었는데, 이는 여러 대의 작은 컴퓨터를 하나로 묶어 하나의 대규모 컴퓨터 시스템으로 사용하는 것이다. 가상화 기술을 사용하여 필요한 수만큼 가상 머신을 만들어내어 이를 구현할 수 있다. 마지막으로 애저(Azure)는 클라우드 컴퓨팅 플랫폼으로, 이러한 가상화 기술을 기반으로 만들어졌다.


(2)이렇게 사용하다보니 리소스 낭비가 심하고 그 용도보다는 우리 시스템에 최적화되어있기를 원하게 됐다. 그래서 리눅스 서버에서 docker엔진이라는 것이 나옴. 리눅스에서는 os 버전 마다 미세하게 다른데 차이점들이 있는데 (실행파일[bin]이나 라이브러리 등등이 조금씩 다르다) 이걸 어떻게 잘 활용할 수없을까? 해서 도커 기술을 만드는데 os가 full로 들어가는 게 아닌 각 os간의 차이점만 들어가 컨테이너 하나하나가 작고 가볍다. 그러니까 이 컨테이너를 통째로 던지면 이 안에 모델파일과 파이썬 버전 파일과 numpy, pandas같은 모듈의 버전 등등이 다 들어간다. 그래서 docker는 즉 실행할 수 있는 환경자체까지도 던지는 것이다. 도커를 만드는 과정은 dockerization이라고 한다.

 

무료로 컨테이너 제공해주는 회사

https://ide.goorm.io/

로그인하고 새컨테이너 누르고 컨테이너 만들기

만들어진 컨테이너 들어가서 리눅스 명령어 쳐보기

pwd = 내경로 보기... clear = 화면 정리 apt-get은 우분투에서 필요한걸 install할 때 쓰는 명령어

 

그러나 다음 예제부터 사용하지 않음

'Linux' 카테고리의 다른 글

Docker(4) vi 에디터를 이용해서 docker 만들기  (0) 2023.05.02
Docker(3) vi editor 기본  (0) 2023.05.01
Docker(2) 설치 및 기본 사용, vi 편집  (0) 2023.05.01
리눅스의 셸, 파일 디렉토리  (1) 2023.04.28
Linux os 시작  (0) 2023.04.27

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] 이부분에서 사용하는 거 생각하면됨, 군집마다 컬러 나눠주기

1. 데이터 임포트 후 데이터프레임 형태로 바꾸기

# 라벨 있으면 군집은 웬만하면 안쓰는 게 좋다, 

# 기본 모듈 임포트

# 모듈 임포트
import numpy as np
import pandas as pd
import sklearn
import matplotlib.pyplot as plt

import warnings
warnings.filterwarnings('ignore')

#파일 임포트

import os 
from os.path import join
from sklearn.datasets import load_wine

# 메모리에 올리기
wine = load_wine()

# 와인 데이터 확인
print(wine.DESCR)
# 데이터 가져오기

data = wine.data
label = wine.target
columns = wine.feature_names

# 데이터 사용하기 쉽도록 pandas 데이터 형태로

data = pd.DataFrame(data, columns = columns)
data.head()

2. 전처리

# 데이터 전처리
# 1. 값이 너무 들쭉날쭉하니 min-max scaling으로 값을 맞춰주기
# 2. 데이터 항목 수 만큼 차원이 생기니 (차원은 높고 데이터 갯수는 172개로 적어 데이터의 밀도가 낮아 특성뽑기 힘들다)-차원의 축소

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
data = scaler.fit_transform(data)
# fit transform 이후 numpy 배열로 바뀜
data[:5]    

#여전히 데이터 갯수는 적고 항목은 많다.


#그러니 차원의 축소 필요
from sklearn.decomposition import PCA 
pca = PCA(n_components=2)   # 차원의축소는 보통 2차원으로 많이 축소
data = pca.fit_transform(data)

# 확인
data[:5]

# 최종적으로 만들어진 데이터의 모양
data.shape

    출력>
    (178, 2)

 

cost function은 모델의 예측과 실제값 간의 차이를 측정하고, w와 b라는 매개변수 값을 최적화하여 훈련 데이터에 가장 적합한 직선을 찾는 데 사용된다. w와 b 값을 조절하여 다양한 직선을 만들 수 있으며, cost function J을 사용하여 예측값과 실제값 간의 차이를 측정할 수 있다. J은 w와 b의 값을 최소화하는 것이 목표이다.


linear regression model 에서 w와 b의 값을 최적화하는 방법에 대한 예시

 

 

간단한 모델에서는 w값만 최적화하며, 이 경우 J은 w의 함수이다. w값이 변화함에 따라 f(x)와 J의 그래프도 변화하게 된다.

'machine_learning > [coursera] Machine learning' 카테고리의 다른 글

Cost function formula  (0) 2023.04.29
Linear regression model part 2  (0) 2023.04.29
Linear regression model part 1  (0) 2023.04.29
Jupyter Notebooks  (0) 2023.04.27
Unsupervised learning part 2  (0) 2023.04.27

머신러닝의 기초 - 선형 회귀 한 번에 제대로 이해하기 (30분만 투자해봐요!) - YouTube

이해 도움되는 유투브

 

 

Cost function

모델이 얼마나 잘 작동하는지 보고 더 보완할 수 있다.

학습 알고리즘이 모델의 예측과 실제 값의 차이를 평가하는 방법.


f(x) = wx + b 함수로 돌아가보자.

함수는 아래와 같이 작동한다.

 

그런데 linear model을 학습시킬 때 많은 m(총 x⒤,y⒤ 쌍의 합)중에서서 어떻게 함수 안에 들어갈 w,b 값을 정하게 되는 것일까? 이를 위해 cost function을 알아야 한다. 이제 편의성을 위해 n⒤를 n^i로 대체하여 쓰겠다.

 

(1) y-hat^i에서 y^i의 값을 뺀다 (=error)

(2) error의 값을 제곱한다.

(3) 모든 training set에서의 error 정도를 알기 위해 1부터 시작하는 i의 모든 수(m)를 합한 값을 곱해준다

(4)  다시 1/2m 사이즈로 줄여준다

 

 

이 방식은 squared error cost function이라 부른다.


 

Q. The cost function used for linear regression is


Which of these are the parameters of the model that can be adjusted?

 

 

'machine_learning > [coursera] Machine learning' 카테고리의 다른 글

Cost function intuition  (0) 2023.04.29
Linear regression model part 2  (0) 2023.04.29
Linear regression model part 1  (0) 2023.04.29
Jupyter Notebooks  (0) 2023.04.27
Unsupervised learning part 2  (0) 2023.04.27

+ Recent posts