안경잡이개발자

728x90
반응형

  파이썬(Python)에서 Pandas 라이브러리를 제대로 활용하기 위해서는 다양한 연산 방법과 함수에 대해서 알고 있어야 합니다.


※ 데이터 프레임의 NULL 여부 확인 ※


  NULL 여부를 확인할 때는 isnull() 혹은 notnull() 함수를 사용할 수 있습니다. 현실 세계의 다양한 데이터는 존재하지 않는 경우도 있기 때문에 NULL 값에 대한 체크가 필요합니다. 또한 fillna() 함수를 이용해서 NULL 값을 다른 값으로 치환할 수 있습니다.


import numpy as np
import pandas as pd

word_dict = {
    'Apple': '사과',
    'Banana': '바나나',
    'Carrot': '당근',
    'Durian': '두리안'
}

frequency_dict = {
    'Apple': 3,
    'Banana': 5,
    'Carrot': np.nan,
    'Durian': 2
}

importance_dict = {
    'Apple': 3,
    'Banana': 2,
    'Carrot': 1,
    'Durian': 1
}

word = pd.Series(word_dict)
frequency = pd.Series(frequency_dict)
importance = pd.Series(importance_dict)

summary = pd.DataFrame({
    'word': word,
    'frequency': frequency,
    'importance': importance
})

print(summary.notnull())
print(summary.isnull())
summary['frequency'] = summary['frequency'].fillna('데이터 없음')
print(summary)


※ Series 자료형의 연산 ※


  Series 자료형은 사칙연산을 수행할 수 있습니다. 이 때 NULL 데이터는 어떻게 처리할지의 여부도 결정할 수 있습니다.


import pandas as pd array1 = pd.Series([1, 2, 3], index=['A', 'B', 'C']) array2 = pd.Series([4, 5, 6], index=['B', 'C', 'D']) array1 = array1.add(array2, fill_value=0) print(array1)


※ Data Frame 자료형의 연산 ※


  Series 자료형을 여러 개 묶은 형태인 Data Frame도 당연히 사칙연산을 수행할 수 있습니다. 저는 2차원 배열 형태를 Data Frame으로 변환하여 연산을 수행해보았습니다. Data Frame 변수인 array1에서는 원래 (0, 2) 위치에 데이터가 존재하지 않았으므로 여전히 NaN으로 처리됩니다. 다만 array1에 더해지는 array2에서 존재하지 않는 데이터는 0으로 치환됩니다.


import pandas as pd

array1 = pd.DataFrame([[1, 2], [3, 4]], index=['A', 'B'])
array2 = pd.DataFrame([[1, 2, 3], [4, 5, 6], [7, 8, 9]], index=['B', 'C', 'D'])

print(array1)
print(array2)

array1 = array1.add(array2, fill_value=0)
print(array1)


※ Data Frame의 집계 함수 ※


import pandas as pd

array1 = pd.DataFrame([[1, 2], [3, 4]], index=['A', 'B'])
array2 = pd.DataFrame([[1, 2, 3], [4, 5, 6], [7, 8, 9]], index=['B', 'C', 'D'])

array1 = array1.add(array2, fill_value=0)
print(array1)
print("컬럼 1의 합:", array1[1].sum())
print(array1.sum())


※ Data Frame의 정렬 함수 ※


  데이터 프레임의 특정한 컬럼으로 정렬을 수행할 수도 있습니다.


import numpy as np import pandas as pd word_dict = { 'Apple': '사과', 'Banana': '바나나', 'Carrot': '당근', 'Durian': '두리안' } frequency_dict = { 'Apple': 3, 'Banana': 5, 'Carrot': 1, 'Durian': 2 } importance_dict = { 'Apple': 3, 'Banana': 2, 'Carrot': 1, 'Durian': 1 } word = pd.Series(word_dict) frequency = pd.Series(frequency_dict) importance = pd.Series(importance_dict) summary = pd.DataFrame({ 'word': word, 'frequency': frequency, 'importance': importance }) summary = summary.sort_values('frequency', ascending=False) print(summary)



