일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- writeup
- 머신러닝
- 리액트
- html
- 알고리즘
- 넘파이
- 리버싱
- 컴퓨터 구조
- MySQL
- sql injection
- 해킹
- 웹
- php
- 리눅스
- C언어
- abex crackme
- 회귀 수식
- 백준 알고리즘
- 웹해킹
- 리버싱 워게임
- 자바스크립트
- 보안
- webhacking.kr
- CodeEngn
- 리버싱 문제
- 어셈블리어
- webhacking
- 백준
- 워게임
- 인공지능
- Today
- Total
인공지능 개발일지
Word2Vec 라이브러리로 임베딩과 단어 유사도 구하기 본문
안녕하세요. 이번 시간에는 임베딩의 간단한 개념과 Word2Vec를 사용해서 단어 임베딩과
단어 간의 유사도 구하기를 실습해봅시다.
(개인적으로 자연어 처리가 너무 재밌고 신기한 것 같아요)
0. 논문의 Word2Vec와 라이브러리 Word2Vec의 차이점
우선 들어가기에 앞서 Word2Vec에 대해 먼저 말씀드리면 Word2Vec는 원래 자연어 처리에서 유명한 논문 중 하나로 문장을 벡터로 표현하는 방법 중 하나입니다. 그래서 이 논문을 보면 Word2Vec는 원래 문장을 입력값으로 받아서 그 문장에서 단어의 위치로부터 의미와 유사도를 좌표축상에 나타내고 이를 기반으로 단어를 임베딩하고 단어 간의 거리를 통해 유사도를 구할 수 있습니다.
그래서 이의 특성으로는 문장이 입력값으로 들어갈 때 좋은 성능이 나오고 문장이 아닌 단순 쉼표로 나누어진 단어의 배열 같은 경우는 좋은 성능을 기대하기 어렵다고 알려져 있습니다.
그러나 우리가 오늘 사용하는 Word2Vec은 라이브러리 형태로 구현된 것이기 때문에 사용 방식이 조금 다릅니다.
원문의 Word2Vec는 토큰을 입력으로 받아서 단어 모델을 생성하고 이를 바탕으로 단어 임베딩을 합니다.
그리고 이 임베딩된 단어들간의 유사도를 구하거나 상호 유사도 행렬을 생성할 수 있습니다.
그래서 이 점 유의하시고 실습 따라와 주시면 감사하겠습니다:)
1. 임베딩이란?
임베딩이란 문자를 벡터로 표현하는 방법 중 하나입니다. 벡터란 한 행 혹은 한 열과 같이 배열에서 한 줄을 보통 벡터라고 생각하시면 편합니다. 그래서 임베딩이란 문자를 벡터와 같은 수치형 데이터로 바꿔서 표현하는 방법입니다.
신기하지 않나요?
그래서 임베딩을 간단히 말하면 단어를 벡터(수치)로 바꾸는 방법입니다. 왜 이런 작업이 필요한가에 대해서는 머신러닝의 전체적인 데이터 전처리 프로세스에서 따르게 됩니다.
머신러닝 라이브러리 사이킷런에서는 모델의 입력값으로 문자열 데이터를 처리하지 못하기 때문에 칼럼의 데이터는 수치형 데이터와 범주형(문자) 데이터로 나뉘어서 데이터를 전처리할 때 문자의 값은 숫자로 바꿔주어야 하기 때문에 위 작업이 사용되곤 합니다. 꼭 위와 같이 전처리할 때가 아니라 챗봇과 같이 여러 분야에서 문자를 벡터로 표현해야 할 때 임베딩을 사용합니다.
사용 데이터
우선 오늘 사용할 데이터는 데이콘의 KNOW 직업추천 알고리즘 경진대회의 2017년 train data입니다.
그러나 오늘 실습을 잘 이해하셨다면 다른데이터에 대해서도 동일한 구조로 변수를 바꿔주면 같은 실습을 하실 수 있습니다. 위에서 말했듯이 Word2Vec 모델을 생성하려면 토큰을 입력해서 단어 모델을 생성해야 사용할 수 있습니다.
그래서 구체적인 방법은 아래와 같습니다.
- 전체 데이터에서 문자형 칼럼만 먼저 따로 복사해오기
- 그 칼럼들을 모두 합쳐서 한 칼럼으로 만들기
- 그 칼럼들의 문장들을 토큰 단위로 나누어서 단어 모델에 학습
- 단어 모델에서 임베딩이나 단어간의 유사도를 구할 수 있음
1. 범주형(문자) 칼럼만 분리
우선 사용할 라이브러리들을 불러와줍니다.
# 라이브러리 불러오기
from tqdm import tqdm_notebook as tqdm
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
from gensim.models.word2vec import Word2Vec
from soynlp.tokenizer import RegexTokenizer
import pandas as pd
import numpy as np
import math
import warnings
from konlpy.tag import Okt,Hannanum,Kkma,Komoran,Mecab
from numpy import dot
from numpy.linalg import norm
import re
from nltk.tokenize import word_tokenize, sent_tokenize
from gensim.models import word2vec
import nltk
import re
import urllib.request
import zipfile
from lxml import etree
from nltk.tokenize import word_tokenize, sent_tokenize
from tqdm import tqdm
from sklearn.manifold import TSNE
import matplotlib as mpl
import matplotlib.pyplot as plt
import gensim
import gensim.models as g
nltk.download('punkt')
warnings.filterwarnings(action = 'ignore')
# 데이터 불러오기
train2017_csv=pd.read_csv("./train/KNOW_2017.csv",low_memory=False)
train2018_csv=pd.read_csv("./train/KNOW_2018.csv",low_memory=False)
train2019_csv=pd.read_csv("./train/KNOW_2019.csv",low_memory=False)
train2020_csv=pd.read_csv("./train/KNOW_2020.csv",low_memory=False)
sample_submission_csv=pd.read_csv("./sample_submission.csv")
test2017_csv=pd.read_csv("./test/KNOW_2017_test.csv",low_memory=False)
test2018_csv=pd.read_csv("./test/KNOW_2018_test.csv",low_memory=False)
test2019_csv=pd.read_csv("./test/KNOW_2019_test.csv",low_memory=False)
test2020_csv=pd.read_csv("./test/KNOW_2020_test.csv",low_memory=False)
원래 데이터는 수치형 칼럼과 범주형(문자) 칼럼만 따로 분리해줍니다.
# 텍스트 칼럼만 모아서 전처리
textColumns=['bq4_1a','bq4_1b','bq4_1c','bq5_2','bq19_1','bq30','bq31','bq32','bq33','bq34','bq38_1']
# data leackage 때문에 Test 데이터의 말뭉치를 같이 학습시키면 안 됨
text=train2017_csv[textColumns]
그리고 확인해보면 아래와 같이 문자 값이 들어간 칼럼만 따로 분리가 된 것을 확인할 수 있습니다.
text
그럼 이제 위의 텍스트 칼럼 11개를 1의 칼럼으로 공백을 기준으로 합쳐줍니다. 합쳐주는 이유는 전체 값들의 토큰을 모델에 입력해야하기 때문에 각각 칼럼별로 토큰화해서 입력하나 전체를 합친 문장의 토큰으로 학습하나 동일한 토큰이기 때문에 학습의 편리를 'sentence'라는 칼럼을 생성해 그 칼럼에 concat한 값을 넣어줍니다.
# 칼럼 다 합친 새칼럼 생성
cols=['bq4_1a', 'bq4_1b', 'bq4_1c', 'bq5_2', 'bq19_1', 'bq30', 'bq31', 'bq32','bq33', 'bq34', 'bq38_1']
text['sentence']=text[cols].apply(lambda row: ' '.join(row.values.astype(str)), axis=1)
2. 데이터 전처리 후 토큰화
soynlp의 RegexTokenizer를 이용해서 데이터를 토큰화해줍니다.
이때 soynlp가 없다고 에러가 뜨면 !pip install soynlp를 실행해 주시면 됩니다.
먼저 RegexTokenizer를 불러와서 객체에 할당해 줍니다. 잘 불러와 졌네요!
tokenizer = RegexTokenizer()
tokenizer
[Output]
<soynlp.tokenizer._tokenizer.RegexTokenizer at 0x7f279108d050>
그럼 위에서 학습에 입력값인 text의 sentence 칼럼을 전처리해줍니다. 아래 preprocessing 함수를 실행해주면 쉼표 같은 특수문자는 없애주고 한글, 영어만 남겨줍니다.
# 전처리 함수 선언
def preprocessing(text):
# 개행문자 제거
text = re.sub('\\\\n', ' ', text)
# # 한글, 영문만 남기고 모두 제거하도록 합니다.
text = re.sub('[^가-힣ㄱ-ㅎㅏ-ㅣa-zA-Z]', ' ', text)
return text
# 텍스트 학습전 전처리 적용
%time sentences=text['sentence'].apply(preprocessing)
[Output]
CPU times: user 62.7 ms, sys: 544 µs, total: 63.2 ms
Wall time: 62.7 ms
전처리가 완료된 문장을 한 번 출력해봅시다.
sentences
[Output]
0 자동차도장기능사 실무교육 생산설비의 자동화로 없다 없다 없다 건설현장 노무직...
1 건축전기설비기술사 건설 수주가 없어서 없다 매타기 드라이버 가위 C...
2 건축전기설비기술사 신축 건설경기가 좋지 않아서 없다 건축설계표 오토캐드...
3 지적기사 측량 및 정보통신기술 교육 업무량 감소 자동화로 인해서 지적기사 ...
4 건축전기설비기술사 부동산 거품 빠지면서 건축 경기도 덩달아 불황 없다 캐...
...
9481 편집기술에 원리와 이해능력 출판업무 특성상 기획업무는 변함없음 없다 한글...
9482 도면 작성 교육 전자 기초 이해 항공우주분야는 국가 경쟁력을 위해 육성...
9483 건설경기는 꾸준해서 건설 노가대 볼트 리벳 없다 없다 없다 기계
9484 공무원의 인원은 크게 변동이 없어서 없다 컴퓨터 없다 모름 문헌정보학
9485 업체 과다 경쟁 없다 차량관리 시스템 전기
Name: sentence, Length: 9486, dtype: object
그럼 여기까지 데이터를 토큰화하기 위해 전처리를 해보았습니다. 이제 바로 위의 정제된 sentences 데이터를 토큰화 해봅시다. 토큰이란 문장을 단어 명사의 단위로 나눠주는 것을 의미합니다. 여기서 토큰화 시킨 값을 tokens라는 변수에 값을 넣어줍니다. 아래 결과를 보면 토큰화가 잘 된 것을 확인하실 수 있습니다.
# 텍스트 데이터 토큰화
%time tokens = sentences.apply(tokenizer.tokenize)
tokens[:]
[Output]
CPU times: user 690 ms, sys: 8.89 ms, total: 698 ms
Wall time: 695 ms
0 [자동차도장기능사, 실무교육, 생산설비의, 자동화로, 없다, 없다, 없다, 건설현장...
1 [건축전기설비기술사, 건설, 수주가, 없어서, 없다, 매타기, 드라이버, 가위, C...
2 [건축전기설비기술사, 신축, 건설경기가, 좋지, 않아서, 없다, 건축설계표, 오토캐...
3 [지적기사, 측량, 및, 정보통신기술, 교육, 업무량, 감소, 자동화로, 인해서, ...
4 [건축전기설비기술사, 부동산, 거품, 빠지면서, 건축, 경기도, 덩달아, 불황, 없...
...
9481 [편집기술에, 원리와, 이해능력, 출판업무, 특성상, 기획업무는, 변함없음, 없다,...
9482 [도면, 작성, 교육, 전자, 기초, 이해, 항공우주분야는, 국가, 경쟁력을, 위해...
9483 [건설경기는, 꾸준해서, 건설, 노가대, 볼트, 리벳, 없다, 없다, 없다, 기계]
9484 [공무원의, 인원은, 크게, 변동이, 없어서, 없다, 컴퓨터, 없다, 모름, 문헌정보학]
9485 [업체, 과다, 경쟁, 없다, 차량관리, 시스템, 전기]
Name: sentence, Length: 9486, dtype: object
3. Word2Vec 모델에 학습
위 토큰을 담은 tokens를 이제 Word2Vec 모델에 학습시켜 봅시다!!
# 로그를 출력하기 위해 불러오기
import logging
logging.basicConfig(
format='%(asctime)s : %(levelname)s : %(message)s',
level=logging.INFO)
모델에 학습시키는 코드는 아래와 같이 간단합니다! (사전 처리로 입력 형식 맞춰주는 게 더 오려 걸려요)
와우! 드디어 우리의 단어 모델이 생성됐네요. (사실 이때 너무 기분 좋았음)
model = word2vec.Word2Vec(tokens, min_count=1)
model
[Output]
2022-05-04 08:38:31,394 : INFO : collecting all words and their counts
2022-05-04 08:38:31,395 : INFO : PROGRESS: at sentence #0, processed 0 words, keeping 0 word types
2022-05-04 08:38:31,434 : INFO : collected 30025 word types from a corpus of 141768 raw words and 9486 sentences
2022-05-04 08:38:31,435 : INFO : Loading a fresh vocabulary
2022-05-04 08:38:31,482 : INFO : effective_min_count=1 retains 30025 unique words (100% of original 30025, drops 0)
2022-05-04 08:38:31,483 : INFO : effective_min_count=1 leaves 141768 word corpus (100% of original 141768, drops 0)
2022-05-04 08:38:31,560 : INFO : deleting the raw counts dictionary of 30025 items
2022-05-04 08:38:31,561 : INFO : sample=0.001 downsamples 18 most-common words
2022-05-04 08:38:31,562 : INFO : downsampling leaves estimated 112252 word corpus (79.2% of prior 141768)
2022-05-04 08:38:31,615 : INFO : estimated required memory for 30025 words and 100 dimensions: 39032500 bytes
2022-05-04 08:38:31,616 : INFO : resetting layer weights
2022-05-04 08:38:36,720 : INFO : training model with 3 workers on 30025 vocabulary and 100 features, using sg=0 hs=0 sample=0.001 negative=5 window=5
2022-05-04 08:38:36,843 : INFO : worker thread finished; awaiting finish of 2 more threads
2022-05-04 08:38:36,848 : INFO : worker thread finished; awaiting finish of 1 more threads
2022-05-04 08:38:36,860 : INFO : worker thread finished; awaiting finish of 0 more threads
2022-05-04 08:38:36,862 : INFO : EPOCH - 1 : training on 141768 raw words (112197 effective words) took 0.1s, 837614 effective words/s
2022-05-04 08:38:37,015 : INFO : worker thread finished; awaiting finish of 2 more threads
2022-05-04 08:38:37,018 : INFO : worker thread finished; awaiting finish of 1 more threads
2022-05-04 08:38:37,028 : INFO : worker thread finished; awaiting finish of 0 more threads
2022-05-04 08:38:37,029 : INFO : EPOCH - 2 : training on 141768 raw words (112329 effective words) took 0.2s, 730509 effective words/s
2022-05-04 08:38:37,197 : INFO : worker thread finished; awaiting finish of 2 more threads
2022-05-04 08:38:37,210 : INFO : worker thread finished; awaiting finish of 1 more threads
2022-05-04 08:38:37,212 : INFO : worker thread finished; awaiting finish of 0 more threads
2022-05-04 08:38:37,213 : INFO : EPOCH - 3 : training on 141768 raw words (112267 effective words) took 0.2s, 646943 effective words/s
2022-05-04 08:38:37,369 : INFO : worker thread finished; awaiting finish of 2 more threads
2022-05-04 08:38:37,385 : INFO : worker thread finished; awaiting finish of 1 more threads
2022-05-04 08:38:37,391 : INFO : worker thread finished; awaiting finish of 0 more threads
2022-05-04 08:38:37,392 : INFO : EPOCH - 4 : training on 141768 raw words (112156 effective words) took 0.2s, 665924 effective words/s
2022-05-04 08:38:37,571 : INFO : worker thread finished; awaiting finish of 2 more threads
2022-05-04 08:38:37,573 : INFO : worker thread finished; awaiting finish of 1 more threads
2022-05-04 08:38:37,580 : INFO : worker thread finished; awaiting finish of 0 more threads
2022-05-04 08:38:37,581 : INFO : EPOCH - 5 : training on 141768 raw words (112285 effective words) took 0.2s, 650566 effective words/s
2022-05-04 08:38:37,582 : INFO : training on a 708840 raw words (561234 effective words) took 0.9s, 651403 effective words/s
<gensim.models.word2vec.Word2Vec at 0x7f278fea63d0>
완성된 모델을 저장하고 학습된 단어를 몇 개 확인해 봅시다.
# 모델 이름을 지정하고 저장한다.
model_name = 'recommandModel'
model.save(model_name)
[Output]
2022-05-04 08:38:37,597 : INFO : saving Word2Vec object under recommandModel, separately None
2022-05-04 08:38:37,599 : INFO : not storing attribute vectors_norm
2022-05-04 08:38:37,601 : INFO : not storing attribute cum_table
2022-05-04 08:38:37,980 : INFO : saved recommandModel
# 단어 사전 수
len(model.wv.vocab)
[Output]
30025
# 단어 사전에서 상위 10개만 보기
vocab = model.wv.vocab
sorted(vocab, key=vocab.get, reverse=True)[:30]
[Output]
['없다',
'컴퓨터',
'PC',
'없음',
'등',
'및',
'대한',
'엑셀',
'프로그램',
'증가',
'기계',
'모름',
'때문에',
'것',
'교육',
'인문계',
'자격증',
'감소',
'있어서',
'선생님',
'경영학',
'포토샵',
'자동화',
'많이',
'것이다',
'훈련',
'계속',
'인해',
'수',
'꾸준히']
추가로 자주 등장하는 단어도 확인해 봅시다.
# Counter로 자주 등장하는 단어 보기
from collections import Counter
dict(Counter(vocab).most_common(20))
[Output]
{'CAD': <gensim.models.keyedvectors.Vocab at 0x7f0052e6bb50>,
'D': <gensim.models.keyedvectors.Vocab at 0x7f0053bbf990>,
'PC': <gensim.models.keyedvectors.Vocab at 0x7f0052e78350>,
'것': <gensim.models.keyedvectors.Vocab at 0x7f00532ee390>,
'계속': <gensim.models.keyedvectors.Vocab at 0x7f0052e7c610>,
'관련': <gensim.models.keyedvectors.Vocab at 0x7f0052e7c090>,
'급': <gensim.models.keyedvectors.Vocab at 0x7f0052e1ae50>,
'꾸준히': <gensim.models.keyedvectors.Vocab at 0x7f0052e78b50>,
'대한': <gensim.models.keyedvectors.Vocab at 0x7f0052fbced0>,
'등': <gensim.models.keyedvectors.Vocab at 0x7f0052fbc610>,
'많이': <gensim.models.keyedvectors.Vocab at 0x7f0052e75550>,
'및': <gensim.models.keyedvectors.Vocab at 0x7f0052e6bd90>,
'사람이': <gensim.models.keyedvectors.Vocab at 0x7f0052e7cd10>,
'수': <gensim.models.keyedvectors.Vocab at 0x7f0052e75410>,
'수요가': <gensim.models.keyedvectors.Vocab at 0x7f0052e57e10>,
'엑셀': <gensim.models.keyedvectors.Vocab at 0x7f0052e751d0>,
'인한': <gensim.models.keyedvectors.Vocab at 0x7f0052e758d0>,
'자격증': <gensim.models.keyedvectors.Vocab at 0x7f0052e7efd0>,
'컴퓨터': <gensim.models.keyedvectors.Vocab at 0x7f0052e1aa50>,
'프로그램': <gensim.models.keyedvectors.Vocab at 0x7f0052fbc650>}
4. 단어 임베딩 및 단어 간의 유사도 구하기!!
이제 모델이 잘 준비된 것을 확인해 보았으니 CAD라는 단어를 예시로 임베딩 해봅시다. 임베딩은 모델에서 .wv로 접근해서 하실 수 있습니다.
model.wv['CAD']
[Output]
array([ 0.66891026, 1.1234144 , 0.98277366, 0.5410204 , 0.43546125,
0.6118243 , -0.01267366, -0.2829244 , 1.0906429 , -0.32414335,
-0.3770287 , 0.18551493, 1.0529205 , 0.0581194 , 0.26417744,
-0.307214 , -1.2799399 , 0.29205143, -0.52759445, -1.209599 ,
0.32912517, 0.8966674 , 1.5432703 , 0.03188413, 0.1183411 ,
0.26976827, -0.5301462 , -0.7950405 , 1.0557704 , -1.2669665 ,
0.893 , 0.5178606 , -0.09277198, 0.1719936 , 0.14988345,
-0.18121311, -1.0378932 , -1.0847445 , 0.37125027, -0.37329853,
0.17710672, -1.6970602 , -0.5829381 , -0.36070868, 0.7317047 ,
-0.5294191 , 1.0744421 , 0.1789279 , -1.4163237 , -0.5518722 ,
0.9857417 , 0.5431092 , 0.19612847, -0.20154056, -1.1067466 ,
-0.41075835, 0.30748087, 1.7030452 , 1.1250914 , -1.1394424 ,
-0.3680961 , 0.26062432, -0.554122 , 0.39087662, -0.41557127,
0.59860474, 0.6059414 , -0.06914414, -0.12047917, -0.45141035,
0.93001264, -1.0413481 , -1.3162522 , 0.7742884 , -1.2409852 ,
-0.26279852, -1.206432 , 0.9951225 , -0.22200485, 0.07095784,
0.6597785 , 0.6935079 , 1.8022833 , 0.8730791 , -0.5678337 ,
0.0675936 , -0.29791185, -1.2945968 , -0.19483049, 0.01119807,
0.4448029 , 1.6029941 , 1.065389 , 0.81879675, 0.33501637,
-0.05684851, 0.37486574, -0.01525358, 1.1072345 , -1.4832817 ],
dtype=float32)
위의 결과를 보니 너무 잘 됐네요.
추가적으로 한 단어를 기준으로 가장 유사한 단어도 .wv.most_similar를 통해 확인할 수 있습니다.
이 구조를 잘 이용하면 영화 줄거리를 학습시켜서 유사한 영화를 추천하던가 하는 작업에도 활용할 수 있겠죠?
model.wv.most_similar('프로그램')
[Output]
2022-03-25 05:03:18,764 : INFO : precomputing L2-norms of word weight vectors
[('및', 0.9130648970603943),
('PC', 0.8998616933822632),
('등', 0.8962622880935669),
('컴퓨터', 0.8962600231170654),
('자격증', 0.8850869536399841),
('대한', 0.880530834197998),
('엑셀', 0.8805047273635864),
('인한', 0.8767929077148438),
('많이', 0.8764530420303345),
('발달로', 0.8742007613182068)]
그럼 이제 두 단어를 입력해서 유사도를 구해봅시다. most_similar를 가 아닌 similar를 이용하면 단어 간의 유사도를 구할 수 있습니다. 신기하지 않나요?
우리 사람은 상식적으로 보면 두 단어가 유사한지 어느 정도 판단할 수 있지만 컴퓨터는 그냥 단어를 입력하면 이게 뭔지 모릅니다. 그래서 임베딩도 컴퓨터가 단어를 인식할 수 있게 "벡터"라는 수치로 바꿔주는 것이고 이것을 이용하면 컴퓨터도 단어를 어느정도 구분할 수 있습니다.
여기서 출력 결과는 -1에서 1 사이의 값으로 1에 가까울수록 유사하고 -1에 가까울 수록 다른 게 됩니다.
그래서 아래 결과를 보면 뭔가 비슷해 보이는 프로그램과 CAD는 유사하다고 나오고 프로그램과 chef는 유사하지 않다고 나오네요.
우리 사람은 상식적으로 보면 두 단어가 유사한지 어느 정도 판단할 수 있지만 컴퓨터는 그냥 단어를 입력하면 이게 뭔지 모릅니다. 그래서 임베딩도 컴퓨터가 단어를 인식할 수 있게 "벡터"라는 수치로 바꿔주는 것이고 이것을 이용하면 컴퓨터도 단어를 어느정도 구분할 수 있습니다.
그럼 여기까지 Word2Vec 라이브러리를 통해 임베딩과 단어 유사도에 대해 알아보았습니다.
사실 이 실습은 한지 좀 돼서 계속 올리려고 했는데 이제 올리네요. 다음엔 더 재밌는 실습으로 찾아오겠습니다.
감사합니다! 혹시 이해되지 않거나 궁금한 점이 있다면 댓글 달아주세요.
'인공지능 > 데이터 분석' 카테고리의 다른 글
[Pandas] groupby(), get_group()으로 범주형 칼럼 그룹화/그룹 객체 생성 (4) | 2022.09.12 |
---|---|
Apache Spark와 Hadoop의 용도 및 차이점 (0) | 2022.06.04 |
[데이터 분석] Pandas 사용법 요약 정리와 활용 팁 (함수의 조합 활용하기) (1) | 2022.05.20 |
[데이터 분석] 넘파이(NumPy) 튜토리얼 겸 기초 총 정리 (feat. reshape에서 -1의 의미) (0) | 2022.05.01 |
[Pandas] DataFrame 셀에 리스트(ndarray) 입력 / ValueError: Must have equal len keys and (0) | 2022.03.17 |