한주 한주 지나갈수록 노드들이 어려워지고 있다.
정신없이 집중해서 하다보면 어느새 금요일인 느낌이다.
그래도 이번주의 마무리로 한주를 정리해보고자 한다.
[4주차 정리]
1. Fundametals Node
◈ 당신의 행운의 숫자는? 나만의 n면체 주사위 만들기
n면체 주사위를 구현하는 프로젝트를 통해 파이썬 클래스 활용법과 객체 지향 프로그래밍(OOP) 개념을 실습해 본다.
- 정리
파이썬에서 객체란?
"파이썬(Python)에서 모든 것은 객체(object)다.
그리고 대부분의 객체는 속성(attributes)과 메소드(methods)를 갖는다."
객체지향 프로그래밍이란?
객체 지향 프로그래밍(OOP : Object Oriented Programming)이라고 한다.
이는 블록쌓기처럼 여러개의 객체들이 각각의 기능들을 맡고 있고,
이러한 기능들을 변경할 경우에는 블록을 바꾸듯이 해당 객체를 변경하면 된다.
반대되는 방식으로는 절차지향 프로그래밍이 있다.
파이썬에서의 클래스
클래스는 파이썬이 객제치향 언어로서 구현되는데에 지대한 역할을 한다.
'점프 투 파이썬' 책의 내용을 인용하자면 클래스를 과자틀, 객체를 과자로 이해할 수 있다.
과자틀을 이용해 과자를 만들면 각 과자는 서로 아무런 영향을 끼치지 않는다.
즉, 객체를 수정해도 다른 문제가 생기지 않는다는 것이다.
아래의 링크는 파이썬의 기초적인 이해를 돕는 책에 관련된 링크이다.
추가적인 링크는 파이썬의 기초 강좌이다.
이해가 부족한 부분을 찾아 읽어보면 좋을 것 같다.
◈ 가랏, 몬스터볼! 전설의 포켓몬 찾아 삼만리
캐글데이터를 이용하여 데이터에서 인사이트를 도출해내는 방법(EDA)을 경험해 보고,
이러한 분석기법의 필요성과 효용성을 알아본다.
- 정리
이 노드에서는 캐글(데이터분석 경진대회) 사이트에 올라와있는 데이터 셋 중 포켓몬에 관련된 데이터셋을 가지고
이리저리 살펴보면서 데이터가 가진 특징과 특정 데이터를 찾아내는 모델을 만들기위해
탐색적 데이터 분석(Exploratory Data Analysis, 이하 EDA)을 하는 과정을 살펴보았다.
분석과정은 다음과 같다.
1) 데이터 확인
- 아래의 그림과 같이 다운받아놓은 데이터셋을 확인해본다.
몇행 몇열로 이루어져있고 특성(feature)는 무엇인지 확인한다.
아래의 데이터는 13개의 특성으로 이루어져있고,
이 노드에서는 이중 마지막 특성인 Legendary특성을 label로 분류하였다.
2) 결측치 확인
- 데이터에는 위의 그림에서 Name : Charmander의 Type2 : NaN 과 같이 결측치가 존재할 수 있다.
이를 확인하고 '어째서 결측치를 가지는지', '해당부분이 필요한 데이터인지 아닌지' 등을 판단한다.
아래의 데이터는 13개의 특성으로 이루어져있고,
이 노드에서는 이중 마지막 특성인 Legendary특성을 label로 분류하였다.
3) 중복자료 확인
- 위의 포켓몬 데이터는 800개의 행을 가지고 있다.
이를 확인하기위해 포켓몬의 번호를 나타내는 # Column의 데이터를 중복값을 제거하고 확인해 본 결과
721개의 데이터를 가지는 것으로 확인하였다.
len(set(pokemon["#"]))
# 721
이러한 정보를 토대로 unique한 Column을 확인하고,
이를 기반으로 index로 활용할 column을 찾는 과정이 중복자료 확인 과정이라 할 수 있다.
4) target의 특징 확인
- 데이터셋에서 Legendary가 True로 되어있는 data의 특징들을 살표본다.
능력치의 총합이라던지, 이름의 길이, 세대 등을 확인하여 특징들을 정리한다.
위에서 정리한 특징들을 모델이 학습 할 수 있도록 하나의 data frame에 정리한다.
5) 데이터 전처리
- 모델에 넣기 적합한 형태로 전처리 해준다.
6) 모델 학습 후 확인
- 전처리를 마친 데이터로 모델을 학습하고 확인한다.
위와 같은 과정들을 통해 표로이루어진 데이터를 EDA과정을 통해 정리하고 이를 활용하여 모델의 성능을 높일 수 있다.
◈ 비지도학습
머신러닝의 학습 방법 중 하나인 비지도 학습(Unsupervised Learning)의 개념과 주요 알고리즘에 대해 알아본다.
- 정리
비지도학습이란?
지난주에 배웠던 사이킷런을 통한 머신러닝 부분에서 머신러닝 알고리즘의 하나인
비지도 학습은 데이터와 그 데이터에 관한 정답(라벨)을 알려주는 지도학습과는 다르게
데이터만 알려주고 관련된 정답은 직접 찾아내는 방법이다.
이번 노드는 이러한 비지도학습 방법중 대표적인 예시인 군집화(클러스터링, clustering)에 관해 배웠다.
이 클러스터링 알고리즘 중에서도 K-means와 DBSCAN알고리즘, PCA, T-SNE에 대해 배웠다.
이중에서 블로그에서는 K-means에 대해서 정리하도록 하겠다.
K-means?
K-means알고리즘은 정답을 알려주지는 않지만 몇개로 묶어보라는 가이드라인을 제시하는 방법이다.
즉, K개로 데이터를 묶어서 정리하는 방법이기 때문에 K-means라고 한다.
<형성한 Data 확인>
%matplotlib inline # 출력을 해당 코드블럭에 하기 위한 명령어
# 필요한 라이브러리 불러오기
from sklearn.datasets import make_blobs
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import random
# 중심점이 5개인 100개의 점 데이터를 무작위로 생성합니다.
# 즉 100개의 점 데이터를 5개의 군집으로 묶어 생성하는 방법.
points, labels = make_blobs(n_samples=100, centers=5, n_features=2, random_state=135)
# 데이터의 분포를 보기위한 그래프 작업
# 그래프 축 그리기
fig = plt.figure() # 빈 그래프 판 형성
ax = fig.add_subplot(1, 1, 1) # 그래프의 위치 정해주기
# 위에서 생성한 점 데이터들을 pandas DataFrame 형태로 변환하기
points_df = pd.DataFrame(points, columns=['X', 'Y']) # X, Y좌표를 기준으로 점 데이터 형성
display(points_df.head()) # 점 데이터 확인을 위한 일부 출력
# 점 데이터를 X-Y grid에 시각화하기
ax.scatter(points[:, 0], points[:, 1], c='black', label='random generated data')
# points[:, 0] => points에서 x좌표
# points[:, 1] => points에서 y좌표
# 축 이름을 라벨에 달고, 점 데이터 그리기
ax.set_xlabel('X') # x축이름
ax.set_ylabel('Y') # y축이름
ax.legend()
ax.grid()
<Output>
<K-means 알고리즘 적용 예시>
from sklearn.cluster import KMeans
# 위의 데이터에서 생성한 무작위 점 데이터(points)에
# 클러스터의 수(K)가 5인 K-means 알고리즘을 적용
kmeans_cluster = KMeans(n_clusters=5)
# points에 대하여 K가 5일 때의 K-means iteration을 수행
kmeans_cluster.fit(points)
# n 번째 클러스터 데이터를 어떤 색으로 도식할 지 결정하는 color dictionary
color_dict = {0: 'red', 1: 'blue', 2:'green', 3:'brown', 4:'indigo'}
# 점 데이터를 시각화 함
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
# 군집화 결과대로 색깔별로 구분하여 점에 색칠한 후 도식
for cluster in range(5):
cluster_sub_points = points[kmeans_cluster.labels_ == cluster] # 전체 무작위 점 데이터에서 K-means 알고리즘에 의해 군집화된 sub data를 분리합니다.
ax.scatter(cluster_sub_points[:, 0], cluster_sub_points[:, 1], c=color_dict[cluster], label='cluster_{}'.format(cluster)) # 해당 sub data를 plot합니다.
# 축 이름을 라벨에 달고, 점 데이터 그리기
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.legend()
ax.grid()
<Output>
K-means는 이렇게 군집의 갯수를 정해줘야하고,
군집의 형태가 이상하다면 제대로 분류할 수 없다는 단점이 있다.
2. Exploration Node
◈ 나랑 닮은 연예인은 누구?
기존의 작사나, 영화감상 리뷰들이 문자들의 벡터거리를 기반으로 했다면
이번 노드는 이미지의 임베딩 벡터 거리를 기반으로 한 닮은얼굴을 찾는 방법이었다.
생각보다 진행하는 것 자체가 재미있었다.
기존의 Exploration Node를 통해서 코드들이 익숙해져서 그랬던 것 같다.
역시 힘든건 아무것도 모를때 겪어야 괜찮은 것 같다.
비록 도중에 여러개의 사진을 임베딩 하는 과정에서 문제가 살짝 문제가 있었지만
슬랙에 올라와있는 답변을 통해서 해결할 수 있었다.
그래도 어플에서 볼 수 있는 닮은꼴 찾기를 직접 만들 수 있어서 재미있던 부분이었다.
Face Embedding project github (차후 링크예정)
◈ 아이유팬이 좋아할 만한 다른 아티스트 찾기
넷플릭스, 페이스북, 유튜브 등의 플랫폼에서 활용하고 있는
추천시스템에 대한 이해를 도와주는 노드였다.
물론 데이터를 정리하는 EDA과정이 필요하지만,
아직은 익숙치 않아서 자연스럽게 되지 않는 부분들이 있다.
이런 부분들은 차차 나아질것이라 생각한다.
영화 추천시스템 project github (차후 링크예정)
3. 알고리즘
◈ 5주차
이번주에 풀이했던 부분은 8장 연결리스트였다.
이부분은 정말 책을 보고 문제를 확인해도 이해가 어려웠다.
연결리스트라는 개념 자체가 어려워서 그런지
문제를 이해하는것도 어려웠다.
그래도 잘 풀어서 해설해주신 분들 덕분에 그나마 개미눈꼽만큼 이해할 수 있었다.
코딩테스트에 연결리스트가 나오는 경우는 적다고 했는데
부디 안나오길 바란다..
4. DeepML(CS231n)
◈ 5주차 (Lecture 5 : Neural Networks) :
'[SSAC X AIFFEL]' 카테고리의 다른 글
[8주차]SSAC X AIFFEL (02.15~02.19) (0) | 2021.02.19 |
---|---|
[6주차]SSAC X AIFFEL (02.01~02.05) (0) | 2021.02.06 |
[4주차]SSAC X AIFFEL (01.18~01.22) (0) | 2021.01.22 |
[3주차]SSAC X AIFFEL (01.11~01.15) (1) | 2021.01.15 |
[2주차] AI 개발자로 가는 첫걸음 (01.04~01.08) (0) | 2021.01.08 |