https://moonjae.tistory.com/35

 

[Paper] Large Language Models Are Zero-Shot Reasoners

29 Jan 2023 논문

moonjae.tistory.com

0 shot CoT는 여기 리뷰했어요!

만관부..

회사 세미나 준비하면서 개인적으로 해본 결과인데

뭐.. 저는 멍청이라 좀 좋은 프롬프트가 생각이 안 나네요

 

'Study > NLP' 카테고리의 다른 글

[RAG] RAG 성능 끌어올리기  (0) 2024.07.23
Pandas 기초와 활용  (0) 2023.09.07
Numpy 기초와 선형 대수에서의 Numpy 함수  (0) 2023.09.04

 

흠.. K의 갯수를 다르게 해서 성능 차이 났던걸 무시했네요.. ㅠ

1. Pandas

  • 데이터 분석과 처리를 위한 라이브러리
  • numpy와 같이 행과 열에 대해서 다루지만 numpy는 수치 분석등에 유용하고 pandas는 데이터들의 처리에 유용하다
  • pandas의 강점은 데이터 탐색에 있다
  • pandas 자료구조에는 1차원 - Series, 2차원 - DataFrame, 3차원 - Panel 등이 있다

2. Pandas 사용하기

import pandas as pd

3. Pandas로 1차원 데이터 다루기 - Series

  • 1차원적인 데이터 집합이다
s = pd.Series([1,4,9,16,25])
  • 딕셔너리도 호환이 가능하다
t = pd.Series({'one': 1, 'two': 2, 'three':3})

4. Series + Numpy 

  • Seires는 ndarray와 유사하다
print(s[1]) #pandas 인덱싱
print(t[1])
print(t[1:3]) #pandas 슬라이싱
  • numpy와 다르게 조건을 추가하기 쉽다.
#자신의 중앙값보다 큰 값만 가지고 오기

s[s > s.median()]
  • numpy와 호환 가능하다
import numpy as np

#자연상수 e의 s제곱 값
np.exp(s)

5. Series + dict

  • series는 dict과도 유사하다
print(t['one'])
  • series에 값 추가
t['six'] = 6
  • dic_series에서 요소 찾기
print(t['six'])

#딕셔너리와 마찬가지로 없는 값 접근 불가
#print(t['seven'])

#없는 값 가져오기
#값이 없으면 2번째 인자를 가져옴

print(t.get('seven', 0))

6. Series에 이름 붙이기

  • 'name' 속성을 가지고 있다
  • 처음 Series를 만들 때 이름을 붙일 수 있다
s = pd.Series(np.random.randn(5), name = 'rand_num')
print(s)
print(s.name)

7. DataFrame

  • 2차원 데이터
d = {'height':[175,173,169,183], 'weight':[60, 78, 65, 84]}

df = pd.DataFrame(d)

df

8. CSV에서 DataFrame으로 옮기기

  • csv -> dataframe화 하는 함수 존재
  • .read_csv()를 이용
  • https://www.kaggle.com/datasets/imdevskp/corona-virus-report  사용된 CSV
 

COVID-19 Dataset

Number of Confirmed, Death and Recovered cases every day across the globe

www.kaggle.com

covid = pd.read_csv('파일의 위치')

print(covid)
  • 일부분만 관찰하기
N = 5
#위에서부터 N개 관찰하기
print(covid.head(N))
#아래서부터 N개 관찰하기
print(covid.tail(N))
  • 데이터 접근하기
    •  df['column_name']  or df.column.name
print(covid['Active'])
print(covid.Active)
print(covid['Active'][1:5])
  • 조건을 이용해서 데이터 접근하기
# 신규 확진자가 10이하인 나라를 찾아보기

covid[covid['New cases']<10]

# WHO 지역이 동남아인 나라 찾기

print(covid['WHO Region'].unique()) #중복 되지 않는 지역의 목록 살펴보기

covid[covid['WHO Region'] == 'South-East Asia']
  • 인덱스를 통해 가져오고 싶으면 loc=key, iloc = index를 통해 가져올 수 있다

9. Groupby

  • 일정한 조건으로 묶는 방법
  • Groupby 과정
    • Split : 특정한 "기준"을 바탕으로 DataFrame을 분할
    • Apply : 통계함수 - sum(), mean(), median()을 적용해서 각 데이터 압축
    • Combine: Apply된 결과를 바탕으로 새로운 Series 생성
