머신 러닝 및 신경망 - 페이지 68

 

4.2 NumPy 배열 구성 및 인덱싱(L04: Python의 과학적 컴퓨팅)



4.2 NumPy 배열 구성 및 인덱싱(L04: Python의 과학적 컴퓨팅)

두 번째 비디오에서는 Python이 아닌 배열 구성 및 인덱싱에 대해 논의하고자 합니다. 배열 구성 루틴은 배열을 만드는 데 유용한 빌딩 블록 또는 함수입니다. 나중에 특정 값으로 채울 수 있는 자리 표시자 배열이 필요할 때 유용합니다. 내가 의미하는 바를 보여 드리겠습니다.

숫자 1로 채워진 배열을 만들려면 ones 함수를 사용할 수 있습니다. 예를 들어 ones((3, 3)) 는 모든 요소가 1로 설정된 3x3 배열을 생성합니다. 1로 채워진 3x4 행렬을 생성하는 ones((3, 4))와 같은 다른 차원을 지정할 수도 있습니다. ones 함수는 배열의 데이터 유형을 결정하는 dtype 매개변수를 포함하여 다양한 인수를 허용합니다(기본값은 64비트 시스템의 경우 float64임). int64로 설정하여 정수 배열을 만들 수 있습니다. 또한 배열이 메모리에 배치되는 방식을 제어하는 order 매개 변수를 지정할 수 있습니다. 기본값은 행 중심 스타일을 나타내는 C이지만 Fortran 스타일 레이아웃에 대해 F를 선택할 수 있습니다. 그러나 이 클래스의 경우 NumPy를 C 또는 Fortran 코드와 결합하는 데 더 관련이 있으므로 이러한 세부 사항에 대해 걱정할 필요가 없습니다.

마찬가지로 zeros 함수를 사용하여 0으로 채워진 배열을 만들 수 있습니다. 1번과 동일하게 사용하시면 됩니다. 이러한 기능에 대해 자세히 알아보려면 도움말 기능을 사용하거나 Jupyter Lab 또는 IPython에서 물음표(?)를 사용할 수 있습니다.

값을 초기화하지 않고 빈 배열을 만드는 empty 함수도 있습니다. 대부분의 경우 이 함수는 단순히 임의의 값으로 배열을 생성하기 때문에 이 함수의 세부 사항에 대해 걱정할 필요가 없습니다. 항등 함수는 대각선 요소가 1이고 나머지는 0인 항등 행렬을 만듭니다. 특정 값을 가진 대각선 행렬을 만드는 데 사용할 수 있습니다.

인덱싱으로 이동하면 NumPy 배열의 기본 인덱싱은 Python 목록의 인덱싱과 유사합니다. 대괄호를 사용하여 요소에 액세스할 수 있습니다. 예를 들어 array[0]은 첫 번째 요소를 반환하고 array[1]은 두 번째 요소를 반환하는 식입니다. Python 목록과 마찬가지로 슬라이싱도 가능합니다. 예를 들어 array[1:4]는 인덱스 1에서 3까지 배열의 슬라이스를 반환합니다(인덱스 4 제외).

2차원 배열을 다룰 때 쉼표 표기법을 사용하여 2차원에 대한 색인을 생성할 수 있습니다. 첫 번째 인덱스는 행을 지정하고 두 번째 인덱스는 열을 지정합니다. 예를 들어 array[0, 0]은 첫 번째 행과 첫 번째 열에 있는 요소를 반환하고 array[1, 2]는 두 번째 행과 세 번째 열에 있는 요소를 반환하는 식입니다.

네거티브 인덱싱은 배열의 끝에서 요소에 액세스하는 데 사용할 수 있습니다. 예를 들어 array[-1, -1]은 배열의 마지막 요소를 반환합니다. 마찬가지로 array[-1, -2]는 마지막에서 두 번째 요소를 반환합니다. 배열 길이를 추적할 필요가 없기 때문에 큰 배열로 작업할 때 유용할 수 있습니다.

전체 행 또는 열을 검색하려면 인덱스 중 하나를 생략할 수 있습니다. 예를 들어 array[0, :]는 첫 번째 행 전체를 반환하고 array[:, 1]은 두 번째 열 전체를 반환합니다. 이는 인덱스 범위를 지정하는 것과 같습니다(예: 첫 번째 행에 대한 array[0, 0:3]). 슬라이싱은 두 차원 모두에서 작동하므로 배열의 특정 부분을 선택할 수 있습니다. 예를 들어 array[1:3, 2:4]는 행 1과 2(행 3 제외)와 열 2와 3(열 4 제외)으로 구성된 하위 배열을 반환합니다.

부울 인덱싱은 NumPy의 또 다른 강력한 기능입니다. 부울 배열을 사용하여 배열을 인덱싱하고 부울 배열에서 True 값에 해당하는 요소만 선택할 수 있습니다. 예를 들어 모양이 (3, 3)인 array라는 배열이 있다고 가정합니다.

array( [[1, 2, 3] ,
       [4, 5, 6] ,
       [7, 8, 9] ])

배열 > 5와 같은 조건을 기반으로 부울 배열을 만들 수 있으며 다음 부울 배열을 반환합니다.

array([[ False , False , False ],
       [ False , False , True ],
       [ True , True , True ]])
이 부울 배열을 원래 배열의 인덱스로 사용하면 True 값에 해당하는 요소만 선택할 수 있으므로 결과는 다음과 같습니다.

array([6, 7, 8, 9])
부울 인덱싱을 사용하면 특정 조건에 따라 요소를 유연하고 효율적으로 선택할 수 있습니다.

기본 인덱싱 외에도 NumPy는 정수 배열 인덱싱 및 배열을 인덱스로 사용하는 것과 같은 고급 인덱싱 기술을 제공합니다. 이러한 기술을 사용하면 배열에서 더 복잡하고 비연속적인 인덱싱 작업을 수행할 수 있습니다. 그러나 이들은 고급 항목이며 기본 배열 조작에는 필요하지 않을 수 있습니다.

 

4.3 NumPy 배열 수학 및 범용 함수(L04: Python의 과학적 컴퓨팅)



4.3 NumPy 배열 수학 및 범용 함수(L04: Python의 과학적 컴퓨팅)

경주를 생성하고 배열의 개별 값을 인덱싱하는 데 상당한 시간을 투자한 후 더 흥미로운 주제인 무료 배열, 수학 및 범용 함수로 이동하겠습니다.

종종 Ufunk 또는 Frank로 축약되는 범용 함수는 프로그래밍에서 강력한 개념입니다. 범용 함수(Ufunk)는 범용 함수의 축약형으로 Numpy 배열을 보다 효율적이고 편리하게 사용할 수 있습니다. 벡터화라는 개념을 소개합니다.

벡터화에는 배열과 같은 객체 시퀀스에 대한 수학 또는 산술 연산 수행이 포함됩니다. 배열의 각 요소에 대해 개별적으로 연산을 실행하는 대신 벡터화를 사용하면 연산을 병렬로 수행할 수 있으므로 요소 간의 종속성이 부족하다는 이점을 얻을 수 있습니다.

예를 들어 배열의 모든 요소에 숫자를 추가하는 작업을 생각해 봅시다. Python for 루프를 사용하여 각 요소를 반복하고 더하기 함수를 호출합니다. 그러나 벡터화를 사용하면 루프 없이도 전체 배열에서 동시에 추가를 수행할 수 있습니다. 이것은 효율성을 크게 향상시킵니다.

Numpy에서 벡터화는 범용 함수(Ufunk)를 사용하여 이루어집니다. Numpy에는 60개 이상의 Ufunk가 구현되어 있으며 각각 특정 목적을 수행합니다. 사용 가능한 Ufunk의 전체 목록은 공식 문서를 참조하는 것이 좋습니다.

