반응형

 

 

 

 

안녕하세요!

 

오늘은 "파이썬으로 딥러닝 하기!" 중 RNN에 대해 알아보도록 하겠습니다~

 

딥러닝 알고리즘 중 CNN은 전 포스팅에서 다뤘습니다.

 

 

먼저,

 

RNN이란 Recurrent Neural Networks로 순환 신경망이라고 합니다.

 

RNN은 시퀀스 데이터, 예를 들어 음성, NLP, 동영상 등의 데이터에서 사용됩니다.

 


 

[기존 DNN과 RNN 비교]

 

 

RNN이 기존 딥러닝 알고리즘과 가장 다른 점은

 

뉴런의 상태를 저장하고 다음 스텝에서 입력으로 사용함으로

 

긴 시퀀스에 대해서도 예측할 수 있다는 것입니다.

 

 

 

<RNN, 순환 신경망 구조>

 

 

 

이미지 출처: 성킴_RNN_YouTube강의

 

 

모든 뉴런은 이전 층의 모든 뉴런에서 나오는 입력 연결과 이어지는 층으로

 

 모든 뉴런을 유도하는 출력 연결 둘 다를 가지고 있습니다.

 

 

하지만 전방향층과 달리 순환층은 순환 연결이 있으며 동일한 층의 뉴런 간에 정보를 전파합니다.

 

 

따라서 순환 신경망에서 뉴런 활성도는 신경망 인스턴스의 누적 상태를 나타냅니다.

 

 

 

 

<RNN 종류>

 

 

이미지 출처: 성킴_RNN_YouTube강의

 

 

RNN은 위와 같이 입력과 출력의 개수에 따라 다양하게 구성할 수 있습니다.

 

 

many-to-one: 마지막 출력 값이 label 값과 같아지는 것이 목표

 

many-to-many: 입력 데이터를 차례대로 입력하면 차례로 출력 데이터 출력

 

 

 

[RNN의 한계]

 

 

RNN의 Gradient Vanishing(기울기 소실) 문제

 

 

과거 여러 단계 입력들에 대해 계산할 때,

 

경사(Gradient)가 빠르게 줄어들어 (즉, 오차가 더 줄어들지 못하고 수렴하는 문제 발생)

 

장기 의존성을 학습하는 모델의 능력이 심각하게 제한됩니다.

 

 

이 문제를 해결하기 위해 LSTM 구조를 도입했습니다.

 

LSTM은 다음 포스팅에서 다루도록 하겠습니다.

 

 

※ 참고: Back-Propagation Through Time (BPTT)

 

 

RNN은 시간에 따라 펼쳐 놓으면 MLP(Multi-Layer Propagation)와 유사하기 때문에

 

Back-Propagation방법으로 Gradient를 계산할 수 있습니다.

 

 


 

오늘은 여기까지!

 

다음 포스팅으로 돌아오겠습니다~

반응형
반응형

 

 

 

요즘 관심을 가지고 있는 분야인 "NLP(Natural Language Processing), 자연어 처리 분야"에 대해 포스팅을 시작합니다!

 

 

 

우선 오늘은 그 기본 중에 기본인 '토크나이징'에 대해 알아보겠습니다.

 

 

1. 토크나이징(Tokenizing)이란?

 

 

궁극적으로, 텍스트를 자연어 처리를 위한 모델에 적용할 수 있게 '언어적인 특성을 반영해 단어를 수치화'하는 것입니다.

 

 

현재 머신러닝, 딥러닝을 하기 위해서는

 

비정형 데이터인 이미지, 텍스트 등의 데이터는 모두 수치화하여 훈련해야 합니다.

 

 

 

2. 자연어 토크나이징 도구의 종류는 '영어'와 '한글' 토크나이징 라이브러리로 나눠서 알아보겠습니다!

 

 

 

1. 영어 토크나이징 라이브러리

 

- NLTK: 파이썬에서 영어 텍스트 전처리 작업을 하는 데 많이 쓰이는 라이브러리이다.

 

- Spacy: 현재 영어를 포함한 8개 국어에 대한 자연어 전처리 모듈을 제공, 빠른 속도로 전처리할 수 있다.

 

 

 

2. 한글 토크나이징 라이브러리

 

- KoNLPy: 한글 자연어 처리를 쉽고 간결하게 처리할 수 있도록 만들어진 오픈소스 라이브러리이다.

 

* Hannanum: 한나눔. KAIST Semantic Web Research Center 개발.

 

* Kkma: 꼬꼬마. 서울대학교 IDS(Intelligent Data Systems) 연구실 개발. ( 오래 걸림 )

 

