요즘 LLM 인공지능으로 세상이 또 하나의 변화에 직면한 것으로 보인다. 그 중에서 가장 앞선 곳이 OpenAI라고 할 수 있다.
AI의 구조에 대해 좀 더 빠르게 알아보는 것이 필요한 시점이라 생각한다.
1. AI 프로젝트 시작하기
요즘 ChatGPT로 촉발된 LLM(Large Language Model)이 폭발적으로 성장하고 있다.
이로 인해 많은 사람들이 인공지능에 대해 정말 많은 관심을 갖게 되었다.
파이썬은 그 여정에 있어서 강력한 동반자가 될 것이라고 생각한다. 왜냐하면 대부분의 인공지능 라이브러리를 파이썬에서 지원하고 있고, 배우기 쉽고 사용하기 편한 파이썬 언어가 인공지능 분야에서는 대세라고 생각하기 때문이다.
머신 러닝 라이브러리 소개
Scikit-Learn
Scikit-Learn은 사용하기 매우 쉽지만, 많은 머신 러닝 알고리즘을 효율적으로 구현하므로 머신 러닝을 배우기에 좋은 출발점이 된다. 이것은 2007년 David Cournapeau에 의해 만들어졌으며, 현재는 프랑스 컴퓨터 과학 및 자동화 연구소(Inria)의 연구팀이 주도적으로 이끌고 있다.
TensorFlow
TensorFlow는 분산 수치 계산을 위한 좀 더 복잡한 라이브러리다. 이것은 수백 개의 멀티-GPU(그래픽 처리 장치) 서버에 걸쳐 계산을 분산시켜 매우 큰 신경망을 효율적으로 훈련하고 실행할 수 있게 만들어준다. TensorFlow(TF)는 Google에서 만들어졌으며, 많은 대규모 머신 러닝 애플리케이션을 지원한다. 2015년 11월에 오픈 소스로 공개되었으며, 2.0 버전은 2019년 9월에 출시되었다.
Keras
Keras는 신경망을 훈련하고 실행하기 매우 간단하게 만드는 고수준의 딥러닝 API이다. Keras는 TensorFlow와 함께 번들로 제공되며, 모든 집약적인 계산을 위해 TensorFlow에 의존한다.
데이터 수집 및 처리
모든 AI 프로젝트의 시작점은 데이터 수집이다. 파이썬은 데이터 수집과 처리를 위한 훌륭한 라이브러리들을 제공한다. pandas는 데이터 분석을 위한 필수 라이브러리이며, numpy는 수치 계산을 위한 강력한 도구다. scikit-learn은 데이터 전처리와 모델링을 위한 간편한 기능들을 제공한다. 이 라이브러리들을 사용하여 데이터를 수집하고, 정제하며, 유용한 특성을 추출하는 작업을 진행한다.
첫 번째 머신러닝 모델 구축
데이터가 준비되었다면, 간단한 머신러닝 모델을 구축할 차례다. scikit-learn의 분류기나 회귀 모델을 사용해보자. 예를 들어, 붓꽃(Iris) 데이터 세트를 사용하여 각 붓꽃의 종류를 분류하는 모델을 만들 수 있다. 이 과정에서 모델을 훈련시키고, 검증하며, 성능을 평가하는 방법을 배울 수 있다.
2. 파이썬으로 복잡한 AI 문제 해결하기
딥러닝 입문
TensorFlow나 PyTorch와 같은 프레임워크를 사용하여 딥러닝 모델을 구축하는 방법을 배워보자. 이러한 프레임워크는 복잡한 신경망을 쉽게 설계하고 학습시킬 수 있게 해준다. 간단한 이미지 분류부터 시작하여 점차 복잡한 문제로 나아가자.
사례 연구
실제로 파이썬을 사용하여 해결된 복잡한 AI 문제들을 살펴보는 것도 매우 유익하다. Google의 AlphaGo부터 자율 주행 자동차에 이르기까지, 파이썬은 다양한 혁신적인 프로젝트에 사용되었다.
3. 파이썬 AI 리소스와 커뮤니티
학습 리소스
‘Coursera’나 ‘edX’와 같은 온라인 학습 플랫폼에서는 파이썬과 AI 관련 강좌를 제공한다. 또한 ‘GitHub’에는 수많은 오픈소스 프로젝트가 있어 실제 코드를 살펴보고 학습할 수 있는 기회를 제공한다.
커뮤니티 참여
‘Stack Overflow’, ‘Reddit’, ‘Kaggle’과 같은 플랫폼에서는 전 세계의 개발자들과 지식을 공유하고 문제를 해결할 수 있다. 또한, 파이썬과 AI 관련 컨퍼런스나 워크샵에 참여하여 네트워킹을 할 수 있다.
Timestamp()는 시간의 단일 시점을 나타낸다. 파이썬 datetime.datetime 객체와 동일한 기능을 한다. date 또는 datetime 스트링과 함께 pd.Timestamp() 함수를 사용해 Timestamp 객체를 만들 수 있다.
import pandas as pd
timestamp_ex = pd.Timestamp('2023-09-10 12:00:00')
Period
Period()는 하루, 한달, 또는 일년과 같이 시간의 일정 기간을 나타낸다. date 또는 datetime 스트링과 빈도(freq)와 함께 pd.Period() 함수를 사용해 Period 객체를 만들 수 있다.
period_ex = pd.Period('2023-10', freq='M')
Timedelta
Timedelta()는 두 날짜 또는 시간들의 차이를 나타낸다. 파이썬 datetime.datetime 객체와 동일한 기능을 한다.기간 스트링과 함께 pd.Timedelta() 함수를 사용해 Timedelta 객체를 만들 수 있다.
timedelta_ex = pd.Timedelta('1 day')
resample
resample()은 datetime index를 가지고 원하는 주기로 변환하거나 분석할 수 있다. resample()은 groupby 와 유사하게 사용할 수 있다. 데이터의 index가 datetime 같은 index가 아니라면, 이 메서드를 적용하기 전에 set_index()를 사용해, datetimeIndex를 먼저 설정해야 한다.
resample_ex = pd.resample('M').max()
shift
shift()는 데이터를 이동시킬 때 사용한다. 인수로 n을 줄 때 전체 데이터가 n행씩 뒤로 이동한다. 주식 데이터를 다룰 때 많이 사용하는데, 일간, 월간 변동률 등을 구할 때 사용한다. 다음은 일간 변동률을 구하는 것을 보여준다.
rolling()은 시리즈에서 window 크기에 해당하는 개수만큼 데이터를 추출하여 집계 함수에 해당하는 연산을 실시한다. 집계 함수로는 max(), mean(), min()을 사용할 수 있다. min_periods를 지정하면 데이터 개수가 윈도우 크기에 못미치더라도 mini_periods로 지정한 개수만 만족하면 연산을 수행한다.
kospi = pdr.get_data_yahoo('^KS11', '2023-10-04') # 주식 일별 데이터를 갖고 있다고 가정한다.
window = 252
peak = kospi['Adj Close'].rolling(window, min_periods=1).max()
Kaggle DataSets API
캐글에 있는 데이터셋을 가지고 연습해 보도록 한다. 캐글에서 데이터셋을 쉽게 가져오기 위해서 kaggle API를 설치하는 것이 좋다.
!pip install kaggle #kaggle 라이브러리를 설치
캐글 홈페이지에 로그인 후 본인 계정에서 API(kaggle.json) 파일을 다운로드한다. 윈도우의 경우에는 C 드라이브에서 '사용자(User)' >'컴퓨터명;>.kaggle폴더에 다운로드한 API파일을 이동시킨다.
이제 캐글 데이터셋을 주피터 노트북에서 쉽게 사용할 수 있게 되었다. 다운로드 받고자 하는 데이터셋을 캐글에서 검색한 후, API 주소를 클립보드에 복사한다(버튼을 누르도록 되어 있다).
!kaggle datasets list -s store-sales-time-series-forecasting
kaggle datasets 명령과 list, -s 옵션, 복사한 API 주소를 함께 입력하면 해당 데이터셋의 리스트를 다음과 같이 볼 수 있다.
콘솔 창에서 위 jupyter notebook --generate-config를 입력하면, jupyter_notebook_config.py 파일이 생성된다. 우분투의 ls -al 명령을 실행하면 현재 위치에 있는 폴더 목록(숨김 폴더까지 보여줌)을 보여준다. * 아래는 주피터 노트북 사이트에 나온 내용을 정리함
1. 단일 노트북 서버 실행
주피터 노트북 웹 애플리케이션은 서버-클라이언트 구조를 기반으로 한다. 노트북 서버는 HTTP 요청을 처리하기 위해 ZeroMQ와 Tornado를 기반으로 하는 2-프로세스 커널 아키텍처를 사용한다. ※ 기본적으로 노트북 서버는 127.0.0.1:8888에서 로컬로 실행되며 localhost에서만 액세스할 수 있다. http://127.0.0.1:8888을 사용하여 브라우저에서 노트북 서버에 액세스할 수 있다.
2. 공개 노트북 서버 실행
웹 브라우저를 통해 원격으로 노트북 서버에 액세스하려면 공용 노트북 서버를 실행하면 된다. 공용 노트북 서버를 실행할 때 최적의 보안을 위해서는 먼저 노트북 서버 보안을 해야 한다.
비밀번호와 SSL/HTTPS로 서버를 보호해야 한다.
먼저 비밀번호를 사용해서 노트북 보안을 하려면 다음과 같은 명령어를 입력하면 된다.
jupyter notebook password
노트북 서버 보안을 위해 인정서 파일과 해시된 비밀번호 생성하는 것부터 시작한다.
아직 구성 파일이 없으면 다음 명령줄을 사용해 노트북용 구성 파일을 만든다.
jupyter notebook --generate-config
~/.jupyter 디렉토리에서, jupyter_notebook_config.py 구성 파일을 편집한다. 기본적으로 노트북용 구성파일은 모든 필드가 주석처리되어 있다. 사용하려는 명령어 옵션만 사용가능하게 주석 처리를 해제하고, 편집해야 한다. 최소한의 구성 옵션 세트는 다음과 같다.
# 인증서 파일, IP, 비밀번호에 대한 옵션을 설정하고 브라우저 자동 열기를 끕니다.
c.NotebookApp.certfile = u'/absolute/path/to/your/certificate/mycert.pem'
c.NotebooApp.keyfile = u'/absolute/path/to/your/certificate/mykey.key'
# 공용 서버의 모든 인터페이스(ips)에 바인딩하려면 ip를 '*'로 설정합니다.
c.NotebookApp.ip = '*'
c.NotebookApp.password = u'sha1:bcd259ccf...<your hashed password here>'
c.NotebookApp.open_brower = False
# 서버 액세스를 위해 알려진 고정 포트를 설정하는 것이 좋습니다.
c.NotebookApp.port = 9999
그런 다음 jupyter notebook 명령어를 사용하여 노트북을 시작할 수 있다.
'https를 사용하세요. SSL 지원을 활성화했을 땐, 일반 http://가 아닌 https://를 사용해 노트북 서버에 접속해야 한다는 것을 기억하세요. 콘솔의 서버 시작 메시지에 이 내용을 미리 알려주만 세부 사항을 간과하고 서버가 다른 이유로 응답하지 않는다고 생각하기 쉽습니다.
SSL을 사용하는 경우 항상 'https://'로 노트북 서버에 접속!
이제 브라우저에서 공개 서버의 도메인 'https://your.host.com:9999'를 입력하여 당신의 공개 서버에 액세스할 수 있다.
반응형
3. 방화벽 설정
올바르게 작동하게 하려면, 클라이언트에서 연결할 수 있도록주피터 노트북 서버가 돌아가는 컴퓨터 방화벽(공유기가 있는 경우 공유기 방화벽 설정도 필요)의 주피터 노트북 구성 파일(jupyter_notebook_config.py)의 액세스 포트(c.NotebooApp.port) 설정에 구성되어 있어야 한다. 방화벽은 49152에서 65535까지의 포트에서 127.0.0.1(localhost)의 연결을 허용해야 한다. 이러한 포트는 서버가 노트북 커널과 통신하는 데 사용된다. 커널 통신 포트는 ZeroMQ에 의해 무작위로 선택되며 커널당 여러 연결이 필요할 수 있으므로 광범위한 포트에 액세스할 수 있어야 한다.
요즘 딥러닝 프로그램을 돌리는 컴퓨터가 있는 사무실에 계속 있기 어려운 환경에 있습니다. 그래서, 외부에서 컴퓨터를 온오프할 수 있도록 공유기 원격접속과 컴퓨터 WOL 기능을 켜두었습니다.
그리고 가장 많이 사용하고 있는 jupyter notebook을 원격지에서 사용할 수 있도록 세팅하였습니다.
1. 방화벽 해제 : 먼저 우분투 포트 방화벽 해제 및 공유기 포트포워드 설정을 합니다. >> sudo ufw allow 8888(jupyter notebook의 기본포트로 원하시는 포트로 변경 가능)
2. jupyter notebook 암호 설정 로컬에서만 사용할 경우에는 보통 암호 설정 없이, 토큰을 이용해 접근했었습니다. 그렇지만 원격 접속은 보안을 위해 암호를 설정하는 것이 더 편하고 좋습니다. jupyter 서버 기본 설정을 위한 jupyter_notebook_config.py을 만들고, 패스워드를 설정합니다. >> jupyter notebook --generate-config Writing default config to: /{MyPath}/.jupyter/jupyter_notebook_config.py
>> jupyter notebook password Enter password : **** Verify password : **** [NotebookPasswordApp] Wrote hashed password to /{Mypath}/.jupyter/jupyter_notebook_config.json
반응형
3. jupyter notebook 설정 파일 수정 nano ~/.jupyter/jupyter_notebook_config.py 수정할 코드를 ctrl+w(검색)를 사용해 찾은 후, 수정합니다.
c.NotebookApp.allow_origin = '*' # 외부 접속을 허용합니다. c.NotebookApp.notebook_dir = '작업 절대경로'# 작업경로를 설정합니다. c.NotebookApp.ip = '*' # 외부 접속 포트 전체 오픈. 보안을 위해 특정 IP만 열어두셔도 됩니다. c.NotebookApp.port = '8888' # 외부접속 사용 포트를 설정합니다. c.NotebookApp.password = '<해시화된 패스워드 입력>' # 암호설정시 만들어진 jupyter_notebook_config.json을 nano등으로 열면 해시화된 패스워드를 확인할 수 있습니다. c.NotebookApp.password_required = True # 비밀번호를 요구하도록 합니다. c.NotebookApp.open_browser = False # 서버 pc에서 자동으로 브라우저가 열리지 않도록 합니다.
4. 서버 실행 >> jupyter notebook 이제 외부에서 접속하시면 됩니다. 공유기에서 ddns를 설정한 경우, ddns:포트번호(여기선 8888)을 주소창에 입력하면 접속할 수 있습니다. 그 다음 설정한 비밀번호를 입력하면 로그인이 됩니다.
Scikit-learn 라이브러리는 파이썬에서 가장 유명한 머신러닝 라이브러리 중 하나로, 분류(classification), 회귀(regression), 군집화(clustering), 의사결정 트리(decision tree) 등의 다양한 머신러닝 알고리즘을 적용할 수 있는 함수들을 제공합니다.
이번에는 머신러닝 수행 방법을 알아보기 전에, 다양한 샘플 데이터를 확보할 수 있는 방법들을 알아보려고 합니다.
데이터셋(Datasets) 얻기
머신러닝을 시작할 때, 간단하게 데이터셋을 얻어서 알고리즘을 테스트해 보는 것이 머신러닝을 이해하는데 있어 매우 유용합니다. 간단한 데이터셋으로 원리를 이해한 후, 실제 생활에서 얻을 수 있는 더 큰 데이터셋을 가지고 작업하는 것이 좋습니다.
우선 머신러닝을 연습하기 위해, 간단한 데이터셋을 얻을 수 있는 곳은 다음과 같습니다. 하나씩 차례대로 알아보도록 하겠습니다.
사이킷런의 빌트인 데이터셋
캐글(Kaggle) 데이터셋
UCI(캘리포니아 대학, 얼바인) 머신러닝 저장소
<사이킷런 데이터셋 사용하기>
사이킷런에는 머신러닝을 쉽게 배울 수 있도록 하기 위해, 샘플 데이터셋을 가지고 있습니다.
샘플 데이터셋을 로드하기 위해, 데이터셋 모듈을 읽어들입니다. 다음은 Iris 데이터셋을 로드한 코드입니다.
>>> from sklearn import datasets
>>> iris = datasets.load_iris() # 아이리스 꽃 데이터셋 또는 피셔 아이리스 데이터셋은 영국의 통계 학자이자 생물학자인 로널드 피셔 (Ronald Fisher)가 소개한 다변수 데이터셋입니다. 데이터셋은 3종의 아이리스(Iris)로 된 50개 샘플로 구성되어 있습니다. 각 샘플로부터 4개의 피쳐(features:피쳐를 우리말로 변수 또는 요인이라고 표현하기도 함)를 측정할 수 있습니다: 꽃받침과 꽃잎의 길이와 너비입니다. 이러한 4가지 피쳐(features)의 결합을 바탕으로 피셔는 종을 서로 구분할 수 있는 선형 판별 모델을 개발했습니다.
로드된 데이터셋은 속성-스타일 접근을 제공하는 파이썬 딕셔너리, 번치(bunch) 객체로 표현됩니다.
>>> print(iris.DESCR) # DESCR 속성을 사용해 데이터셋의 정보를 다음과 같이 얻을 수 있습니다.
>>> print(iris.data) # data 속성을 사용해 피쳐를 알아볼 수 있습니다.
>>> print(iris.feature_names) # feature_names 속성으로 피쳐 이름을 알아낼 수 있습니다.
이것은 데이터셋이 꽃받침 길이, 꽃받침 너비, 꽃잎 길이, 꽃잎 너비 등 4개의 컬럼들로 구성되어 있다는 것을 의미합니다.
꽃의 꽃잎(petal)과 꽃받침(sepal)
>>> print(iris.target) # 레이블을 알 수 있습니다.
>>> print(iris.target_names) # 레이블 이름을 알 수 있습니다.
여기서 0은 'setosa'를, 1은 'versicolor'를 2는 'virginica'를 나타냅니다.
(사이킷런의 모든 샘플 데이터가 feature_names, target_names 속성을 지원하는 것은 아닙니다)
여기서, 데이터를 쉽게 다루기 위해, 판다스(Pandas)의 데이터프레임으로 변환하는 것이 유용합니다.
>>> import pandas as pd # pandas 라이브러리를 읽어들입니다.
>>> df = pd.DataFrame(iris.data)
>>> df.head()
<캐글(Kaggle) 데이터셋 사용하기>
데이터 과학자 및 머신러닝 학습자들에게 있어,캐글(Kaggle)은 세계에서 가장 큰 커뮤니티입니다.
머신러닝 경쟁을 제공하는 플랫폼에서 시작하여, 현재 캐글(Kaggle)은 공개 데이터 플랫폼과 데이터 과학자를 위한 클라우드 기반 워크 벤치도 제공합니다.
구글이 2017년 3월에 캐글(Kaggle)을 인수했습니다.
우리는 머신러닝 학습자들을 위해, 캐글(Kaggle)에서 제공된 샘플 데이터셋을 이용할 수 있습니다.