1. Python의 상위 호환(superset)이다. 2. AI 프로그래밍의 불편함을 해소하고자 시작된 프로젝트이다. 3. C++, Rust 등 low 언어 문법과 (high) Python 문법이 혼합되어 있으며(let, var, struct, 메모리 관리 기법 등), 아직 Python 문법을 100% 지원하지는 않는다. 4. Python에서 함수 정의를 위해 사용하는 def 대신 좀더 strict한 fn을 제공한다. 서로 기능은 동일하나, fn 이 def보다 좀 더 limited, controlled 하다고 한다. input, output의 타입은 필수로 명시하는 등.
struct Complex:
var re: Float32
var im: Float32
fn __init__(inout self, x: Float32):
"""Construct a complex number given a real number."""
self.re = x
self.im = 0.0
fn __init__(inout self, r: Float32, i: Float32):
"""Construct a complex number given its real and imaginary components."""
self.re = r
self.im = i
5. Python 대표 모듈은 당연히 사용가능하게끔 지원한다. NumPy, Pandas 등
문서에 나온 예제를 보면 언뜻 다음 느낌을 받을 수 있는데, 물론 자세한 것은 아니고 느낌이 그렇다는 ㅇ 파이썬이 가지고 있는 강점은 살리면서, - 쉬운 문법, 사용자를 바라보는 철학, 다른 라이브러리와의 비교적 쉬운 혼합(binding) ㅇ 파이썬에 존재하는 본질적인 단점을 해결하는 느낌이다. - 시스템 프로그래밍, 타언어에 비해 불안정적인 배포
Docs에 매우 자세하게 많은 것들이 설명돼있으니 시간을 가지고 천천히 전부 읽어보면 도움이 많이 될 것 같다.
물론 아직 신규 언어라 다른 언어 문서에 비하면 내용이 적다고 생각할 수 있지만 기본적으로 파이썬과 C 언어를 읽을 수 있으면, 전부 이해할 수 있을정도로 쉽게 설명해놓았다.
뭔가 다른 언어에 파이썬이 겹쳐있는 느낌이라 매우 흥미롭게 느껴진다. 시간이 지날수록 Mojo가 어떻게 될지, Python은 어떻게 반응할지 엄청 궁금해지는 바이다.
신경망(Neural Network)뿐 아니라 대부분 모델에서 학습을 수행하기 전에 데이터 값의 범위를 정규화(Normalization), 표준화(Standardization) 하는 것은 매우 중요합니다.
이러한 처리 방법을 사용해서 값의 범위를 비슷하게 만들거나 평균이 1인 정규 분포 형태로 만들어주는 것은 학습 시에 큰 도움이 됩니다.
하지만 현실 데이터에선 값의 범위가 균형적(balanced)이거나 정규분포 형태를 거의 보기 어렵고, 주로 꼬리가 치우친(Skewed or unbalanced) 형태를 띄고 있는데요. Skewed Data는 모델 입력으로 사용하기 전, 전처리 과정(Preprocessing or Engineering)에서 어떤 처리 방법을 사용할지 한번쯤은 고민하게 만드는 골치아픈 데이터입니다.
이때, 기본적으로 세 가지 방법을 후보로 생각해볼 수 있습니다.
Min-Max Scaler; 정규화
Standard Mean/Std Scaler; 표준화
Apply Log-function; 로그화
이 방법들을 통해 성능을 많이 향상시킬 수 있는데, 이뿐 아니라 Gaussian Rank 방법을 추가로 고려해볼 수 있습니다.
Gaussian Rank 방법은 Numeric Feature Distribution을 Normal Distribution으로 변형시켜줍니다.
-1 ~ 1 사이의 값(clipped value)을 순서(sorted)매깁니다.
순서 값에 오차역함수(inverse error function)을 적용하여 마치 Normal Distribution처럼 만듭니다.
Gaussian Rank 방법은 Porto Seguro's Safe Driver Prediction(캐글 대회, 아래 URL 참고) 1등 솔루션 인터뷰를 보면, Min-Max Scaler나 Standard mean/std Scaler보다 더 좋은 성능으로 가장 좋았다고 나와있습니다.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.special import erfinv
from sklearn.preprocessing import QuantileTransformer
np.random.seed(42)
먼저, 예제로 사용할 더미 데이터를 생성합니다.
# 데이터 생성
X = (np.random.randn(200, 1) * 5 + 10) ** 2
df = pd.DataFrame(X)
df.head()