* Komoran: 코모란. Shineware에서 개발.

 

* Mecab: 메카브. 일본어용 형태소 분석기를 한국어를 사용할 수 있도록 수정. (Window에서 설치 복잡)

 

* Okt오픈 소스 한국어 분석기. 과거 트위터 형태소 분석기.

 

 

참고: 데이터 사이언스 스쿨(KoNLPy)

 

 

3. 한글의 경우 형태소 토크나이징을 하는 이유는 ?

 

음절: 문자 단위 / 어절: 단어 단위 (쉽게 띄어쓰기 단위) / 형태소: 의미를 가진 가장 작은 단위

 

예) "한글 자연어 처리 공부는 어렵다"

 

음절: 한, 글, 자, 연, 어, 처, 리, 공, 부, 는, 어, 렵, 다

어절: 한글, 자연어, 처리, 공부는, 어렵다

형태소: 한글, 자연어, 처리, 공부, 는, 어렵, 다

 

 

1. 영어와는 달리 한국어에는 조사라는 것이 존재합니다.

따라서 형태소 토큰화를 지향하며, 영어와 달리 어절 토큰화는 한국어 NLP에서 지양되고 있습니다.

 

2. 한국어는 영어권 언어와 비교하여 띄어쓰기가 어렵고, 또 잘 지켜지지 않는 경향이 있습니다.

 

추가) 품사태깅을 하는 이유

: 단어의 의미를 제대로 파악하기 위해서는 해당 단어가 어떤 품사로 쓰였는지 보는 것이 주요 지표가 될 수도 있습니다.

 

 

 

4. Word Embedding에는 크게 두 가지 방식으로 나눌 수 있습니다.

 

: 토큰화한 단어 벡터라이징(Vectorizing, 수치화)하는 방법!

 

 

Frequency based Embedding : CountVectorizer, TF-IDF, bag-of-words

 

Prediction based Vector: Word2vec, CBOW, skip-gram

 

(각각의 방법은 다음 포스팅에서 다루도록 하겠습니다.)

 

 


 

책 '텐서플로와 머신러닝으로 시작하는 자연어처리'를 참고하였습니다.

반응형
반응형

 

안녕하세요~ 으니입니다!

 

 

"현업에서 많이 사용하고 있는 Python 모듈 마스터하기!"

 

두 번째, Scikit-Learn 에 대해 알아보도록 하겠습니다~

 

 

첫 번째 편은 "현업에서 많이 사용하는 Python 모듈 | Pandas" 입니다.

 

 

 

먼저, Scikit - learn은 Python의 "머신러닝 라이브러리"

 

아래와 같은 기능을 기본으로 하고 있습니다.

 

1. 지도학습, 비지도학습 모듈

 

2. 모델 선택 및 평가 모듈

 

3. 데이터 변환 및 데이터 불러오기 위한 모듈

 

4. 계산 성능 향상을 위한 모듈

 

 

또한 대부분의 모듈들이 통일된 인터페이스를 가지고 있어 간단하게 여러 기법을 적용할 수 있고,

 

쉽고 빠르게 원하는 결과를 얻을 수 있습니다!

 

 

 

1. 설치

 

pip install scikit-learn

 

# anaconda를 사용한다면,

conda install scikit-learn

 

 

# install 확인

 

import sklearn

sklearn.__version__

 

 

 

2. cheat-sheet

 

너무 유명한 scikit-learn의 알고리즘 cheat-sheet!

 

아래의 그림을 참고하면 좀 더 쉽게 적합한 모델을 선택할 수 있다네요~

 

출처: scikit-learn.org

 

 

 

3. 지도학습, 비지도학습 예시

 

사이킷런 라이브러리에 기본적으로 내장돼 있는 데이터 중 하나인 붓꽃 데이터를 이용한 예시를 통해 알아보도록 하겠습니다.

 

 

from sklearn.datasets import load_iris

from sklearn.model_selection import train_test_split

 

iris_dataset = load_iris()

target = iris_dataset['target'] # label

 

# train/test 데이터 분리

