행위

Python 라이브러리를 활용한 인공지능

라이언의 꿀팁백과

Ryanyang (토론 | 기여)님의 2022년 8월 12일 (금) 17:06 판 (→‎5일차)
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)

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시간 동안 머신러닝 중 딥러닝에 대해 학습하는 과정이다.


20220808-강의커리큘럼-01.png20220808-강의커리큘럼-02.png

20220808-강의커리큘럼-03.png

3[편집 | 원본 편집]

도서를 읽으며 학습한 내용은 별도 페이지인 핸즈온 머신러닝(2판)(책)을 참고하자.

4 강의[편집 | 원본 편집]

총 5일 동안 교육한 내용을 아래에 간략히 정리했다.

4.1 1일차[편집 | 원본 편집]

  • 인공지능 관련 지루한 설명을 들었다.
  • 파일 공유를 위한 주소(https://tinyurl.com/ai220808)를 공유 받았다.
  • 인공지능 공식을 간략히 소개하면 y=Wx 의 행렬곱이다.
    • W 는 가중치(weight)를 의미한다.
  • 강사님이 딥러닝은 인간의 뇌를 모방했다면서 "유재석" 얘기를 했는데 앞에 앉아 있는 어떤 학생이 유재석이 나오는 <유퀴즈 온 더 블록>을 보고 있어서 어이 없었다.
  • 이 수업에서는 파이썬 언어, 수집(BeautiflSoup), 분석(Pandas), 시각화(Matplolib, Seaborn), ML 까지 실습을 하며 이를 위해 아나콘다(Anaconda)를 설치하며, 실습은 함께 설치하는 주피터(Jupyter)를 활용.
  • 환경설정은 아래와 같이 함
    1. Anaconda 다운로드 https://www.anaconda.com/products/distribution
    2. 설치
    3. 주피터 노트북 실행

      20220808-주피터 실행.png
  • 주피터 노트북에 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 을 실행한다.
    주피터 노트북에서 명령어 모두 다시 실행하기.png
  • 저 강사님 수업을 아마도 3년 전에 다른 수업에서 들었던 것 같다. 과거에 했던 로또 당첨번호 웹 스크래핑 실습을 또 한다. 사골국물도 아니고 이게 뭔가요?!?!?! ㅠ.ㅠ
  • 아무튼 나는 현재까지 당첨된 로또 번호 및 보너스 번호를 출력하는 프로그램으로 개량했다. (3년 전에도 똑같은 걸 했었다 ㅎ.ㅎ)
    로또 1등 및 보너스 번호.png
  • 이어서 타이타닉 호 승객 생존 예측 미니 프로젝트를 하는데 이것도 아마 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단계[편집 | 원본 편집]

  1. 훈련 데이터와 테스트 데이터를 나눈다. : train_test_split
  2. ML 알고리즘 선택
    • 머신러닝 알고리즘은 수학
  3. 훈련 : fit
  4. 평가 : score
  5. 새 데이터로 예측 : predict

4.3.3 수업내용 필기[편집 | 원본 편집]

  • Tree를 여러 개 가져다가 다수결로 결정하는 알고리즘을 앙상블(Ensemble) 이라고 합니다.
  • train_test_split 함수를 통해 학습 데이터와 테스트 데이터를 나눌 수 있는데, 이 때 random_state 값을 설정해야 하이퍼파라메터 조정을 하는 데 애로사항이 없다.
  • 머신러닝이 최종적으로 하는 일은 두 가지로 나눌 수 있음 → 분류를 잘하거나 값을 맞추거나
    • DecisionTreeClassifier : 분류
    • DecisionTreeRegression : 값
  • 대부분의 머신러닝 알고리즘 함수에는 -Classifier 또는 -Regression 이 붙음

4.4 오후수업[편집 | 원본 편집]

  • ML 코딩 5단계
    1. 훈련 데이터와 테스트 데이터로 나눈다 : train_test_split
    2. ML 알고리즘 선탱
    3. 훈련 : fit
    4. 평가 : score
    5. 새 데이터로 예측 : 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단계
    1. 훈련 데이터와 테스트 데이터로 나눈다 : train_test_split
    2. ML 알고리즘 선택
    3. 훈련 : fit
    4. 평가 : score
    5. 새 데이터로 예측 : 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% 정도 점유율로 사용되고 있음
    • 융통성이 없는 overfitting 은 어떻게 해결하지?
      • DropOut을 씀. 즉, 학습을 시킬 때 일부러 정보를 누락 시키거나 중간 노드를 끈다. 이를 통해 일부 특성에만 집착하지 않고 중요한 요소가 무엇인지 터득한다.
    • 요약하면...
      • 학습이 잘 안되었던 것은 sigmoid 를 쓰면서 vanishing gradient 가 나왔기 때문이어서 ReLU 로 변경했음
      • 속도가 느린 건 GDAdams로 변경했음
      • 융통성이 없는 건 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이 주로 쓰임

4.5.2 오후수업[편집 | 원본 편집]

  • 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) 를 선택해서 실행
        아나콘다 가상환경 사용하기.png
    • 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
      아나콘다 TensorFlow 설치.png
  • TnsorFlow 설치여부 확인하기
    • 아래와 같이 라이브러리를 import 한 후, 버전을 출력한다.
      TensorFlow2 설치여부 확인하기.png
  • TensofrFlow Jupyter Notebook 실행하기
    • 아래처럼 Jupyter Notebook (tf) 를 실행한다.
      TensorFlow Jupyter Notebook 실행.png
  • TensorFlow 이름?
    • tensor = 다차원 배열
    • flow = 흐름
  • 딥러닝의 내부 흐름인 "다차원 배열이 흘러간다" 는 것을 이름에 녹여냈다.
  • MNIST 에서 train set 과 test set 을 255 로 나눈 이유는 정규화(nomalization)를 하기 위함이다.
  • 텐서플로우 MNIST 예제 보기
    TF MNIST 예제.png
    • 훈련 데이터와 테스트 데이터 준비한다.
    • 모델을 설계한다. ← 딥러닝은 모델 설계 과정이 있음. 이게 앞서 학습했던 전통적인 머신러닝과의 차이점
    • 훈련한다.
    • 평가한다.
    • 새로운 데이터를 넣어서 모델을 업데이트 한다.
  • 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'
      
  • 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 - 회귀

