반응형

요즘 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 관련 컨퍼런스나 워크샵에 참여하여 네트워킹을 할 수 있다.

최신 동향 유지

AI 분야는 빠르게 발전하고 있다.
arXiv’, ‘Google Scholar’ 등의 리소스를 통해 최신 연구를 접하고, ‘Medium’이나 ‘Towards Data Science’와 같은 블로그를 통해 새로운 트렌드를 확인하도록 하자.

반응형
반응형

PyPDF2 맛보기

가끔 pdf파일에서 텍스트를 추출할 일이 있다.
그때 활용할 수 있도록 Python언어로 pdf파일에서 텍스트를 읽어오는 방법에 대해 예제 코드와 함께 알아본다.

 

1. 필요한 라이브러리

PDF파일을 읽어들이기 위해 PyPDF2 라이브러리를 설치한다.

!pip install PyPDF2

2. 예시 코드

공개된 사이트에서 PDF파일을 갖고 온다. 
이번에는 국토교통부 홈에 있는 보도자료에 바로 올라온 '주택건설사업 인허가 속도 높인다'라는 제목의 파일을 읽어들일 것이다. 쉽게 설명하기 위해 주 디렉토리에 'sample.pdf'라는 파일명으로 다운받아 저장했다.

# 라이브러리를 읽어들인다.
from PyPDF2 import PdfReader

# PDF파일을 읽어서 reader라는 변수에 저장한다.
reader = PdfReader("sample.pdf")

파일을 읽어들인 후에는 전체 페이지가 몇 페이지인지 알아보고 전체 페이지에서 다음과 같이 텍스트를 추출하도록 한다.

반응형
pages = reader.pages

text = ""

for page in pages:
    sub = page.extract_text()
    text += sub
    
# 텍스트를 전부 잘 추출했는지 확인한다.    
print(text)

위 예시 파일에서 텍스트를 잘 읽어들인 것을 확인할 수 있다.

PyPDF의 좀 더 복잡한 기능은 '사용자 가이드'를 참고하면 많은 도움이 될 것이다.

 

반응형
반응형

Timestamp

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행씩 뒤로 이동한다.
주식 데이터를 다룰 때 많이 사용하는데, 일간, 월간 변동률 등을 구할 때 사용한다. 다음은 일간 변동률을 구하는 것을 보여준다.

sec_dpc = (sec['Close'] / sec['Close'].shift(1) - 1) * 100 # 'Close'는 종가 필드를 나타냄

rolling

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 주소를 함께 입력하면 해당 데이터셋의 리스트를 다음과 같이 볼 수 있다.

!kaggle datasets download -w aslanahmedov/walmart-sales-forecast

분석하고 싶은 데이터셋을 선택해서 다운로드할 수 있다.
-w옵션은 현재 폴더에 저장하는 옵션이고,--unzip 옵션을 넣어 압축을 해제한 상태에서 다운로드할 수도 있다.

 

반응형
반응형

pandas는 Series, DataFrame 두개를 중심으로 데이터를 다룬다.

그 중 DataFrame에서 주로 사용하는 명령을 먼저 간단히 정리해 본 다음, loc와 iloc를 알아볼 것이다.

먼저 라이브러리를 읽어들인다.

import pandas as pd
import numpy as np

그 다음 사용할 데이터를 DataFrame 데이터 유형으로 만든다.

dates = pd.date_range('2023-09-01', periods=6)
df = pd.DataFrame(np.random.randn(6,5), index = dates, columns=['A', 'B', 'C', 'D', 'E'])
df

head() 명령을 사용하면 기본적으로 첫 5행을 보여준다. 괄호에 숫자를 기입하면 그 숫자만큼 행을 더 볼 수 있다.

df.head()

index, columns 명령을 사용하면 DataFrame의 컬럼과 인덱스를 확인할 수 있다.

df.index

df.columns

DataFrame에 값들은 values 명령을 사용해 확인하면 된다. 

df.values

info() 명령을 사용하면 DataFrame의 개요를 알 수 있다.