train_input, test_input, train_label, test_label = train_test_split(iris_dataset['data'], target, test_size = 0.25, # test data의 비율 random_state=42) # random seed 값

 

# 지도학습 모델 중 k-nn모델

 

from sklearn.neighbors import KNeighborsClassifier knn = KNeighborsClassifier(n_neighbors = 1)

 

knn.fit(train_input, train_label) # 분류기 모델에 학습 데이터와 label 데이터 적용

 

predict_label = knn.predict(test_input) # 분류기 모델의 결과 예측

 

import numpy as np

print('test accuracy {:.2f}'.format(np.mean(test_label == predict_label))) # 정확도 출력 1

 

from sklearn.metrics import accuracy_score

print('test accuracy {:.2f}'.format(accuracy_score(test_label, predict_label))) # 정확도 출력 2

 

 

# 비지도학습 모델 중 k-means 모델

 

from sklearn.cluster import KMeans k_means = KMeans(n_clusters=3)

 

k_means.fit(train_input)

 

predict_cluster = k_means.predict(test_input) print(predict_cluster)

 

# 단, 군집의 순서와 label의 값은 다를 수 있음, 예를 들어 0번째 군집에 라벨1인 데이터들이 주로 분포할 수 있음

print("0 cluster:", train_label[k_means.labels_ == 0]) print("1 cluster:", train_label[k_means.labels_ == 1]) print("2 cluster:", train_label[k_means.labels_ == 2])

 

코드 참고: 텐서플로와 머신러닝으로 시작하는 자연어처리

 

 

 

추가) 딥러닝 모델을 만든다하더라도 데이터 분리나 특징 추출 등 사이킷런의 전처리 모듈은 유용하게 사용할 수 있습니다.

 


 

오늘은 여기까지!

 

scikit-learn에 대해 간단히 알아보았습니다.

 

다음은 tensorflow와 keras에 대해 알아보도록 하겠습니다~

반응형
반응형

안녕하세요~



"현업에서 많이 사용하고 있는 Python 모듈 마스터하기!"


라는 시리즈를 포스팅하려고 합니다.



그 중 첫 번째편은 바로 Pandas 입니다!




Pandas의 DataFrame의 형태가 데이터베이스의 테이블과 유사하기 때문에 많이 사용되지 않을까요? :)


즉, Feature 엔지니어링 하여 데이터 분석을 할 때 유용합니다!



1. Series


그렇다면, 먼저 Pandas의 기본 자료구조인 Series에 대해 알아보겠습니다.



Series = value(값) + Index(인덱스)


Series는 1차원 배열과 같은 구조로 동일한 자료형만 담을 수 있습니다.




예) Series 생성

import pandas as pd


s = pd.Series([172, 160, 174, 183], index=["지수", "으니", "덕", "운동"])


# 딕셔너리 개체로 시리즈를 생성할 수 있다.

s2 = pd.Series({"지수": 172, "으니": 160, "덕": 174, "운동": 183})


# 순서를 정하고 싶다면 인덱스를 지정해야한다.

s3 = pd.Series({"지수": 172, "으니": 160, "덕": 174, "운동": 183}, index=["지수","으니","덕","운동"])

결과)



예2) Series 인덱싱

s["으니":"덕"]


# 위와 같은 결과

s[1:3]


# Series[conditions]: conditions 부분에 논리연산이 올 수 있다

s[(160 == s) | (174 == s)]

결과)



예3) Series 특징


시리즈 객체는 라벨 값에 의해 인덱싱이 가능하므로 딕셔너리 자료형과 같다고 할 수 있다.


# items(): dictionary method인 items함수는 key와 value의 쌍을 튜플로 묶은 값을 dict_items 객체로 돌려준다.

for k, v in s.items():

print("%s's 키는 %d cm 입니다." % (k,v))



예4) 데이터 갱신, 추가, 삭제

# 갱신

s["으니"] = 161


# 추가

s["다래"] = 179


# 삭제

del s["운동"]

결과) 갱신


결과) 추가


결과) 삭제




2. DataFrame


Series가 복수개 합쳐진 것

서로 다른 종류의 데이터 타입을 가질 수 있으며,

행렬의 열, 행에 인덱스 값을 부여한 것과 같습니다.



예) DataFrame 생성

import pandas as pd


data = {

"키": [172, 160, 174, 183],

"나이": [25, 24, 27, 26],

"성별" : ['F', 'F', 'M', 'M']

}

columns = ["키", "나이", "성별"]

index = ["지수", "으니", "덕", "운동"]

df = pd.DataFrame(data, index=index, columns=columns)

df.index.name = "이름"

결과)



예2) DataFrame 인덱싱

# 열 인덱싱

df["키"]


# 행 인덱싱1

df["으니":"덕"]


# 행 인덱싱2: 행단위로 인덱싱을 하고자 하면 항상 슬라이싱을 해야한다 df[1:3]


# .iloc[] 을 이용한 인덱싱: 행단위로 인덱싱 (without 슬라이싱) df.iloc[1]