개념을 설명하기 위해 일반적인 연산인 요소별 덧셈에 초점을 맞추겠습니다. Python에서 목록의 목록으로 구현된 2차원 배열이 있다고 가정합니다. 각 요소에 1을 추가하려면 일반적으로 중첩 루프 또는 목록 이해를 사용합니다. 그러나 이러한 접근 방식은 특히 대규모 어레이의 경우 비효율적일 수 있습니다.

Numpy에서는 Ufunk "np.add"를 사용하여 벡터화된 방식으로 전체 배열에 숫자 1을 추가할 수 있습니다. 이렇게 하면 명시적 루프가 필요하지 않으며 성능이 크게 향상됩니다.

Numpy는 Ufunk의 직관적인 사용을 허용하는 연산자 오버로딩을 활용한다는 점을 언급할 가치가 있습니다. 예를 들어 배열과 숫자 사이에 "+" 연산자를 사용하면 "np.add" Ufunk가 자동으로 호출됩니다.

또 다른 유용한 Ufunk는 배열의 각 요소를 제곱하는 "np.square"입니다. Ufunk 함수는 단항(단일 값에서 작동) 또는 이항(두 개의 인수 사용)일 수 있습니다. 공식 Numpy 문서는 사용 가능한 Ufunk에 대한 자세한 내용을 제공합니다.

더 흥미로운 사례로 이동하여 "reduce" 방법과 함께 Ufunk를 사용하는 방법을 살펴보겠습니다. "축소" 작업은 지정된 축을 따라 작업을 적용하여 여러 값을 단일 값으로 줄입니다. 예를 들어 "reduce" 메서드와 함께 "np.add"를 사용하여 열 합계를 계산할 수 있습니다.

이 시나리오에서는 지정된 축(이 경우 축 0)을 롤오버하고 지정된 작업을 사용하여 요소를 결합합니다. "축소" 작업은 일반적으로 계산이 여러 노드에 분산된 다음 결합되어 최종 결과를 생성하는 "지도 축소" 및 Hadoop과 같은 개념과 관련됩니다.

이것이 압도적으로 보일 수 있지만 이러한 개념을 이해하면 Numpy를 사용하여 보다 효율적이고 효과적인 프로그래밍이 가능합니다. Ufunk 및 벡터화를 활용하여 어레이에서 복잡한 작업을 쉽게 수행하고 성능 향상을 위해 코드를 최적화할 수 있습니다.

사용 가능한 Ufunk의 전체 목록과 예제 및 사용 지침은 공식 Numpy 문서를 참조하세요. Ufunk의 가능성을 탐색하면 툴킷이 확장되고 향후 프로젝트에서 다양한 컴퓨팅 작업을 처리하는 데 도움이 됩니다.

따라서 NumPy에는 배열의 지정된 축을 따라 축소 작업을 수행할 수 있는 reduce라는 함수가 있습니다. 축소 작업은 여러 값을 단일 값으로 결합합니다. 기본적으로 축소는 배열의 첫 번째 축(축 0)을 따라 적용됩니다.

이 개념을 더 잘 이해하기 위해 예를 들어 보겠습니다. 다음 배열을 고려하십시오.

array( [[1, 2, 3] ,
       [4, 5, 6] ,
       [7, 8, 9] ])
열 합계를 계산하려면 reduce 함수를 사용할 수 있습니다. 이 작업은 첫 번째 축(축 0)을 롤오버하고 각 열의 값을 결합합니다. 따라서 결과는 각 열의 합계를 포함하는 1차원 배열이 됩니다.

이를 달성하기 위해 요소별 추가를 수행하는 np.add 함수를 사용할 수 있습니다. reduce에 대한 함수 인수로 np.add를 전달하여 지정된 축을 따라 값을 추가하려고 함을 나타냅니다.

코드는 다음과 같습니다.

import numpy as np

array = np. array ([[ 1 , 2 , 3 ],
                  [ 4 , 5 , 6 ],
                  [ 7 , 8 , 9 ]])

column_sums = np.reduce(np.add, array )
print (column_sums)
출력은 다음과 같습니다.

[12 15 18]
이 예에서 reduce 함수는 배열의 열을 반복하고 값을 함께 추가합니다. 첫 번째 열(1 + 4 + 7), 두 번째 열(2 + 5 + 8) 및 세 번째 열(3 + 6 + 9)을 열 합계를 나타내는 단일 배열로 결합합니다.

이 접근 방식은 열을 수동으로 반복하고 값을 하나씩 추가하는 것보다 더 효율적입니다. NumPy에서 제공하는 벡터화된 작업을 통해 최적화된 기본 알고리즘을 활용하여 계산을 병렬로 수행할 수 있습니다.

reduce는 수행하려는 작업에 따라 np.add 외에도 다양한 다른 기능과 함께 사용할 수 있습니다. 감소 개념은 강력하며 다양한 시나리오에 적용될 수 있습니다.

 

4.4 NumPy 방송(L04: Python의 과학 컴퓨팅)



4.4 NumPy 방송(L04: Python의 과학 컴퓨팅)

NumPy는 암시적 차원을 도입하고 엄격한 선형 대수학의 범위 내에서 일반적으로 불가능한 연산을 수행할 수 있게 해주는 "브로드캐스팅"이라는 매력적인 기능을 제공합니다. 이러한 브로드캐스팅 개념은 어레이로 작업할 때 더 많은 유연성과 편의성을 제공합니다.

NumPy는 브로드캐스팅을 활용하여 다양한 모양의 배열을 자동으로 정렬할 수 있으며 기본적으로 요소별 작업을 일치시키고 수행하도록 배열을 확장합니다. 이 암시적 차원 생성을 통해 다양한 크기의 배열에서 작업을 원활하게 실행할 수 있으므로 간결하고 효율적인 코드가 생성됩니다.

수학적 규칙에 대한 엄격한 준수가 작업을 지배하는 선형 대수학의 맥락에서 브로드캐스팅은 복잡한 계산을 단순화하는 강력한 도구를 제공합니다. 모양이 다른 어레이에서 계산을 수행할 수 있으므로 요소를 통해 수동으로 모양을 바꾸거나 반복할 필요가 없습니다.

브로드캐스팅 덕분에 암시적 차원이 있는 배열에 작업을 쉽게 적용할 수 있으므로 광범위한 수동 조작이 필요할 수 있는 결과를 얻을 수 있습니다. 이 기능은 NumPy로 달성할 수 있는 범위를 확장하여 NumPy를 과학 컴퓨팅 및 데이터 분석을 위한 다재다능하고 필수적인 라이브러리로 만듭니다.

 

4.5 NumPy 고급 인덱싱 -- 메모리 보기 및 복사본(L04: Python의 과학적 컴퓨팅)



4.5 NumPy 고급 인덱싱 -- 메모리 보기 및 복사본(L04: Python의 과학적 컴퓨팅)

다섯 번째 동영상에서는 인덱싱에 대해 다시 한 번 살펴보겠습니다. 그러나 기본 인덱싱을 다룬 초기 비디오와 달리 이제 고급 인덱싱을 살펴보겠습니다. 이 부분에서는 배열 값을 실수로 덮어쓰는 것과 같은 의도하지 않은 실수를 방지하는 중요한 방법인 메모리 보기 및 메모리 복사본 생성과 같은 개념을 소개합니다. NumPy에서 버그와 예기치 않은 동작을 방지하는 데 도움이 되므로 이를 이해하는 것이 중요합니다.

