본문 바로가기
Programming 개발은 구글로/기타 정보

[WEB+AI] 14일차 Embedding(임베딩) + Python

by 40대직장인 2024. 10. 31.

Embedding

 

강사: 이숙번님

 

🟩 통계(Statistics)

  : (이숙번강사님이 생각하는 관점) 거대한 대상이나 복잡한 현상을 이해라고 예측하는 것을 통계라고 한다.

  - 어떤 정보를 가지고 예측으로 결정을 내릴 수 있음.

  - 인간은 관찰과 이해, 예측과 결정의 행동을 함.

 

 ◼️통계의 목적

  1. 기술 통계(이해) - 수집된 데이터의 요약과 설명 

  • 데이터를 한 개의 대표값으로 표현하기
  • 흩어짐의 정도로 데이터 이해하기

  2. 추론 통계(예측) - 기술 통계 결과를 기반으로 일반화, 예측, 추정

  • 모집단을 표본으로 추정해보기
  • 가설을 검증해가며 데이터를 파악해가기

🟪데이터(Data)

   :   문자, 숫자, 이미지 등 다양한 형태로 저장된 정보를 의미한다.

 

  1. 데이터 용어 설명

    - 데이터 기본 용어(1)

  • 행 -> *관측치(Observation)
  • 열 -> 특징(feature), 변수(variable)

 

  * 관측치(Observation)

    : 데이터셋에서 각 행이 나타내는 개별 데이터 포인트입니다.

 

    -  데이터 기본 용어(2)

  • 범주형: 카테고리를 나눔
    • 명목형 / 순서형

  • 수치형: 수량을 의미함
    • 연속형 / 이산형

 

    - 데이터 기본 용어(3)

  • 독립변수 -> 원인이 되는 열
  • 종속변수 -> 결과가 되는 열

 

  * 변수(Variable)

    : 데이터의 특성을 설명하는 속성

 

    - 데이터 기본 용어(4): 데이터 공간

  • 변수의 개수만큼 공간의 축(=차원)이 생성
  • 관측치의 개수만큼 공간에 점으로 표현

 

    - 데이터 기본 용어(5): 데이터 공간

  • 변수 N개 -> N차원의 데이터 공간 이용
  • 관측치 K개 -> 데이터 공간에 K개의 점 표시

 

 

 


데이터 포인트로 표현하면 

  • 데이터 간의 거리를 잴 수 있다. 
    • 비슷한 데이터와 서로 구분되는 관측치를 정밀하게 측정. 
  • 데이터의 분포를 확인할 수 있다.
    • 데이터를 이해한 것.
    • 그럴 듯한 데이터를 생성할 수 있다. 

 


 

  - 벡터 (Vector)

  : 벡터는 데이터의 특징을 여러 차원에서 수치화하여 하나의 구조로 표현한 것

 

  - 데이터 포인트의 표현: 데이터는 개별 속성들로 구성되며, 이 속성들을 숫자로 표현할 때 벡터로 나타낼 수 있습니다.

    예를 들어, 사람의 키와 몸무게라는 두 속성을 가진 데이터 포인트는 [170,65][170, 65]라는 2차원 벡터로 표현될 수 있습니다.

 

 

  - Feature Engineering

  : 변수의 추가와 추출, 선택

 

  - 변수를 잘 선택하면

  • 의미있는 데이터 분석을 할 수 있다. 
  • 머신러닝 모델 성능이 좋아진다

 


 

  좋은 데이터 분석가는 Feature Engineering을 잘하는 사람.

  좋은 머신러닝 엔지니어는 Feature Engineering을 잘하는 사람.


 

 

임베딩 (Embedding)

  • 특정 잠재공간 (Latent space)에 의미 있는 벡터화(Vector)하는 것이다. 
  • 특징을 새로 만들고 선정하는 과정이 임베딩과 유사한 개념이다. 
  • 좋은 임베딩 함수는 보다 의미있는 잠재공간에 벡터를 만든다.
  • 딥러닝은 “특징 자동 추출기”로써 좋은 임베딩 함수이다. 

 

  - 데이터 임베딩(Embedding)

  • 복잡한 데이터를 보다 단순하고 핵심적인 형태로 변환
  • 차원 축소 + 중요한 특징과 패턴 보존
  • 특정 특징으로 표현되는 잠재 공간으로 표시하는 것 

 

 

 

 

  • 특징을 잘 선정했다면, 비슷한 것끼리 가깝고 다른 건 멀리 표현.
  • 분포를 알면 새로운 데이터에 대해서 설명할 수 있다. 
  • 분포를 알면 임의로 그럴 듯한 데이터를 생성할 수 있다. 

 


 

  - 임베딩 함수 사용

!pip install openAI

 

from openai import OpenAI

client = OpenAI(api_key = key) # openai key 입력

response = client.embeddings.create(
    input="안녕하세요. 오늘은 임베딩을 배우는 날입니다.",
    model="text-embedding-3-small"
)

