☑️ 목차

오늘의 TIL순서는

  • 시작전 마음가짐
  • 머신러닝 복습
  • AI모델활용 복습
  • 파이썬 과제
  • 회고 

복습 내용과 코드는 GITHUB링크를 참고해주세요. 

TIL/ML/PCA.ipynb at main · Onesword-Jang/TIL

 

TIL/ML/PCA.ipynb at main · Onesword-Jang/TIL

오늘 배운 것은?! Contribute to Onesword-Jang/TIL development by creating an account on GitHub.

github.com

 

 

 


☑️시작전 마음가짐

오늘의 학습 목표는 ML, AL 복습을 진행하고 API키를 발급 받았기에 AL의 코드를 진행해볼 것입니다.

 

그리고 수준별 학습반의 과제와 포트폴리오 작성를 진행하겟습니다.

 

어제 진행한 ML 복습에서 차원축소 부분의 결과를 해석을 하지못해 갑갑한 마음이있었기에 차원축소 코드 결과를 해석하는데 집중하며 복습을 해야겟습니다.


☑️머신러닝 복습

1. PCA 결과 해석

  • 변수가 너무 많아 기존 변수를 조합해 새로운 변수를 가지고 모델링을 하려고 할 때 주로 PCA를 사용한다.
  • 전체 분산을 95%를 설명하는 주성분을 332개 찾았다.(기존 784차원에서 332차원으로 축소)
  • 각 주성분이 설명하는 분산 비율은 전체 데이터의 변동성을 각 주성분 마다 얼마정도씩 설명해주는지 보여주고 그 값이 제일 큰 주성분을 첫 번째 주성분이라 할 수 있다..
  • 그 332개중에 분산비율이 가장 크고 변동에 영향이 큰 주성분이 X축 두 번째 큰 주성분이 Y축으로 지정 되어서 그래프를 보여준다.
  • 첫번째(x축) 와 두번째(y축) 선을 기준으로 사용해서 데이터 포인트들을 shearing(잡아당김)해서 2차원 그래프로 나타낸다.
  • shearing 했을 때 분산도가 가장 크고 데이터 별로 잘 뭉쳐져있으면 잘 분류한것이라 볼 수 있다.

2. 변동이 많을수록 좋은 이유

  1. 데이터가 다양한 값으로 퍼져있다는 뜻으로, 주성분이 데이터의 다양한 특성을 잘 포착하고 있다는 의미 (데이터의 중요한 구조와 패턴을 더 많이 담고있다.)
  2. 차원 축소에서 고차원 데이터 중 불필요하거나 정보량이 적은 차원을 제거하고, 중요 패턴이 담긴 주성분을 유지하여 차원을 축소한다.
  3. 잡음 제거를 잘한 것이다.

3. 시각화한 그래프를 해석하는 방법

  • mnist데이터셋으로 보았을 때 가장 변동성이 큰 주성분이 X축, 두 번째로 큰 주성분이 Y축이라 볼 수 있고 각 데이터 포인트의 색들은 분류하고자하는 레이블(0~9)를 말한다.
  • 각 색깔 별로 잘 뭉쳐있다면 첫 번째 두 번째 주성분으로 잘 분류가 가능하다라는 의미가 된다.
  • 만약 너무 흩어져있다면 선택된 주성분들의 분류 성능이 좋지 못하다라는 뜻으로 해석이 가능하다.

4. PCA를 사용하는 상황

  1. 차원의 저주 해결이 필요할 떄(변수가 너무 많아 특서을 찾기 어려운 경우)
  2. 다중공선성 문제가 있을 때(변수들 간에 높은 상관관계가 존재하는 경우 모델이 특정 특성에 과도하게 의존해 불안정한 결과가 나오기 때문)
  3. 계산 비용 절감이 필요할 때(대용량 이미지 데이터셋 처리)
  4. 노이즈 제거가 필요할 때(예: 센서 데이터의 노이즈)

5. 머신 러닝의 결과 해석이 중요한지?

  • 실무에 적용 시키면 회사마다 다르지만 이런 기술을 내것으로 만들게 된다면 경쟁력이 높아진다고 생각할 수 있다.

6. 참고 자료

- PCA를 쉽게 설명한 영상

https://www.youtube.com/watch?v=FgakZw6K1QQ

 

- 공분산 행렬의 의미 영상

https://www.youtube.com/watch?v=jNwf-JUGWgg

 


☑️파이썬 과제

1. 문자열 출력하기

  • 공백을 없애는 방법은 기억이 나지않아 찾아보고 작성했다.
  • 다른 사람들의 풀이에서 else를 사용해서 continue 사용방법이 떠올랐다.
    str = input()
    if len(str) >= 1 and len(str) <= 1000000:
      print(str, end="")

2. a와 b 출력하기

  • 조건문을 복습하고 싶어 길게 사용해 보았습니다.
  • 오류로는 들여쓰기(IndentationError), 오타(NameError) 오류를 만낫습니다.
a, b = map(int, input().strip().split(' '))
while True:
    if a >= -100000 and a <= 100000 and b >= -100000 and b <= 100000:
        print(f'a = {a}') 
        print(f'b = {b}')
        break
    else:
        print("-100,000과 100,000 사이의 수 두개만 입력해주세요.")
        a, b = map(int, input().strip().split(' '))
        continue

3. 문자열 반복해서 출력하기

  • input에 틀렸을 때 나오는출력 글을 넣었는데 str과 같이 출력 되는 문제가 생겨서 input의 정보를 지우고 print로 틀렸을 때 경고 메세지로 나오게 만듦
  • str * n부분을 {str} * {n}으로 했다가 ({str} * {n})으로 했다가 마지막에 str * n으로 해서 해결
  • 마지막 continue위 n = int(n)을 추가하지않아 오류 만남 추가해서 해결
str, n = input().strip().split(' ')
n = int(n)
while True:
    if len(str) >= 1 and len(str) <= 10 and n >= 1 and n <= 5:
        print(str*n)
        break
    else:
        print(f'첫 번째 자리는 10자리 이내로, 두 번째 자리는 1~5 숫자만 입력하세요.')
        str, n = input().strip().split(' ')
        n = int(n)
        continue