728x90
반응형

728x90
반응형

  판다스(Pandas)는 파이썬(Python) 라이브러리 중 하나로서 데이터를 효과적으로 처리하고 보여줄 수 있도록 도와줍니다. 또한 Numpy와 함께 사용되어 다양한 연계 기능을 제공합니다. 판다스의 기본 자료형 중 하나로는 시리즈(Series)가 있습니다. 이는 Numpy 배열과 흡사하지만 인덱스(Index)를 제공한다는 점에서 사전(Dictionary) 자료형에 가깝습니다. 이를 이용해 인덱스로 특정한 데이터에 바로 접근할 수 있습니다.


import pandas as pd array = pd.Series(['사과', '바나나', '당근'], index=['a', 'b', 'c']) print(array['a'])


  사전과 흡사하게 동작한다는 점에서 파이썬(Python)의 사전(Dictionary)를 판다스 객체로 만들 수 있습니다.


import pandas as pd

dict = {
    'a': '사과',
    'b': '바나나',
    'c': '당근'
}

array = pd.Series(dict)
print(array['a'])


※ 데이터 프레임(Data Frame) ※


  데이터 프레임은 Pandas에서 다수의 Series 데이터를 모아 처리하는 목적으로 사용할 수 있습니다. 일반적으로 표 형태로 특정한 데이터를 출력하고자 할 때 간단히 사용할 수 있습니다.


import pandas as pd

word_dict = {
    'Apple': '사과',
    'Banana': '바나나',
    'Carrot': '당근'
}

frequency_dict = {
    'Apple': 3,
    'Banana': 5,
    'Carrot': 7
}

word = pd.Series(word_dict)
frequency = pd.Series(frequency_dict)

summary = pd.DataFrame({
    'word': word,
    'frequency': frequency
})

print(summary)


  또한 Pandas도 Numpy와 마찬가지로 연산이 가능합니다.


import pandas as pd

word_dict = {
    'Apple': '사과',
    'Banana': '바나나',
    'Carrot': '당근'
}

frequency_dict = {
    'Apple': 3,
    'Banana': 5,
    'Carrot': 7
}

importance_dict = {
    'Apple': 3,
    'Banana': 2,
    'Carrot': 1
}

word = pd.Series(word_dict)
frequency = pd.Series(frequency_dict)
importance = pd.Series(importance_dict)

summary = pd.DataFrame({
    'word': word,
    'frequency': frequency,
    'importance': importance
})

score = summary['frequency'] * summary['importance']
summary['score'] = score

print(summary)


  이러한 판다스 객체는 인덱스를 기준으로 처리하고, 슬라이싱 하는 등의 작업을 수행할 수 있습니다. 슬라이싱을 할 때는 iloc 혹은 loc를 사용할 수 있습니다. iloc는 인덱스를 기준으로 슬라이싱을 처리하도록 도와줍니다.


import pandas as pd

word_dict = {
'Apple': '사과',
'Banana': '바나나',
'Carrot': '당근',
'Durian': '두리안'
}

frequency_dict = {
'Apple': 3,
'Banana': 5,
'Carrot': 7,
'Durian': 2
}

importance_dict = {
'Apple': 3,
'Banana': 2,
'Carrot': 1,
'Durian': 1
}

word = pd.Series(word_dict)
frequency = pd.Series(frequency_dict)
importance = pd.Series(importance_dict)

summary = pd.DataFrame({
'word': word,
'frequency': frequency,
'importance': importance
})

print(summary)
print(summary.loc['Banana':'Carrot', 'importance':])
print(summary.iloc[1:3, 2:])


  같은 문법을 활용하여 특정한 데이터를 수정하거나 삽입할 수도 있습니다.


import pandas as pd

word_dict = {
    'Apple': '사과',
    'Banana': '바나나',
    'Carrot': '당근',
    'Durian': '두리안'
}