df.info()

describe() 명령을 사용하면 통계적 개요를 확인할 수 있다. 

df.describe()

sort_values() 명령은 by로 지정된 컬럼을 기준으로 정렬된다. ascending 옵션을 사용하면 오름차순(=True)이나 내림차순(=False)으로 정렬할 수 있다.

df.sort_values(by='C', ascending=True)

반응형

DataFrame.loc

인덱스인 dates 변수를 사용해 특정 날짜의 데이터만 보고 싶으면 df.loc 명령을 사용하면 된다. loc는 location 옵션으로 슬라이싱할 때 loc 옵션을 이용해서 위치 값을 지정할 수 있다.

df.loc[dates[0]]

컬럼을 지정한 후 모든 행을 보고 싶다면, 다음과 같이 하면 된다.

df.loc[:, ['B', 'D']]

행과 열의 범위를 모두 지정해 볼 수도 있다.

df.loc['2023-09-03':'2023-09-05', ['B', 'D']]

 

DataFrame.iloc

loc 명령과 달리 행과 열의 번호를 이용해 데이터에 바로 접근하려고 할 때는 iloc 명령을 사용한다.
iloc를 사용하면 행이나 열의 범위를 지정하면 된다. 특히 콜론(:)을 사용하면 전체 데이터를 불러온다.

아래 명령 iloc[4]는 5번째 행의 전체 컬럼 값을 불러오게 된다. 0번부터 시작하기 때문에 5번 행을 불러오게 된다.

df.iloc[4]

다음과 같이 범위를 정해서 불러올 수도 있다. 2번째 행부터 5번째 앞, 즉 2번째~4번째 행과 0번부터 2번째 열의 데이터만 가져오게 된다.

df.iloc[2:5, 0:3]

범위가 아니라 콤마(,)로 행이나 열을 지정해 데이터를 가져올 수도 있다. 행이나 열에 대해 전체를 가져오고 싶은 곳에는 그냥 콜론(:)을 사용한다.

df.iloc[1:4, :]

DataFrame에서 특정 조건을 만족하는 데이터만 가져올 수도 있다.
다음과 같이 조건을 입력해서 사용한다.

df[df.B > 0]

 

반응형
반응형

보통 ML이 가능한 서버와 원격으로 접속하는 클라이언트 환경에서 주피터 노트북을 사용한다. 그리고, 서버는 리눅스(또는 우분투) 환경에서 사용하는 것이 일반적이라고 생각하기에 그런 환경을 염두에 두고 정리한다.

서버 주소를 알고 있다는 가정하에, SSH로 서버에 접속한다.

SSH 아이디@192.168.0.123
아이디@192.168.0.123's password:

패스워드를 입력하고, 접속하면 원격 서버에 접속하게 된다.

아이디@sss:~$ jupyter notebook --generate-config

콘솔 창에서 위 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에 의해 무작위로 선택되며 커널당 여러 연결이 필요할 수 있으므로 광범위한 포트에 액세스할 수 있어야 한다.

좀 더 많은 명령어를 알아보려면, 주피터 노트북에서 다음과 같은 명령어를 사용하면 된다.

jupyter notebook --help

반응형
반응형

요즘 딥러닝 프로그램을 돌리는 컴퓨터가 있는 사무실에 계속 있기 어려운 환경에 있습니다. 그래서, 외부에서 컴퓨터를 온오프할 수 있도록 공유기 원격접속과 컴퓨터 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)을 주소창에 입력하면 접속할 수 있습니다. 
그 다음 설정한 비밀번호를 입력하면 로그인이 됩니다.

반응형
반응형

머신러닝에 있어, 가장 먼저해야 하는 일 중 하나가 데이터 정제(Data Cleaning)입니다.

왜냐하면 바로 모델을 훈련할 수 있는 데이터셋을 확보하는 것이 실제로는 매우 어렵기 때문입니다.

