데이타 관점에서 정의하면 NaN은 '빈칸(결측치)' 또는 '값이 없다'를 의미한다. 이 내용을 시각적으로 정의하면, 엑셀 cell이 하얗게 비여 있는 상태를 의미한다.
1. NaN(Not a Number)
1.1 왜? 이것을 '빈칸'이라고 하지 않지 않고, NaN이라고 할까?
제 짐작으로는 프로그래밍 언어의 데이타 타입에 따라 다르게 인식하기 때문일듯하다.
1) 숫자 상태에서 빈칸: NaN(float로 취급)
2) 객체 상태에서 빈칸: None
3) 문자열에서 빈칸:""(Empty String, 이건 내용이 없는것이지 NaN이 아니다!)
위와 같이 데이타 타입에 따라 의미하는 바가 다르기때문에 NaN이라는 것을 만들어 낸듯하다.
1.2. NaN의 특징
1) 연상 불능: NaN에 숫자를 더하거나 곱해도 무조건 NaN이 됨
2) 자기 자신 비교 불가
- if NaN == NaN 은 언제나 False이다.그래서, df == np.nan 대신 반드시 df.isna()를 사용해야함
2. inf(Infinity:무한대)
- 단순히 '엄청나게 큰 수'가 아닌, 계산이 불가능할 정도로 커진 상태 의미
- 수학에서 말하는 무한대 개념을 컴퓨터에 적용하기 위해서 만들어 냄
2.1 언제 발생
- 숫자를 0으로 나눌때 발생
print(10 / 0) # 일반 파이썬에선 ZeroDivisionError 발생
print(np.array([10]) / 0) # 넘파이/판다스에선 [inf] 발생
- 양의 무한대 (inf): $10 / 0$ 처럼 양수를 0으로 나눴을 때
- 음의 무한대 (-inf): $-10 / 0$ 처럼 음수를 0으로 나눴을 때
2.2 inf 특징
1) 전염성: inf에 어떤 숫자를 더하거나 곱해도 결과 inf
2) 통계 파괴자: 이게 제일 중요함
데이터에 inf가 단 하나라도 섞여 있으면, 해당 컬럼의 평균(mean) 또는 합계(sum)를 구했을 때 결과가 무조건 inf로 나옵니다.
분석 데이터가 통째로 망가짐
3. NaN vs Inf
| NaN | Inf | |
| 의미 | 데이터가 없음 (빈칸) | 숫자가 너무 커서 측정 불가 (무한대) |
| 발생 원인 | 데이터 누락, 잘못된 연산 (0/0) | 0으로 나누기, 지수 함수 폭발 등 |
| 데이타 타입 | 실수형(float) | 실수형(float) |
4. 실무적인 작업
판다스의 많은 기능(fillna, dropna 등)은 기본적으로 NaN을 기준으로 설계되어 있음. 그래서, inf를 NaN으로 먼저 바꿔놓아야 함.
그렇지 않으면 데이타가 망가짐
(실무예)
df = df.replace([np.inf, -np.inf, 'inf', '-inf'], np.nan)
"무한대(inf)라는 계산 불가능한 값들을 일단 '비어있는 칸(NaN)'으로 만들어버리자. 그러면 나중에 한꺼번에 0으로 채우든 지우든 처리하기 편하니까!"
오늘 그동안 우연히(?) 그것도 오랫동안 잘 동작하는 코드에 문제가 생겨서, 하루 종일 고생을 해서 내용을 정리함.
1. 기존방식: (\d{6})
pattern_a = re.compile(rf"{file_key}_(\d{6})_(\d{6})\.xlsx")
- 정상적으로 동작하다가 에러가 발생
- 에러: {6} 는 f-string 문법에서 "변수를 포맷팅할 때 쓰는 중괄호"로 인식 -> 그동안 어떻게 동작했지?
- 에러 원인: 추측하기로는 파이썬이 이걸 f-string의 포맷팅 구문으로 보려고 하다가, 6은 변수도 아니고 포맷 명세도 아닌데 그냥 "6"으로 인식해서 에러가 발생함(구글링을 해보니, 보통은 잘된다고 나옴 ㅠㅠㅠ)
- 해결 아래와 같이 안전한 방식으로 하는게 최고임
2. 개선방식: (\d{{6}})
pattern_b = re.compile(rf"{file_key}_(\d{{6}})_(\d{{6}})\.xlsx")
- {{ 와 }} 는 f-string에서 중괄호 이스케이프이기때문, f-string이 해석할 때 {{6}} → 문자열 "{6}" 으로 변환됨
- 안전한 방식으로 하자
3. 결론
- 정규식에 {n} 패턴을 쓸 때는 f-string 안에서는 반드시 {{n}} 로 써야함.
다양한 AI 서비스가 나오면서, 각각의 서비스는 자기들의 매개변수(파라미터)를 자랑하듯이 발표하고 있습니다.
마치 '파라미터(prameter)' 개수가 많을 수록 똑똑하다고 말하는 듯이 자랑합니다.
간단하게 각 서비스의 '파라미터(prameter)' 개수를 보면 아래와 같습니다.
1. GPT-3 : 1750억개
2. GPT-4: 1조 8천억개
3. Gemini Ultra: 1조~1조 5천억개
4. ResNet-50: 2560만개
'파라미터(prameter)' 개수 많을 수록 절대적으로 똑똑하지는 않겠지만, 똑똑할 확률이 높다고 봐도 될 듯합니다.
그럼, 이제 기본적인 '파라미터(prameter)' 에 대해서 정리하겠습니다.
AI 모델에서 말하는 '파라미터(prameter)'란?
- AI 모델이 학습을 통해 얻게된 지식
- 즉, 반복적으로 데이터를 학습하면서, 예측과 정답의 차이를 줄이도록 점점 업데이트하면서 얻는 값!
AI 모델에서 '학습'이란?
- 파라미터(prameter)를 얻는 과정을 의미
- 파라미터(prameter)가 더 좋은 예측, 결과를 낼수 있게 조정하는 과정을 의미
- 이것을 이과적으로 설명하면,
예측을 위해, 딥러닝 모델은 수많은 수학적인 연산을 통해 입력데이타를 처리하고 결과를 만들어내게 됨
이때 사용하는 **가중치(weight)**와 편향(bias) 같은 값들이 바로 파라미터임.
- 예: y = wx + b
여기서 w(가중치)와 b(편향)이 파라미터야.
모델이 학습하면서 w랑 b의 값을 조금씩 바꿔가며 결과가 얼마나 좋은지 확인하고, 다시 수정하고… 이 과정을 반복!
- 다시 정리하면, 파라미터(prameter)는 데이터를 반복적으로 보면서, 예측과 정답의 차이를 줄이도록 점점 업데이트하면서 얻는 값, 즉 AI 모델이 학습을 통해서 얻게 된 지식을 의미함!!!!
