공간분석 프로젝트에서 사용된 주요 전처리 함수 정리하여 포스팅하였습니다.
'데이터분석' 카테고리의 다른 글
사용자 사전 추가된 Mecab 형태소 분석 in Corab (0) | 2023.12.04 |
---|
사용자 사전 추가된 Mecab 형태소 분석 in Corab (0) | 2023.12.04 |
---|
단어 통일화 및 사용자 사전 구축에 따른 mecab 형태소 분석을 Class로 정의하였습니다.
클래스 내 함수 def _morph는 변수명이 하드코딩으로 되어 있으므로 수정이 필요합니다.
또한, 해당 함수는 형태소분석기로 추출된 단어가 사고유형, 장소, 시간 등에 따라 분류가 되는 코드입니다.
만일 추출된 단어별로 재 분류가 필요 없다면 _ morph 함수를 수정해야 합니다.
공간분석 프로젝트_함수정리 (0) | 2023.12.04 |
---|
선형회귀분석 중 조절변수, 매개변수, 스케일링에 따른 해석차이와 방법을 알고자 공부한 내용을 공유드려요
이번 기회를 통하여 여러분도 선형회귀분석의 새로운 관점을 얻고 가시길 바랍니다 :]
틀린내용이 있다면 댓글로 남겨주시면 감사하겠습니다
대화체 문장간의 유사도를 구하여 추천 알고리즘으로 만들기 위한 목적으로 스터디 하고 있습니다.
임베딩는 크게 단어임베딩 VS 문장임베딩으로 나눌수가 있습니다.
단어임베딩은 각 단어에 대해서 vector 진행 후 유사도를 구하는데 이에 단점은 문맥을 고려 하지 않는다는 점이다. 문맥을 포함한 임베딩을 만들기 위해서 문장임베딩이 사용이 되는데, 여기에는 Doc2vec 혹은 Transformer과 같은 딥러닝의 임베딩을 예로 들수가 있다.
필자는 Word2vec(단어임베딩)를 사용하여 문장 전체 임베딩을 구하는 sentence2vec을 사용하여 실험해 보았습니다.
자세한 코드 내용은 https://github.com/stanleyfok/sentence2vec 에서 볼수 있습니다.
사용된 데이터는 유튜브 댓글임을 알려드립니다.
import re
import numpy as np
from numpy import dot
from numpy.linalg import norm
from gensim.models import Word2Vec
from nltk import word_tokenize
class Sentence2Vec:
def __init__(self, model_file):
self.load(model_file)
def load(self, model_file):
self.model = Word2Vec.load(model_file)
def get_vector(self, sentence):
# convert to lowercase, ignore all special characters - keep only
# alpha-numericals and spaces
sentence = re.sub('[^ ㄱ-ㅣ가-힣]+', '', str(sentence))
vectors = [self.model.wv[w] for w in word_tokenize(sentence)
if w in self.model.wv]
v = np.zeros(self.model.vector_size)
if (len(vectors) > 0):
v = (np.array([sum(x) for x in zip(*vectors)])) / v.size
return v
def similarity(self, x, y): #코사인 유사도
xv = self.get_vector(x)
yv = self.get_vector(y)
score = 0
if xv.size > 0 and yv.size > 0:
score = dot(xv, yv) / (norm(xv) * norm(yv))
return score
문장 벡터를 구하기 위한 Class를 선언 합니다. def similarity 함수에서 문장간의 유사도를 구할수 있습니다.
import pandas as pd
import re
import logging
import nltk
from nltk import word_tokenize
from nltk.corpus import stopwords
from gensim.models import Word2Vec
nltk.download('stopwords')
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s',
level=logging.INFO)
def cleanData(documents):
# for i,document in enumerate(documents):
#(), [] 패턴 삭제
# document = re.sub('\[[a-zA-Z0-9가-힣-=+’:\'./!★\s]{0,60}\]|\([a-zA-Z0-9가-힣-=.\'_/‘’:眞&?★·!,\s]{0,60}\)',"",document)
# #한글 및 띄어쓰기만 남기고 제거
document = re.sub('[^ ㄱ-ㅣ가-힣]+',"",str(documents))
#특수문자 제거
# document = re.sub('[★◆●▶♥●◆!@#$-=+,#/\?:^$.@*\"※~&%ㆍ!』\\‘|\(\)\[\]\<\>`\'…》;:?↑→‘’]',"",document)
return document
df = pd.read_csv('./testing_csv_raw.csv')
# drop duplicate rows
df = df.drop_duplicates(subset='string')
# clean data
df['string'] = df['string'].map(lambda x: cleanData(x))
# print('strings',df['string'] )
# get array of strings
strings = df['string'].values.tolist()
# tokenize the each string
tok_strings = [word_tokenize(string) for string in strings]
# refer to here for all parameters:
# https://radimrehurek.com/gensim/models/word2vec.html
model = Word2Vec(tok_strings, sg=1, vector_size=100, window=5, min_count=5, workers=4,
epochs=100)
# save model to file
model.save('./model/utube_strings.model')
문장 정제 후 word_tokenize로 문장내 단어간의 분리를 한뒤 각 Word2Vec, 즉 각 단어 별로 벡터화를 진행해줍니다.
각 단어별로 단어를 구하면 아래 그림처럼 평균으로 만들어서 문장벡터로 변환할수 있습니다.
해당 코드 결과, "잘 어울려요"와 비슷한 문장을 내림차순으로 정렬한 모습입니다.
제 개인적인 생각으로는 "잘" 이라는 요소 때문에 어울린다는 말과는 별개로 추천되고 있다는 느낌을 받았습니다.
아마도 단어 기반의 벡터로 유사도를 구했기 때문임을 추측해 볼수 있습니다. 결국 댓글과 같은 문맥이 중요한 텍스트는 문장 임베디을 사용하는 것이 유리하다고 판단 됩니다.
따라서 문장 임베딩 기법 중 Doc2vec에 대하여 스터디 진행해 볼 계획입니다.
mlops에 관심을 가지게 되어 패캠의 머신러닝 서비스 구축을 위한 실전 MLOps 올인원 패키지 Online 이라는 강의를 수강하게 되었습니다. 생소한 단어와 개념이 많아서 블로그에 정리를 하고자 합니다. 만일 설명이 틀리거나 수정할 부분이 있다면 수정하도록 하겠습니다! 실습 자료는 아래 링크를 통해 볼수 있습니다.
https://rigorous-firefly-d50.notion.site/MLOps-486a7bcd320b4e9f93a70b5691b88dd1
mlops 수행에 있어서 도커 & 쿠버네티스를 왜 사용해야하는가?
AI 개발을 하다보면 가장 만나는 난관이 패키지의 버전 문제라고 생각한다. 실례로 회사 GPU 서버에 연결하기 위해서 cuda와 pytorch를 설치했는데 버전 문제때문에 시간을 할애해야 했다. 그렇다면 나의 코드를 다른 곳에서 작동시킬려면 다시 패키지를 설치해야 할까? 우리가 불편함을 느끼는 기술은 이미 구축되어 있다. 나의 ML 코드를 작동시키기 위한 패키지를 코드와 함께 묶어서 전달하면 된다. 어떠한 OS 이든 환경이든 상관하지 않은채 내 코드만의 독립된 환경을 구축하는 겁니다(Reproducibility)
그뿐만아니라 ML 학습의 스케쥴링, 병렬작업 관리, 유휴작업관리 등 스케쥴링 기능을 하며(job Scheduling) 자운용중인 서버에서 발새하는 장애, 트랙픽 대응하는 역할(auto-healing & auto-scaling)도 포함됩니다.
위에 언급된 기술들은 Docker와 쿠버네티스로 구축할수 있습니다.
*도커와 쿠버네티스
docker의 containerization, 쿠버네티스의 container Orchestration에 대해서 알아봅시다.
containerization는 위 기술 중 Reproducibility에 해당한다. 아래 그림을 보면
내가 필요한 것들을 한 곳에 모아서 묶어 패키징 하는 것을 containerization이라 합니다. 참고로 도커 이미지란 어떤 애플리케이션에 대해서,단순히 애플리케이션 코드뿐만이 아니라,그 애플리케이션과 dependent 한 모든 것을 함께 패키징한 데이터를 말한다. 다시 본론으로 돌아와서 이러한 containerization이 수십개가 동시에 운용이 되어야 한다면 사람이 일일이 괸리 해야할까? 아닙니다. 복수의 containerization을 사람대신 자동으로 일해주는 기술이 있는데 이를 쿠버네티스의 오케스트레이션이라 합니다.
오케스트레이션을 통해서, 메모리가 많이 필요한 컨테이너는 메모리가 많이 있는 서버로 연결해주는 등 사람이 하는 일을 컴퓨터가 알아서 할수 있도록 돕는다. 말 그대로 컨테이너를 지휘하는 역할입니다.
쿠버네티스는 사용감이 까다롭기 때문에 복잡성을 보완한 서비스가 이용되고 있다. 대표적으로 위 세개의 프로그램인데 데 물론 공짜는 아니고 사용료를 지불해야 합니다. 따라서 오픈형 쿠버네티스 버전을 이용하여 무료로 접근하고자 합니다.
미니큐브라는 것을 통해 "나만의 작은 쿠버네티스"를 구축 할수 있다고 합니다. 그래서 본 강의는 미니큐브를 설치하여 진행하고 있습니다.
코드 알고리즘을 짜게되면 일일이 하나씩 다 지정을 해줘야 하는 번거로움이 존재합니다. 이렇게 하나부터 열까지 모두 명령을 쳐야 하는 것을 명령형 인터페이스 라고 합니다. 하지만 쿠버네티스는 사용자가 무엇을 하고자 하는지 목적만 받으면 내부적으로 어떻게 만들어야 할지는 알아서 진행해줍니다. 위 그림의 예시를 보면 이해가 되실거라 생각됩니다. 그러면 쿠버네티스가 오직 사용자의 목적만 입력 받으면 안에 내부적으로 어떻게 진행이 되는지 대략적으로만 살펴보겠습니다.
필기 크기가 작은 점 양해 바랍니다 ;;
쿠버네티스는 크게 control plane과 node로 나뉩니다. 제가 이해한 것을 예시로 들자면 control plane은 회사에서 부장급이라고 보면 됩니다. node는 실질적으로 일하는 직원입니다. 고객의 요구가 들어오면 부장이 스케쥴링을 하여 효율적으로 직원들에게 일을 뿌려 주는 모습과 흡사합니다.
도커의 컨테이너를 지휘하는 기술은 오케스트레이션 뿐만 아니라 다양하게 있지만 현재 가장 많이 사용되는 것이 바로 이 쿠버네티스입니다.
강의에서는 윈도우,맥 사용자 구분없이 수업에 통일성을 주기위해서 가상머신(Virtual Box)을 설치 한 후에 그위에 우분투(20.004.3 LTS)를 올려서 실습을 진행함을 말씀드립니다.
가상머신의 설치와 환경설정들은 실습자료 사이트를 참고하시면 했으며 아래 내용은 제가 직접 실습하면서 겪었던 오류나 기억해야할만한 과정들만 기록해 두었습니다.(저처럼 초보분들이 당황할만한 내용을 공유하고자)
- 복붙은 언제나 필수 기능입니다. 윈도우에서 복사 후 shift+inert로 가상머신 터미널에 넣으면 되는데, 수행이 되지 않았습니다. 구글링하면서 양방향 설정도 해봤지만 실패 하였습니다. 실질적으로 도움 받았던 블로그는 아래 링크를 걸어두었습니다. 저처럼 복붙이 안되시는 분이 있다면 참고 바라겠습니다.
https://whareview.tistory.com/4
실습 내용에 따라 Dockerfile을 만들고 vi를 통해서 편집기 모드로 변환했습니다. 해당 모드에서는 명령어를 자유롭게 기술하는 편리함을 제공받을수 있습니다.
2.1 입력모드 진입
- 처음 진입 시 입력어가 먹질 않는다. vi는 명령어모드와 입력모드로 나뉘어 집니다. 처음 들어가게 되면 자동으로 명령어 모드로 셋팅되어 있으며 입력하고자 할때는 "i" or "a" 키를 먼저 눌러주면 입력이 가능합니다. 반대로 입력모드에서 명령어 모드로 갈려면 esc를 눌러주면 됩니다.
그렇다면 명령어모드에서는 어떤걸 할수 있는지 궁금해 집니다. 해당 내용은 https://opentutorials.org/course/730/4561 블로그를 참고 해주시면 될것같습니다. (참고로 편집기를 종료하고자 할때는 명령어모드에서 수행해야합니다)
2.2 입력한 문자를 수정 or 삭제
첫줄에 입력하고 enter를 치면 아랫줄로 변경된다. 첫줄을 수정 할려고 윗쪽 방향키를 누르면 "A"가 나올뿐 첫줄로 옮겨 지지 않았습니다. 이것저것 눌러보니까 자유로운 줄 변경을 위해서는 shift + 왼쪽 or 아래 방향키를 먼저 눌러준 후에 이동 가능합니다.
- 도커의 이미지를 남들과 공유하기 위해서 저장을 해야합니다. 저장된 저장소로부터 이미지를 다운 받아서 사용할수 있게 됩니다.
-d(백그라운드)에서 실행하여 5000번포트에서 registry라는 이름의 도커 컨테이너스를 run(실행)한다.
- registry라는 곳에 image를 태깅 후 push해준다. 아래 그림 참고바랍니다.
211208_자연어 입문편(mse loss) (0) | 2021.12.09 |
---|---|
211207_자연어 입문편(Cross Entropy) (0) | 2021.12.07 |
211204_자연어 입문편(Kullback) (0) | 2021.12.07 |
211201_자연어 입문편(MAP) (0) | 2021.12.07 |
211129_자연어 입문편(MLE 수식) (0) | 2021.11.29 |
211209_자연어 입문편(차원축소) (0) | 2021.12.09 |
---|---|
211207_자연어 입문편(Cross Entropy) (0) | 2021.12.07 |
211204_자연어 입문편(Kullback) (0) | 2021.12.07 |
211201_자연어 입문편(MAP) (0) | 2021.12.07 |
211129_자연어 입문편(MLE 수식) (0) | 2021.11.29 |
차원이 높아질수록 sparse하게 분포되므로 모델링하기가 어려워진다. 예를들어 Kmean는 고차원의 데이터를 다룰 경우 성능이 저하되며 해석도 난해하게 된다. 따라서 쓸데없이 공간만 차지 하는 차원 때문에 성능 저하에 우려가 된다. 이를 해결하기 위해선 적절하게 저차원에서 실행하는 것이 옳다.
PCA는 어떤 샘플이 있을 때, 이를 잘 설명하는 새로운 축을 찾아내는 방법이다. 축이 분포를 잘 설명한다는 뜻은 무엇일까를 한번 생각해보자.
위 두 조건을 만족했을 때 설명을 잘 해준다고 볼수 있다. 검은점이 기존의 분포이며 이 것들이 빨간점으로 projection된다. 이때 빨간점끼리 서로 멀어지도록 해야 한다. 두번째 조건은 projection할 때, 검은점과 검은 선 사이의 거리의 합이 최소가 되야 한다. 최소가 되어야 하는 이유는 Projection되는 거리 만큼 정보의 손실이 발생하기 때문이다.(손실 압축)
9.Mse Loss (0) | 2021.12.09 |
---|---|
8.Cross_entropy (0) | 2021.12.07 |
7.Kullback (0) | 2021.12.07 |
6. MAP(Maximum A Posterior) (0) | 2021.12.01 |
5. MLE 수식 (0) | 2021.11.29 |