따라서, 결측값(NaN)은 없는지, 이상치(outlier)는 없는지 알아보기 위해 데이터셋을 주의깊게 살펴보아야 합니다. 

값이 큰 열이 있는 경우 정규화를 통한 보정이 필요하기도 합니다. 

이번에는 데이터 정제(Data Cleaning)에 필요한 일반적인 작업에 대해 알아보도록 하겠습니다.

 

결측값(NaN)이 있는 열 정제하기

다음 데이터로 된 NaNDataset.csv 파일이 있다고 가정하겠습니다.

눈으로 봐도 몇개 열에 결측값이 있는 것을 확인할 수 있습니다.

작은 데이터셋에서는, 쉽게 결측값을 찾을 수 있습니다.

하지만, 큰 데이터셋에서는, 눈으로 알아내는 게 거의 불가능할 것입니다.

결측값을 찾아내는 효과적인 방법은 판다스(Pandas) 데이터프레임으로 데이터셋을 로드해서 데이터프레임의 빈 값(NaN) 여부를 확인하기 위해 isnull() 함수를 사용하는 것입니다.

>>> import pandas as pd
>>> df = pd.read_csv('NaNDataset.csv')
>>> df.isnull().sum()

B 컬럼에 두개의 빈 값이 있는 것을 볼 수 있습니다.

판다스(Pandas)에서 빈 값이 포함된 데이터셋을 로드할 때, 빈 필드를 나타내는 NaN을 사용할 것입니다.

다음은 데이터프레임의 결과물입니다.

컬럼의 평균값으로 NaN 대체하기

데이터셋의 NaN(빈 값)을 처리하는 방법 중 하나는 그 빈 값이 위치한 컬럼의 평균값으로 빈 값을 대체 처리하는 것입니다.

다음의 스니펫 코드는 B 컬럼의 모든 빈 값(NaN)을 B 컬럼의 평균값으로 대체합니다.

>>> df.B = df.B.fillna(df.B.mean()) # NaN(빈 값)을 B 컬럼의 평균값으로 대체합니다.
>>> df

열 제거하기

데이터셋에서 빈 값(NaN)을 처리하는 다른 방법은 빈 값이 포함된 열을 제거하는 것입니다.

아래와 같이 dropna() 함수를 사용해서 처리할 수 있습니다.

>>> df = pd.read_csv('NaNDataset.csv')
>>> df = df.dropna()
>>> df

NaN이 포함된 행을 제거한 후에 인덱스 순번이 더 이상 맞지 않는다는 것을 알 수 있습니다.

인덱스를 재설정하고 싶다면, reset_index() 함수를 사용합니다.

>>> df = df.reset_index(drop=True) # 인덱스를 재설정합니다
>>> df

반응형

중복된 열 제거하기

다음 데이터로 된 DuplicateRows.csv 파일이 있다고 가정하겠습니다.

중복된 모든 열을 찾기 위해, 먼저 데이터셋을 데이터프레임에 로드합니다.

그리고, duplicated() 함수를 적용합니다.

>>> df = pd.read_csv('DuplicateRows.csv') # 판다스(Pandas) 라이브러리는 이미 로드했다고 가정합니다.
>>> df.duplicated(keep=False))

어떤 열이 중복되었는지 알려줍니다. 위 예에서는, 인덱스 1, 2, 5, 6열이 중복입니다. 

keep 인수를 사용하면 중복을 표시하는 방법을 지정할 수 있습니다.

  • 기본값은 'first' : 첫번째 나타나는 것을 제외한, 모든 중복이 True로 표시됩니다.
  • 'last' : 마지막으로 나타나는 것을 제외한, 모든 중복이 True로 표시됩니다.
  • False : 모든 중복이 True로 표시됩니다.

만약 keep 인수를 'first'로 설정하면, 다음과 같은 결과물을 보게 될 것입니다:

따라서, 모든 중복 열들을 보고 싶다면, keep 인수를 False로 설정해야 합니다. 

>>> df[df.duplicated(keep=False)]

중복 행을 삭제하려면 drop_duplicates() 함수를 사용할 수 있습니다.