print(response.data[0].embedding)
print(len(response.data[0].embedding))

 

 


 

Python

 

  - 문자열 f-string

이름, 지역 = "이숙번", "통영"

print(f"{이름}님은 {지역}에 살아요") # f-string
print("{0}님은 {1}에 살아요".format(이름, 지역)) # format method 방식
print("%s님은 %s에 살아요" % (이름, 지역)) # % 방식(거의 안씀)

 

 

  - 문자(열)은 리스트의 특징을 가진다.

nums = list(range(10))

print(nums)
print(nums[0])
print(nums[-1])
print(nums[3:6])
print(1 in nums)
print([1, 2, 3] in nums)
print(100 in nums)

str_nums = "0123456789"
print(str_nums)   
print(str_nums[0])   
print(str_nums[-1])   
print(str_nums[3:6])
print("1" in str_nums)
print("123" in str_nums)
print("100" in str_nums)   

# 결과
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
0
9
[3, 4, 5]
True
False
False
0123456789
0
9
345
True
True
False

 

nums = list(range(10))

print(nums)
print(nums[::2])
print(nums[::-1])

str_nums = "1234567890"
print(str_nums)   
print(str_nums[::2])   
print(str_nums[::-1])

# 결과
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 2, 4, 6, 8]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
1234567890
13579
0987654321

 

 

  - 구구단 만들기

# 1
num = int(input("숫자를 입력하세요."))

for i in range(1, 10):
  print(f"{num} x {i} = {num * i}")
  
  
# 2 데이터를 생성하는 시점과 사용하는 시점을 분리
num = int(input("숫자를 입력하세요."))

gugu = []
for i in range(1, 10):
  gugu.append(f"{num} x {i} = {num * i}") 
  
print("\n".join(gugu)) # 구구단 사이에 줄바꿈 추가

# 3 리스트 컴프리헨션
gugu = [f"{num} x {i} = {num * i}" for i in range(1, 10)]
print("\n".join(gugu))
->
print("\n".join([f"{num} x {i} = {num * i}" for i in range(1, 10)]))

 

 

# 문자열 분리
menu.split(',')

 

 

  - 시간 계산기

a = "23:40"
b = "08:30"

ah, am = a.split(":")
bh, bm = b.split(":")

sm = (int(am) + int(bm)) % 60
oh = (int(am)+ int(bm)) // 60
sh = (int(ah)+ int(bh) + oh) % 24      


print(f"{sh}:{sm}")

 

  - 가사에 있는 각 문자의 갯수(count) 확인

가사 = """
아파트 아파트
아파트 아파트
아파트 아파트
Uh, uh huh uh huh
Kissy face, kissy face
Sent to your phone but,
I'm trying to kiss your lips for real
Red hearts, red hearts
That's what I'm on yeah
"""

가사 = 가사.lower()
words =  가사.split()

for w in set(words):
  print(f"{w} : {words.count(w)}")

 

 

  - 가사에서 가장 많이 등장하는 세 단어와 빈도수를 찾기

가사 = """
아파트 아파트
아파트 아파트
아파트 아파트
Uh, uh huh uh huh
Kissy face, kissy face
Sent to your phone but,
I'm trying to kiss your lips for real
Red hearts, red hearts
That's what I'm on yeah
"""

가사 = 가사.lower()
words =  가사.split()

fir_w, fir_c = "", 0 # 가장 많이 등장하는 단어와 빈도수 저장
sec_w, sec_c = "", 0 # 두 변째로 많이 등장하는 단어와 빈도수 저장
thi_w, thi_c = "", 0 # 세 번째로 많이 등장하는 단어와 빈도수 저장

for w in set(words):
  if fir_c < words.count(w):
    thi_w, thi_c = sec_w, sec_c
    sec_w, sec_c = fir_w, fir_c    
    fir_w, fir_c = w, words.count(w)
  elif sec_c < words.count(w):
    thi_w, thi_c = sec_w, sec_c
    sec_w, sec_c = w, words.count(w)
  elif thi_c < words.count(w):
    thi_w, thi_c = w, words.count(w)  

print(f"{fir_w}({fir_c})")
print(f"{sec_w}({sec_c})")
print(f"{thi_w}({thi_c})")

# 결과
아파트(6)
red(2)
to(2)

# 풀이
set(words): 중복을 제거한 단어 집합을 생성 - 가사에서 중복되는 단어를 제거하여 고유한 단어만 남음