frequency_dict = {
    'Apple': 3,
    'Banana': 5,
    'Carrot': 7,
    'Durian': 2
}

importance_dict = {
    'Apple': 3,
    'Banana': 2,
    'Carrot': 1,
    'Durian': 1
}

word = pd.Series(word_dict)
frequency = pd.Series(frequency_dict)
importance = pd.Series(importance_dict)

summary = pd.DataFrame({
    'word': word,
    'frequency': frequency,
    'importance': importance
})

summary.loc['Apple', 'importance'] = 5 # 데이터의 변경
summary.loc['Elderberry'] = ['엘더베리', 5, 3] # 새 데이터 삽입
print(summary)


※ Pandas를 이용해 엑셀(Excel)로 내보내기/불러오기 ※


  판다스의 내장 함수를 이용하면 엑셀 파일 형태로 내보내거나 불러올 수도 있습니다.


import pandas as pd

word_dict = {
    'Apple': '사과',
    'Banana': '바나나',
    'Carrot': '당근'
}

frequency_dict = {
    'Apple': 3,
    'Banana': 5,
    'Carrot': 7
}

word = pd.Series(word_dict)
frequency = pd.Series(frequency_dict)

summary = pd.DataFrame({
    'word': word,
    'frequency': frequency
})

summary.to_csv("summary.csv", encoding="utf-8-sig")
saved = pd.read_csv("summary.csv", index_col=0)
print(saved)


728x90
반응형

728x90
반응형

  파이썬(Python)의 넘파이(Numpy) 라이브러리에서는 다양한 기본 연산을 지원합니다. 기본적인 사칙연산을 지원하는데, 이러한 연산들은 배열 안에 포함되어 있는 원소에 대한 연산입니다. 예를 들어 배열의 모든 원소의 값에 10을 더하는 등의 작업을 수행할 수 있습니다. 저는 1부터 9까지의 숫자를 랜덤하게 3개만큼 생성하여 각 원소에 10씩 더하도록 프로그래밍을 해보았습니다.


import numpy as np array = np.random.randint(1, 10, size=3) result_array = array + 10 print(result_array[0], result_array[1], result_array[2])


  당연히 곱셈 또한 가능합니다.


import numpy as np array = np.random.randint(1, 10, size=3) result_array = array * 10 print(result_array[0], result_array[1], result_array[2])


  또한 이러한 Numpy의 연산은 Numpy 배열의 형태와 관계 없이 사용할 수 있습니다.


import numpy as np

array = np.random.randint(1, 10, size=4).reshape(2, 2)

result_array = array * 10

print(result_array[0][0], result_array[1][0], result_array[1][1])


※ 서로 다른 형태의 Numpy 연산 ※


  서로 다른 형태를 가진 Numpy 배열 끼리도 연산할 수 있습니다. 이 때는 기본적으로 행우선으로 연산이 이루어집니다.


import numpy as np

array1 = np.arange(4).reshape(2, 2)
array2 = np.arange(2)
array3 = array1 + array2

print(array3[0][0], array3[0][1], array3[1][0], array3[1][1])

  

  서로 다른 형태(Shape이 다를 때)의 Numpy를 연산할 때에는 브로드캐스트(Broadcast)가 적용됩니다. 다시 말해 브로드캐스트란 서로 모양이 다른 배열을 연산할 수 있도록 배열의 형태를 동적으로 변환하는 기법입니다.


  예를 들어


1 2 3

4 5 6

7 8 9



1 2 3을 더하면,


2 4 6

5 7 9

8 10 12


가 됩니다.


array1 = np.arange(1, 10)
array1 = array1.reshape(3, 3)

array2 = np.arange(1, 4)

print(array1 + array2)


  # 브로드캐스트는 최소한 하나의 배열의 차원의 크기가 1일 때 가능합니다.

  # 브로드캐스트는 차원에 대해서 축의 길이가 같을 때 사용이 가능합니다.


  그러므로 1 X 4인 배열과 4 X 1인 배열끼리도 덧셈이 가능한 것입니다. 이 때 자동으로 브로드캐스트가 적용되어 1 X 4는 4 X 4로 확장 되고, 4 X 1 또한 4 X 4로 확장 되어 연산이 이루어진다고 볼 수 있습니다.