이제 시작하겠습니다. 이전 섹션에서 "뷰"라고 하는 NumPy 배열의 한 측면에 대해 논의했습니다. 일반 인덱싱 또는 기본 슬라이싱 작업을 사용할 때 뷰가 생성됩니다. 이러한 보기는 선형 대수학의 엄격한 수학적 프레임워크 내에서 실현할 수 없는 작업을 수행할 수 있도록 암시적 차원으로 작동합니다. 그러나 보기로 작업하는 것은 원래 배열을 인식하지 못한 채 실수로 수정할 수 있기 때문에 위험할 수 있습니다.

이를 설명하기 위해 간단한 예를 살펴보겠습니다. 2개의 행과 3개의 열이 있는 2차원 배열이 있다고 가정합니다. 편의상 첫 번째 행을 "first_row"라는 별도의 변수에 할당하겠습니다. 이제 중요한 점은 다음과 같습니다. 첫 번째 행을 변수에 할당하면 새 개체가 아닌 뷰가 생성됩니다. 즉, 이 변수는 메모리에서 원래 배열의 위치를 가리킬 뿐입니다. 따라서 이 변수의 값을 수정하면 원래 배열의 해당 값도 수정됩니다.

이를 시연하기 위해 "first_row" 변수의 각 요소를 99씩 증가시켜 보겠습니다. 이 작업을 실행하면 변수의 값이 변경될 뿐만 아니라 원래 배열의 첫 번째 행에 있는 값도 덮어씁니다. 이 동작은 우리가 독립적인 객체가 아닌 뷰로 작업하고 있다는 힌트 역할을 합니다. 뷰로 작업하는 동안 의도치 않게 원래 배열의 값을 덮어쓰기 쉽기 때문에 이를 인식하지 못하는 것은 위험할 수 있습니다.

반면에 뷰는 불필요한 배열 복사를 피할 수 있기 때문에 메모리 효율성에 매우 유용할 수 있습니다. 그러나 배열의 복사본을 명시적으로 생성해야 하는 상황이 있습니다. 이를 위해 원본과 동일한 값으로 새 배열을 생성하는 "복사" 기능을 사용할 수 있습니다. 제공된 예제에서는 "복사" 기능을 사용하여 배열의 두 번째 행 복사본을 만듭니다. 이렇게 하면 "first_row" 변수에 대한 모든 수정 사항이 원래 배열에 영향을 주지 않습니다.

슬라이싱 및 정수 기반 인덱싱이 메모리 뷰를 생성하는 동안 배열의 복사본을 생성하는 "팬시 인덱싱"이라는 또 다른 유형의 인덱싱이 있다는 점에 유의하는 것이 중요합니다. 팬시 인덱싱은 여러 정수 인덱스를 사용하여 배열에서 특정 요소를 선택하는 것을 말합니다. 이 기능은 일반 Python 목록에서 지원되지 않기 때문에 "fancy"라고 합니다. 그러나 NumPy를 사용하면 이러한 유형의 인덱싱을 수행할 수 있으며 이는 매우 강력할 수 있습니다.

예를 들어 일반 Python 목록에서는 첫 번째 요소와 세 번째 요소를 동시에 검색할 수 없습니다. 그러나 NumPy에서는 멋진 인덱싱을 사용하여 이를 달성할 수 있습니다. 마찬가지로 멋진 인덱싱을 사용하여 2차원 배열에서 특정 열을 선택할 수 있습니다. 멋진 인덱싱은 항상 뷰가 아닌 배열의 복사본을 생성한다는 점은 주목할 가치가 있습니다.

보기와 복사본의 구분은 NumPy의 효율성 고려 사항과 관련이 있습니다. 슬라이싱을 사용하면 특정 값을 메모리에 캐시하여 성능을 최적화할 수 있습니다. 그러나 멋진 인덱싱으로 이 캐싱 메커니즘을 구현하는 것은 연속적인 메모리 청크를 추출할 수 없기 때문에 간단하지 않습니다. 대신 개별 값을 선택하여 새 배열을 만듭니다. 이 동작은 멋진 인덱싱이 뷰가 아닌 복사본을 생성하는 이유를 설명합니다.

고급 인덱싱의 또 다른 흥미로운 측면은 배열의 열 순서를 재정렬할 수 있다는 것입니다. 멋진 인덱싱을 사용하여 원하는 열 인덱스를 지정하면 필요에 따라 열을 섞을 수 있습니다.

NumPy의 부울 마스크는 특정 조건에 따라 배열을 필터링하는 효율적이고 강력한 방법입니다. 부울 마스크는 단순히 원래 배열과 모양이 같은 부울 값(True 또는 False)의 NumPy 배열입니다. 원래 배열에 부울 마스크를 적용하면 주어진 조건을 만족하는 요소를 선택하고 나머지는 버릴 수 있습니다.

부울 마스크를 만들려면 먼저 배열의 각 요소에 대한 부울 값을 반환하는 조건을 정의합니다. 예를 들어 arr이라는 배열이 있다고 가정해 보겠습니다.

import numpy as np
arr = np.array([1, 2, 3, 4, 5])
3보다 큰 요소만 선택하는 것과 같은 조건에 따라 부울 마스크를 만들 수 있습니다.
mask = arr > 3
결과 부울 마스크인 mask는 [False, False, False, True, True]가 됩니다. 마스크의 각 요소는 원래 배열의 동일한 위치에 해당하며 해당 요소에 대한 조건이 참인지 거짓인지를 나타냅니다.

부울 마스크를 적용하고 조건을 만족하는 요소를 검색하려면 간단히 마스크를 배열의 인덱스로 사용할 수 있습니다.

filtered_arr = arr[mask]
결과로 생성되는 Filter_arr은 원래 배열에서 3보다 큰 요소만 포함하는 [4, 5]가 됩니다.

부울 마스크는 &(및), |와 같은 논리 연산자를 사용하여 결합할 수 있습니다. (또는) 및 ~(아님)은 더 복잡한 조건을 만듭니다. 예를 들어:

mask = (arr > 2) & (arr < 5)
filtered_arr = arr[mask]
이 조건은 2보다 크고 5보다 작은 요소를 선택하여 Filtered_arr이 [3, 4]가 되도록 합니다.

부울 마스크는 대규모 데이터 세트로 작업하거나 데이터 필터링 및 분석을 수행할 때 특히 유용합니다. 명시적인 루프나 조건 검사 없이 어레이에서 효율적이고 간결한 작업을 수행할 수 있습니다.

배열 필터링 외에도 요소 할당에 부울 마스크를 사용할 수도 있습니다. 부울 마스크를 통해 선택한 요소에 새 값을 할당하면 조건에 따라 배열의 특정 부분을 수정할 수 있습니다.

전반적으로 부울 마스크는 지정된 조건에 따라 NumPy 배열을 조작하고 필터링하는 유연하고 효율적인 방법을 제공하므로 데이터 처리 및 분석에 유용한 도구가 됩니다.

 

4.6 NumPy 난수 생성기(L04: Python의 과학적 컴퓨팅)



4.6 NumPy 난수 생성기(L04: Python의 과학적 컴퓨팅)

이 비디오에서는 NumPy의 난수 생성기에 대한 간략한 개요를 제공합니다. NumPy에서 난수를 생성하는 다양한 방법을 모두 다루지는 않지만 난수 생성기와 그 실용적인 유용성을 이해하는 데 중점을 둘 것입니다.

간단한 예부터 시작하겠습니다. 난수 생성에 사용할 라이브러리인 NumPy를 가져오는 것으로 시작하겠습니다. NumPy에는 난수를 그리는 다양한 함수가 포함된 random 모듈이 있습니다. 우리가 참조할 문서가 약간 오래되었지만 다양한 기능과 설명에 대한 유용한 목록을 제공합니다.