예제) words = ["apple", "banana", "apple", "cherry", "banana", "apple", "cherry", 
"banana", "cherry", "cherry"]가 있다면, "apple":3 ,"banana": 3, "cherry": 4 의 빈도를 가짐
 
 w = 'apple' 
 'apple'은 빈도수가 3으로 fir_c < words.count(w)가 fir_c(초기 값: 0) < 3보다 작음
 'apple'을 
 이때 thi_w, thi_c = sec_w, sec_c sec_c, sec_w = fir_c, fir_w 는 의미 없음
 fir_w에 'apple' fir_c에 3을 저장함.
 
 w = 'banana'
 'banana'는 빈도수가 3으로 fir_c < words.count(w) 3 < 3을 만족하지 않으나,
  elif sec_c < words.count(w): 0 < 3을 만족함
  sec_w에 'banana'를 sec_c에 3을 저장함
  
  w = 'cherry'
  'cheery'는 빈도수가 4로 fir_c < words.count(w) 3 < 4를 만족함
    thi_w, thi_c = sec_w, sec_c       # 'banana' 값을 thi_w, thi_c에 저장함
    sec_w, sec_c = fir_w, fir_c       # 'apple' 값을 sec_w, sec_c에 저정함
    fir_w, fir_c = w, words.count(w)  # 'cheery' 값을 fir_w, fir_c에 저장함

 

 

  - sorted()를 사용하여 순서대로 정렬

가사 = 가사.lower()
words =  가사.split()

word_count = [[words.count(w), w] for w in set(words)]
word_sorted = sorted(word_count, reverse=True)
# word_sorted = sorted(word_count)[::-1]
print(word_sorted[:5])

# 결과
[[6, '아파트'], [2, 'your'], [2, 'uh'], [2, 'to'], [2, 'red']]

 

 

  - 야구 게임

import random
numbers = list("1234567890")
random.shuffle(numbers) # numbers의 숫자를 임의로 섞음
answers = numbers[:3] # 랜덤으로 섞인 숫자의 앞자리 3자리를 answers에 저장

strike = 0
while strike < 3:
    inputs = input("세자리 숫자를 입력하세요.\n")
    strike = sum([c1 == c2 for c1, c2 in zip(inputs, answers)])
    ball = sum([c1 in answers for c1 in inputs ]) - strike
    print(f"{strike} 스트라이크 {ball} 볼")

print("정답입니다.")

# 결과(answers '153')
input '123'인 경우 2 strike 0 ball
input '542'인 경우 0 strike 1 ball (자리수가 같은 건 없으나, 5가 '153'에 포함됨)

# 풀이
strike = sum([c1 == c2 for c1, c2 in zip(inputs, answers)])
zip(inputs, answers): 각 자리의 수를 쌍으로 묶어줌
input이 '123' 이고, answers가 '153'인 경우 ('1', '1'), ('2', '5'), ('3', '3') 임
c1 == c2 가 같냐는 질문에 따르면, [True, Falase, True]로 sum은 True가 2개이므로 2임.

ball = sum([c1 in answers for c1 in inputs ]) - strike
c1 in answers: input 값 '123'이 answers '153'에 포함되는 지 확인
input 1 은 answers '153'에 포함됨 - True
input 2 는 answers '153'에 포함되지 않음. - False
input 3 은 answers '153'에 포함됨 - True
sum은 True가 2개이므로 2임. 여기서 strike 숫자를 빼줘야 함. 2 - 2 = 0

 

 


 

참고로, 비즈니스에 자주 쓰이는 정성적 목표와 정량적 목표 정리

1. 정성적 목표 (Qualitative Goals)

  • 정성적 목표는 수치화하기 어려운 목표로, 주로 경험, 감정, 인식, 태도와 같은 비수치적 요소를 강조합니다.
  • 특징: 구체적인 숫자보다는 방향성과 가치, 질적인 성취를 추구하는 경우에 사용됩니다.
  • 예시:
    • "고객 만족도를 높이기"
    • "팀 내 협력을 강화하기"
    • "브랜드 인지도를 개선하기"
  • 측정 방식: 만족도 조사, 인터뷰, 피드백 수집 등으로 성취도를 평가할 수 있습니다.
  • 활용 사례: 기업 문화 개선, 리더십 개발, 브랜드 이미지 구축 등에서 많이 활용됩니다.

2. 정량적 목표 (Quantitative Goals)

  • 정량적 목표는 수치화하여 구체적으로 측정할 수 있는 목표입니다.
  • 특징: 달성 여부를 명확하게 판단할 수 있는 수치나 기준을 설정하여 목표를 정의합니다.
  • 예시:
    • "연매출 10% 증가 달성하기"
    • "고객 이탈률 5% 이하로 낮추기"
    • "신규 고객 1,000명 유치하기"
  • 측정 방식: 통계적 분석, 데이터 수집, KPI 평가 등을 통해 구체적으로 성취도를 평가할 수 있습니다.
  • 활용 사례: 매출 증가, 생산성 향상, 비용 절감 등 명확한 성과 목표를 설정할 때 많이 사용됩니다.

 


출처: AI Hub 교육과정 - WEB+AI (위 내용이 문제가 된다면 댓글에 남겨주세요. 바로 삭제조치하도록 하겠습니다.)

 

댓글