정규 표현식, 더미 변수, 샘플링
by Kim
목차
1. 샘플링 함수
일반적으로 모델을 평가할 때 기존의 데이터를 학습 데이터(train data)와 평가 데이터(test data)로 분리하고, 학습 데이터를 모델에 학습 시킨 후 평가 데이터를 넣어서 점수를 얻는 방식으로 이루어집니다. 보다 자세한 설명은 모델 카테고리에서 제대로 다룰 예정이며 이번 글은 간단히 데이터 셋만 분리하는 맛보기라고 생각하시면 됩니다.
numpy 안에 있는 random 안의 randint
함수는 범위 안의 수를 정해진 사이즈 만큼 랜덤으로 생성하는 함수로 데이터의 직접적인 샘플링은 지원하지 않으며, 샘플링에 필요한 번호만 추출이 가능합니다. 아쉬운 점이 있다면 중복 여부를 판단하지 않아 같은 데이터가 들어갈 수 있어 학습/평가 데이터를 추출하는데 적합하지 않습니다.
- 기본 문법
예제) 웹 사이트에 있는 위스콘신 유방암 데이터(wdbc.data)를 csv형태로 불러오고 학습, 실험 데이터를 7:3 비율로 분리
각 컬럼명은 캐글에서도 확인할 수 있습니다.
2. 더미 변수
더미 변수를 만든다는 것은 factor(요인형) 변수를 0과 1을 사용하여 구분하는 방법을 말합니다. 이런 과정 원 핫 인코딩(one-hot-encoding)이라고 합니다. 더미 변수를 만드는 이유는 딥러닝에서는 성능상의 이유로 문자 데이터를 읽지 않기 때문에 숫자로만 표현하기 때문에 문자 데이터를 숫자로 바꿔야 하기 때문입니다. pd.get_dummies
함수를 사용하며 주로 class의 개수만큼, 혹은 하나 적은 변수로 분할하는 방법을 선택합니다.
위에서 불러온 유방암 데이터에서 두 번째 컬럼(진단)을 더미 변수로 만든 후 원래 데이터에 붙여봅시다.
딥러닝 모델에 돌릴 때 무조건 더미 변수를 만드는 것은 아니라고 합니다. 트리 기반 모델의 경우 더미 변수를 보내면 정교하지 못하게 예측하는 경우가 발생한다고 합니다. 절대적인 얘기는 아니며 사용하는 모델에 맞춰서 작업을 진행을 한다고 합니다.
3. 정규 표현식(regexp)
정규 표현식은 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어입니다. 많은 프로그래밍 언어에서 지원하고 약속된 기호를 사용하여 문자열의 패턴을 확인하고 추출하는 것을 도와줍니다. 처음보면 사용하는 기호들이 난해할 수 있지만 패턴대로 문자열을 나누는 기능 자체의 폭은 R에서의 stringr
패키지 등 보다 넓습니다. Python에서 모듈 re
를 호출하여 사용할 수 있습니다.
모듈 re 내에서 match, search, split 등 다른 함수도 자주 사용하는 편이지만 이 글에서는 패턴을 지정하는 compile
과 패턴에 맞는 문자를 리스트 형태로 만들어주는 findall
만 사용할 것입니다.
1) compile
자주 쓰는 정규식 패턴은 compile하여 변수화하여 사용합니다. 패턴에 대한 내용은 예제를 직접 실행하면서 설명하도록 하겠습니다.
※ 간단한 팁 및 주의사항
1) 영어의 경우에는 [a-z]
로 찾을 수 있고, 한글의 경우에는 [가-힣]
으로 찾을 수 있습니다.
2) (
,)
나 .
등은 문법으로 사용되는 기호이기 때문에 저 문자를 패턴으로 입력하고 싶을때는 이스케이프 문자인 \
를 입력해야 합니다.
3) \
는 대괄호 내에서 이스케이프 기능을 수행하지 못하며, 일반 기호로 인식됩니다.
2) findall
re.compile로 변수화한 패턴을 이용하여 findall에 넣으면 원하는 패턴의 글자를 찾을 수 있습니다.
이메일은 보통 아이디@포털이름.com
식의 구조로 되어있는데 아이디에는 영어와 숫자가 들어가기 때문에 아이디에 들어가는 패턴을 찾기 위해 @
앞에 [a-z0-9]+
를 입력하였습니다. 포털 이름은 영어로만 되어 있어서 [a-z]+
를 입력하였습니다. 마지막으로 이메일 주소 맨 뒤에는 com 이나 net 등의 영어가 오기 때문에 마찬가지로 [a-z]+
를 입력하였습니다.
이처럼 원하는 패턴을 입력하여 찾고 그 글자를 그대로 가져오는 방법도 있지만 가져온 글자에서 원하는 부분만 바로 가져올 수 있는 기능도 있습니다. 예를 들면 위에서 이메일 주소의 패턴을 찾고나서 아이디에 해당하는 부분만 찾는 것을 의미합니다. 괄호 기호를 이용한 방법입니다.
아래 예시는 이메일 주소에서 아이디와 포털 이름 둘만 묶어서 출력하는 패턴입니다.
아이디에 해당하는 앞 부분, @와 . 사이에 포털 이름 각각의 양 옆에 괄호를 입력함으로서 두 부분만 떼서 튜플 형식으로 바꾼 후 출력한 모습을 볼 수 있습니다. 다음으로는 방금 추출한 리스트에서 모듈 pandas의 시리즈를 이용하여 아이디 따로, 포털 이름만 따로 출력하는 코드도 실행해보겠습니다.
3) str.findall
str.findall은 pandas에 내장되어 있는 모듈로 시리즈에 적용가능한 패턴 추출 메소드로 벡터연산이 내장되어 있어 모든 원소에 대해 패턴 추출이 가능한 메소드입니다.
해당 메소드를 이용하여 문자가 들어있는 시리즈에서 이메일 주소만 추출해봅시다.
추가로 원소마다 있는 리스트의 괄호를 벗기는 방법은 str 메소드를 이용하면 됩니다.
Subscribe via RSS