일반적으로 사용되는 함수 중 하나는 random.rand로 균일 분포에서 무작위 샘플을 생성합니다. 원하는 배열의 모양(예: 2x3)을 지정하면 이 함수는 균일한 분포의 난수로 채워진 2차원 배열을 생성합니다.

NumPy는 반개방 간격 [0, 1)에서 무작위 부동 소수점을 생성하는 random.random과 같은 다른 기능도 제공합니다. random.randn 함수를 사용하여 표준 정규 분포와 같은 다양한 분포에서 무작위 샘플을 추출할 수도 있습니다.

때로는 코드가 실행될 때마다 동일한 무작위 결과를 생성하는지 확인하고 싶을 수 있습니다. 이것은 특히 코드를 공유하거나 다른 방법을 비교할 때 재현성에 유용합니다. 이를 달성하기 위해 코드 또는 노트북의 시작 부분에 임의의 시드를 설정할 수 있습니다. 시드는 매번 동일한 순서의 난수가 생성되도록 하는 임의의 숫자입니다.

임의 시드를 설정하면 생성된 난수가 코드를 여러 번 실행하는 동안 일정하게 유지됩니다. 그러나 다른 임의 샘플을 추출하면 여전히 임의 프로세스이기 때문에 결과가 달라진다는 점에 유의하는 것이 중요합니다.

일관된 결과를 갖는 것은 데이터 섞기 또는 테스트 구현과 같은 기계 학습 애플리케이션에서 특히 유용할 수 있습니다. 예를 들어 데이터 세트를 분할할 때 무작위 시드를 설정하면 분할이 매번 동일하게 됩니다. 이를 통해 다양한 방법을 정확하게 비교하고 평가할 수 있습니다.

임의성을 보다 세부적으로 관리하기 위해 NumPy에서 임의 상태 개체를 사용할 수 있습니다. 임의 상태 개체에는 자체 난수 생성기가 있어 임의성이 적용되는 위치를 세밀하게 제어할 수 있습니다. 여러 개의 임의 상태 개체를 생성하여 코드에서 다양한 임의성 소스를 가질 수 있습니다. 이것은 코드의 특정 부분이 일관된 결과를 생성하고 다른 부분은 다양한 난수를 생성하려는 경우에 특히 유용합니다.

이전 random_state 클래스가 여전히 널리 사용되는 동안 NumPy 커뮤니티는 이제 새로운 임의 생성기를 사용할 것을 권장합니다. 이 새로운 생성기는 난수를 생성하는 데 다른 방법을 사용하지만 대부분의 간단한 응용 프로그램에서는 둘 중 하나를 선택해도 눈에 띄는 차이가 없습니다. 가장 중요한 것은 재현성을 위해 무작위 시드를 설정하는 것입니다.

코드의 난수 생성기는 진정한 난수가 아니라 의사 난수임을 기억하는 것이 중요합니다. 알고리즘을 사용하여 임의성을 모방한 일련의 숫자를 생성합니다. 우리의 맥락에서 초점은 난수 생성에 사용되는 특정 알고리즘보다는 일관성과 재현성에 있습니다.

결론적으로 NumPy에서 난수 생성기로 작업할 때 생성기 자체의 선택은 중요하지 않습니다. 중요한 것은 일관되고 재현 가능한 결과를 보장하기 위해 무작위 시드를 설정하는 것입니다. 이는 코드를 공유하거나 과제를 제출하거나 다른 방법을 비교할 때 특히 유용합니다.

 

4.7 NumPy 배열 재구성(L04: Python의 과학적 컴퓨팅)



4.7 NumPy 배열 재구성(L04: Python의 과학적 컴퓨팅)

드디어 NumPy 시리즈의 결론이 다가오고 있습니다. 비디오가 세 개밖에 남지 않은 상태에서 NumPy 배열 재구성이라는 중요한 주제에 도달했습니다. 행렬을 벡터로 변환하거나 그 반대로 변환하는 것과 같이 데이터를 원하는 모양으로 변환해야 하는 경우 배열 재구성이 중요합니다. MNIST에 대해 논의한 입문 강의에서 이 개념에 대해 간략하게 언급했습니다. 이 프로세스를 설명하기 위해 간단한 예를 들어 보겠습니다.

이미지를 나타내는 28 x 28 크기의 배열이 있다고 상상해보십시오. 일반적으로 배열의 각 요소는 픽셀 값에 해당합니다. 그러나 간단하게 하기 위해 각 요소가 한 자리 숫자라고 가정해 보겠습니다. 따라서 숫자 이미지를 나타내는 28 x 28 배열이 있습니다. 그러나 이 배열을 분류기의 특징 벡터로 사용하려면 784개의 요소(28 * 28)가 있는 하나의 긴 벡터로 모양을 변경해야 합니다. 각 교육 예제는 이미지가 될 것이며 각 이미지에는 784개의 기능이 있습니다.

NumPy의 reshape 함수를 사용하여 배열을 재구성할 수 있습니다. 예를 들어 벡터 1, 2, 3, 4, 5, 6을 2x3 행렬로 재구성할 수 있습니다.

array([[1, 2, 3],
       [4, 5, 6]])
형태 변경 중에 지정된 치수는 원래 배열의 총 요소 수와 일치해야 합니다. 치수가 올바르지 않으면 오류가 발생합니다. 예를 들어 요소가 6개인 벡터를 3x3 행렬로 변형하려고 하면 요소가 충분하지 않기 때문에 오류가 발생합니다.

배열을 재구성할 때 새 배열이 아닌 메모리 뷰가 생성됩니다. 이 메모리 보기를 사용하면 데이터를 복제하지 않고 재구성된 배열을 조작할 수 있습니다. 이를 확인하기 위해 np.may_share_memory 함수를 사용할 수 있지만 항상 100% 정확한 결과를 제공하지는 않습니다.

변형에서 차원으로 -1을 사용하는 것은 NumPy의 편리한 기능입니다. 이는 자리 표시자 역할을 하여 메서드가 총 요소 수를 기반으로 적절한 차원을 결정할 수 있도록 합니다. 예를 들어 6개의 요소가 있는 벡터가 있고 -1, 2를 사용하여 모양을 변경하면 6개의 요소를 얻기 위해 3개의 행과 2개의 열을 배열하는 방법은 한 가지뿐이므로 -1은 3으로 대체됩니다. 이 자리 표시자 개념은 임의의 수의 차원에서 작동합니다.

또한 reshape 함수를 사용하여 배열을 평면화할 수 있습니다. 단일 값을 차원으로 지정하면(예: reshape(6)) 배열을 1차원 벡터로 변환할 수 있습니다. 실제로 -1을 사용하면 크기를 기억할 필요가 없기 때문에 더 편리합니다. 예를 들어 reshape(-1)은 요소가 6개인 배열에 대해 reshape(6)과 동일한 결과를 얻습니다.

NumPy에서 배열을 평면화하는 방법에는 여러 가지가 있습니다. -1인 reshape 함수는 메모리 뷰를 생성하는 반면 flatten 함수는 배열을 병합하지만 복사본을 생성합니다. 또 다른 함수인 ravel도 배열을 평평하게 만드는 데 사용됩니다. 이러한 기능 간의 차이점을 확인하는 것은 좋은 자체 평가 퀴즈가 될 것입니다.

마지막으로 NumPy에서 배열을 연결하여 지정된 축을 따라 결합할 수 있습니다. 첫 번째 축을 따라 배열을 연결할 때 Python 목록에 요소를 추가하는 것과 유사합니다. 예를 들어 하나의 축을 가진 두 개의 배열이 있는 경우 해당 축을 따라 배열을 연결하면 하나가 다른 하나 아래에 쌓입니다.