# .loc[condition] 을 이용한 인덱싱

df.loc[df["키"] <= 160]

결과) 열 인덱싱


결과) 행 인덱싱




예3) Transpose

df.T # 대부분의 np 2차원 배열이 가지는 속성/메소드를 지원한다.

결과)



예4) 갱신, 삽입, 삭제

# 갱신

df.loc["으니","키"] = 161

# df["키"].loc["으니"] = 161 # warning


# 열 삽입1

df["학과"] = ["경영","경영정보","경영정보","도시 부동산"]


# 열 삽입2

df["학과"] = pd.Series(["경영","경영정보","경영정보","도시 부동산"], index=["지수","으니","덕","운동"])


# 행 삽입1

df.loc["다래"] = {"키": 179, "나이": 24, "성별": "F", "학과": "응급의학과"}


# 행 삽입2

df.loc["다래"] = pd.Series([179, 'F', '응급의학과'], index=["키","성별","학과"]) # 나이: NaN 발생


# 삭제: del, drop 키워드를 사용하면 열을 삭제할 수 있다.

결과) 갱신


결과) 열 삽입


결과) 행 삽입



예5) DataFrame 변형

df1 = pd.DataFrame({"키":[161,179], "이름":["으니","다래"], "나이":[24,24], "학과": ["경영정보","응급의학"]}, \

columns=["키","이름","학과"]) df2 = pd.DataFrame({"학과":["경영","경영정보","도시부동산"], "학과번호":[201,202,203]}, columns=["학과","학과번호"])


# merge()

df = pd.merge(df1,df2,on="학과") # inner join과 같은 결과, on : 기준 key 값

df = pd.merge(df1,df2, how='left') # left: df1 | right: df2 의 키값을 모두 보여준다

df = pd.merge(df1,df2, how='outer') # 키값이 한쪽에만 있어도 데이터를 보여준다.


# concat()

df1 = pd.DataFrame({"키":161, "이름":"으니", "나이":24, "학과": "경영정보"}, columns=["키","이름","학과"], \

index = [0]) df2 = pd.DataFrame({"키":[174,183], "이름":["덕","운동"], "나이":[27,26], "학과": ["경영정보","도시부동산"]}, \

columns=["키","이름","학과"], index = [1,2])

df = pd.concat([df1,df2], ignore_index=True)

결과) merge()


결과) concat()



※참고: merge()와 concat()의 차이점


.merge()는 두 데이터 프레임의 공통 열 또는 인덱스를 기준으로 두 테이블을 합친다.


이때 기준이 되는 열, 행의 데이터를 키(key)라고 한다.

(join을 사용할 수 있다)

 


.concat() 은 기준 열을 사용하지 않고 단순히 데이터를 연결(concatenate)한다.


출처: 데이터 사이언스 스쿨




3. Pandas 함수



예1) 데이터 분석용 함수

# sum, min, mean, var, ...

df[["키","나이"]].sum(axis=0) # axis = 0 : 행 | 1: 열


# corr(상관관계), cov(공분산) : 머신러닝에서 많이 사용되는 함수



예2) Na 처리하기

# Na값 대체하기 (최소값, 평균, 최대값,...)

age_min = df["나이"].min()

df["나이"] = df["나이"].fillna(value=age_min)


# Na값 제거하기

df=df.dropna(axis=0)



예3) 유용한 함수

# unique: 특정열을 중복없는 열로 만들어줌


# isin : 특정값 포함여부에 따른 Boolean 생성


# sort_index: 인덱스기반 정렬

df.sort_index(axis=0, ascending=False, by="키") # ascending=False 내림차순으로 정렬, by: 특정 열을 기준


# duplicated : 중복행 조회



추가)


pandas 데이터 타입은 총 3가지로


위에서 다룬


Series, DataFrame 이외에도


Panel(판넬)이라는 데이터 타입도 존재합니다. ( 단, Deprecated since version 0.20.0 )



오늘은 여기까지~


pandas가 손에 익으면 SQL보다 편하다네요~


여기서는 다루지 않았지만 pandas를 이용하여 다양한 방법으로 데이터를 로드할 수 있답니다!


csv, excel 등의 파일에서 데이터를 로드하는 부분은 제 이전의 포스팅을 보시면 굉장히 자주 등장합니다!



참고) numpy와 matplotlib은 이전 포스팅에서 다뤘답니다!


딥러닝에 필요한 파이썬 기본문법 | numpy & matplotlib



"백문이 불여일타!!"

반응형

+ Recent posts