>>> df.drop_duplicates(keep='first', inplace=True) # 처음 열은 그대로 두고, 그 다음 중복 열만 제거합니다.
>>> df

기본적으로, drop_duplicates() 함수는 원본 데이터프레임을 수정하지 않고, 제거된 열이 포함된 데이터프레임을 반환합니다.

만약 원본 데이터프레임을 수정하고 싶다면, inplace 파라미터를 True로 설정해야 합니다.

때로는 데이터셋의 특정 열에서 발견된 중복만 제거하고 싶은 경우가 있습니다.

예를 들어, 3, 4열의 B컬럼은 값이 다르지만, A, C 컬럼은 동일합니다. 이를 기준으로 제거해 보도록 하겠습니다.

>>> df.drop_duplicates(subset=['A', 'C'], keep='last', inplace=True) # A, C 컬럼에 모든 중복을 제거하고, 마지막 열을 남깁니다.
>>> df

컬럼 정규화하기

정규화는 데이터 정리 프로세스 중에 자주 적용되는 기술입니다.

정규화의 목적은 데이터 범위의 숫자 열 값을 변경하여, 값 범위의 차이를 수정하지 않고 공통 척도를 적용하는 것입니다.

일부 알고리즘은 데이터를 올바르게 모델링하기 위해 정규화가 중요합니다. 

예를 들어, 데이터셋 열 중 하나는 0에서 1까지의 값을 포함하고 다른 열은 400,000에서 500,000까지의 값을 가질 수 있습니다. 

두 개의 열을 사용하여 모델을 훈련하면 숫자의 척도가 크게 달라질 수 있습니다. 

정규화를 사용하면 두 열의 값 비율을 제한된 범위로 유지하면서 값의 비율을 유지할 수 있습니다.

판다스(Pandas)에서는 MinMaxScaler 클래스를 사용하여 각 열을 특정 값 범위로 확장할 수 있습니다.

다음 데이터로 된 NormalizeColumns.csv 파일이 있다고 가정하겠습니다.

다음 스니펫 코드는 모든 열의 값을 (0,1) 범위로 조정합니다.

>>> import pandas as pd
>>> from skleran import preprocessing
>>> df = pd.read_csv('NormalizeColumns.csv')
>>> x = df.values.astype(float)
>>> min_max_scaler = preprocessing.MinMaxScaler()
>>> x_scaled = min_max_scaler.fit_transform(x)
>>> df = pd.DataFrame(x_scaled, columns=df.columns)
>>> df

이상치(outlier) 제거하기

통계에서 이상치(이상점, outlier)는 관측된 다른 점들과 먼 지점의 점입니다.

예를 들어, 다음과 같은 값들(234, 267, 1, 200, 245, 300, 199, 250, 8999, 245)이 세트로 주어졌다고 하면, 이 중에서 명백하게 1과 8999는 이상치(oulier)입니다. 

그들은 나머지 값들과 뚜렷이 구별되며, 데이터셋의 대부분의 다른 값들과 달리 "바깥에 위치합니다". 

이상치는 주로 기록 또는 실험 오류의 오류로 인해 발생하며 머신러닝에서는 모델을 학습하기 전에 이상치를 제거해야 합니다. 

그렇지 않으면 모델을 왜곡시킬 수 있습니다.

이상치를 제거하는 데는 여러 가지 기술이 있으며,이번에서는 두 가지를 논의합니다.

  • Tukey Fences
  • Z-Score

Tukey Fences

Tukey Fences는 사분위 범위(IQR, interquartile range)를 기반으로 합니다. 

Q1이라고 표시된 첫번째 사분위수는 데이터셋의 값 중 첫번째 25 %를 보유하는 값입니다.

3분위수(Q3)은 데이터셋의 값 중 3번째의 25 %를 보유하는 값입니다. 

따라서, 정의에 따르면, IQR = Q3-Q1입니다.