import numpy as np

array1 = np.arange(4).reshape(4, 1)
array2 = np.arange(4)
array3 = array1 + array2

print(array3[0][0], array3[0][1], array3[0][2], array3[0][3])
print(array3[1][0], array3[1][1], array3[1][2], array3[1][3])
print(array3[2][0], array3[2][1], array3[2][2], array3[2][3])
print(array3[3][0], array3[3][1], array3[3][2], array3[3][3])


  또한 Numpy는 마스킹 연산도 수행이 가능합니다. 이는 각 원소가 특정한 조건을 만족하는지에 대한 결과가 배열 형태로 반환이 이루어집니다.


import numpy as np

# Numpy 원소의 값을 조건에 따라 바꿀 때는 다음과 같이 합니다.
# 반복문을 이용할 때보다 매우 빠르게 동작합니다.
# 대체로 이미지 처리(Image Processing)에서 자주 활용됩니다.
array1 = np.arange(16).reshape(4, 4)
print(array1)

array2 = array1 < 10
print(array2)

array1[array2] = 100
print(array1)


※ Numpy의 연산 함수 ※


  Numpy는 다양한 기본 함수들을 제공합니다.


import numpy as np

array = np.arange(16).reshape(4, 4)

print("최대값:", np.max(array))
print("최소값:", np.min(array))
print("합계:", np.sum(array))
print("평균값:", np.mean(array))


  가로 축에 대한 집계도 가능합니다.


import numpy as np

array = np.arange(16).reshape(4, 4)

print("합계:", np.sum(array, axis=0))



728x90
반응형

728x90
반응형

  파이썬(Python)에서는 Numpy라는 데이터 분석 전용 라이브러리가 많이 사용됩니다. Numpy는 다차원 배열을 효과적으로 처리할 수 있도록 해주는 다양한 기능을 제공하고 있습니다. 일반적으로 현실 세계에서 다양한 데이터배열 형태의 데이터로 표현할 수 있습니다. 720 X 480 크기의 이미지가 있다고 하면, 이를 720 X 480 배열로 나타낼 수도 있습니다.


  흔히 대부분의 문제는 행렬을 이용해 해결할 수 있다고 말합니다. Numpy는 그러한 행렬을 매우 효과적으로 처리할 수 있도록 도와준다는 특징이 있습니다. 더불어 Numpy는 List와 다르게, 하나의 자료형이 데이터로 들어간다는 특징이 있습니다.


  물론 다차원 배열은 파이썬의 리스트(List) 자료형을 이용해도 어렵지 않게 만들 수 있습니다. 하지만 Numpy를 사용하면 보다 효율적으로 다차원 배열을 사용할 수 있으며, 메모리의 효율성도 리스트보다 앞서게 됩니다. Numpy는 일반적으로 리스트를 입력으로 받아서, Numpy 객체로 처리하여 사용할 수 있도록 해줍니다. 기본적인 Numpy 객체의 사용 방법은 다음과 같습니다.


※ 파이참에서 Numpy 사용하기 ※


  파이참에서 Numpy를 사용하려면 이를 프로젝트 설정에서 등록해주시면 됩니다.



  이후에 인터프리터 설정에서 추가(+) 버튼을 눌러서 라이브러리를 추가해주시면 됩니다.



  Numpy를 검색해서 설치를 진행합니다.



  결과적으로 Numpy를 사용할 수 있게 되었습니다.



※ Numpy 사용해보기 ※


  Numpy 라이브러리는 리스트를 입력으로 받아서 Numpy 객체를 만들 수 있도록 해줍니다.


import numpy as np array = np.array([1, 2, 3]) print(array.size) # 배열의 크기 print(array.dtype) # 배열 원소의 타입 print(array[2]) # 인덱스 2의 원소


