머신러닝

[파이썬 머신러닝 완벽 가이드] - 1장

주니빙 2024. 9. 28. 20:19

1장 파이썬 기반의 머신러닝과 생태계 이해

<머신러닝>

애플리케이션을 수정하지 않고도 데이터를 기반으로 패턴을 학습하고 결과를 예측하는 알고리즘 기법을 통칭

 

01 머신러닝의 분류

지도학습 : 분류, 회귀, 추천 시스템, 시각/음성 감지/인지, 텍스트분석, NLP

비지도학습 : 클러스터링, 차원 축소, 강화학습

 

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

  • 머신러닝 패키지 : 사이킷런
  • 행렬/선형대수/통게 패키지 : 넘파이, 사이파이
  • 데이터 핸들링 : 판다스(2차원 데이터 처리에 특화), 맷플롯립
  • 시각화 : 맷플롯립, 시본
  • 서드파티 라이브러리(머신러닝을 편리하게 지원)
  • 아이파이썬(대화형 파이선 툴) - 주피터 노트북

Anaconda 설치

 

 

03 넘파이

넘파이 모듈 임포트 : import numpy as np

넘파이의 기반 데이터 타입 : ndarray ⇒ 다차원 배열을 쉽게 생성하고 다양한 연산을 수행 가능하다.

 

넘파이 array() 함수

파이썬의 리스트와 같은 다양한 인자를 입력 받아서 ndarray로 변환하여 기능을 수행한다.

#입력
array1 = np.array([1,2,3])
print('array1 type:',type(array1))
print('array1 array 형태:',array1.shape)

array2 = np.array([[1,2,3],
                  [2,3,4]])
print('array2 type:',type(array2))
print('array2 array 형태:',array2.shape)

array3 = np.array([[1,2,3]])
print('array3 type:',type(array3))
print('array3 array 형태:',array3.shape)
#출력
array1 type: <class 'numpy.ndarray'>
array1 array 형태: (3,)
array2 type: <class 'numpy.ndarray'>
array2 array 형태: (2, 3)
array3 type: <class 'numpy.ndarray'>
array3 array 형태: (1, 3)
#입력
print('array1: {0}차원, array2: {1}차원, array3: {2}차원'.format(array1.ndim,array2.ndim,array3.ndim))
#출력
array1: 1차원, array2: 2차원, array3:  2차원

 

arange() 함수

array를 range()로 표현하는 것. 0부터 함수 인자 값 -1까지의 값을 순차적으로 ndarray의 데이터값으로 변환해준다.

#입력
sequence_array = np.arange(10)
print(sequence_array)
print(sequence_array.dtype, sequence_array.shape)
#출력
[0 1 2 3 4 5 6 7 8 9]
int64 (10,)

 

zero() 함수

함수 인자로 튜플 형태의 shape 값을 입력하면 모든 값을 0으로 채운 해당 shape를 가진 ndarray를 반환한다.

ones() 함수

함수 인자로 튜플 형태의 shape 값을 입력하면 모든 값을 1로 채운 해당 shape를 가진 ndarray를 반환한다.

#입력
zero_array = np.zeros((3,2),dtype='int32')
print(zero_array)
print(zero_array.dtype, zero_array.shape)

one_array = np.ones((3,2))
print(one_array)
print(one_array.dtype, one_array.shape)
#출력
[[0 0]
 [0 0]
 [0 0]]
int32 (3, 2)
[[1. 1.]
 [1. 1.]
 [1. 1.]]
float64 (3, 2)

 

reshape() 는 지정된 사이즈로 변경이 불가능하면 오류 발생

#입력
array1.reshape(4,3)
#출력
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[9], line 1
----> 1 array1.reshape(4,3)

ValueError: cannot reshape array of size 3 into shape (4,3)

 

  • 넘파이의 ndarray의 데이터 세트 선택하기 - 인덱싱
    • 특정한 데이터만 추출 : 원하는 위치의 인덱스 값을 지정하면 해당 위치의 데이터가 반한된다.
    • 슬라이싱 : 연속된 인덱스상의 ndarray를 추출하는 방식이다.
    • 팬시 인덱싱 : 일정한 인덱싱 집합을 리스트 또는 nadarray 형태로 지정해 해당 위치에 있는 데이터의 ndarray를 반환한다.
    • 불린 인덱싱 : 특정 조건에 해당하는지 여부인 True/False 값 인덱싱 집합을 기반으로 True에 해당하는 인덱스 위치에 있는 데이터의 ndarray를 반환한다.

 