아래 그림은 짝수 및 홀수 값을 가진 데이터셋에 대해 IQR을 얻는 방법의 예를 보여줍니다.

Tukey Fences에서 이상치(outlier)는 다음과 같은 값입니다.

  • Q1 - (1.5 * IQR) 미만 or
  • Q3 + (1.5 * IQR) 초과

다음 스니펫 코드는 파이썬을 사용해 Tukey Fences를 실행하는 방법을 보여줍니다.

>>> import numpy as np
>>> def outliers_iqr(data):
              q1, q3 = np.percentile(data, [25, 75])
              iqr = q3 - q1
              lower_bound = q1 - (iqr * 1.5)
              upper_bound = q3 + (iqr * 1.5)
              return np.where((data > upper_bound) | (data < lower_bound))

np.where() 함수는 조건에 만족하는 아이템들의 위치를 반환합니다. 

outliers_iqr() 함수는 첫 번째 요소가 이상치(oulier)값을 갖는 행의 인덱스 배열인 튜플을 반환합니다.

Tukey Fences를 테스트하기 위해, 부모와 자녀의 키에 대해 유명한 Galton 데이터셋을 사용해 보도록 하겠습니다. 

이 데이터셋에는 Francis Galton이 1885년에 실시한 유명한 아동 연구결과를 기반으로 한 데이터가 포함되어 있습니다. 

각각의 경우는 성인용이며 변수는 다음과 같습니다.

  • Family : 자녀가 속한 가족으로서 1에서 204 사이의 숫자와 136A로 표시됩니다.
  • Father : 아빠의 키(인치)
  • Mother : 엄마의 키(인치)
  • Gender : 아이들의 성, 남성(M) 또는 여성(F)
  • Height : 아이들의 키(인치)
  • Kids : 아이들의 가정에서, 아이들의 숫자

이 데이터셋은 898 케이스를 갖고 있습니다. 

먼저 데이터를 읽어들입니다:

>>> import pandas as pd
>>> df = pd.read_csv('http://www.mosaic-web.org/go/datasets/galton.csv')
>>> df.head()

height 컬럼에서 이상치(outlier)를 찾고 싶다면, 다음과 같이 outliers_iqr() 함수를 불러옵니다.

>>> print('Outliers using ourliers_iqr()')
>>> print('=====================')
>>> for i in outliers_iqr(df.height)[0]:
                 print(df[i:i+1])

다음과 같은 결과를 볼 수 있습니다:

Tukey Fences 메서드를 사용해, height 컬럼에 하나의 이상치(outlier)가 있다는 것을 알 수 있었습니다.

Z-Score

이상치(outlier)를 결정하는 두번째 방법은 Z-Score 메서드를 사용하는 것입니다. 

Z-Score는 데이터 포인트가 평균에서 얼마나 많은 표준 편차를 가지는지 나타냅니다.

Z-Score의 공식은 다음과 같습니다.

여기서 xi는 데이터 포인트, μ는 데이터셋의 평균, σ는 표준편차입니다.

  • 음의 Z-Score는 데이터 포인트가 평균보다 작음을 나타내고 양의 Z-Score는 문제의 데이터 포인트가 평균보다 큰 것을 나타냅니다.
  • Z-Score가 0이면 데이터 포인트가 중간(평균)이고 Z-Score가 1이면 데이터 포인트가 평균보다 1 표준편차가 높다는 것을 알 수 있습니다.
  • 3보다 크거나 -3보다 작은 모든 Z-Score는 이상치(outlier)로 간주됩니다.

다음 스니펫 코드는 파이썬을 사용해 Z-Score를 실행하는 방법을 보여줍니다.

>>> def outliers_z_score(data):
           threshold = 3
           mean = np.mean(data)
           std = np.std(data)
           z_scores = [(y - mean) / std for y in data]
           return np.where(np.abs(z_scores) > threshold)

이전에 사용한 것과 동일한 Galton 데이터셋에 대해 outliers_z_score()함수를 사용해 height 컬럼에 대한 이상치(outlier)를 찾을 수 있습니다.