※ Numpy로 배열 만들기 ※


  Numpy에서 배열을 순식간에 생성하기 위해서는 arange() 함수를 사용할 수 있습니다. arange() 함수를 이용하면 0부터 특정 인덱스까지의 배열을 생성할 수 있습니다.


import numpy as np

array1 = np.arange(4)
print(array1[3])


※ Numpy 배열 합치기 ※


  concatenate() 함수를 이용하면 여러 배열을 하나로 합칠 수 있습니다.


import numpy as np

array1 = np.array([1, 2, 3])
array2 = np.array([4, 5, 6])
array3 = np.concatenate([array1, array2])

print(array3.shape)


※ Numpy 다양한 형태의 배열 만들기 ※


import numpy as np

array1 = np.zeros((4, 4), dtype=float)
array2 = np.ones((3, 3), dtype=str)
array3 = np.random.randint(0, 10, (3, 3))
# 평균이 0이고 표준편차가 1인 표준 정규를 띄는 값
array4 = np.random.normal(0, 1, (3, 3))
print(array1)
print(array2)
print(array3)
print(array4)


※ Numpy 배열의 형태 바꾸기 ※


  reshape() 함수를 이용하면, 기존 배열의 형태를 바꿀 수 있습니다. 예를 들어서 1차원 배열을 2차원 배열로 바꿀 수 있습니다.


import numpy as np

array1 = np.array([1, 2, 3, 4])
array2 = array1.reshape((2, 2))

print(array2.shape)


※ Numpy 배열을 세로 축으로 합치기 ※


  Numpy 배열은 세로 축으로 합칠 수도 있습니다. 기본적으로 축 값(Axis)이 0이라면 세로 축이고, 1이라면 가로 축입니다.


import numpy as np

array1 = np.arange(4).reshape(1, 4)
array2 = np.arange(8).reshape(2, 4)

array3 = np.concatenate([array1, array2], axis=0)
print(array3.shape)


※ Numpy 배열을 나누기 ※


  Numpy 배열을 나눌 때에는 split() 함수를 사용하며 이는 concatenate() 함수와 흡사하게 동작합니다. 2 X 4 배열을 왼쪽과 오른쪽으로 이등분하는 소스코드는 다음과 같습니다.


import numpy as np

array = np.arange(8).reshape(2, 4)
left, right = np.split(array, [2], axis=1)
print(left.shape)
print(right.shape)
print(right[1][1])


728x90
반응형

728x90
반응형

CNN(Convolution Neural Network)을 통해 배우는 이미지 인식 인공지능 기술

1. 인공지능 기술 및 CNN의 개요

나동빈


인공지능: 컴퓨터가 인간의 지능을 흉내내도록 하는 기술


  최근의 인공지능 기술은 경험주의에 기반하고 있습니다. 사람이 컴퓨터에게 별도의 지식을 제공하지 않아도 컴퓨터가 데이터로부터 지식을 직접 학습할 수 있다고 보는 관점입니다. 오직 컴퓨터가 데이터라는 경험만을 이용하여 수식(Function)을 찾아냅니다. 실제로 이러한 접근 방법이 최근 딥 러닝(Deep Learning) 기술까지 이어졌습니다.


  현재 인공지능은 데이터로부터 스스로 학습하는 단계까지는 왔다고 말할 수 있지만 초월적인 지능으로 새로운 발견을 하는 단계가 되기까지는 한참 멀었다고 보는 것이 일반적입니다.


※ 머신러닝 인공지능의 분류 ※


1) 지도학습(Supervised Learning): 학습 데이터가 정답 정보인 레이블(Label)을 가지고 있도록 하는 학습 방법입니다.

→ 딥 러닝이 대표적인 예시이며, 우리가 공부하게 될 CNN도 지도학습에 속합니다.


2) 비지도학습(Unsupervised Learning): 학습 데이터가 레이블을 가지고 있지 않도록 하는 학습 방법입니다. 데이터 자체에 들어있는 고유한 특징을 스스로 찾아냅니다.