데이터를 원하는 모양으로 조작하려면 NumPy 배열을 재구성하는 것이 필수적입니다. 다양한 방법, 자리 표시자 및 연결 기술을 이해하면 배열을 효과적으로 사용하고 코드를 최적화할 수 있습니다. 다음 비디오에서는 모양 변경과 결합할 때 강력한 도구가 되는 NumPy 비교 연산자 및 마스크에 대해 설명합니다.

 

4.8 NumPy 비교 연산자 및 마스크(L04: Python의 과학적 컴퓨팅)



4.8 NumPy 비교 연산자 및 마스크(L04: Python의 과학적 컴퓨팅)

NumPy에서 비교 연산자와 선택 마스크는 많은 유연성을 제공하며 작업하기에 매우 즐거울 수 있습니다. 이전 비디오에서 우리는 마스크와 비교 연산자를 소개했지만 이제 작업할 때 사용할 수 있는 몇 가지 추가 트릭을 살펴보겠습니다.

간단한 예부터 시작하겠습니다. 단순화를 위해 NumPy 배열 [1, 2, 3, 4]가 있다고 가정합니다. 배열에서 특정 값을 선택하도록 마스크를 정의할 수 있습니다. 이 마스크는 True 또는 False 값을 포함하는 부울 배열입니다. 2보다 큰 값을 선택하는 것과 같은 조건을 지정하여 마스크를 만들 수 있습니다. 결과 마스크 배열은 조건이 참인 위치를 나타내는 True 값과 조건이 거짓인 위치를 나타내는 False 값으로 원래 배열과 동일한 모양을 갖게 됩니다.

Python에서는 부울 값과 정수 사이에 편리한 관계가 있습니다. True는 1에 해당하고 False는 0에 해당합니다. 이 관계를 통해 흥미로운 작업을 수행할 수 있습니다. 예를 들어 if condition:을 작성하여 if 문을 사용하여 조건이 참인지 확인할 수 있습니다. if not condition:을 작성하여 조건이 거짓인지 확인하기 위해 not 연산자를 사용할 수도 있습니다. 이러한 접근 방식은 조건을 True 또는 False와 명시적으로 비교하는 것과 비교하여 더 읽기 쉬운 코드를 제공합니다.

또 다른 유용한 기능은 특정 조건과 일치하는 배열의 요소 수를 계산하는 기능입니다. 합계 연산자를 마스크에 적용하여 마스크의 True 값 수를 계산할 수 있습니다. 예를 들어 2보다 큰 값을 선택하는 마스크가 있는 경우 sum(mask)를 호출하여 이러한 값의 수를 셀 수 있습니다. 마찬가지로 배열의 총 요소 수에서 합계를 빼서 False 값의 수를 계산할 수 있습니다.

배열에서 음수 값의 수를 계산하기 위해 마스크의 부울 값을 뒤집는 NumPy 반전 함수를 활용할 수 있습니다. 반전을 마스크에 적용한 다음 sum을 호출하여 False 값(이제 음수 값을 나타냄)의 수를 계산할 수 있습니다.

배열을 이진화하는 것, 즉 배열을 이진 표현으로 변환하는 것은 또 다른 일반적인 작업입니다. 조건이 참인 위치에 특정 값을 할당하고 조건이 거짓인 위치에 다른 값을 할당하여 이를 달성할 수 있습니다. 그러나 전체 작업을 입력하는 것은 지루할 수 있습니다. 다행스럽게도 NumPy는 이 프로세스를 단순화하는 where 함수를 제공합니다. where 함수는 조건을 받아 조건이 참인 위치에 첫 번째 값을 할당하고 조건이 거짓인 위치에 두 번째 값을 할당합니다. where를 사용하면 단 한 줄의 코드로 배열을 쉽게 이진화할 수 있습니다.

비교 연산자 외에도 NumPy는 and, or, xor, not과 같은 논리 연산자를 제공합니다. 이러한 연산자를 마스크와 결합하여 더 복잡한 조건을 만들 수 있습니다. 예를 들어 or 연산자를 사용하여 3보다 크거나 2보다 작은 값을 선택할 수 있습니다. 논리 연산자를 사용하여 여러 조건을 결합하여 필요에 맞는 복잡한 선택 마스크를 만들 수 있습니다.

NumPy의 이러한 부울 마스크, 논리 연산자 및 비교 연산자는 데이터 세트로 작업하고 의사 결정 트리 규칙을 구현할 때 매우 유용합니다. 앞으로 나올 비디오에서 이러한 개념을 더 자세히 살펴볼 것입니다. 다음 비디오에서는 NumPy의 기본 선형 대수학 개념을 자세히 살펴보겠습니다. 계속 지켜봐!

 

4.9 NumPy 선형 대수 기초(L04: Python의 과학적 컴퓨팅)



4.9 NumPy 선형 대수 기초(L04: Python의 과학적 컴퓨팅)

이 비디오에서는 특히 NumPy의 맥락에서 선형 대수학의 몇 가지 기본 개념을 탐구하고 싶습니다. 이 과정에서 선형 대수학을 광범위하게 활용하지는 않지만 벡터 내적 및 행렬 곱셈과 같은 기본 연산을 이해하는 것이 중요합니다. 앞서 언급했듯이 선형 대수 표기법을 사용하면 보다 효율적이고 간결한 코드를 작성할 수 있습니다.

1차원 배열을 행 벡터로 간주하여 시작하겠습니다. 또는 여러 요소가 있는 단일 행으로 구성된 벡터로 정의할 수 있습니다. 반면에 열 벡터는 하나의 열과 여러 요소를 갖도록 행 벡터를 재구성하여 만들 수 있습니다. 기본적으로 열 벡터 표현을 나타냅니다. 특히 이 문맥에서는 대괄호를 사용할 필요가 없습니다.

벡터를 명시적으로 재구성하는 대신 NumPy의 newaxis 함수를 사용하여 새 축을 추가하여 동일한 결과를 얻을 수 있습니다. 두 개의 새 축을 추가하여 3D 텐서를 만들 수도 있습니다. 또 다른 접근 방식은 newaxis와 동일한 용도로 사용되는 None 키워드를 사용하는 것입니다. 이 세 가지 방법, 즉 reshaping, newaxis 및 None은 모두 필요한 경우 추가 축을 추가하는 목표를 달성합니다.

계속해서 행렬 곱셈에 대한 기본 선형 대수 표기법을 접하게 됩니다. 선형 대수학에서 행렬 곱셈은 여러 내적을 계산하는 것과 같습니다. 예를 들어 벡터 [1, 2, 3]과 [1, 2, 3]이 있는 경우 내적 결과는 14가 됩니다. 마찬가지로 [4, 5, 6]과 [1, 2, 3] yields 32. NumPy에서 matmul 함수를 사용하여 행렬 곱셈을 수행할 수 있습니다. 또는 편의를 위해 @ 연산자를 사용할 수 있습니다. 그러나 선형 대수에서는 행렬과 벡터를 직접 곱할 수 없다는 점에 유의해야 합니다. 그럼에도 불구하고 열 벡터를 행렬, 특히 3x1 행렬로 간주할 수 있습니다. 이 접근 방식을 사용하면 엄격한 선형 대수학에서는 불가능한 행렬에 벡터를 곱할 수 있습니다. 따라서 NumPy는 기존 선형 대수에 비해 더 많은 유연성을 제공합니다.