>>> print('Outliers using ourliers_z_score()')
>>> print('=========================')
>>> for i in outliers_z_score(df.height)[0]:
                 print(df[i:i+1])

다음과 같은 결과물을 볼 수 있습니다.

Z- Score 메서드를 사용하면 height 컬럼에 3개의 이상치(outlier)가 있음을 알 수 있습니다.

(Source : Python Machine Learning, Wiley, 2019)

반응형
반응형

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)에서 제공된 샘플 데이터셋을 이용할 수 있습니다.

몇가지 흥미로운 데이터셋이 있는데, 다음과 같습니다.

<캘리포니아 대학, 어바인의 머신러닝 저장소 사용하기>

캘리포니아 대학, 어바인의 머신러닝 저장소는 머신러닝 알고리즘의 데이터 생성 경험적 분석을 위해, 머신러닝 커뮤니티에서 사용하는 데이터베이스, 도메인 이론 및 데이터 생성기 모음입니다.

이 거대한 데이터셋 모음 중에서 흥미로운 몇가지 데이터셋을 살펴보면 다음과 같습니다.

< 직접 자신의 데이터셋 생성하기>

실험을 위한 적당한 데이터셋을 찾을 수가 없다면, 직접 자신의 데이터셋을 생성합니다.

사이킷런(Scikit-learn) 라이브러리의 sklearn.datasets.samples_generator 모듈에는 다양한 유형의 문제에 대해 서로 다른 유형의 데이터 세트를 생성할 수 있는 많은 함수가 포함되어 있습니다.

다음과 같은 데이터셋들을 만들 수 있습니다.

  • 선형으로 분산된 데이터셋
  • 군집화된 데이터셋
  • 순환 방식으로 분산되고 군집화된 데이터셋

1. 선형으로 분산된 데이터셋

make_regression() 함수를 사용해 선형으로 분산된 데이타를 생성합니다. 아웃풋에 적용된 가우스 노이즈의 표준 편차뿐만 아니라, 원하는 피쳐의 수를 지정할 수도 있습니다.

>>> % matplolib inline
>>> import matplotlib.pyplot as plt
>>> from sklearn.datasets.samples_generator import make_regression
>>> X, y = make_regression(n_samples=100, n_features=1, noise=5.4)
>>> plt.scatter(X, y)

2. 군집화된 데이터셋

make_blobs()함수는 n개의 무작위 데이터 클러스터를 생성합니다. 이것은 비지도(자율)학습에서 군집화를 수행할 때 매우 유용합니다.

>>> %matplotlib inline
>>> import matplotlib.pyplot as plt
>>> import numpy as np
>>> from sklearn.datasets import make_blobs
>>> X, y = make_blobs(500, centers=3) # 군집화를 위한 등방성 가우시안 블롭 생성
>>> rgb = np.array(['r', 'g', 'b'])
>>> plt.scatter(X[:, 0], X[:, 1], color=rgb[y]) # 산포도와 컬러 코딩을 사용해 그립니다.

3. 순환 방식으로 분산되고 군집화된 데이터셋

make_circles()함수는 두 개의 차원에 작은 원을 포함하는 큰 원이 포함된 임의의 데이터셋을 생성합니다. SVM(

Support Vector Machines)과 같은 알고리즘을 사용하여 분류(classifications)를 수행할 때 유용합니다.

>>> %matplotlib inline
>>> import matplotlib.pyplot as plt
>>> import numpy as np
>>> from sklearn.datasets import make_circles
>>> X, y = make_circles(n_samples=100, noise=0.09)
>>> rgb = np.array(['r', 'g', 'b'])
>>> plt.scatter(X[:, 0], X[:, 1], color=rgb[y])

다음 번에는 간단한 선형 회귀(linear regression) 알고리즘을 구현해 보면서 사이킷런(Scikit-Learn) 기초 사용법을 익혀 보겠습니다.

 

(Source : Python Machine Learning, Wiley, 2019)

 

반응형

+ Recent posts