# WHO Region별 확진자 수 구하기

#split
covid_by_region = covid['Confirmed'].groupby(by = covid['WHO Region'])

#Apply
covid_by_region_sum = covid_by_region.sum()
print(covid_by_region_sum)

#Combine
covid_by_region_sum_df = pd.DataFrame(covid_by_region_sum)
print(covid_by_region_sum_df)

10. 데이터 병합

  • merge(가로 병합), concat(세로 병합)을 사용
user = pd.DataFrame({'id':[1,2,3,4], 'name' = ['재문', '민준', '영희', '철수']})

game = pd.DataFrame({'id':[1,2,3,4], 'name' = ['LOL','PUBG','DarkSoul','발더게3', 'Play_User' = [1,3,2,2]}

new_user = pd.DataFrame({'id':[5,6], 'name' = ['창수', '호야']})

# 세로로 합치기 = append, concat
# ignore_index를 통해 새로 인덱스 지정 가능

new_user_set = user.append(new_user, ignore_index = True)
print(new_user_set)

new_user_set2 = pd.concat([user,new_user], ignore_index = True)
print(new_user_set2)

#가로로 합치기 = merge
#기준 열 이름이 같을 때 on = 기준열, how = join 방식
#기준 열 이름이 다를 때 left_on = 왼쪽 열, right_on 오른쪽 열 
ans = game.merge(user, left_on = 'rent_user', right_on = 'id')
  • suffixes = 병합할 객체들간 이름이 중복되는 열이 있을 때, 해당 열에 붙일 접미사 설정
ans = game.merge(user, left_on = 'rent_user', right_on = 'id',suffixes=('','_user'))
  • drop을 통해 해당 열을 날릴 수 있음
#axis = 0 가로 axis = 1 세로
ans.drop('id_user' ,axis = 1)

 

더 다양한 기능은: https://wikidocs.net/151740 여기에 많이 적혀 있네요 

  • Numpy
    • Numpy는 는 벡터 및 행렬 연산에 있어서 매우 편리한 기능을 제공하는 파이썬 라이브러리이다
  • 넘파이 기본 사용 예제
    • 배열을 np.array()로 선언
import numpy as np

#기본 배열 선언
A = np.array([[1,2],[2,3]])

#넘파이 베열의 수 확인 = np.shape()
print(np.shape(A))
  • 벡터와 스칼라 연산
#벡터 스칼라 연산

x = np.array([1])
y = 3

print("스칼라 벡터 덧셈 {}".format(x+y))
print("스칼라 벡터 곱셈 {}".format(x*y))
  • 벡터와 벡터의 연산
    • 벡터와 벡터의 연산에서의 주의 사항은 행과 열이 같아야 재대로 된 연산이 가능하다
    • 추후에 나올 브로드캐스팅이 있는데 그건 추후에 기술
#벡터 벡터 연산
#벡터 연산은 행과 열이 모두 일치할 때 가능

x = np.array([1,2,3])
y = np.array([4,5,6])

print("스칼라 벡터 덧셈 {}".format(x+y))
print("스칼라 벡터 곱셈 {}".format(x*y))
  • 넘파이의 인덱싱과 슬라이싱
    • 기본적으로 파이썬과 같지만 2차원 이상 일 때 대괄호 연속해서 치는 python코드와 달리 한 대괄호 내에서 처리한다
#파이썬 indexing과 유사

x = np.array([[1,2,3,4],[2,3,4,5],[4,5,6,7]])

print(x[0,0])
print(x[1,2])

#파이썬 Slicing과 유사

x = np.array([[1,2,3,4],[2,3,4,5],[4,5,6,7]])

print(x[0:2, 0:2])
print(x[0:2])
  • 넘파이의 브로드캐스팅
    • 행과 열과 같은 길이가 아니면 연산이 원하는 대로 안 나올 수 있는데 이를 해결하기 위해 브로드캐스팅을 넘파이에서 해준다
    • 브로드캐스팅이란  피연산자를 복제해 같은 data type으로 변형 시킬 수 있으면 복제해서 연산을 실행하는 것이다
    • 예를들어 [[1,2],[1,1]]에 [0,1]을 더하면 1열 뿐만 아니라 2열도 [0,1]과의 연산을 하는 것이다
#Array Broadcating은 피연산자를 복제해 같은 data type으로 변형 시킬 수 잇으면 그리한대요~~

#열 복사
a = np.array([[1, 2, 3], [4,5,6], [7,8,9]])
x = np.array([0,1,0])

x = x[:, None] #x를 전치

print(a+x)

#행 복사
a = np.array([[1, 2, 3], [4,5,6], [7,8,9]])
x = np.array([0,1,-1])

print(a*x)

 

 

  • 영 벡터(행렬)
    • 모든 원소의 값이 0인 벡터(행렬)
    • 'np.zeros(dim)'을 통해 생성 / dim은 값, 혹은 튜플(,)
    • 일벡터도 동일하게 ones통해 생성
print(np.zeros(3))

print(np.zeros((3,3,3)))

print(np.ones(3))
  • 대각행렬
    • main diagonal을 제외한 성분이 0인 행렬
    • 'np.diag'(main_diagonal <- tuple)을 통해 생성
print(np.diag((2, 4)))

print(np.diag((1,3,5)))
  • 항등 행렬
    • main diagonal이 1인 대각 행렬
    • 'np.eye(length, dtype = type)'을 통해 생성
    • dtype의 default = float
print(np.eye(3, dtype = int))
  • ★ 행렬곱
    • 행렬 곱은 n * r , r * m 일때 r이 서로 같아야 연산 가능
    • 행렬의 곱은 * 기호가 아니라 @를 통해 연산한다
    • 'A.dot(B)'로도 사용 가능 단 3차원이상은 @ 과 dot은 다르게 연산 된다
A = np.array([[1, 2], [3,5]])
B = np.array([[1, 3], [2,4]])

print(A.dot(B))
print(A @ B)
  • trace
    • Main diagonal의 합
    • 'np.trace()'사용
A = np.array([[1,2,5],[2,4,1]])

print(A.trace())
print(np.eye(2, dtype = int).trace())
  • 행렬식
    • 행렬을 대표하는 값들 중 하나 -> 선형 변환
    • 'np.linalg.det()'으로 계산
arr_3 = np.array([[1,4,7],[2,5,8],[3,6,9]])

print(np.linalg.det(arr_3))
  • 역행렬
    • A에 대해 AB = BA를 만족하는 행렬
    • 'np.linalg.inv()'로 계산
arr_2 = np.array([[1, 2], [3, 5]])
arr_inv = np.array([[1, 2], [3,5]])
print(arr_inv)

#검증
print(arr_2 @ arr_inv)
  • 고유값과 고유벡터
    • 정방행렬 A에 대해 Ax(\lambda)x를 만족하는 상수 (\lambda)와 이에 대응되는 벡터
    • 'np.linalg.eig()'로 계산
mat = np.array([[2, 0, -2], [1, 1, -2], [0, 0, 1]])

print(mat)

print(np.linalg.eig(mat))

#검증
eig_val , eig_vec = np.linalg.eig(mat)

print(mat @ eig_vec[:, 0]) # Ax

print(eig_val[0] * eig_vec[:,0])# (lambda)x
  • Norm
    • Norm 은 벡터의 크기(혹은 길이)를 측정하는 방법
    • L1 Norm: 각 벡터의 원소의 절대값들의 합
    • L2 Norm: 각 벡터를 잇는 선분의 길이
def get_L2_norm(arr):
  return np.linalg.norm(arr)

A = np.array([1,2,3,4,5])

print(get_L2_norm(A))
  • 특이 행렬
    • 역행렬이 존재하지 않는 행렬
    •  역행렬이 존재하지 않기 위해서는 행렬식(Determinant)이 0이 되어야 한다.
def singular_matrix(arr):
  return True if np.linalg.det(arr) == 0 else False

A = np.array([[1,4,0],[2,5,0],[3,6,0]])

print(singular_matrix(A))

'Study > NLP' 카테고리의 다른 글

[prompt] 0 shot CoT를 한국어 버전으로 해보자  (0) 2024.09.10
[RAG] RAG 성능 끌어올리기  (0) 2024.07.23
Pandas 기초와 활용  (0) 2023.09.07

+ Recent posts