→ 대표적인 기술로는 비슷한 데이터끼리 묶는 클러스터링(Clustering)이 있습니다.

→ 레이블이 없다는 점에서 지도학습보다 더 난이도가 높은 경우가 많습니다.


3) 준지도학습(Semi-Supervised Learning): 학습 데이터가 어느 정도만의 레이블을 가지고 있도록 하는 학습 방법입니다.


4) 강화학습(Reinforcement Learning): 학습의 정답 유무를 출력하기까지 시간이 필요한 학습 방법입니다. 주로 게임(Game) 인공지능으로 활용됩니다.

→ 바둑(Go) 인공지능과 같은 게임 인공지능이 대표적인 예시이며 전략적인 상황에서 활용도가 높습니다.


※ 컴퓨터 비전(Computer Vision) ※


  컴퓨터 비전 기술은 컴퓨터의 시각(Vision) 요소에 관련한 기술을 연구하는 분야입니다. 증강현실, 문자 인식, 패턴 인식, 얼굴 인식, 이미지 복구, 가상현실 등의 세부 분야가 있습니다. 우리가 공부하게 될 CNN도 대표적인 컴퓨터 비전 분야의 기술입니다.


※ 머신러닝 데이터의 분류 ※


  머신러닝은 인공지능 알고리즘 중 하나이며 대표적인 경험주의적 철학이 반영된 알고리즘입니다. 이러한 머신러닝에서 사용되는 데이터는 다음과 같이 세 가지로 분류될 수 있습니다.


· 훈련 데이터: 모델의 학습을 위해 사용하는 데이터입니다. 예를 들어 특정한 이미지가 주어졌을 때 미리 그 이미지가 '말'에 해당하는지, '소'에 해당하는지 등의 정답 데이터를 준비해놓고 학습을 진행합니다.


· 검증 데이터: 모델의 검증을 위해 사용하는 데이터입니다. 학습이 잘 되었는지 판단하기 위한 중요한 척도가 됩니다.


· 테스트 데이터: 주로 현재 가지고 있지 않은 데이터로 실제로 인공지능 소프트웨어를 운영하면서 만나게 될 데이터를 의미합니다.


  일반적으로 전체 데이터훈련 데이터와 검증 데이터로 나누어서 먼저 훈련을 시키고, 나중에 검증을 하는 방식으로 데이터를 활용합니다. 일반적으로 학습 모델을 표현하고자 할 때는 '신경망 모델(Neural Network Model)'을 이용해 표현합니다. 여러 개의 노드(Node)가 서로 연결되어 있는 그래프 형태로 표현합니다. 대부분의 딥 러닝 알고리즘은 신경망 모델을 이용해 표현됩니다.


※ 학습 모델의 평가 ※


  일반적으로 모델을 평가할 때는 해결하고자 하는 문제에 따라서 다른 모델 평가 방식을 적용할 수 있습니다. 가장 많이 사용되는 평가 방식은 다음과 같습니다.


· 회귀 문제{y - f(x)}^2의 합으로 모델을 평가합니다. f(x)는 각 데이터에 대한 모델의 예측 값을 의미합니다. y는 실제 정답 값을 의미하는데, 제곱을 해주는 이유는 모델이 예측한 값이 얼마나 실제 정답과 거리가 있는지를 양수로 표현하기 위해서입니다.


· 정확도: 전체 테스트 데이터의 개수가 N개 일 때, 정답을 맞힌 테스트 데이터의 개수가 K개라면 K/N이 정확도가 됩니다.


※ CNN(Convolution Neural Network) ※


  일반적인 신경망 기술로는 해결하기 어려운 문제인 '이미지' 문제를 해결하기에 적합한 인공지능 알고리즘입니다. CNN은 1989년 LeCun의 필기체 인식 알고리즘으로 처음 등장하여 2000년대부터 본격적으로 관심을 받아 지속적으로 개선이 이루어지고 있습니다.

728x90
반응형