☑️ AI모델활용 복습

오늘 다른 학습으로 인해서 시간이 없어 미리 필기해놓았던 코드를 가져와서 API키를 활용해 간단한 동작을하는 Chat봇을 만들어보았습니다.

 

하지만 계속 되는 오류(모듈, 들여쓰기, 단어정의, 오타 등)로 작동되지 않았습니다.

 

내일 AI모델활용 복습 시간에 강의를 처음부터 들어가며 새로운 가상환경을 만들어 진행하겟습니다.


☑️회고

오늘은 지금까지 하루 공부한 총 양을 따지면 가장 적게 공부한 날입니다.

 

하지만 한가지의 주제를 심도있게 공부한 날이기도해서 좋았습니다.

 

오늘은 포트폴리오를 만들기 위한 정보를 찾아보았습니다. 간단한 검색으로는 github에 웹싸이트를 만드는 방법들만 주루룩 나왔습니다.

 

깃허브에 웹싸이트는 이미 만들어 놓은 상태이기에 다른 정보를 찾아보았고 좋은 정보가있는 블로그를 발견했습니다.

 

내일은  꼭 API키를 사용해보고 이 블로그와 유튜브 등 영상까지 참고해서 포트폴리오 작성에 대한 철저한 준비와 도전해보겟습니다.

 

https://velog.io/@productuidev/%EC%A4%80%EB%B9%84%ED%95%98%EA%B8%B0-7-%ED%8F%AC%ED%8A%B8%ED%8F%B4%EB%A6%AC%EC%98%A4-GitHub

 

[준비하기] (7) 포트폴리오 - GitHub

인프런 비전공자를 위한 개발자 취업 강의 (7)

velog.io

 

☑️목차

오늘의 TIL 순서로는

  • 시작전 마음가짐
  • AI모델활용 강의
  • 머신러닝 비지도학습
  • 회고

입니다.

강의 학습과 복습 코드는 GITHUB링크 확인!

TIL/AI/AI5_6_8.ipynb at main · Onesword-Jang/TIL

 

TIL/AI/AI5_6_8.ipynb at main · Onesword-Jang/TIL

오늘 배운 것은?! Contribute to Onesword-Jang/TIL development by creating an account on GitHub.

github.com

 

 


☑️시작전 마음가짐

오늘은 AI모델활용 강의를 마무리하고 머신러닝 비지도학습을 복습할 계획입니다.

 

딥러닝, AI모델활용 강의를 들으며 다른 강의보다 이해가 안가고 어렵다고 생각이 드는 순간이 많았습니다.

 

이러한 부분은 파이썬을 처음 만났을 때 그리고 머신러닝을 처음 만났을 때도 마찬가지였지만, 현재 파이썬과 머신러닝의

부분을 복습을 진행하면 이해가 쉽고 학습속도가 굉장히 빨라진것을 느낌니다.

 

딥러닝과 AI모델활용 부분도 답답해도 참고 많은 복습으로 학습을 진행하면 내 것이 될거라 생각하고

 

화이팅!!!!

 

을 외치며 학습을 시작하겟습니다!!!


☑️AI모델활용 5주차 (6~8)

📚5-6

1. 사용 모듈 설명

1) ultralytics

YOLO

  • 객체 탐지 모델을 사용하기 위한 클래스이며, 다양한 메서드를 통해 *이미지, 비디오에서 객체를 인식하고 처리

2) cv2

  • OpenCV 라이브러를 사용하는데 필요한 모듈
  • 이미지, 비디오를 다루는데 유용(스트림 처리, 영상처리 기능)

3) PyQt5.QtWidgets

QApplication

  • PyQt5 애플리케이션을 초기화하고 실행하는 클래스
  • GUI 프로그램의 기본 인스턴스를 생성QLabel
  • 텍스트나 이미지를 표시하는 라벨 위젯QVBoxLayout
  • 위젯들을 수직으로 정렬할 때 사용QWidget
  • GUI 프로그램의 기본 창 역할을 하는 기본 위젯QPushButton
  • 클릭 가능한 버튼을 생성하는 위젯

4) PyQt5.QtCore

QTimer

  • 타이머를 설정하고 일정한 시간 간격으로 이벤트를 발생시키는 클래스

5) PyQt5.QtGui(이미지를 최적화 해서 빠르게 표시

QImage

  • 이미지 데이터를 처리하고 표현하기 위한 클래스(이미지를 포맷으로 저장, 변환 기능)QPixmap
  • 화면에 이미지를 표시하기 위한 클래스

2. super 메서드

  • super() 메서드는 파이썬에서 부모 클래스의 메서드나 속성을 자식 클래스에서 호출할 때 사용
  • 다중 상속이나 클래스 간 메서드 호출 순서를 정할 때 유용

3. yolov8x.pt

  • YOLOv8모델의 사전 훈련된 가중치 파일
  • 객체 동시 탐지 및 분류

4. if문의 is not None

  • 강의 코드를 예로 들면
  • self.capture 변수가 None이 아닐 때, 즉 유효한 값이 있을 때만 조건문이 실행되도록 하는 것
      # 웹캠 중지
      def stop_webcam(self):
          """웹캠을 중지하고 타이머를 멈춤"""
          self.timer.stop()
          if self.capture is not None:
              self.capture.release()
    5. release 메서드
  • 보통 리소스를 해제하는 데 사용되는 메서드
  • 주로 OpenCV와 같은 라이브러리에서 비디오 캡처 객체나 파일을 다룰 때 사용

6. 라이브러리 에러

  • dotenv 라이브러리를 pip install python-dotenv하고 성공적으로 설치했다고 알림을 받음
  • 파일에서 실행시키니 모듈 찾을 수 없음 에러가 나옴
  • 재설치, 디렉토리 경로 탐색, 파이썬 인터프리터 경로 탐색 등 많은 방법을 사용해 봄
  • 가상환경을 재구축해서 해결하기에는 다른 방법으로 해결 하고 싶었음
  • 혹시 VSCode로 실행하면 되나 싶어 진행해 본 결과 해결 완료
  • 맞지 않던 인터프리터 경로나 버젼 등이 VSCode로 실행하니 완벽해졋음
# 현재 디렉토리 확인
dir # bash
# 파이썬 스크립트에서 경로 확인
import os

print("Current Working Directory:", os.getcwd()) # 현재 작업 디렉토리 확인

if os.path.exists(".env"): # .env 파일 존재 여부 확인
    print(".env 파일이 존재합니다.")
else:
    print(".env 파일이 존재하지 않습니다.")
# 사용중인 파이썬 경로 확인
import sys
print(sys.executable)

📚5-7

1. 사용 모듈 설명

1) fastapi

