본문 바로가기

cs,코딩,알고리즘/<파이썬 머신러닝 완벽 가이드>스터디

1. 파이썬 기반의 머신러닝과 생태계의 이해(1)numpy까지

728x90

생활코딩에서 여러번 보고 들으면서 앞부분(머신러닝에 관한 간단한 설명)은 쉽게쉽게 읽어나가면서 소화한 듯

1. 머신러닝의 개념

컴퓨터에게 수많은 데이터를 학습시켜서 모델을 만들고(패턴파악) 미래(결과)를 예측하게끔

ex)금융사기 방지 알고리즘 : 정교하고 복잡한 소스코드보다 이를 관통하는 일정한 패턴을 찾아 응용하게끔

but 데이터에 매우 의존적(Garbage in Garbage out)-> 결국은 데이터..

2. 파이썬 머신러닝 생태계를 구성하는 주요 패키지

패키지 종류는 나중에 각각의 패키지 다룰 때 자세하게 하고 일단 기본 개념부너 다시 짚고 넘어가자(이때 아니면 영원히 안찾아볼 듯)

패키지(Package) : 여러 사람들에 의해서 만들어지는 클래스들. 이름이 똑같아서 충돌할 때 이때 패키지로 묶어서 충돌을 막아준다. (대출 클래스들을 일괄적으로 묶어놓은 상위의 무언가로 이해하면 되는 듯하다)

클래스들의 이름 충돌을 해소하기 위한 노력(물론 이름의 충돌만을 해결하기 위해 생긴건 아니지만

인터페이스(Interface) : 기능으로서의 인터페이스만 보자면, "규제". 어떤 클래스가 있고 그 클래스가 특정한 인터페이스를 사용한다면 그 클래스는 반드시 그 인터페이스에 속해있는 메소드를 구현해야한다. 만약 그 인터페이스가 강제하고 있는 메소드를 구현하지 않으면 컴파일 조차 되지 않는다.

클래스 A는 인터페이스 I를 구현하고 있다.(implements를 통해) 그것은 3행의 interface I의 맴버인 public void z() 메소드를 클래스 A가 반드시 구현해야 한다.(상속,extends와는 다름)

API (Application Programming Interface): 파이썬이 제공하는 함수들을 부품으로 응용해서 컴퓨터가 제공하지 않는 새로운 기능을 만들 수 있어. 결국 application: 기존의 기능을 응용해서/ program: 시간의 순서에 따라 동작하는 일들-> application을 구현하기 위해 시간의 순서대로 배치할 기능들.

print, list등의 부품(문법적 요소)들은 파이썬이 내장하는 api들

-> 이 부품들을 응용해서 새로운 함수를 만들고 그 함수를 타인이 사용할 수 있도록 공개하면 타인은 우리가 제공하는 함수를 통해 application을 만들 수 있게 됨. 이때 우리가 부품을 응용하고 결함해서 만든 기능이 api라는 것

=> 뭔가 돌고 도는 느낌이다?..

3. 넘파이(ndarray)

머신러닝의 이론적 백그라운드는 선형개수와 통계로 이루어져있는게 이 이론을 다루는 패키지. Numercial Python

⊙ndarray는 Numpy의 핵심인 다차원 행렬 자료구조 클래스(그래서 차원을 이해하는 것이 중요). 계산하는 라이브러리라고 생각하면 편함.

1) ndarray 활용하기

-ndim

행과 열의 수를 튜플형태로 가지고 있기 때문에 배열의 차원을 알 수 있다.

import numpy as np

array1=np.arrapy([1,2,3])
array2=np.arrapy([1,2,3],[2,3,4])
array3=np.arrapy([[1,2,3]])

print('array1: {:0}차원, array2: {:1}차원, array3: {:2'}차원.format(array1.ndim, array2.ndim, array2.ndim))
<output>
array1: 1차원, array2: 2차원, array3: 2차원

array3가 2차원인 이유는 리스트 안에 리스트가 존재하기 때문

 

-astype() : 데이터 타입 확인

ndarray는 모든 데이터 유형 가능. 데이터 유형이 섞여있는 리스트를 ndarray로 변경하면 데이터 크기가 더 큰 데이터 타입으로 형 변환을 함. 이때 원하는 타입을 문자열로 지정

array_int=np.array([1,2,3])

array_float=array_int.astype('float64')
array_int1=array_float.astype('int32')

print(array_float, array_float.dtype)
print(array_int1, array_int1.dtype)
<output>
[1. ,2. ,3.] float64
[1,2,3] int32

그런데 이렇게 하면 메모리를 얼마나 줄일 수 있으려나..

 

-arange(): ndarray생성

0부터 순서대로 나타내준다

-reshape(): 차원과 크기를 변경

array1=np.arange(10)
print(array1)
array.reshape(2, 5)
<output>
[0 1 2 3 4 5 6 7 8 9]
[[0 1 2 3 4]
 [55 6 7 8 9]]

-indexing 슬라이싱: 데이터 세트 선택하기

일단 데이터 가져오는 방식 리마인딩-순서는 0부터 시작, -(마이너스)붙으면 역순으로. 역순일 때에는 -1부터 시작

array(□:△)->□번째부터 △-1번째 까지

array1=np.arange(start=1, stop=10)
array2=array1.reshape(3,3)
print(array2)
print('indexing: ', array2[0,0], array2[0,1], array2[1,0], array2[2,2])

print('array2[0:2,0:2]|n', array2[0:2,0:2])
print('array3[1:3,0:3]|n', array3[1:3,0:3])

<output>
[[1 2 3]
 [4 5 6]
 [7 8 9]]
indexing: 1,2,4,9

array2[0:2,0:2]
[[1 2]
 [4 5]]
array3[1:3,0:3]
[[4 5 6]
 7 8 9]]

-sort(), agsort(): 행렬의 정렬

np.sort()는 원 행렬을 그대로 유지한 채 반환, ndarray.sort()는 변환은 하지만 반환은 x

org_array=np.array([3, 1, 9, 5])
sort_array1_desc=np.sort(org_array)[::-1]
print('내림차순으로 정렬: ',sort_array1_desc)
내림차순으로 정렬: [9 5 3 1]

2) 선형대수 연산

-행렬 내적(행렬 곱)

np.dot()를 이용

행과 열의 원소를 순차적으로 곱한 뒤 다 더하면 됨

-전치행렬

tranpose()를 이용

행과 열의 위치를 바꿔서...(왜....이걸 사용하는지...는 모르겠다.. 스터디때 건휘가 찾아와주겠디)