오전수업

  • 사이트 소개 : https://playground.tensorflow.org/
    • 값을 조절해가며 찾아봤다!

      Playground for TensorFlow.png
    • 이렇게 레이어를 많이 추가하면 된다.
      Playground TensorFlow 이렇게.png
  • 차원의 저주
    • 차원이 증가하면서 학습데이터 수가 차원 수보다 적어져서 성능이 저하되는 현상을 일컫는다. 차원이 증가할수록 변수가 증가하고, 개별 차원 내에서 학습할 데이터 수가 적어진다
    • 차원 = 컬럼의 개수
    • 차원이 많아 질수록 경우의 수가 많아져야 하므로 데이터가 기하급수적으로 많아져야 함
    • 그래야 모든 경우에 대해 학습이 가능함
    • 차원이 많아질수록 데이터가 많아지는 현상을 "차원의 저주" 라고 함
  • 머신러닝은 데이터가 적어도 가능하지만 딥러닝은 데이터가 적으면 어렵다.
  • 딥러닝을 하다보면 훈련이 잘 되었을 때, 멈출 필요가 있는데 이를 조기 종료(Early Stopping)하는 방법이 있음 (기준 : 검증 비용)
    • patience parameter 가 중요. 훈련 횟수에 따라서 더 이상 떨어지지 않고 유지가 되거나 올라가는 경우에 몇 번이나 참을 것인지 설정 (=성능이 증가하지 않는 epoch을 몇 번이나 허용할 것인가를 정의한다 - 링크)
  • 타이타닉에 탑승한 디카프리오와 윈슬렛의 생존확률을 딥러닝으로 작성했다.
    TensorFlow 실습 타이타닉 탑승자 생존률 추측.png
  • 딥러닝 대비 머신러닝은 feature_importances 등 좀 더 설명 가능한 요소를 확인할 수 있다.

4.6.3 오후수업[편집 | 원본 편집]

  • 강사님이 커피를 준다고 했는데 안 사왔다!!! 라이어!!!
  • 오후에는 CNN 실습을 한다.
  • VGG를 구현한다.
    VGG 구조.png

제로패딩(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 복습 및 시험관련 설명[편집 | 원본 편집]

머신러닝 수업정리-01.png

머신러닝 수업-02.png

5 참고자료[편집 | 원본 편집]

6 기타 학습자료[편집 | 원본 편집]