또한 NumPy는 행렬 곱셈을 위한 도트 함수를 제공하며 대부분의 컴퓨터에서 효율적으로 구현되기 때문에 널리 권장됩니다. 이 함수를 사용하면 특히 행 벡터를 다룰 때 더 편리하게 코드를 작성할 수 있습니다. NumPy에서 행렬 곱셈을 위한 지름길 또는 연산자 오버로딩 역할을 합니다. 도트 함수가 행렬과 벡터의 다양한 조합을 처리할 수 있으며 입력 모양을 기반으로 내적 또는 행렬 곱셈을 수행할 수 있다는 점은 주목할 가치가 있습니다.

성능과 관련하여 matmul과 dot 함수는 모두 속도가 비슷합니다. 그들 사이의 선택은 특정 기계에 따라 다를 수 있습니다. 그럼에도 불구하고 점 함수는 일반적으로 실제로 선호됩니다. 또한 전치 연산은 선형 대수학의 전치 연산과 유사한 역할을 하여 효과적으로 행렬을 뒤집습니다. transpose 함수를 명시적으로 사용하는 대신 간결함을 위해 T 특성을 활용할 수 있습니다.

NumPy에는 2차원 배열에 대한 행렬 유형이 포함되어 있지만 NumPy 커뮤니티 내에서 일반적으로 사용되지는 않습니다. 일반 다차원 배열은 대부분의 경우 목적에 부합합니다. 행렬 유형은 2차원으로 제한되며 불필요하게 복잡합니다. 특별히 필요한 경우가 아니면 사용을 자제하는 것이 좋습니다.

마지막으로 NumPy를 넘어서는 광범위한 추가 기능을 포함하는 인상적인 라이브러리인 SciPy에 대해 간략하게 설명합니다. 이 라이브러리에는 선형 대수 연산, 푸리에 변환, 보간 기술, 최적화 알고리즘, 통계 함수 등과 같은 과학 컴퓨팅을 위한 수많은 특수 알고리즘이 포함되어 있습니다. NumPy를 기반으로 하지만 SciPy는 다양한 과학적 계산을 위한 전문 도구를 제공하는 확장 기능을 제공합니다. 이 과정에서는 필요에 따라 SciPy 내의 특정 알고리즘을 탐색합니다. 모든 세부 사항을 기억할 필요는 없습니다. 관련 알고리즘을 만나면 소개하고 설명하겠습니다.

이것으로 Python의 과학 컴퓨팅을 위한 NumPy 및 SciPy에 대한 논의를 마칩니다. 다음 비디오에서는 강력한 플로팅 라이브러리인 matplotlib를 탐색하여 과학 컴퓨팅 여정을 계속할 것입니다.

 

4.10 Matplotlib(L04: Python의 과학 컴퓨팅)



4.10 Matplotlib(L04: Python의 과학 컴퓨팅)

드디어 꽤 길었던 4강이 끝났습니다. 하지만 NumPy에 대해 논의한 개념이 여러분에게 가치가 있었으면 합니다. 앞으로 우리는 기계 학습 알고리즘을 구현하기 위한 숙제에 NumPy를 광범위하게 활용할 것입니다. 따라서 이 시점에서 NumPy에 능숙하고 익숙해지는 것이 중요합니다.

강의 4의 마지막 주제로 넘어가서 Python용 인기 플로팅 라이브러리인 matplotlib에 대해 살펴보겠습니다. 현재 사용할 수 있는 여러 플로팅 라이브러리가 있지만 matplotlib은 여전히 가장 널리 사용되는 라이브러리입니다. 개인적으로 제가 가장 좋아하는 플로팅 라이브러리이기도 하며 이름은 Metalab에서 영감을 받았습니다. matplotlib의 구문은 MATLAB과 매우 유사하며 일부 사람들은 높이 평가하지만 다른 사람들은 그렇지 않습니다. 예를 들어 저는 대학원 시절 MATLAB을 사용하는 것을 싫어했지만 matplotlib가 훌륭한 도구라는 것을 알게 되었습니다.

MATLAB의 팬이 아니더라도 matplotlib은 비교적 사용하기 쉽다고 생각합니다. 또한 NumPy와 원활하게 통합되어 추가 이점이 있습니다. 이제 matplotlib을 시작하겠습니다. 개인적으로 matplotlib는 저수준 라이브러리이기 때문에 작업을 수행하는 모든 특별한 방법을 암기하지 않는다는 점을 개인적으로 언급해야 합니다. 즉, 높은 수준의 사용자 지정 옵션을 제공하지만 모든 옵션이 직관적이지는 않습니다. 그래서 종종 찾아보는 나 자신을 발견하게 됩니다. 특정 작업을 수행해야 할 때 다양한 예제를 보여주는 matplotlib 갤러리를 방문합니다. 예를 들어 스템 플롯을 만들고 싶다면 갤러리에서 간단히 검색하고 예제를 찾아 내 데이터에 적용하면 됩니다. 이 접근 방식은 일반적으로 내 요구에 충분합니다. 그러나 더 자세한 자습서를 선호하는 경우 matplotlib의 다양한 측면에 대한 설명 자습서를 제공하는 matplotlib.org 웹 사이트를 탐색할 수도 있습니다.

먼저 Jupyter Lab 또는 Jupyter Notebook에서 matplotlib로 작업할 때 인라인 기능을 사용하여 노트북 자체 내에서 플롯을 표시할 수 있습니다. 즉, 플롯이 노트북에 직접 표시되므로 별도의 창이 필요하지 않습니다. 이 작업을 수행할 수 있는 다른 방법이 있지만 개인적으로 인라인 접근 방식을 사용하는 것이 좋습니다. 여러 컴퓨터에서 더 안정적이기 때문입니다. 인라인 모드를 활성화하려면 %matplotlib inline 매직 명령을 사용할 수 있습니다. 또는 일반적으로 동일한 결과를 얻을 수 있는 plot 문 끝에 세미콜론을 추가할 수 있습니다. 그러나 특정 컴퓨터에서는 세미콜론 트릭이 제대로 작동하지 않을 수 있으므로 plt.show()를 사용하여 플롯을 표시하는 것이 좋습니다.

이제 matplotlib를 사용하여 몇 가지 간단한 플롯을 만드는 방법을 살펴보겠습니다. 예를 들어 사인 곡선을 그리는 것으로 시작할 수 있습니다. 이를 위해 np.linspace 함수를 사용하여 0에서 10까지의 범위에 있는 100개의 값을 생성한 다음 이 값을 사인 함수인 np.sin에 대해 플롯할 수 있습니다. 플롯을 만드는 가장 간단한 방법은 plt.plot 함수를 사용하는 것입니다. 여기서 plt는 matplotlib.pyplot의 약어입니다. plt.xlim 및 plt.ylim 함수를 사용하여 플롯의 축 범위를 조정하여 각각 x축 및 y축에 대한 제한을 설정할 수 있습니다. 또한 plt.xlabel 및 plt.ylabel 함수를 사용하여 x축과 y축에 레이블을 추가할 수 있습니다. 마지막으로 플롯을 표시하기 위해 plt.show() 함수를 사용하거나 플롯 문 끝에 세미콜론을 추가하여 원하지 않는 출력을 억제할 수 있습니다.

단일 플롯 외에도 동일한 그림 내에서 여러 플롯을 만들 수도 있습니다. 예를 들어 사인 곡선과 코사인 곡선을 별도의 하위 플롯으로 그릴 수 있습니다. 이를 달성하기 위해 plt.subplots 함수를 사용하여 두 개의 그림을 생성한 다음 각 서브플롯에서 각각의 사인 및 코사인 곡선을 그릴 수 있습니다. plt.subplots 함수는 각 서브플롯을 개별적으로 사용자 지정하는 데 사용할 수 있는 그림 객체와 축 객체의 배열을 반환합니다.

다음은 여러 서브플롯 생성을 보여주는 예제 코드 스니펫입니다.

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace( 0 , 10 , 100 )
y1 = np.sin(x)
y2 = np.cos(x)