FastAPI

  • python으로 RESTful API를 빠르고 쉽게 구축하게 한다.
  • @app.get() 또는 @app.post()와 같은 데코레이터를 API 엔드포인트를 정의하고 요청을 처리하기 위해 사용한다.Request
  • 클라이언트의 HTTP요청에 대한 정보 포함
  • 헤더, 경로 매개변수, 본문 데이터 등의 다양한 정보를 가져오거나 조작할 때 사용Form
  • HTML 폼 데이터를 처리하는 데 사용되며, POST 요청으로 전송된 데이터의 필드를 정의

2) fastapi.templating

Jinja2Templates

  • FastAPI에서 HTML 템플릿 렌더링을 지원하는 템플릿 엔진
  • HTML 파일 내에 Python 코드와 데이터를 삽입해 동적으로 웹 페이지를 생성 가능
  • templates 디렉터리에 HTML 파일을 저장하고, 데이터를 템플릿에 전달하여 동적으로 웹 페이지를 생성

3)fastapi.responses

HTMLResponse

  • FastAPI에서 HTML 형식의 응답을 반환하는 클래스
  • 콘텐츠를 클라이언트에 직접 반환해야 할 때 사용

4) fastapi.staticfiles

StaticFiles

  • FastAPI에서 정적 파일을 제공하는 데 사용
  • 지정한 경로에 저장된 정적 리소스를 엔드포인트에 연결하여 사용자가 접근할 수 있도록 한다. (css, javascript, images 등)
  • 요소는 숫자, 문자열, 다른 리스트 등 어떤 자료형이든 가능

5) OpenAI

  • OpenAI API를 Python에서 호출할 수 있도록 지원하는 패키지
  • AI 기반 응답을 생성하고, 텍스트를 생성하거나 요약하는 등의 작업을 수행할 수 있다.

2. append 메서드

  • 리스트(list) 자료형에서 사용되는 메서드
  • 리스트의 끝에 새로운 요소를 추가하는 역할

📚5-8

1. 사용 모듈 설명

1) import os

  • 운영체제와 상호작용하기 위한 표준 라이브러리
  • 파일경로, 환경변수, 설정, 디렉토리 관리 등

2) import requests

  • HTTP요청을 보내기 위한 라이브러리
  • GET, POST 등 다양한 HTTP 요청을 사용하여 웹 API와 상호작용 한다.

3) dotenv

  • .env 파일에서 환경 변수를 로드하는 함수

4) PyQt5

QtWidgets

  • PyQt5의 다양한 GUI 위젯을 포함한 모듈(버튼, 라벨, 텍스트 필드 등 포함)

5) PyQt5.QtMultimedia

QMediaPlayer

  • 오디오와 비디오 파일을 재생할 수 있는 클래스QMediaContent
  • QMediaPlayer에 재생할 미디어 파일이나 스트림을 설정하기 위한 클래스

6) transformers

AutoTokenizer

  • 텍스트를 모델이 이해할 수 있는 형태로 변환AutoModelForSeq2SeqLM
  • 시퀀스 간 변환을 수행하는 모델을 자동으로 로드하는 클래스
  • 텍스트 요약, 번역, 질문 생성 모델 등

7) pydub

AudioSegment

  • 오디오 파일을 처리할 수 있는 클래스
  • 길이 조절, 불륨 조절 등 편집 가능

8) pydub.playback

  • AudioSegment 객체를 재생하기 위한 함수
  • 오디오를 파이썬 코드에서 직접 재생할 수 있다.

9) import io

  • 입력과 출력을 위한 표준 라이브러리

📚DBSCAN

