행위

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

라이언의 꿀팁백과

Ryanyang (토론 | 기여)님의 2022년 8월 11일 (목) 15:14 판 (→‎오후수업)

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

4.6 5일차

업데이트 예정

5 참고자료

6 기타 학습자료