fig, axs = plt.subplots( 2 , 1 )  # Create a figure with 2 subplots arranged vertically

# Plot the sine curve in the first subplot
axs[ 0 ].plot(x, y1)
axs[ 0 ].set_title( 'Sine Curve' )  # Set a title for the subplot
axs[ 0 ].set_xlabel( 'X' )
axs[ 0 ].set_ylabel( 'Y' )

# Plot the cosine curve in the second subplot
axs[ 1 ].plot(x, y2)
axs[ 1 ].set_title( 'Cosine Curve' )
axs[ 1 ].set_xlabel( 'X' )
axs[ 1 ].set_ylabel( 'Y' )

plt.tight_layout()  # Adjust the spacing between subplots for better readability
plt.show()  # Display the figure
이 예제에서는 plt.subplots 함수를 사용하여 수직으로 정렬된 2개의 서브플롯(2, 1)이 있는 그림을 만듭니다. 이 함수는 Figure 객체 fig와 지정된 서브플롯 레이아웃과 일치하는 차원을 가진 axes 객체 axs의 배열을 반환합니다. 축 배열을 인덱싱하여 각 서브플롯에 액세스할 수 있습니다.

서브플롯 관련 코드 블록 내에서 플롯 함수를 사용하여 각 곡선을 그린 다음 각각 set_title, set_xlabel 및 set_ylabel 함수를 사용하여 각 서브플롯의 제목, x축 레이블 및 y축 레이블을 사용자 지정합니다.

tight_layout 함수는 서브플롯 사이의 간격을 조정하여 더 나은 가독성을 보장하기 위해 호출됩니다. 마지막으로 plt.show()를 사용하여 서브플롯이 포함된 그림을 표시합니다.

Jupyter Notebook 또는 Jupyter Lab 환경에서 이 코드를 실행하여 별도의 서브플롯에 표시된 사인 및 코사인 곡선이 있는 결과 그림을 볼 수 있습니다.

이것은 서브플롯을 생성하는 기본적인 예일 뿐이며 플롯을 보다 유익하고 시각적으로 매력적으로 만들기 위해 matplotlib에서 사용할 수 있는 더 많은 사용자 지정 옵션이 있습니다. 추가 예제 및 자세한 설명은 matplotlib 문서 및 갤러리를 탐색할 수 있습니다.

 

5.1 표 텍스트 파일에서 데이터세트 읽기(L05: Scikit-Learn을 사용한 기계 학습)



5.1 표 텍스트 파일에서 데이터세트 읽기(L05: Scikit-Learn을 사용한 기계 학습)

여러분, 안녕하세요! 여러분 모두 즐거운 한 주를 보냈고 모든 NumPy 자료를 통해 작업할 수 있는 기회를 가졌기를 바랍니다. 이번 주에는 scikit-learn을 사용한 데이터 처리 및 기계 학습에 중점을 둘 것이므로 NumPy를 잘 이해하는 것이 필수적입니다. 코딩을 연습하고 실제 예제에서 배운 개념을 적용하는 것이 매우 유용하다고 생각합니다. 이것이 바로 이 강의에서 일부 코딩을 미리 수행할 이유입니다. 이 도구를 광범위하게 사용하면 수업 후반에 도움이 될 것입니다. 말하자면, NumPy를 사용한 감독 학습 및 코드 예제를 포함하여 이전 강의에서 다룬 개념을 테스트할 첫 번째 큰 숙제를 업로드했다는 점을 제외하면 이 강의에 추가할 내용이 많지 않습니다. K-최근접 이웃 알고리즘을 직접 체험하고 NumPy와 scikit-learn을 자세히 살펴볼 수 있는 좋은 기회입니다.

이제 비디오를 시청하고 숙제를 완료하고 자기 평가 퀴즈를 푸는 동안 재미를 느끼고 즐길 수 있도록 상기시켜 드리고 싶습니다. 제가 가장 좋아하는 계절인 가을이 여기 위스콘신에서 막 시작되었습니다. 저는 더 추운 날씨와 변화하는 나뭇잎의 아름다운 색상을 좋아합니다. 그나저나 지난 주말에 벌써 호박밭에 가서 호박을 몇 개 사서 할로윈을 어서 빨리 깎고 싶어서 정말 신이 났습니다. 그래서 강의를 시작해서 작은 호박으로 돌아가서 할로윈을 준비할 수 있도록 합시다.

자, 이제 전산 기초 강의의 3부까지 왔습니다. 이 강의에서는 전통적인 기계 학습 작업에 가장 일반적인 파일 형식인 CSV 파일과 같은 테이블 형식의 텍스트 파일에서 데이터 세트를 읽는 것부터 시작하여 몇 가지 주제를 다룰 것입니다. 그런 다음 기계 학습 알고리즘 및 교육 절차를 위한 데이터 형성을 포함하여 기본적인 데이터 처리 기술에 대해 논의합니다.

그런 다음 scikit-learn을 사용하여 기계 학습에 뛰어들 것입니다. 하지만 그 전에 Python 클래스와 객체 지향 프로그래밍을 간략하게 요약하고 싶습니다. 이전 실습에서는 Python을 준비하거나 개념을 더 잘 이해하도록 요청했습니다. scikit-learn은 객체 지향 프로그래밍에 크게 의존하기 때문에 객체 지향 프로그래밍을 잘 이해하는 것이 중요합니다. 따라서 scikit-learn의 작동 방식을 이해하려면 객체 지향 프로그래밍을 이해해야 합니다.

계속해서 scikit-learn 변환기 API를 사용하여 교육 데이터를 준비하는 방법에 대해 설명합니다. 또한 데이터 세트 준비, 크기 조정, 정규화, 차원 감소 및 분류자 자체와 같은 다양한 작업을 연결하는 데 도움이 되는 scikit-learn 파이프라인 정의를 다룰 것입니다. 파이프라인을 사용하여 머신 러닝 프로세스의 다양한 측면을 연결하는 효율적인 교육 워크플로를 생성하여 작업을 더욱 편리하게 만들 수 있습니다. 이것은 scikit-learn의 중요한 강점 중 하나입니다.

이번 강의에서는 다시 슬라이드를 사용하기로 했습니다. Jupiter Lab은 환상적인 도구이지만 펜이나 연필로 코드 예제에 주석을 달아 특정 개념을 설명하는 것이 더 쉽습니다. 그래서 이 슬라이드에는 강의 중에 주석을 달게 될 Jupiter Lab과 Jupiter Notebook의 스크린샷을 캡처했습니다. 그러나 추가 설명을 찾을 수 있는 전체 코드 노트북도 GitHub에 업로드했습니다. 이 문서를 선택 과정 또는 참고용 강의 노트로 간주하십시오.

이 과정에서 현재 위치를 빠르게 요약해 보겠습니다. 우리는 기계 학습에 대한 소개부터 시작하여 기본 사항을 다루고 scikit-learn이 작동하는 방식을 탐구했습니다. 그런 다음 NumPy 및 과학 컴퓨팅에 대해 배우면서 Python을 탐구했습니다. 이제 우리는 scikit-learn으로 데이터 처리 및 기계 학습 단계에 진입하고 있습니다. 다음 강의에서는 의사 결정 트리, 앙상블 방법 및 모델 평가와 같은 핵심 기계 학습 개념으로 돌아갑니다. 이것이 전산 기초 강의의 마지막 부분이지만 과정의 끝을 의미하지는 않습니다. 계산 기초 강의를 마친 후에는 딥 러닝 및 신경망을 포함한 기계 학습의 고급 주제로 넘어갑니다.