단일 값 추출

#입력
# 1에서 부터 9 까지의 1차원 ndarray 생성 
array1 = np.arange(start=1, stop=10)
print('array1:',array1)
# index는 0 부터 시작하므로 array1[2]는 3번째 index 위치의 데이터 값을 의미
value = array1[2]
print('value:',value)
print(type(value))
#출력
array1: [1 2 3 4 5 6 7 8 9]
value: 3
<class 'numpy.int64'>

 

슬라이싱

#입력
array1 = np.arange(start=1, stop=10)
array3 = array1[0:3]
print(array3)
print(type(array3))
#출력
[1 2 3]
<class 'numpy.ndarray'>
  1. ‘:’ 기호 앞에 시작 인덱스를 생략하면 자동으로 맨 처음 인덱스인 0으로 간주
  2. ‘:’ 기호 뒤에 종료 인덱스를 생략하면 자동으로 맨 마지막 인덱스로 간주
  3. ‘:’ 기호 앞/뒤에 시작/종료 인덱스를 생략하면 자동으로 맨 처음/맨 마지막 인덱스로 간주
#입력
array1 = np.arange(start=1, stop=10)
array4 = array1[:3]
print(array4)

array5 = array1[3:]
print(array5)

array6 = array1[:]
print(array6)
#출력
[1 2 3]
[4 5 6 7 8 9]
[1 2 3 4 5 6 7 8 9]

 

팬시 인덱싱

#입력
array1d = np.arange(start=1, stop=10)
array2d = array1d.reshape(3,3)

array3 = array2d[[0,1], 2]
print('array2d[[0,1], 2] => ',array3.tolist())

array4 = array2d[[0,1], 0:2]
print('array2d[[0,1], 0:2] => ',array4.tolist())

array5 = array2d[[0,1]]
print('array2d[[0,1]] => ',array5.tolist())
#출력
array2d[[0,1], 2] =>  [3, 6]
array2d[[0,1], 0:2] =>  [[1, 2], [4, 5]]
array2d[[0,1]] =>  [[1, 2, 3], [4, 5, 6]]

 

불린 인덱싱 (조건 필터링과 검색을 동시에 가능)

#입력
array1d = np.arange(start=1, stop=10)
# [ ] 안에 array1d > 5 Boolean indexing을 적용 
array3 = array1d[array1d > 5]
print('array1d > 5 불린 인덱싱 결과 값 :', array3)
#출력
array1d > 5 불린 인덱싱 결과 값 : [6 7 8 9]
#입력
array1d > 5
#출력
array([False, False, False, False, False,  True,  True,  True,  True])

 

행렬의 정렬 - sort(), argsort()

#입력
org_array = np.array([ 3, 1, 9, 5]) 
print('원본 행렬:', org_array)
# np.sort( )로 정렬 
sort_array1 = np.sort(org_array)         
print ('np.sort( ) 호출 후 반환된 정렬 행렬:', sort_array1) 
print('np.sort( ) 호출 후 원본 행렬:', org_array)
# ndarray.sort( )로 정렬
sort_array2 = org_array.sort()
print('org_array.sort( ) 호출 후 반환된 행렬:', sort_array2)
print('org_array.sort( ) 호출 후 원본 행렬:', org_array)
#출력
원본 행렬: [3 1 9 5]
np.sort( ) 호출 후 반환된 정렬 행렬: [1 3 5 9]
np.sort( ) 호출 후 원본 행렬: [3 1 9 5]
org_array.sort( ) 호출 후 반환된 행렬: None
org_array.sort( ) 호출 후 원본 행렬: [1 3 5 9]

 

04 데이터 핸들링 - 판다스

타이타닉 데이터 파일 다운로드

 

#입력
titanic_df = pd.read_csv('/Users/choejunhee/Documents/ecc 스터디/머신러닝 스터디/titanic/titanic_train.csv')
titanic_df.head(3)