"Python 라이브러리를 활용한 인공지능"의 두 판 사이의 차이
라이언의 꿀팁백과
(→2일차) |
(→5일차) |
||
(사용자 2명의 중간 판 42개는 보이지 않습니다) | |||
86번째 줄: | 86번째 줄: | ||
***순서형 : 학점, 성적 | ***순서형 : 학점, 성적 | ||
*Pandas의 Dataframe을 통해 데이터를 조작하는 것은 정말 사기다. 안 쓸 수 없다. | *Pandas의 Dataframe을 통해 데이터를 조작하는 것은 정말 사기다. 안 쓸 수 없다. | ||
*'''원-핫 인코딩(One-Hot Encoding)'''은 단어 집합의 크기를 벡터의 차원으로 하고, 표현하고 싶은 단어의 인덱스에 1의 값을 부여하고, 다른 인덱스에는 0을 부여하는 단어의 벡터 표현 방식입니다. 이렇게 표현된 벡터를 원-핫 벡터(One-Hot vector)라고 함 ([https://wikidocs.net/22647 링크]) | |||
*결측치를 채우는 방법을 배움 | |||
=== 3일차 === | === 3일차 === | ||
==== 2일차 복습 ==== | |||
* iPhyon 노트북은 서로 독립적이기 때문에 매번 import 문 등을 동일하게 추가해야 한다. | |||
* Pandas의 static member function을 통해 엑셀파일을 읽을 수 있다. (C++, Java와 같은 언어에서는 인스턴스가 아닌 객체명으로 멤버를 호출했으니 정적 멤버함수가 맞는데 파이썬에서도 동일한가? 알아봐야할듯) | |||
** df = pd.read_excel("파일명") | |||
* 타이타닉 데이터 분석에서 파일을 연 후에 가장 먼저 한 행동은 특성 탐색 | |||
* 머신러닝을 활용하려면 입력과 출력이 반드시 숫자가 되어야 함 (예: 알파벳을 이해하려면 대소문자 알파벳 52자를 숫자로 변환한 후 학습을 시켜야 함) | |||
* Dataframe 에서 교차표는 crosstab 함수로 그리며 합계를 추가하려면 margins=True 를 작성 | |||
* 데이터를 범주형으로 만들려면 Dataframe의 cut 함수 사용 | |||
**df['age_cat'] = pd.cut(df['age'], bins=[0,10,20,50,80], include_lowest=True, labels=['baby', 'teenage', 'adult', 'old']) | |||
* Pandas에서 데이터를 반환하는 게 아니라 호출한 객체 값이 저장하게 하려면 inplace=True 를 추가하면 됨 (항상 그렇다는 건 아님) | |||
* 현실에 맞게 학습하려면 이상치를 포함하는 게 맞음 | |||
* df[df['fare'].isnull()] : 운임이 null(결측치)인 사람 찾기 | |||
* df['survived'].value_counts() : 생존자 수 카운트 | |||
==== 머신러닝 코딩 5단계 ==== | |||
# 훈련 데이터와 테스트 데이터를 나눈다. : train_test_split | |||
# ML 알고리즘 선택 | |||
#* 머신러닝 알고리즘은 수학 | |||
# 훈련 : fit | |||
# 평가 : score | |||
# 새 데이터로 예측 : predict | |||
==== 수업내용 필기 ==== | |||
* Tree를 여러 개 가져다가 다수결로 결정하는 알고리즘을 앙상블(Ensemble) 이라고 합니다. | |||
* train_test_split 함수를 통해 학습 데이터와 테스트 데이터를 나눌 수 있는데, 이 때 random_state 값을 설정해야 하이퍼파라메터 조정을 하는 데 애로사항이 없다. | |||
* 머신러닝이 최종적으로 하는 일은 두 가지로 나눌 수 있음 → 분류를 잘하거나 값을 맞추거나 | |||
** DecisionTreeClassifier : 분류 | |||
** DecisionTreeRegression : 값 | |||
* 대부분의 머신러닝 알고리즘 함수에는 -Classifier 또는 -Regression 이 붙음 | |||
=== 오후수업 === | |||
* '''ML 코딩 5단계''' | |||
*# 훈련 데이터와 테스트 데이터로 나눈다 : train_test_split | |||
*# ML 알고리즘 선탱 | |||
*# 훈련 : fit | |||
*# 평가 : score | |||
*# 새 데이터로 예측 : predict | |||
* '''ML 문제 분류''' | |||
** 분류 | |||
*** 이진 | |||
**** 0 | |||
**** 1 | |||
*** 다중 | |||
**** A | |||
**** B | |||
**** C | |||
**** ... | |||
** 회귀 | |||
*** 값 예측 | |||
*주피터 노트북에서 외부 명령어를 실행하려면 '''"! 명령어"'''를 입력한다. | |||
*최근에는 '''앙상블 모델'''을 이용하고 있다. | |||
*앙상블 모델은 트리로 이루어진다. (예: 랜덤 포레스트) | |||
*Kaggle 사이트(https://www.kaggle.com/<nowiki/>)에서 1% 이내에 들면 원하는 곳 취업 가능 | |||
*선형회귀 실습을 했다. | |||
*SVM 실습을 했다. | |||
*sigmoid 활성화 함수에 대해 언급했다. | |||
*정규화를 위해 가장 많이 쓰는 애들은 StandardScaler, MinMaxScaler 이다. | |||
**MinMaxScaler 는 값이 0.0 ~ 1.0 으로 바뀜 | |||
**StandardScaler는 평균을 0으로 만들고 표준편차는 1로 만듦 | |||
*Numpy에서 데이터 출력 관련 값은 np.set_printoptions 으로 설정 가능하다. | |||
**np.set_printoptions(precision=4, suppress=True) | |||
*DecisionTree 실습 | |||
**어떤 특성을 중요하게 판단했는지 확인하기 : tree.feature_importances_ | |||
**상기 값은 설명가능한 인공지능(eXplainable Artificial Intelligence, XAI)와 밀접한 관련이 있다. | |||
=== 4일차 === | === 4일차 === | ||
시험에 대해서는 내일 정리해주겠다면서 수업을 시작했다. | |||
==== 오전수업 ==== | |||
* 항상 그랬던 것처럼 복습으로 수업을 시작했다. | |||
* ML 코딩 5단계 | |||
*# 훈련 데이터와 테스트 데이터로 나눈다 : train_test_split | |||
*# ML 알고리즘 선택 | |||
*# 훈련 : fit | |||
*# 평가 : score | |||
*# 새 데이터로 예측 : predict | |||
* 경고 메시지 나오지 않게 하기 <br /><syntaxhighlight lang="python3" line="1"> | |||
import warnings | |||
warnings.filterwarnings('ignore') | |||
</syntaxhighlight> | |||
* 적절한 파라미터를 찾는 과정을 '''하이퍼파라미터 찾기'''라고 함 | |||
* '''K-Neighbors''' 나 '''선형회귀(Linear Regression)'''은 실전에서는 쓰이지 않지만 기초이기 때문에 배울 필요가 있음 : KNeighborsClassifier | |||
** K-Neighbors에서 n_neighbors가 너무 작으면 underfitting, n_neighbors가 너무 크면 overfitting이 될 수 있어서 적절한 값을 찾아야 함 : LinearRegression | |||
** Linear Regression에서 Cost가 너무 작으면 underfitting, Cost가 너무 크면 overfitting이 될 수 있어서 적절한 값을 찾아야 함 : | |||
* '''Support Vector Machine(SVM)'''은 가장 두꺼워지는 직선을 찾음 : SVC | |||
* 값의 범주가 동일하지 않은 데이터를 함께 분석해야 하는 경우에는 '''정규화(normalization)'''를 해야 하며 MinMaxScaler, StandardScaler로 가능 | |||
* 오늘은 DecisionTree와 Graph 관련 수업을 함 | |||
* numpy.arange([start, ] stop, [step, ] dtype=None) : numpy 모듈의 arange 함수는 반열린구간 [start, stop) 에서 step 의 크기만큼 일정하게 떨어져 있는 숫자들을 array 형태로 반환해 주는 함수 | |||
** (예) np.arange(30) 이라고 하면 [0, 1, 2, ... 28, 29] 를 값으로 갖는 array 를 return 함 | |||
* DecisionTree에서는 overfitting 혹은 underfitting이 일어나면 depth 조절을 함 | |||
*RandomForest는 Tree의 조합인데 max_depth를 통해 overfitting과 underfitting을 조절함 | |||
*머신러닝 이론 학습을 위해 제공한 PDF가 쉽게 잘 만들어져 있어서 유익함!!! ★★★★★ | |||
**sigmoid 는 머신러닝에서는 잘 되었으나 딥러닝에서는 잘 안되어서 ReLU(Rectified Linear Units) 라는 activation 함수를 사용 | |||
***사그라드는 sigmoid 대신 죽지 않는 ReLU를 쓰자 => '''vanishing gradient 문제 해결''' | |||
**GradientDescent를 통해 가중치 parameters를 최적화 하는 게 너무 느려서 '''StochasticGradientDescent'''가 나옴 => '''Slowness''' '''문제 해결''' | |||
***GradientDescnet는 loss function의 현 가중치에서 기울기(gradient)를 구해서 loss를 줄이는 방향으로 업데이트를 하는 함수 | |||
****'''현재는 Adam이 90% 정도 점유율로 사용되고 있음''' | |||
**융통성이 없는 overfitting 은 어떻게 해결하지? | |||
***'''DropOut'''을 씀. 즉, 학습을 시킬 때 일부러 정보를 누락 시키거나 중간 노드를 끈다. 이를 통해 일부 특성에만 집착하지 않고 중요한 요소가 무엇인지 터득한다. | |||
**요약하면... | |||
***학습이 잘 안되었던 것은 sigmoid 를 쓰면서 '''vanishing gradient''' 가 나왔기 때문이어서 '''ReLU''' 로 변경했음 | |||
***속도가 느린 건 '''GD'''를 '''Adams'''로 변경했음 | |||
***융통성이 없는 건 '''DropOut'''으로 해결했음 | |||
**문제의 유형에 따라 적절한 아키텍처를 적용하는 게 핵심 | |||
***스냅샷성 데이터(이미지, 영상 등) : '''Convolutional Neural Network(CNN)''' | |||
***시퀀스성 데이터(음성, 언어, 주식 가격, 맥락 등) : '''Recurrent Neural Network(RNN)''' 또는 '''Long Short Term Memory(LSTM)''' | |||
****'''RNN'''은 기본적으로 '''sigmoid''' 활성화 함수가 들어있어서 문제가 있다. 이를 개선한 것이 '''LSTM'''이다. | |||
**'''Convolution'''은 특정 패턴이 있는지 없는지 박스로 훑으며 마킹하는 알고리즘 | |||
***위아래선 필터, 좌우선필터, 대각선필터, 이런질감필터, 요런질감필터, 동그라미필터 등등 여러 가지 "조각" 필터로 해당 패턴이 그림 위에 있는지 확인 | |||
***이 때 테두리가 잘리면 계산 값이 0으로 수렴하는 경우가 발생할 수 있어서 이미지 바깥쪽의 데이터를 0으로 채우는 '''zero padding'''을 함 | |||
**사이즈를 줄여서 계산량을 줄이는 '''MaxPooling''' 또한 자주 활용함 | |||
***'''AveragePooling'''도 있는데 얘는 최대값을 선택하는 '''MaxPooling''' 대비 평균 값을 채워서 사이즈를 줄임. 단, AveragePooling을 쓰면 이미지가 뭉개지는 경향이 있어서 가장 큰 값(선명한 값)을 선택하는 '''MaxPooling'''이 주로 쓰임 | |||
==== 오후수업 ==== | |||
* Convolution은 패턴들을 쌓아가며 점차 복잡한 패턴을 인식하도록 하고 | |||
* MaxPooling은 사이즈를 줄여가면서 패턴의 추상도를 높인다. | |||
* 그러면서 중간에 DropOut을 하면서 일부에 집착하지 않고 중요한 요소를 파악하는 융통성을 키운다. | |||
* PPT 자료가 진짜 좋다 | |||
* '''가상환경 만들기''' | |||
** 시작 > Anaconda3 > Anaconda Prompt(Anaconda3) > conda create -n tf python=3.7 anaconda | |||
***위에서 만든 가상환경은 C:\Users\user\anaconda3\envs 에 위치함 | |||
*'''가상환경 사용 및 종료하기''' | |||
**GUI | |||
***아래처럼 '''Anaconda Prompt (tf)''' 를 선택해서 실행 <br />[[파일:아나콘다 가상환경 사용하기.png|프레임없음|686x686픽셀]] | |||
**CUI | |||
***(사용) conda activate tf | |||
***(종료) conda deactivate | |||
* '''Conda 업데이트 하기''' | |||
**conda update -n base -c defaults conda | |||
*'''TensorFlow 설치하기''' | |||
**conda install -c anaconda tensorflow==2.6 | |||
**GPU가 있는 경우 conda install -c anaconda tensorflow-gpu==2.6 <br />[[파일:아나콘다 TensorFlow 설치.png|프레임없음|1000x1000픽셀]] | |||
*TnsorFlow 설치여부 확인하기 | |||
**아래와 같이 라이브러리를 import 한 후, 버전을 출력한다. <br />[[파일:TensorFlow2 설치여부 확인하기.png|프레임없음|900x900픽셀]] | |||
*TensofrFlow Jupyter Notebook 실행하기 | |||
**아래처럼 Jupyter Notebook (tf) 를 실행한다. <br />[[파일:TensorFlow Jupyter Notebook 실행.png|프레임없음|683x683픽셀]] | |||
*TensorFlow 이름? | |||
**tensor = 다차원 배열 | |||
**flow = 흐름 | |||
*딥러닝의 내부 흐름인 "다차원 배열이 흘러간다" 는 것을 이름에 녹여냈다. | |||
*MNIST 에서 train set 과 test set 을 255 로 나눈 이유는 정규화(nomalization)를 하기 위함이다. | |||
*텐서플로우 MNIST 예제 보기 <br />[[파일:TF MNIST 예제.png|프레임없음|800x800픽셀]] | |||
**훈련 데이터와 테스트 데이터 준비한다. | |||
**'''모델을 설계한다.''' ← 딥러닝은 모델 설계 과정이 있음. 이게 앞서 학습했던 전통적인 머신러닝과의 차이점 | |||
**훈련한다. | |||
**평가한다. | |||
**새로운 데이터를 넣어서 모델을 업데이트 한다. | |||
*TensorFlow를 Jupyter Notebook 에서 MNIST 데이터세트로 실습했다. | |||
=== 5일차 === | === 5일차 === | ||
업데이트 | |||
==== 초성퀴즈: ㅁㅈㅁ ㅅㅇ ==== | |||
* 마지막 수업 | |||
==== 어제 수업 복습 ==== | |||
* 가상환경 만들기 (왜? 프로젝트마다 Dependency 가 다름) | |||
** (가상환경 생성) conda create -n 가상환경이름 python=3.7 anaconda | |||
** (Anaconda 업데이트) conda update -n base -c defaults conda | |||
** (TensorFlow 설치) conda install -c anaconda tensorflow==2.6 | |||
*** 리눅스나 맥은 2.7 이나 2.8 로 됨 (최근에는 항상 리눅스 버전이 먼저 나옴) | |||
* Jupyter Notebook 사용 시 주의사항 | |||
** KMP_DUPLICATE_LIB_OK 설정 필요 <br /><syntaxhighlight lang="python3" line="1"> | |||
import os | |||
os.environ['KMPDUPLICATE_LIB_OK']='True' | |||
</syntaxhighlight> | |||
* Warning 끄기 <br /><syntaxhighlight lang="python3" line="1"> | |||
import warnings | |||
warnings.filterwarnings('ignore') | |||
</syntaxhighlight> | |||
* 관련 라이브러리 가져오기 <br /><syntaxhighlight lang="python3" line="1"> | |||
import numpy as np | |||
import pandas as pd | |||
import matplotlib.pyplot as plt | |||
import seaborn as sns | |||
</syntaxhighlight> | |||
*DL 코딩 5단계 | |||
** 훈련/테스트 데이터 준비 ← Pipeline을 만들어서 자동화 할 필요있음 | |||
** 모델 설계 | |||
** 훈련 | |||
***모델 학습 방식을 설정하기 | |||
****model.compile(optimizer, loss, metrics) | |||
** 평가 | |||
** 예측 | |||
* TensorFlow 2.0 에는 Keras 가 포함되어 있음 | |||
** 1.0 때는 TF 코드와 Keras 코드가 별도로 있었으나 Keras가 더 간단해서 Google이 Keras 개발자 영입 후, 2.0 부터 포함시킴 | |||
*이러한 코드를 실습했다. | |||
**뇌,건물 만들고 → model = Sequential() | |||
**데이터를 평평하게 1차원으로 만들고 → model.add( Flatten(input_shape=(28, 28)) | |||
**다음 층에는 128개의 출력 뉴런을 ReLU 활성화 함수와 함께 쌓고 → model.add( Dense(128, activation='relu') ) | |||
**그 다음 층에는 20%의 출력 뉴런을 끈다 → model.add( Dropout(0.2) ) | |||
**마지막 층에는 출력방법을 설정한다 → model.add( Dense(10, activation='softmax') ) | |||
***마지막 activation 함수는 아래와 같이 설정 | |||
****softmax - 다중분류 | |||
****sigmoid - 이진분류 | |||
****X - 회귀 | |||
오전수업 | |||
*사이트 소개 : https://playground.tensorflow.org/ | |||
**값을 조절해가며 찾아봤다! <br /><br />[[파일:Playground for TensorFlow.png|프레임없음|1300x1300픽셀]] <br /> | |||
**이렇게 레이어를 많이 추가하면 된다. <br />[[파일:Playground TensorFlow 이렇게.png|프레임없음|1300x1300픽셀]]<br /> | |||
*'''차원의 저주''' | |||
**'''차원이 증가하면서 학습데이터 수가 차원 수보다 적어져서 성능이 저하되는 현상'''을 일컫는다. 차원이 증가할수록 변수가 증가하고, 개별 차원 내에서 학습할 데이터 수가 적어진다 | |||
**차원 = 컬럼의 개수 | |||
**차원이 많아 질수록 경우의 수가 많아져야 하므로 데이터가 기하급수적으로 많아져야 함 | |||
**그래야 모든 경우에 대해 학습이 가능함 | |||
**'''차원이 많아질수록 데이터가 많아지는 현상을 "차원의 저주" 라고 함''' | |||
*머신러닝은 데이터가 적어도 가능하지만 딥러닝은 데이터가 적으면 어렵다. | |||
*딥러닝을 하다보면 훈련이 잘 되었을 때, 멈출 필요가 있는데 이를 '''조기 종료(Early Stopping)'''하는 방법이 있음 (기준 : 검증 비용) | |||
**'''patience''' parameter 가 중요. 훈련 횟수에 따라서 더 이상 떨어지지 않고 유지가 되거나 올라가는 경우에 몇 번이나 참을 것인지 설정 (=성능이 증가하지 않는 epoch을 몇 번이나 허용할 것인가를 정의한다 - [https://3months.tistory.com/424 링크]) | |||
*타이타닉에 탑승한 디카프리오와 윈슬렛의 생존확률을 딥러닝으로 작성했다. <br />[[파일:TensorFlow 실습 타이타닉 탑승자 생존률 추측.png|프레임없음|1300x1300픽셀]] <br /> | |||
*딥러닝 대비 머신러닝은 feature_importances 등 좀 더 설명 가능한 요소를 확인할 수 있다. | |||
==== 오후수업 ==== | |||
*강사님이 커피를 준다고 했는데 안 사왔다!!! 라이어!!! | |||
*오후에는 CNN 실습을 한다. | |||
*VGG를 구현한다. <br />[[파일:VGG 구조.png|프레임없음|1100x1100픽셀]] | |||
제로패딩(Zero-Padding)을 적절히 해주어야 양쪽 끝에 있는 픽셀이 줄어들지 않고 Convolution 계산이 됨 | |||
*model.add ( Conv2D(64, (3,3), activation='relu', padding='same', input_shape=(28, 28)) ) | |||
**same : 필터의 사이즈가 k이면 사방으로 k/2 만큼의 패딩을 준다. ([https://buomsoo-kim.github.io/keras/2018/05/02/Easy-deep-learning-with-Keras-8.md/ 링크]) | |||
CNN으로 MNIST 구현을 함 | |||
RNN 소개 | |||
*RNN은 activation 함수로 tanh 나 sigmoid를 쓰는 경우가 많음 | |||
비트코인 가격 예측 프로그램 작성 | |||
*어떻게 예측할까? 주어진 데이터를 통해 예측하는데 아래와 같이 하고자 함 | |||
**1~5일차 데이터로 6일 때 비트코인 가격 예측 | |||
**2~6일차 데이터로 7일 때 비트코인 가격 예측 | |||
**3~7일차 데이터로 8일 때 비트코인 가격 예측 | |||
**... | |||
* 마지막에는 복습 및 시험관련 설명 | |||
==== 복습 및 시험관련 설명 ==== | |||
[[파일:머신러닝 수업정리-01.png|프레임없음|1000x1000픽셀]] | |||
[[파일:머신러닝 수업-02.png|프레임없음|1100x1100픽셀]] | |||
== 참고자료 == | == 참고자료 == | ||
102번째 줄: | 337번째 줄: | ||
*GitHub Repository https://github.com/rickiepark/handson-ml2 | *GitHub Repository https://github.com/rickiepark/handson-ml2 | ||
*FMA: A Dataset For Music Analysis https://github.com/mdeff/fma | *FMA: A Dataset For Music Analysis https://github.com/mdeff/fma | ||
*딥 러닝을 이용한 자연어 처리 입문 https://wikidocs.net/book/2155 | |||
== 기타 학습자료 == | |||
* 데이터 사이언스 스쿨 https://datascienceschool.net/intro.html | |||
* 데이터 분석, 머신러닝 정리 노트 https://injo.tistory.com/6?category=1068433 | |||
*(책) 혼자 공부하는 머신러닝+딥러닝 https://www.kyobobook.co.kr/product/detailViewKor.laf?barcode=9791162243664 | |||
*(책) 기계 학습 https://www.kyobobook.co.kr/product/detailViewKor.laf?barcode=9791156641582 | |||
[[분류:교육]] | [[분류:교육]] |
2022년 8월 12일 (금) 17:06 기준 최신판
1 개요[편집 | 원본 편집]
올해는 머신러닝 쪽 관련 지식을 함양하고자 한다. 이러한 노력의 일환으로 회사에서 보내주는 외부연수로 아래 강의를 수강했다.
강좌명 | 교육기간 | 교육장소 | 기타 |
---|---|---|---|
Python 라이브러리를 활용한 인공지능 | 2022.8.8 ~ 2022.8.12 | 한국생산성본부 8층 803호 | - 강사명 : 박성백 (sungback@naver.com / 010-8711-7982) ← 평생 A/S 가능
- 수강자 : 10명 (오프라인 7명, 온라인 3명) - 교 재 : <Hands-On Machine Learning with Scikit-Learn Keras & TensorFlow> |
2 교육과정[편집 | 원본 편집]
이번에 내가 수강하는 과정은 아래와 같이 총 5일, 35시간 동안 머신러닝 중 딥러닝에 대해 학습하는 과정이다.
3 책[편집 | 원본 편집]
도서를 읽으며 학습한 내용은 별도 페이지인 핸즈온 머신러닝(2판)(책)을 참고하자.
4 강의[편집 | 원본 편집]
총 5일 동안 교육한 내용을 아래에 간략히 정리했다.
4.1 1일차[편집 | 원본 편집]
- 인공지능 관련 지루한 설명을 들었다.
- 파일 공유를 위한 주소(https://tinyurl.com/ai220808)를 공유 받았다.
- 인공지능 공식을 간략히 소개하면 y=Wx 의 행렬곱이다.
- W 는 가중치(weight)를 의미한다.
- 강사님이 딥러닝은 인간의 뇌를 모방했다면서 "유재석" 얘기를 했는데 앞에 앉아 있는 어떤 학생이 유재석이 나오는 <유퀴즈 온 더 블록>을 보고 있어서 어이 없었다.
- 이 수업에서는 파이썬 언어, 수집(BeautiflSoup), 분석(Pandas), 시각화(Matplolib, Seaborn), ML 까지 실습을 하며 이를 위해 아나콘다(Anaconda)를 설치하며, 실습은 함께 설치하는 주피터(Jupyter)를 활용.
- 환경설정은 아래와 같이 함
- Anaconda 다운로드 https://www.anaconda.com/products/distribution
- 설치
- 주피터 노트북 실행
- 주피터 노트북에 CSS를 적용하려면 윈도우 10 기준으로 %HOMEPATH% 에 .jupyter 폴더를 만든 후, 이어서 방금 만든 폴더 안에 custom 폴더를 만든다. 이어서 custom.css 라는 파일로 아래 CSS 파일을 custom 폴더에 저장한다. 그런 후 주피터 노트북을 재실행하면 CSS가 적용된다.
.container { width:100% !important; }
.CodeMirror {font-family: D2Coding; font-size: 22pt; line-height: 140%;}
div.output {
font-family: D2Coding;
font-size: 12pt;
}
div.prompt {
padding-left: 0;
min-width: 2ex;
}
- D2Coding 폰트를 설치했다. (https://github.com/naver/d2codingfont)
- 시험 공지를 해줬다. 4지선다 15문제, 단답형 5문제로 총 20문제다.
- (시험) 머신러닝 학습 특성에 따른 분류 : Supervised, Unsupervised, Reinforcement Learning
- 주피터에서 파이썬 자료형, 제어문 등 기본 문법을 실습했다.
4.2 2일차[편집 | 원본 편집]
- 오늘은 버스가 많이 막혀서 9:28 에 도착했다. 도착하기 전에 전화를 주셔서 "도착했어요!" 라고 얘기했다. KCP 수업 담당자님께서 강사님이 교통 체증으로 늦어서 양해의 표현으로 커피를 샀으니 마시라고 하셨다. 하하하. 그런데 강사님이 내가 도착한 후 1분 뒤에 오셨다. 강사님이 매번 늦어서 커피가 매번 제공되면 좋겠다.
- 어제 학습한 내용을 복습했다.
- 주피터 노트북에서 모든 명령어를 다시 실행하려면 Kernel 메뉴에 있는 Restart & Run All 을 실행한다.
- 저 강사님 수업을 아마도 3년 전에 다른 수업에서 들었던 것 같다. 과거에 했던 로또 당첨번호 웹 스크래핑 실습을 또 한다. 사골국물도 아니고 이게 뭔가요?!?!?! ㅠ.ㅠ
- 아무튼 나는 현재까지 당첨된 로또 번호 및 보너스 번호를 출력하는 프로그램으로 개량했다. (3년 전에도 똑같은 걸 했었다 ㅎ.ㅎ)
- 이어서 타이타닉 호 승객 생존 예측 미니 프로젝트를 하는데 이것도 아마 3년 전에 했던 것 같다.
- 파이썬 라이브러리 Numpy는 수치연산을 매우 빠르게 하는데 이것이 가능한 이유는 내부 코드를 C/C++로 구현했기 때문이다.
- 코로나 이전에 기상청 직원이 강의를 수강했는데 거기는 여전히 포트란(Fortran)을 사용하고 있다고 한다. 다만 이를 Python에서 사용할 수 있게 바인딩해서 사용을 하고 있다고 한다.
- 점심시간 전에 <타이타닉 호 승객 생존 예측 미니 프로젝트>를 위한 사전 작업을 완료했다. (데이터 제공, 가설 수립 등)
- 커피 사주셨다. 나 퀴즈 틀렸는데? ㅋㅋㅋㅋㅋㅋㅋㅋ 위로커피인듯...
- Dataframe의 info() 함수 결과값에서서 중요하게 봐야 하는 것 중 하나는 Non-Null Column 개수로 결측치 정도를 확인해야 한다. 이 값에 다라 해당 데이터를 활용할 수 있을지 없을지가 결정되기 때문이다.
- 데이터 타입은 아래와 같이 나뉨
- 수치형
- 이산형 : 정수
- 연속형 : 실수
- 범주형
- 명목형 : 혈액형
- 순서형 : 학점, 성적
- 수치형
- Pandas의 Dataframe을 통해 데이터를 조작하는 것은 정말 사기다. 안 쓸 수 없다.
- 원-핫 인코딩(One-Hot Encoding)은 단어 집합의 크기를 벡터의 차원으로 하고, 표현하고 싶은 단어의 인덱스에 1의 값을 부여하고, 다른 인덱스에는 0을 부여하는 단어의 벡터 표현 방식입니다. 이렇게 표현된 벡터를 원-핫 벡터(One-Hot vector)라고 함 (링크)
- 결측치를 채우는 방법을 배움
4.3 3일차[편집 | 원본 편집]
4.3.1 2일차 복습[편집 | 원본 편집]
- iPhyon 노트북은 서로 독립적이기 때문에 매번 import 문 등을 동일하게 추가해야 한다.
- Pandas의 static member function을 통해 엑셀파일을 읽을 수 있다. (C++, Java와 같은 언어에서는 인스턴스가 아닌 객체명으로 멤버를 호출했으니 정적 멤버함수가 맞는데 파이썬에서도 동일한가? 알아봐야할듯)
- df = pd.read_excel("파일명")
- 타이타닉 데이터 분석에서 파일을 연 후에 가장 먼저 한 행동은 특성 탐색
- 머신러닝을 활용하려면 입력과 출력이 반드시 숫자가 되어야 함 (예: 알파벳을 이해하려면 대소문자 알파벳 52자를 숫자로 변환한 후 학습을 시켜야 함)
- Dataframe 에서 교차표는 crosstab 함수로 그리며 합계를 추가하려면 margins=True 를 작성
- 데이터를 범주형으로 만들려면 Dataframe의 cut 함수 사용
- df['age_cat'] = pd.cut(df['age'], bins=[0,10,20,50,80], include_lowest=True, labels=['baby', 'teenage', 'adult', 'old'])
- Pandas에서 데이터를 반환하는 게 아니라 호출한 객체 값이 저장하게 하려면 inplace=True 를 추가하면 됨 (항상 그렇다는 건 아님)
- 현실에 맞게 학습하려면 이상치를 포함하는 게 맞음
- df[df['fare'].isnull()] : 운임이 null(결측치)인 사람 찾기
- df['survived'].value_counts() : 생존자 수 카운트
4.3.2 머신러닝 코딩 5단계[편집 | 원본 편집]
- 훈련 데이터와 테스트 데이터를 나눈다. : train_test_split
- ML 알고리즘 선택
- 머신러닝 알고리즘은 수학
- 훈련 : fit
- 평가 : score
- 새 데이터로 예측 : predict
4.3.3 수업내용 필기[편집 | 원본 편집]
- Tree를 여러 개 가져다가 다수결로 결정하는 알고리즘을 앙상블(Ensemble) 이라고 합니다.
- train_test_split 함수를 통해 학습 데이터와 테스트 데이터를 나눌 수 있는데, 이 때 random_state 값을 설정해야 하이퍼파라메터 조정을 하는 데 애로사항이 없다.
- 머신러닝이 최종적으로 하는 일은 두 가지로 나눌 수 있음 → 분류를 잘하거나 값을 맞추거나
- DecisionTreeClassifier : 분류
- DecisionTreeRegression : 값
- 대부분의 머신러닝 알고리즘 함수에는 -Classifier 또는 -Regression 이 붙음
4.4 오후수업[편집 | 원본 편집]
- ML 코딩 5단계
- 훈련 데이터와 테스트 데이터로 나눈다 : train_test_split
- ML 알고리즘 선탱
- 훈련 : fit
- 평가 : score
- 새 데이터로 예측 : predict
- ML 문제 분류
- 분류
- 이진
- 0
- 1
- 다중
- A
- B
- C
- ...
- 이진
- 회귀
- 값 예측
- 분류
- 주피터 노트북에서 외부 명령어를 실행하려면 "! 명령어"를 입력한다.
- 최근에는 앙상블 모델을 이용하고 있다.
- 앙상블 모델은 트리로 이루어진다. (예: 랜덤 포레스트)
- Kaggle 사이트(https://www.kaggle.com/)에서 1% 이내에 들면 원하는 곳 취업 가능
- 선형회귀 실습을 했다.
- SVM 실습을 했다.
- sigmoid 활성화 함수에 대해 언급했다.
- 정규화를 위해 가장 많이 쓰는 애들은 StandardScaler, MinMaxScaler 이다.
- MinMaxScaler 는 값이 0.0 ~ 1.0 으로 바뀜
- StandardScaler는 평균을 0으로 만들고 표준편차는 1로 만듦
- Numpy에서 데이터 출력 관련 값은 np.set_printoptions 으로 설정 가능하다.
- np.set_printoptions(precision=4, suppress=True)
- DecisionTree 실습
- 어떤 특성을 중요하게 판단했는지 확인하기 : tree.feature_importances_
- 상기 값은 설명가능한 인공지능(eXplainable Artificial Intelligence, XAI)와 밀접한 관련이 있다.
4.5 4일차[편집 | 원본 편집]
시험에 대해서는 내일 정리해주겠다면서 수업을 시작했다.
4.5.1 오전수업[편집 | 원본 편집]
- 항상 그랬던 것처럼 복습으로 수업을 시작했다.
- ML 코딩 5단계
- 훈련 데이터와 테스트 데이터로 나눈다 : train_test_split
- ML 알고리즘 선택
- 훈련 : fit
- 평가 : score
- 새 데이터로 예측 : predict
- 경고 메시지 나오지 않게 하기
import warnings warnings.filterwarnings('ignore')
- 적절한 파라미터를 찾는 과정을 하이퍼파라미터 찾기라고 함
- K-Neighbors 나 선형회귀(Linear Regression)은 실전에서는 쓰이지 않지만 기초이기 때문에 배울 필요가 있음 : KNeighborsClassifier
- K-Neighbors에서 n_neighbors가 너무 작으면 underfitting, n_neighbors가 너무 크면 overfitting이 될 수 있어서 적절한 값을 찾아야 함 : LinearRegression
- Linear Regression에서 Cost가 너무 작으면 underfitting, Cost가 너무 크면 overfitting이 될 수 있어서 적절한 값을 찾아야 함 :
- Support Vector Machine(SVM)은 가장 두꺼워지는 직선을 찾음 : SVC
- 값의 범주가 동일하지 않은 데이터를 함께 분석해야 하는 경우에는 정규화(normalization)를 해야 하며 MinMaxScaler, StandardScaler로 가능
- 오늘은 DecisionTree와 Graph 관련 수업을 함
- numpy.arange([start, ] stop, [step, ] dtype=None) : numpy 모듈의 arange 함수는 반열린구간 [start, stop) 에서 step 의 크기만큼 일정하게 떨어져 있는 숫자들을 array 형태로 반환해 주는 함수
- (예) np.arange(30) 이라고 하면 [0, 1, 2, ... 28, 29] 를 값으로 갖는 array 를 return 함
- DecisionTree에서는 overfitting 혹은 underfitting이 일어나면 depth 조절을 함
- RandomForest는 Tree의 조합인데 max_depth를 통해 overfitting과 underfitting을 조절함
- 머신러닝 이론 학습을 위해 제공한 PDF가 쉽게 잘 만들어져 있어서 유익함!!! ★★★★★
- sigmoid 는 머신러닝에서는 잘 되었으나 딥러닝에서는 잘 안되어서 ReLU(Rectified Linear Units) 라는 activation 함수를 사용
- 사그라드는 sigmoid 대신 죽지 않는 ReLU를 쓰자 => vanishing gradient 문제 해결
- GradientDescent를 통해 가중치 parameters를 최적화 하는 게 너무 느려서 StochasticGradientDescent가 나옴 => Slowness 문제 해결
- GradientDescnet는 loss function의 현 가중치에서 기울기(gradient)를 구해서 loss를 줄이는 방향으로 업데이트를 하는 함수
- 현재는 Adam이 90% 정도 점유율로 사용되고 있음
- GradientDescnet는 loss function의 현 가중치에서 기울기(gradient)를 구해서 loss를 줄이는 방향으로 업데이트를 하는 함수
- 융통성이 없는 overfitting 은 어떻게 해결하지?
- DropOut을 씀. 즉, 학습을 시킬 때 일부러 정보를 누락 시키거나 중간 노드를 끈다. 이를 통해 일부 특성에만 집착하지 않고 중요한 요소가 무엇인지 터득한다.
- 요약하면...
- 학습이 잘 안되었던 것은 sigmoid 를 쓰면서 vanishing gradient 가 나왔기 때문이어서 ReLU 로 변경했음
- 속도가 느린 건 GD를 Adams로 변경했음
- 융통성이 없는 건 DropOut으로 해결했음
- 문제의 유형에 따라 적절한 아키텍처를 적용하는 게 핵심
- 스냅샷성 데이터(이미지, 영상 등) : Convolutional Neural Network(CNN)
- 시퀀스성 데이터(음성, 언어, 주식 가격, 맥락 등) : Recurrent Neural Network(RNN) 또는 Long Short Term Memory(LSTM)
- RNN은 기본적으로 sigmoid 활성화 함수가 들어있어서 문제가 있다. 이를 개선한 것이 LSTM이다.
- Convolution은 특정 패턴이 있는지 없는지 박스로 훑으며 마킹하는 알고리즘
- 위아래선 필터, 좌우선필터, 대각선필터, 이런질감필터, 요런질감필터, 동그라미필터 등등 여러 가지 "조각" 필터로 해당 패턴이 그림 위에 있는지 확인
- 이 때 테두리가 잘리면 계산 값이 0으로 수렴하는 경우가 발생할 수 있어서 이미지 바깥쪽의 데이터를 0으로 채우는 zero padding을 함
- 사이즈를 줄여서 계산량을 줄이는 MaxPooling 또한 자주 활용함
- AveragePooling도 있는데 얘는 최대값을 선택하는 MaxPooling 대비 평균 값을 채워서 사이즈를 줄임. 단, AveragePooling을 쓰면 이미지가 뭉개지는 경향이 있어서 가장 큰 값(선명한 값)을 선택하는 MaxPooling이 주로 쓰임
- sigmoid 는 머신러닝에서는 잘 되었으나 딥러닝에서는 잘 안되어서 ReLU(Rectified Linear Units) 라는 activation 함수를 사용
4.5.2 오후수업[편집 | 원본 편집]
- Convolution은 패턴들을 쌓아가며 점차 복잡한 패턴을 인식하도록 하고
- MaxPooling은 사이즈를 줄여가면서 패턴의 추상도를 높인다.
- 그러면서 중간에 DropOut을 하면서 일부에 집착하지 않고 중요한 요소를 파악하는 융통성을 키운다.
- PPT 자료가 진짜 좋다
- 가상환경 만들기
- 시작 > Anaconda3 > Anaconda Prompt(Anaconda3) > conda create -n tf python=3.7 anaconda
- 위에서 만든 가상환경은 C:\Users\user\anaconda3\envs 에 위치함
- 시작 > Anaconda3 > Anaconda Prompt(Anaconda3) > conda create -n tf python=3.7 anaconda
- 가상환경 사용 및 종료하기
- CUI
- (사용) conda activate tf
- (종료) conda deactivate
- CUI
- Conda 업데이트 하기
- conda update -n base -c defaults conda
- TensorFlow 설치하기
- TnsorFlow 설치여부 확인하기
- TensofrFlow Jupyter Notebook 실행하기
- TensorFlow 이름?
- tensor = 다차원 배열
- flow = 흐름
- 딥러닝의 내부 흐름인 "다차원 배열이 흘러간다" 는 것을 이름에 녹여냈다.
- MNIST 에서 train set 과 test set 을 255 로 나눈 이유는 정규화(nomalization)를 하기 위함이다.
- 텐서플로우 MNIST 예제 보기
- 훈련 데이터와 테스트 데이터 준비한다.
- 모델을 설계한다. ← 딥러닝은 모델 설계 과정이 있음. 이게 앞서 학습했던 전통적인 머신러닝과의 차이점
- 훈련한다.
- 평가한다.
- 새로운 데이터를 넣어서 모델을 업데이트 한다.
- TensorFlow를 Jupyter Notebook 에서 MNIST 데이터세트로 실습했다.
4.6 5일차[편집 | 원본 편집]
4.6.1 초성퀴즈: ㅁㅈㅁ ㅅㅇ[편집 | 원본 편집]
- 마지막 수업
4.6.2 어제 수업 복습[편집 | 원본 편집]
- 가상환경 만들기 (왜? 프로젝트마다 Dependency 가 다름)
- (가상환경 생성) conda create -n 가상환경이름 python=3.7 anaconda
- (Anaconda 업데이트) conda update -n base -c defaults conda
- (TensorFlow 설치) conda install -c anaconda tensorflow==2.6
- 리눅스나 맥은 2.7 이나 2.8 로 됨 (최근에는 항상 리눅스 버전이 먼저 나옴)
- Jupyter Notebook 사용 시 주의사항
- KMP_DUPLICATE_LIB_OK 설정 필요
import os os.environ['KMPDUPLICATE_LIB_OK']='True'
- KMP_DUPLICATE_LIB_OK 설정 필요
- Warning 끄기
import warnings warnings.filterwarnings('ignore')
- 관련 라이브러리 가져오기
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns
- DL 코딩 5단계
- 훈련/테스트 데이터 준비 ← Pipeline을 만들어서 자동화 할 필요있음
- 모델 설계
- 훈련
- 모델 학습 방식을 설정하기
- model.compile(optimizer, loss, metrics)
- 모델 학습 방식을 설정하기
- 평가
- 예측
- TensorFlow 2.0 에는 Keras 가 포함되어 있음
- 1.0 때는 TF 코드와 Keras 코드가 별도로 있었으나 Keras가 더 간단해서 Google이 Keras 개발자 영입 후, 2.0 부터 포함시킴
- 이러한 코드를 실습했다.
- 뇌,건물 만들고 → model = Sequential()
- 데이터를 평평하게 1차원으로 만들고 → model.add( Flatten(input_shape=(28, 28))
- 다음 층에는 128개의 출력 뉴런을 ReLU 활성화 함수와 함께 쌓고 → model.add( Dense(128, activation='relu') )
- 그 다음 층에는 20%의 출력 뉴런을 끈다 → model.add( Dropout(0.2) )
- 마지막 층에는 출력방법을 설정한다 → model.add( Dense(10, activation='softmax') )
- 마지막 activation 함수는 아래와 같이 설정
- softmax - 다중분류
- sigmoid - 이진분류
- X - 회귀
- 마지막 activation 함수는 아래와 같이 설정
오전수업
- 사이트 소개 : https://playground.tensorflow.org/
- 차원의 저주
- 차원이 증가하면서 학습데이터 수가 차원 수보다 적어져서 성능이 저하되는 현상을 일컫는다. 차원이 증가할수록 변수가 증가하고, 개별 차원 내에서 학습할 데이터 수가 적어진다
- 차원 = 컬럼의 개수
- 차원이 많아 질수록 경우의 수가 많아져야 하므로 데이터가 기하급수적으로 많아져야 함
- 그래야 모든 경우에 대해 학습이 가능함
- 차원이 많아질수록 데이터가 많아지는 현상을 "차원의 저주" 라고 함
- 머신러닝은 데이터가 적어도 가능하지만 딥러닝은 데이터가 적으면 어렵다.
- 딥러닝을 하다보면 훈련이 잘 되었을 때, 멈출 필요가 있는데 이를 조기 종료(Early Stopping)하는 방법이 있음 (기준 : 검증 비용)
- patience parameter 가 중요. 훈련 횟수에 따라서 더 이상 떨어지지 않고 유지가 되거나 올라가는 경우에 몇 번이나 참을 것인지 설정 (=성능이 증가하지 않는 epoch을 몇 번이나 허용할 것인가를 정의한다 - 링크)
- 타이타닉에 탑승한 디카프리오와 윈슬렛의 생존확률을 딥러닝으로 작성했다.
- 딥러닝 대비 머신러닝은 feature_importances 등 좀 더 설명 가능한 요소를 확인할 수 있다.
4.6.3 오후수업[편집 | 원본 편집]
제로패딩(Zero-Padding)을 적절히 해주어야 양쪽 끝에 있는 픽셀이 줄어들지 않고 Convolution 계산이 됨
- model.add ( Conv2D(64, (3,3), activation='relu', padding='same', input_shape=(28, 28)) )
- same : 필터의 사이즈가 k이면 사방으로 k/2 만큼의 패딩을 준다. (링크)
CNN으로 MNIST 구현을 함
RNN 소개
- RNN은 activation 함수로 tanh 나 sigmoid를 쓰는 경우가 많음
비트코인 가격 예측 프로그램 작성
- 어떻게 예측할까? 주어진 데이터를 통해 예측하는데 아래와 같이 하고자 함
- 1~5일차 데이터로 6일 때 비트코인 가격 예측
- 2~6일차 데이터로 7일 때 비트코인 가격 예측
- 3~7일차 데이터로 8일 때 비트코인 가격 예측
- ...
- 마지막에는 복습 및 시험관련 설명
4.6.4 복습 및 시험관련 설명[편집 | 원본 편집]
5 참고자료[편집 | 원본 편집]
- 정오표 https://tensorflow.blog/handson-ml2/
- 유튜브 강의 https://bit.ly/homl2-youtube/
- GitHub Repository https://github.com/rickiepark/handson-ml2
- FMA: A Dataset For Music Analysis https://github.com/mdeff/fma
- 딥 러닝을 이용한 자연어 처리 입문 https://wikidocs.net/book/2155
6 기타 학습자료[편집 | 원본 편집]
- 데이터 사이언스 스쿨 https://datascienceschool.net/intro.html
- 데이터 분석, 머신러닝 정리 노트 https://injo.tistory.com/6?category=1068433
- (책) 혼자 공부하는 머신러닝+딥러닝 https://www.kyobobook.co.kr/product/detailViewKor.laf?barcode=9791162243664
- (책) 기계 학습 https://www.kyobobook.co.kr/product/detailViewKor.laf?barcode=9791156641582