모델학습 및 예측

  • df['Cluster]로 지정하는 이유는 df['Cluster']는 각 데이터에 대해 군집 라벨을 예측하고 df데이터 프레임의 새로운 열에 저장한다.
df['Cluster'] = dbscan.fit_predict(X)
`

📚PCA

fetch_openml

  • 데이터셋 이름이나 ID를 기반으로 OpenML에 접근하여 데이터를 다운로드하고, Pandas DataFrame이나 numpy.array 형식으로 데이터를 반환

파라미터

  1. data_id: OpenML 데이터셋 ID를 지정하여 특정 데이터셋을 가져온다.
  2. name: 데이터셋의 이름을 지정할 수도 있고, 이름을 사용하는 경우 가장 최신 버전의 데이터셋이 로드된다.
  3. version: 데이터셋 버전을 지정하고, 생략 시 가장 최신 버전이 자동으로 선택
  4. as_frame: True로 설정 시 데이터셋을 Pandas DataFrame으로 반환하고, 기본값은 None으로 설정 된다.
  5. return_X_y: True로 설정하면, 독립변수와 종속변수를 (X, y) 형태의 튜플로 반환하여 모델 학습에 바로 사용할 수 있게 한다.

활용

  • 유명한 공개 데이터셋(MNIST, Iris, CIFAR-10 등)을 쉽게 가져와서 머신러닝 모델을 학습할 수 있다..
  • 다양한 데이터셋을 테스트하거나 비교하는 실험을 할 때 빠르게 데이터를 가져올 수 있어 편리하다.

☑️회고

AI모델활용 강의를 들으며

 

코드들이 매우 길기도하고 강사님께서 각 요소에 대하여 자세하게 알면 좋지만 어떻게 흘러가는지 파악만 해도 좋다고 말씀 하셔서 코드 전체를 해석하지는 않고 코드를 보면서 내가 궁금하고 모르는 부분에 대하여 정리를 했습니다.

 

또한 오늘 드디어 API키를 결제한 뒤 발급 받았습니다~.

 

그런데 여기서

 

.env 파일을 만들고 import os를 했을 때 문제를 만났습니다.

 

난 분명 아나콘다 프롬프트에서 pip install python-dotenv을 진행하고 성공적으로 설치가 완료되었다고 나오는데

 

왜!!

 

모듈에러가 나오는지!!! 그래서 해결 방법을 찾아보았고 결국 VSCode에서 .py파일을 만들어 진행하니 문제가 없음을 알게

되었습니다....(내 3시간이 사라졌어요ㅜ)

 

쥬피터 노트북만 사용하고 싶었는데 욕심을 버리고 텍스트형 AI모델 작업은 VSCode로 진행해야할 것 같습니다.

 

복습을 진행하며

 

모듈에러로 시간이 많이 소비되어 많은 복습을 진행하지 못했지만 열심히 진행했습니다.

 

DBSCAN은 이해가 되고 모르는 요소들이 없었습니다.

 

차원축소인 PCA를 학습하며 분명 보았었지만 기억이 나지 않는 것이 있었고

 

결정적으로

 

결과를 해석하지 못해 약간 갑갑한 마음이 있었습니다.

 

내일 해석하는 방법에 대하여 알아보는 시간을 가져야겟습니다.

 

마지막으로

 

포트폴리오를 도전하려고했지만 오늘도 다른 학습에 정신이 팔려 진행하지 못했습니다.

 

내일부터는 수준별 학습의 과제도 진행해야하니 더 바쁠텐데..

 

시간이 나면 진행하고 만약 못한다면 주말을 통으로 비워 시도해보야겟습니다.

이번주에는 머신러닝 학습 방법과 전처리, 데이터 구별 방법에 대하여 주로 학습을 하였습니다.

 

전처리를 진행하는 방법에 대해 익숙해졌고

 

아직 머신러닝 코드들에 대하여 여러번 학습했지만 아직 미숙하다.

 

학습한 내용의 소개 순서는

 

1. 데이터 구분 방법

 

2. 전처리 방법

 

3. 머신러닝 import코드 와 각 학습방법들의 특징

 

4. 회고

 

순서로 진행하겟습니다.

 


☑️ 데이터 구분 방법

1. 데이터 종류

1) 질적, 양적 데이터

질적 데이터

-명목척도: 순서나 크기의 개념없이 단순한 구분(혈액형, 학생번호, 전화번호 등)

 

-서열척도: 순서나 대소 관계가 의미있지만, 비례관계를 나타내지 않음(만족도 평가, 성적 등급 순위 등)

 

양적 데이터

-구간척도: 대소 관계와 함께 값들간의 타이에 의미가 있는 데이터, 0의 기준이 절대적이지 않고 임의로 정한 기준(온도, IQ 시간 등)

 

-비율척도: 절대적 0을 포함하고 비율비교가 가능한 데이터(키, 몸무게, 시험점수, 거리, 절대온도 등)

 

2) 데이터의 연속성

이산형 데이터

-뎐속적인 값이 아닌 정해진 범위 내의 특정 값으로만 표현

-값이 하나하나 개별적으로 구분되는 변수로 주로 정수값을 가지며 불연속적

-주사위눈, 시험점수, 학생 수 등

 

연속형 데이터

-연속적인 값을 가지며, 범위 내에서 무한히 많은 값으로 표현

-값이 연속적이며, 값 사이에 무한히 많은 세부적인 값이 존재

-키, 온도, 시간 등

 

2. 데이터 별 전처리 방법

-원핫인코딩(질적데이터 / 명목척도)

-라벨 인코딩(질적 데이터 / 서열척도)

-정규화MINMAXScaler: 스케일이 다른 피처 존재, 거리기반 알고리즘(k-nn, SVM), 경사하강법 사용하는 경우

-표준화Standard Scaler: 데이터의 분포가 정규분포일 때 많이 사용하며, 수치형 데이터에만 사용 가능

-피처 엔지니어링

-범주화


☑️ 전처리 방법

1. 탐지

-결측치  print(df.isna().sum())

 

-이상치 탐지

print(df['나이'].describe())

평균(mean)과 표준편차(std)가 큰 차이를 보이는 경우, 또는 최대값(max)이 비정상적으로 높은 경우

 

import matplotlib.pyplot as plt

시각화를 사용한 탐지

 

IQR(Interquartile Range)

 

-중복값 확인

df = df.duplicates().sum()

 

2. 제거, 대체

-결측치 제거

df_dropped_rows = df.dropna()

df_dropped_columns = df.dropna(axis=1)

 

-결측치 대체

df_filled = df.fillna('없음')

df['나이'] = df['나이'].fillna(df['나이'].mean())

df2['온도'] = df2['온도'].interpolate() (선형보간법)

 

-이상치 제거

df_without_outliers = df[(df['나이'] >= lower_bound) & (df['나이'] <= upper_bound)]

IQR방법의 lower_bound, upper_bound 사용

 

median_age = df['나이'].median() df['나이'] = df['나이'].apply(lambda x: median_age if x > upper_bound or x < lower_bound else x)

IQR방법의 lower_bound, upper_bound 사용

 

df = df[df['PurchaseAmount'] >= 0]
 음수 값 제거


df = df[df['PurchaseAmount'] < 1000000]

 비정상적인 큰 값 제거

 

-중간값 제거

df = df.drop_duplicates(subset='TransactionID')

 

3. 인코딩

맵핑을 활용한 인코딩

mpa(lambda(x: 0 if x == "" else 1)

 

4. 정규화, 표준화

# MinMaxScaler

scaler = MinMaxScaler()

df['PurchaseAmount'] = scaler.fit_transform(df[['PurchaseAmount']])

 

# StandardScaler

from sklearn.preprocessing import StandardScaler

numeric_cols = ['TransactionID', 'CustomerID', 'PurchaseAmount', 'CustomerAge', 'ReviewScore', 'CustomerGender', 'ProductCategory']


scaler = StandardScaler()
standard_data = scaler.fit_transform(df_numeric)
print(pd.DataFrame(standard_data, columns=numeric_cols))

 

5. 타입 변환

astype(str)

astype(int) 등

 

6 샘플링

# 데이터셋에서 50% 샘플 추출

df_sampled = df.sample(frac=0.5)

# 데이터셋에서 100개의 샘플 추출

df_sampled_n = df.sample(n=100)

 


☑️머신러닝 import 코드 및 학습모델 특징

지도학습

 

분류모델 - 로지스틱 회귀

- 변수가 이진형일 때 사용

- 확율 예측

from sklearn.linear_model import LogisticRegression

 

분류모델 - SVM

- 분류와 회귀 분석에 사용

- 마진을 최대화하면서 결정 초평면을 찾아 데이터 포인트를 정확하게 분류

from sklearn.svm import SVC

 

분류모델 - KNN

분류와 회귀 분석

학습 데이터를 기반으로 새로운 데이터 포인트의 클래스를 예측

from sklearn.neighbors import KNeighborsClassifier

 

분류모델 - 나이브베이즈

- 통계적 분류 기법

- 주로 텍스트 분류 문제에 사용

- 목표는 주어진 데이터 포인트가 특정 클래스에 속할 확률을 계산하여 분류

 

- 가우시안: 특징들이 연속적이고 정규 분포를 따른다.

from sklearn.naive_bayes import GaussianNB

 

- 베르누이: 특징들이 이진수(0 또는 1)로 표현되는 경우 사용

from sklearn.naive_bayes import BernoulliNB

 

- 티노미얼 : 특징들이 다항 분포를 따르는 경우

from sklearn.naive_bayes import MultinomialNB

 

분류모델 - 의사결정나무

- 의사결정 규칙을 만들고 이를 바탕으로 데이터를 분류나 회귀

from sklearn.tree import DecisionTreeClassifier

 

비지도 학습

군집화 모델

k-means clustering

from sklearn.cluster import KMeans

  1. 초기화: k개의 군집 중심을 랜덤하게 설정합니다.
  2. 할당 단계: 각 데이터 포인트를 가장 가까운 군집 중심에 할당합니다.
  3. 업데이트 단계: 각 군집의 중심을 해당 군집에 속한 데이터 포인트들의 평균으로 업데이트합니다.
  4. 반복: 할당 단계와 업데이트 단계를 군집 중심이 더 이상 변화하지 않을 때까지 반복합니다

계층적 군집화

- 데이터포인트를 계층 구조로 그룹화하는 방법

 

DBSCAN

- 밀도 기반 군집화 알고리즘

- 데이터 밀도가 높은 영역을 군집으로 간주하고, 밀도가 낮은 영역은 노이즈로 처리

from sklearn.cluster import DBSCAN

 

차원축소

PCA

- 고차원 데이터를 저차원으로 변환하는 차원 축소 기법

- 데이터의 분산을 최대한 보존하면서, 데이터의 주요 특징을 추출해 저차원 공간으로 변환

- 데이터의 시각화, 노이즈 제거, 계산 효율성 향상

from sklearn.decomposition import PCA 

 

t_SNE

- 고차원 데이터를 저차원으로 변환하여 시각화하는 차원 축소 기법

- 포인트 간의 유사성을 보존하면서, 고차원 데이터를 2차원 또는 3차원 공간으로 변환

- 데이터의 구조와 패턴을 시각적으로 이해

from sklearn.manifold import TSNE

 

LDA

- 차원 축소와 분류를 동시에 수행

- 데이터의 클래스 간 분산을 최대화하고, 클래스 내 분산을 최소화하는 방향으로 데이터를 변환

- 분류 성능을 향상시키고, 저차원 공간에서 데이터의 구조를 시각화

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

 

앙상블학습

배깅과 부스팅

- 여러 개의 학습 모델을 결합하여 하나의 강력한 모델을 만드는 기법

- 학습의 주요 기법으로는 배깅(Bagging)과 부스팅(Boosting)

- 배깅이란? 여러 개의 학습 모델을 병렬로 학습, 원본 데이터셋에서 중복을 허용한 무작위 샘플을 생성, 모델 간의 상관성을 줄이고 예측 성능을 향상

from sklearn.ensemble import BaggingRegressor

- 부스팅이란? 여러 개의 약한 학습기(weak learner)를 순차적으로 학습시키고, 그 예측 결과를 결합, 이전 모델이 잘못 예측한 데이터 포인트에 가중치를 부여하여, 다음 모델이 이를 더 잘 학습

from sklearn.ensemble import GradientBoostingRegressor

 

랜덤 포레스트

- 여러 개의 결정 트리(Decision Tree)를 학습시키고, 그 예측 결과를 결합하여 최종 예측

- 과적합을 방지하고 예측 성능을 향상

- 데이터의 무작위 샘플을 사용하여 학습되며, 트리의 예측 결과를 평균 또는 다수결로 결합하여 최종 예측을 수행

from sklearn.ensemble import RandomForestRegressor

 

그래디언트 부스팅 머신(GBM)

- 여러 개의 약한 학습기(weak learner)를 순차적으로 학습시키고, 그 예측 결과를 결합하여 강한 학습기(strong learner)를 만드는 기법

- 잘못 예측한 데이터 포인트에 가중치를 부여하여, 다음 모델이 이를 더 잘 학습하도록한다.

- 과적합을 방지하고 예측 성능을 향상

from sklearn.ensemble import GradientBoostingRegressor

 

XGBoost

- 병렬 처리, 조기 종료, 정규화 등의 기능을 통해 성능을 극대화

- 이전 트리의 예측 오류를 보완하는 방식으로 학습됩

- 트리의 예측 결과를 가중합하여 최종 예측을 수행

import xgboost as xgb


☑️ 회고

이번주에는 조별과제를 진행하면서 머신러닝에 대해서 학습을 진행하였고

 

조별과제로는 발표와 자료 준비를 맡았다.

 

발표를 준비하기에 과제의 내용을 적절히 파악해야한다는 생각으로 

 

스스로 과제 내용을 전체적으로 진행해보았고

 

데이터 파악, 전처리, 머신러닝 모델 학습 구조에 대해 자세히 파악하는 시간이였다.

 

다음 주는 과제 완성도를 높이는 회의를 진행하면서 데이터 파악 연습, 딥러닝 모델 연습을 주로 할거다.

 

조과제는 팀장으로서 생각하고 행동해야하겟지만 팀장을 처음 해보는지라 어떻게 사람들을 이끌어야하는지 모르겟다.

 

그래서 주로 과제를 어떻게 진행할지 다 같이 고민하는 시간을 가지기 위한 생각을 많이했다.

 

'WIL' 카테고리의 다른 글

내일배움캠프 WIL 24.11.10  (1) 2024.11.10
내일배움캠프 2주차 WIL + 파이썬 데이터 정복  (4) 2024.10.13

머신러닝의 구성요소

  • 데이터 셋: 데이터 모음
  • 입력 데이터 특징(Feature): 데이터셋의 개별 속성
  • 출력 데이터 레이블(lable): 예측하고자 하는 예측 변수
  • 모델: 정다(레이블)을 예측할 수 있는 지식을 학습할 수 있는 프로그램
  • 학습: 모델이 데이터를 통해 패턴을 인식하고, 이를 기반으로 예측을 수행 할 수 있도록 함수 내의 가중치를 조정하는 과정
  • 훈련: 모델이 데이터를 통해 학습하는 과정
  • 테스트: 학습된 모델의 성능을 평가하는 과정

🔎 학습방법

지도학습(레이블 O)

회귀: 연속적인 값 예측 (주택 가격, 주식 가격)

분류: 이산적인 값 예측(스팸 필터링, 이미지 분류)

 

비지도 학습(레이블 X)

군집화: 데이터를 유사 그룹으로 묶는 문제(고객 세분화, 이미지 세그멘테이션)

이미지 세그멘테이션: 이미지을 픽셀단위로 나누어 어떤 객체에 또는 어떤 영역에 속하는지 구분하는 기술

차원축소: 고차원 데이터를 저차원으로 변환(PCA, t-SNE)

 

앙상블 학습(여러개의 모델 결합)

배깅: 여러 모델을 독립적으로 학습시키고, 에측을 평균내거나 다수결 투표(랜덤 포레스트)

부스팅: 여러 모델을 순차적 학습시키고, 이전 모델의 오차를 보완

스태킹: 여러 모델을 학습시키고 예측결과를 새로운 데이터로 사용하여 메타 모델을 학습

 

 


☑️ 데이터 셋 다운 및 기본정보 확인

kaggle

예시 : 타이타닉 데이터셋 다운로드

  • kaggle competitions download -c titanic

다운로드한 데이터 import

  • import pandas as pd
  • train_df = pd.read_csv('train.csv')
  • test_df = pd.read_csv('test.csv')

 

데이터 확인

  • 행열 확인 print(df.shape)
  • 컬럼명 확인 print(df.columns)
  • 타입확인 print(df.dtypes)
  • 통계 확인 print(df.describe())
  • 정보확인(NULL갑스 타입 등) print(df.info()) 

 


☑️ 데이터 전처리

🔎 결측치 처리

  • 제거

df_dropped_rows = df.dropna() # null 행 제거

df_dropped_cols = df.dropna(axis=1) #null 열 제거

  • 대체

df_filled = df.fillna(0) 0으로 대체

df_filled_mean = df.fillna(df.mean())평균값으로 대체

df_filled_median = df.fillna(df.median()) 중간값으로 대체

df_filled_mode = df.fillna(df.mode().iloc[0]) 각 열의 최빈값으로 대체

  • 예측

#sklearn의 linear에서 LinearRegression 회귀모델 임포트

from sklearn.linear_model import LinearRegression

 

#결측치 있는 열과 없는 열 구분

df_with_na = df[df['column_with_na'].isnill()]

df_without_na = df[df['column_with_na'].notnull()]

 

model = LinearRegression()

model.fit(df_without_na[['feature1', 'feature2']], df_without_na['column_with_na'])

 

predicted_values = model.predict(df_with_na[['feature1', feature2']])

 

df.loc[df['column_with_na'].isnull(), 'column_with_na'] = predicted_valuse

 

🔎이상치 처리

데이터 셋에서 비정상적인 값 처리

  • 확인IQR

#특정 열의 이상치 확인

#25%보다 작거나 75%보다 크면 이상치로 처리

#quantile로 이상치의 기준점 설정

Q1 = df['C'].quantile(0.25)

Q3 = df['C'].quantile(0.75)

IQR = Q3 - Q1 

 

#이상치 범위 설정

lower_bound = Q1 - 1.5 * IQR

upper_bound = Q3 + 1.5 * IQR

 

#여기서 |는 OR의 논리연산자

#C열의 값중 lower_bound보다 작거나 upper_bound보다 큰 수를 이상치로 간주해 outliers에 저장해서 확인

outliers = df[(df['C'] < lower_bound) | (df['C'] > upper_bound)]

print(outliers)

 

#C 열의 값이 lower_bound와 크거나 같은 값 그리고upper_bound보다 작거나 같은 값을 df_no_outliers에 저장

df_no_outliers = df[(df['C'] >= lower_bound) & (df['C'] <= upper_bound)]
print(df_no_outliers)

 

#C열의 평균값을 mean_value에 저장

#apply를 사용해서 C에 대해 특정 함수나 연산을 적용

#lambda로 함수식을 한줄로 정리 x에는 c열의 각 값이 들어간다.

#C 열의 각 값을 검사하여, 값이 lower_bound보다 작거나 upper_bound보다 크면 그 값을 해당 열의 평균값으로 대체, 아니면 값 유지

mean_value = df['C'].mean()

df['C'] = df['C'].apply(lambda x: mean_value if x < lower_bound or x > upper_bound else x)

 

🔎중복값 제거

#중복된 행 확인

print(df.duplicated().sum())

#제거

df_no_duplicates = df.drop_duplicates()

 

🔎데이터 타입 변환

df['column_name'] = df['column_name'].astype(int)

df['column_name'] = df['column_name'].astype(str)

df['column_name'] = df['column_name'].astype(float)

 

🔎인코딩

머신러닝은 수치형 데이터를 인자로 받기 때문에 범주형 데이터를 수치형으로 변환 하는거다.

원핫 인코딩

#get_dummies를 활용해 수치형 데이터로 바꾼다.

#get_dummies를 진행할 df데이터 프레임의 category_column카테고리 컬럼을 지정

df_encoded = pd. get_dummies(df, columns=['category_column'])

print(de_encoded.head())

 

🔎샘플링 랜덤으로 추출

#50% 샘플 추출

#비율 frac

df_sampled = df.sample(frac=0.5)

#100개 샘플 추출

#개수 n

df_sampled_n = df.sample(n=100)

 

🔎특징 선택 및 추출

#SelectKBest k개의 특징을 선택하는 방법을 제공하는 클래스

#f_classif 독립변수와 종속변수 사이의 상관성을 측정하여 높은 상관성을 가진 특성을 선택(분류문제에서 사용)

from sklearn.feature_selection import SelectKBest, f_classif

 

#selector객체 생성

#score_func = f_classif 특징에 F-값을 계산해 높은 값 가진 특징이 더 중요하다고 간주

#k는 가장 중요한 5개의 특징 선택 지정 

selector = SelectKBest(score_func=f_classif, k=5)

#fit_transform입력 데이터(주어진 데이터)X, 타겟 레이블(정답 값)y 특징 선택 수행

#X_new에 선택된 5개의 특징으로 된 새로운 데이터셋 지정

X_new = selector.fit_transform(X, y)

 

#get_support(indices=True)는 선택된 특징들의 인덱스를 반환

selected_features = selector.get_support(indices=True)

print(selected_features)

 

# 두 열의 곱을 새로운 특징으로 추가
df['new_feature'] = df['feature1'] * df['feature2']

# 두 열의 합을 새로운 특징으로 추가
df['new_feature_sum'] = df['feature1'] + df['feature2']


☑️ 회귀모델 학습

Scikit_learn

기능

데이터 전처리

모델 학습

모델 평가

모델 예측

 

Scikilt-learn 설치

conda install scikit-learn

pip install scikit-learn

 

회귀 모델 예제

import pandas as pd

import numpy as np

# train_test_split 데이터를 훈련 세트와 테스트 세츠로 나누기 위한 함수

#  LinearRegression연속적인 값 예측하는 회귀 문제 해결

# mean_squared_error, r2_score모델의 성능을 평가하기 위한 메트릭

from sklearn.model_selection import train_test_split

from sklearn.linear import LinearRegression

from sklearn.metrics import mean_squared_error, r2_score

 

#데이터 생성

#X는 독립변수(특징) 데이터 (6개의 샘플, 2개의 특징)

#y는 종속변수(타겟) 데이터(각 샘플의 정답값)

X = np.array([[1, 1], [2, 2], [3, 3], [4, 4], [5, 5],[6,6]])
y = np.array([1, 2, 3, 4, 5, 6])

 

#데이터 분할

# train_test_split(...)주어진 데이터를 훈련 데이터와 테스트 데이터로 나누는 함수

#test_size=0.2 전체 데이터의 20%를 데스트 데이터로 설정 나머지는 훈련 데이터 설정

#random_state=42 데이터 분할의 일관성을 위해 랜덤 시드를 설정

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

랜덤 시드는 어떻게 결정해야하는가?

임의로 정한다. 일반적으로 정수 값을 사용하며, 0 이상의 정수를 설정한다

42라는 정수를 사용했을 뿐, 특별한 의미는 없다.

 

#회귀 모델 생성 및 학습

model = LinearRegression() #선형 회귀 모델의 인스턴스 생성

model.fit(X_train, y_train) #생성한 모델에 훈련 데이터를 학습 시킨다. x_train과 y_train 데이터 기반으로 학습

인스턴스는 왜 생성하는가?

선형 회귀 알고리즘을 사용하여 데이터에 대해 학습(fit)하고 예측(predict), 모델 파라미터 확인(model.coed_로 회귀계수를 model.intercept_로 절편을 확인 가능)하기 위함

 

#예측

# model.predict(X_test) 학습된 모델을 사용하여 테스트데이터 X_test에 대한 예측값을 계산.예측 결과는 y_pred에 저장

y_pred = model.predict(X_test)

 model.predict도 메서드 함수인가?

메서드이다. 메서드는 특정 클래스의 인스턴스에서 사용할 수 있는 함수

 

#모델 평가

# mean_squared_error(y_test, y_pred): 테스트 데이터에 대한 실제 값 y_test와 예측 값 y_pred 간의 평균 제곱 오차(MSE)를 계산

# MSE는 예측의 정확성을 나타내는 지표로, 값이 작을수록 모델의 성능이 좋다는 의미

mse = mean_squared_error(y_test, y_pred)

# r2_score(y_test, y_pred): 결정 계수 R2R^2를 계산. R2R^2 값은 모델의 설명력을 나타내며, 1에 가까울수록 모델이 실제 데이터를 잘 설명한다는 뜻. 0이면 모델이 종속 변수의 평균으로 예측하는 것과 같고, 음수일 경우 모델이 평균보다 더 나쁜 성능을 보이는 것.
r2 = r2_score(y_test, y_pred)
print(f'Mean Squared Error: {mse}')
print(f'R^2 Score: {r2}')

 

 


☑️ 로지스틱모델 학습

import numpy as np
import pandas as pd

#  load_breast_cancer 유방암 데이터셋 로드
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split

# StandardScaler데이터의 평균을 0, 분산을 1로 스케일링
from sklearn.preprocessing import StandardScaler

스케일링을 왜 진행하고 왜 평균을 0, 분산을 1로 만드는 건가

모델 성능과 학습 속도에 긍정적인 영향

스케일링을 통해 입력 특징이 동일한 스케일로 변환되면, 알고리즘이 더욱 빠르고 효율적으로 수렴하고 정규화 가능

평균을 0으로 만드는 이유: 스케일링을 통해 데이터의 중심을 원점으로 이동시킴으로써 모델이 각 변수에 대한 가중치를 더 공정하게 학습할 수 있도록 합니다.

분산을 1로 만드는 이유: 데이터의 변동성을 통일하여 스케일 차이로 인해 발생하는 문제를 완화.


# 데이터 로드
data = load_breast_cancer()
X = data.data
y = data.target

# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 데이터 스케일링
scaler = StandardScaler()

#훈련 세트, 테스트 세트를 스케일링하고 변환
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

 

#모델 학습

# LogisticRegression 이진 분류 문제를 해결

from sklearn.linear_model import LogisticRegression

# accuracy_score 모델의 정화도 계산 함수

# classifcation_report 정밀도, 재현율, F1점수 등 모델의 성능을 요약한 보고서 생성 함수

# confusion_matrix 예측 결과와 실제 값을 비교하여 혼동 행렬 생성 함수(모델의 분류 성능 시각화)

from sklearn.metrics import accuracy_score, classifcation_report, confusion_matrix

 

model = LogisticRegression()

model.fit(X_train, y_train)

 

y_pred = model.predict(X_test)

 

# accuracy_score(y_test, y_pred) 실제값 y_test와 예측 값 y_pred를 비교하여 정확도 계산

print(f"Accuracy: {accuracy_score(y_test, y_pred)}")

# classification_report(y_test, y_pred) 모델의 성능을 요약하여 출력(정밀도, 재현율,F1점수, 지원)

print(f"Classification Report:\n{classification_report(y_test, y_pred)}")

# confusion_matrix(y_test, y_pred) 혼동 행렬을 생성하여 모델의 성능을 시각적으로 나타낸다.

print(f"Confusion Matrix:\n{confusion_matrix(y_test, y_pred)}")

 

정밀도Precision

재현율 Recall

F1-score 정밀도와 재현율 간의 조화 평균

지원Support 각 클래스의 속한 실제 샘플 수

평균 Average 나온 숫자들이 비슷할 수록 좋다.

혼동행렬에서 행은 실제 클래스, 열을 예측 클래스


☑️ 생성형 AI를 활용한 학습 방법과 Prompt Engineering

프로그래밍 vs인공지능 모델

공통점: 개발자가 주어진 입력이 무엇을 출력할지 설계

차이점:

프로그래밍은 입출력의 관계에 대한 알고리즘을 직접구현

인공지능 모델을 입출력의 관계를 데이터를 통해 학습

 

생성형AI

이미지 생성AI DALL-E, Midjourney, Stable Diffusion Web UI

동영상 생성AI Gen-3, 

텍스트 생성 AI: 챗지피티, Claide, Gemimi, Preflexty

음악 생성AI Suno, Udio

 

LLM대규모 언어 모델

텍스트 생성, 번역, 질문 답변, 요약 등

다양한 언어 관련 작업을 하나의 모델에서 수행

대표적

OpenAI(GPT)

Google(Gemini)

Meta(LLaMA3)

 

LLM의 원리

입력과 출력 사이의 조건부 확률 분포를 학습합니다.

새로운 입력이 주어졌을 때 학습된 조건부 확률 분포를 통해 모든 토큰별 확률을 예측하고, 그 중 가장 가능성이 높은 토큰을 선택하여 답변

 

몬티홀 문제(조건부 문제)

 

LLM의 한계

실제로 계산 하는게 아니라서 학습 데이터 분포를 벗어난 입력을 넣으면 신뢰할 수 없는 출력을 생성할 확률이 매우 큼

데이터 편향

데이터 오류

 

모호한 지시 처리: 다양한 해석을 할 수 있는 질문이나 지시 => 세부적인 정보와 구체적인 답변 예시 등을 통해 답변 할 수 있도록 유도

 

맥락 유지의 어려움: 핵심정보 요약해 맥락 유지

 

할루시네이션: 문맥에 맞는 듯 보이지만 실제로는 근거없는 내용을 생성하는 현상으로, 사용자에게 잘못된 정보를 제공할 수 있음

외부 지식 및 데이터 베이스의 내용을 프롬프트에 넣어 해당 내용에 근거해 답변을 생성하도록 함 (RAG, Retrieval-Augmented Generation)

 

정보의 한계: 최신 정보 및 새로운 전문적인 지식을 제공 못함

질문에 대한 내용을 인터넷에서 검색 후 LLM

 

 

프롬프트 엔지니어링 기초

명확한 지침 제공: 중요한 세부 사항이나 문맥 및 제약 조건 등을 명시

페르소나 부여: 시스템 메세지를 사용하여 모델에 페르소나 부여

프롬프트 명시적 구조화(형식적 구조 예시화)

줄임말 순화 프로그램 만들기


☑️ 회고

랜덤 시드는 어떻게 결정해야하는가?

임의로 정한다. 일반적으로 정수 값을 사용하며, 0 이상의 정수를 설정한다

42라는 정수를 사용했을 뿐, 특별한 의미는 없다.

 

인스턴스는 왜 생성하는가?

선형 회귀 알고리즘을 사용하여 데이터에 대해 학습(fit)하고 예측(predict), 모델 파라미터 확인(model.coed_로 회귀계수를 model.intercept_로 절편을 확인 가능)하기 위함

 

 model.predict도 메서드 함수인가?

메서드이다. 메서드는 특정 클래스의 인스턴스에서 사용할 수 있는 함수

 

스케일링을 왜 진행하고 왜 평균을 0, 분산을 1로 만드는 건가

모델 성능과 학습 속도에 긍정적인 영향

스케일링을 통해 입력 특징이 동일한 스케일로 변환되면, 알고리즘이 더욱 빠르고 효율적으로 수렴하고 정규화 가능

평균을 0으로 만드는 이유: 스케일링을 통해 데이터의 중심을 원점으로 이동시킴으로써 모델이 각 변수에 대한 가중치를 더 공정하게 학습할 수 있도록 합니다.

분산을 1로 만드는 이유: 데이터의 변동성을 통일하여 스케일 차이로 인해 발생하는 문제를 완화.

+ Recent posts