이제 이 강의의 첫 번째 주제인 테이블 형식의 텍스트 파일에서 데이터 세트 읽기에 대해 살펴보겠습니다. 기계 학습으로 작업할 때 데이터를 CSV(쉼표로 구분된 값) 파일과 같은 테이블 형식으로 저장하는 것이 일반적입니다. 이러한 파일에는 데이터의 행과 열이 포함되어 있으며 각 행은 샘플 또는 인스턴스를 나타내고 각 열은 기능 또는 특성을 나타냅니다.

Python에서 CSV 파일을 읽으려면 Pandas 라이브러리를 사용할 수 있습니다. Pandas는 강력한 데이터 조작 및 분석 도구를 제공하므로 Python에서 테이블 형식 데이터로 작업하는 데 널리 사용됩니다. 예를 살펴보겠습니다.

import pandas as pd

# Read the CSV file into a DataFrame
data = pd.read_csv( 'data.csv' )

# Display the first few rows of the DataFrame
print(data.head())

이 예에서는 먼저 pandas 라이브러리를 가져오고 편의상 pd로 별칭을 지정합니다. 그런 다음 read_csv() 함수를 사용하여 CSV 파일 data.csv를 Pandas에서 제공하는 2차원 테이블 형식 데이터 구조인 DataFrame으로 읽어 들입니다. DataFrame은 변수 데이터에 저장됩니다.

데이터를 읽은 후 head() 함수를 사용하여 DataFrame의 처음 몇 행을 표시할 수 있습니다. 이를 통해 데이터를 빠르게 검사하고 올바르게 읽었는지 확인할 수 있습니다.

Pandas는 데이터를 조작하고 분석하기 위한 다양한 기능과 방법을 제공합니다. 행 필터링, 열 선택, 데이터 집계 등과 같은 다양한 작업을 수행할 수 있습니다. Pandas를 처음 사용하는 경우 설명서를 살펴보고 직접 다양한 작업을 실험해 보시기 바랍니다.

이제 데이터를 읽는 방법을 알았으니 다음 주제인 기본 데이터 처리 기술로 넘어가겠습니다. 기계 학습을 위해 데이터로 작업할 때 데이터를 적절하게 전처리하고 준비하는 것이 중요합니다. 여기에는 누락된 값 처리, 범주형 변수 인코딩, 숫자 기능 크기 조정, 데이터를 교육 및 테스트 세트로 분할과 같은 작업이 포함됩니다.

일반적인 전처리 단계 중 하나는 누락된 값을 처리하는 것입니다. 누락된 값은 종종 데이터에서 NaN(숫자가 아님) 또는 NULL 값으로 표시됩니다. 이러한 누락된 값은 기계 학습 모델을 교육할 때 문제를 일으킬 수 있으므로 적절하게 처리해야 합니다. Pandas는 누락된 값을 확인하는 isna(), 누락된 값을 지정된 값으로 채우는 fillna(), 누락된 값이 있는 행이나 열을 제거하는 dropna()와 같이 누락된 값을 처리하는 여러 함수를 제공합니다.

범주형 변수를 인코딩하는 것은 또 다른 중요한 단계입니다. 기계 학습 모델은 일반적으로 숫자 데이터로 작동하므로 범주형 변수를 숫자 표현으로 변환해야 합니다. 일반적인 인코딩 기술 중 하나는 각 범주에 대한 이진 열을 만들고 각각 1 또는 0으로 범주의 존재 또는 부재를 나타내는 원-핫 인코딩입니다.

import pandas as pd

# Create a DataFrame with categorical variables
data = pd.DataFrame({ 'color' : [ 'red' , 'blue' , 'green' , 'red' , 'green' ]})

# Perform one-hot encoding
encoded_data = pd.get_dummies(data)

# Display the encoded data
print(encoded_data)
이 예에서는 범주형 변수를 포함하는 'color' 열이 있는 DataFrame을 만듭니다. 그런 다음 Pandas의 get_dummies() 함수를 사용하여 원-핫 인코딩을 수행합니다. 결과로 인코딩된 데이터에는 원래 '색상' 열의 각 고유 범주에 대한 이진 열이 포함됩니다.

수치적 특징의 스케일링은 또 다른 일반적인 전처리 단계입니다. 많은 기계 학습 알고리즘은 기능의 규모에 민감합니다. 기능의 배율이 다른 경우 모델의 성능에 영향을 줄 수 있습니다. 이 문제를 해결하기 위해 기능을 0에서 1 또는 -1에서 1과 같은 표준 범위로 확장할 수 있습니다. Pandas는 기능 확장을 수행하기 위해 sklearn.preprocessing 모듈에서 MinMaxScaler 및 StandardScaler 클래스를 제공합니다.

import pandas as pd
from sklearn.preprocessing import MinMaxScaler

# Create a DataFrame with numerical features
data = pd.DataFrame({ 'age' : [ 25 , 30 , 35 , 40 ], 'income' : [ 50000 , 60000 , 70000 , 80000 ]})

# Perform feature scaling using MinMaxScaler
scaler = MinMaxScaler()
scaled_data = scaler.fit_transform(data)

# Convert the scaled data back to a DataFrame
scaled_df = pd.DataFrame(scaled_data, columns=data.columns)

# Display the scaled data
print(scaled_df)
이 예제에서는 'age'와 'income'이라는 두 가지 숫자 기능을 사용하여 DataFrame을 만듭니다. 그런 다음 sklearn.preprocessing 모듈의 MinMaxScaler 클래스를 사용하여 기능 확장을 수행합니다. fit_transform() 메서드는 데이터를 스케일링하고 스케일링된 결과 데이터는 scaled_data 변수에 NumPy 배열로 저장됩니다. 마지막으로 스케일링된 데이터를 다시 DataFrame으로 변환하여 표시합니다.

마지막으로 데이터를 교육 및 테스트 세트로 분할하는 것은 기계 학습 모델의 성능을 평가하는 데 중요합니다. 우리는 일반적으로 데이터를 모델을 훈련하는 데 사용되는 훈련 세트와 성능을 평가하는 데 사용되는 테스트 세트의 두 세트로 나눕니다. Pandas는 sklearn.model_selection 모듈에서 train_test_split() 함수를 제공하여 데이터를 교육 및 테스트 세트로 분할합니다.

import pandas as pd
from sklearn.model_selection import train_test_split

# Read the CSV file into a DataFrame
data = pd.read_csv( 'data.csv' )

# Split the data into features and labels
X = data.drop( 'label' , axis= 1 )
y = data[ 'label' ]

# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size= 0.2 , random_state= 42 )
이 예에서는 먼저 CSV 파일 'data.csv'를 DataFrame으로 읽어 들입니다. 그런 다음 데이터를 기능 X와 레이블 y로 분할합니다. 여기서 X에는 '레이블' 열을 제외한 모든 열이 포함되고 y에는 '레이블' 열만 포함됩니다.

다음으로 train_test_split() 함수를 사용하여 데이터를 훈련 세트와 테스트 세트로 분할합니다. 특성 X와 레이블 y를 전달하고 원하는 테스트 크기(예: 20% 테스트 세트의 경우 0.2)를 지정하고 재현성을 위해 임의 상태를 설정합니다.

데이터를 분할한 후 훈련 세트(X_train 및 y_train)를 사용하여 기계 학습 모델을 훈련하고 테스트 세트(X_test 및 y_test)에서 성능을 평가할 수 있습니다.

다음은 Python의 Pandas 라이브러리를 사용하는 기계 학습의 몇 가지 기본 데이터 처리 기술입니다. 데이터 전처리 및 준비는 기계 학습 파이프라인의 필수 단계이며 프로젝트의 특정 요구 사항에 따라 더 많은 기술과 도구를 사용할 수 있습니다.