**⬅️ 이전 시간: [Part 1: AI 개발 환경 완벽 구축 가이드](../01_ai_development_environment/part_1_ai_development_environment.md)**
**➡️ 다음 시간: [Part 3: 파이썬 컬렉션, 더 깊게 이해하기](../03_python_collections/part_3_python_collections.md)**
---
## 1. 학습 목표 (Learning Objectives)
이번 파트가 끝나면, 여러분은 다음을 할 수 있게 됩니다.
- 변수를 선언하고 숫자, 문자열, 불리언 등 기본 자료형을 활용할 수 있습니다.
-[리스트](./glossary.md#리스트-list), [튜플](./glossary.md#튜플-tuple), [딕셔너리](./glossary.md#딕셔너리-dictionary), 셋의 차이점을 이해하고 상황에 맞게 선택하여 사용할 수 있습니다.
-`if`, `for`, `while` 등 제어문을 사용하여 코드의 실행 흐름을 제어할 수 있습니다.
- 코드의 재사용성을 높이는 [함수](./glossary.md#함수-function)를 직접 정의하고, [매개변수](./glossary.md#매개변수-parameter와-인자-argument)와 [반환 값](./glossary.md#반환-값-return-value)을 활용할 수 있습니다.
-[리스트 컴프리헨션](./glossary.md#리스트-컴프리헨션-list-comprehension)과 같은 파이썬다운(Pythonic) 코드를 작성할 수 있습니다.
AI 개발의 세계에 오신 것을 환영합니다! 파이썬은 AI와 데이터 과학 분야에서 가장 사랑받는 언어입니다. 문법이 간결하고 사람의 생각과 비슷해서, 복잡한 AI 모델의 로직을 직관적으로 표현할 수 있습니다. 이번 주차에는 앞으로 우리가 만들 모든 AI 서비스의 뼈대가 될 파이썬의 가장 핵심적인 문법들을 하나씩 정복해나갑니다. **단순히 문법을 배우는 것을 넘어, 각 문법이 실제 AI 개발 과정에서 어떻게 데이터를 다루고 모델을 조작하는 데 사용되는지**에 초점을 맞출 것입니다.
> [!TIP]
> 이 파트의 모든 코드 예제는 아래 링크의 파이썬 파일에서 직접 실행하고 수정해볼 수 있습니다.
> **실행 가능한 소스 코드: [`part_2_3_python_syntax_collections.py`](../../source_code/part_2_3_python_syntax_collections.py)**
---
## 4. 모든 것의 시작, 변수와 자료형
> **🎯 1일차 목표:** 변수(Variable)를 사용해 데이터를 저장하고, 파이썬의 기본 데이터 종류(자료형)를 이해합니다.
### 4.1. 변수(Variable): 데이터에 이름표 붙이기
<ahref="./glossary.md#변수-variable">변수(Variable)</a>는 숫자, 글자 같은 데이터를 저장하는 '상자'입니다. `age = 30` 이라는 코드는, `30`이라는 데이터를 `age`라는 이름의 상자에 넣는다는 뜻입니다. 이제부터 우리는 `age`라는 이름만 부르면 컴퓨터가 알아서 `30`이라는 값을 찾아줍니다.
```python
my_name="파이"# 문자열 (String)
my_age=20# 정수 (Integer)
pi=3.14# 실수 (Float)
is_student=True# 불리언 (Boolean)
print(f"안녕하세요, 제 이름은 {my_name}이고 나이는 {my_age}살입니다.")
```
### 4.2. 기본 자료형(Data Types)
파이썬은 데이터의 종류를 구분하며, 이를 <ahref="./glossary.md#자료구조-data-structure">자료형</a>이라고 합니다.
-**정수 (Integer)**: `1`, `100`, `-5` 같이 소수점이 없는 숫자.
-**실수 (Float)**: `3.14`, `-0.5` 같이 소수점이 있는 숫자.
-**문자열 (String)****: `"안녕하세요"`, `'Python'` 같이 따옴표로 감싼 글자들.
-**<a href="./glossary.md#boolean">불리언 (Boolean)</a>**: `True` 또는 `False`. 조건의 참/거짓을 나타냅니다.
---
## 5. 여러 데이터를 담는 그릇 (1): 리스트와 튜플
> **🎯 2일차 목표:** 순서가 있는 데이터 묶음인 [리스트(List)](./glossary.md#리스트-list)와 변경이 불가능한 [튜플(Tuple)](./glossary.md#튜플-tuple)을 다루고, [리스트 컴프리헨션](./glossary.md#리스트-컴프리헨션-list-comprehension)으로 파이썬다운 코드를 작성합니다.
### 5.1. 리스트(List): 순서가 있고 변경 가능한 만능 주머니
- 여러 값을 순서대로 저장하는 **변경 가능한**<ahref="./glossary.md#자료구조-data-structure">자료구조</a>입니다. (`[]` 사용)
```python
fruits=["apple","banana","cherry"]
fruits[1]="blueberry"# 값 변경
fruits.append("strawberry")# 요소 추가
print(f"최종 리스트: {fruits}")
```
### 5.2. 파이썬다운 코드: 리스트 컴프리헨션 (List Comprehension)
`for` 반복문을 한 줄로 간결하게 표현하여 새로운 리스트를 만드는 방법입니다. 단순히 코드를 짧게 만드는 기술을 넘어, 대용량 데이터를 빠르고 효율적으로 가공하기 위한 **전문가의 코드 작성 방식**입니다. AI 모델에 입력될 대량의 데이터를 필터링하거나 특정 형태로 변환할 때 매우 유용하게 사용됩니다.
> **🎯 4일차 목표:** `if`, `for`, `while` 제어문을 사용하여 조건과 반복에 따라 코드의 흐름을 제어합니다.
### 7.1. 파이썬의 상징: 들여쓰기(Indentation)
파이썬은 **[들여쓰기](./glossary.md#들여쓰기-indentation)(스페이스 4칸)**로 코드의 소속을 구분하는 '문법'입니다. `if`, `for` 등에 속한 코드들은 반드시 들여쓰기를 해야 합니다.
### 7.2. `if-elif-else`: 조건에 따라 움직이기
```python
score=85
ifscore>=90:grade="A"
elifscore>=80:grade="B"
else:grade="F"
print(f"학점: {grade}")
```
### 7.3. `for`: 순서대로 반복하기
리스트, 튜플, 문자열 등 순회 가능한 객체의 요소를 하나씩 순회합니다. `enumerate`를 사용하면 인덱스와 값을 함께 얻을 수 있습니다.
```python
fruits=["apple","banana","cherry"]
foridx,fruitinenumerate(fruits):
print(f"{idx+1}번째 과일: {fruit}")
```
### 7.4. `while`: 조건이 만족하는 동안 반복하기
주어진 조건이 `True`인 동안 코드를 계속해서 반복합니다. 조건이 언젠가 `False`가 되도록 만들지 않으면 '무한 루프'에 빠지므로 주의해야 합니다.
```python
count=3
whilecount>0:
print(f"카운트 다운: {count}")
count-=1# 이 줄이 없으면 무한 루프!
print("발사!")
```
---
## 8. 코드를 재사용하는 마법, 함수
> **🎯 5일차 목표:** 반복되는 코드를 `[함수(Function)](./glossary.md#함수-function)`로 묶어 재사용하고, 함수의 입력([매개변수](./glossary.md#매개변수-parameter와-인자-argument))과 출력([반환 값](./glossary.md#반환-값-return-value))을 이해합니다.
### 8.1. 함수(Function): 나만의 데이터 처리 레시피
[함수](./glossary.md#함수-function)는 특정 작업을 수행하는 코드 묶음에 이름을 붙인 **'재사용 가능한 레시피'**입니다. 특히 AI 개발에서 함수는 **'데이터 전처리기'** 와 같습니다. 입력(매개변수)으로 원본 데이터를 받고, 특정 방식(알고리즘)으로 가공하여 깨끗하게 정제된 데이터(반환 값)를 출력하는 과정은 AI 모델 학습의 가장 기본적인 단계입니다. `def` 키워드로 나만의 데이터 처리 레시피를 만들어보세요.
### 8.2. 입력(매개변수)과 출력(반환 값)
-**[매개변수(Parameter)](./glossary.md#매개변수-parameter와-인자-argument):** 함수에 전달하는 재료(입력 값).
-**[`return`](./glossary.md#반환-값-return-value):** 함수가 작업을 마친 후 돌려주는 결과물(출력 값).
```python
defadd(a,b):
result=a+b
returnresult
# 함수 호출 및 결과 저장
sum_result=add(5,3)
print(f"5 + 3 = {sum_result}")
```
함수를 잘 사용하면 복잡한 문제를 여러 개의 간단한 함수로 나누어 해결할 수 있어, 훨씬 체계적인 프로그래밍이 가능해집니다.
---
## 9. 직접 해보기 (Hands-on Lab)
이번 주에 배운 내용을 바탕으로 다음 함수들을 직접 완성해보세요.
**문제 1: 학점 계산기 함수**
- 학생의 점수(0~100)를 매개변수로 받아 학점을 반환하는 `get_grade` 함수를 `if-elif-else`를 사용하여 만들어보세요.
지금까지 우리는 프로그래밍의 '재료'를 다듬는 법을 익혔습니다. 이번 주차에는 이 재료들을 조합하여 '요리'를 하는 법, 즉 더 크고 체계적인 프로그램을 만드는 **[객체 지향 프로그래밍(OOP)](./glossary.md#객체-지향-프로그래밍-object-oriented-programming-oop)** 패러다임을 학습합니다.
**이번 파트의 최종 목표는 `model = RandomForestClassifier()` 라는 AI 코드 한 줄을 완벽하게 이해하는 것입니다.**
Scikit-learn, PyTorch, TensorFlow 등 세상의 모든 AI 라이브러리는 OOP를 기반으로 설계되었습니다. 따라서 OOP를 이해하는 것은 단순히 프로그래밍 기술을 하나 더 배우는 것이 아니라, **AI 개발자로서 라이브러리의 구조를 꿰뚫어 보고 자유자재로 활용하기 위한 필수 관문**입니다.
> **💡 핵심 비유: OOP는 '붕어빵 비즈니스'입니다**
> OOP의 모든 개념을 '붕어빵 장사'에 빗대어 이해해 봅시다!
> - **클래스(Class)**: 붕어빵을 만드는 **'붕어빵 틀'**
> - **객체(Object)**: 붕어빵 틀에서 찍어낸 **'붕어빵'** 하나하나
> - **속성(Attribute)**: 붕어빵의 '팥', '슈크림' 같은 **'속재료'**
> - **메서드(Method)**: 붕어빵 틀의 **'굽기()', '뒤집기()'** 같은 **'행동'**
> [!TIP]
> 본 파트의 모든 예제 코드는 `../../source_code/part_4_object_oriented_programming.py` 파일에서 직접 실행해볼 수 있습니다.
---
## 4. 클래스와 객체: 붕어빵 틀과 붕어빵
> **🎯 1일차 목표:** 클래스(Class)와 객체(Object)의 개념을 이해하고, `__init__`과 `self`를 사용하여 객체의 고유한 상태를 만듭니다.
-**클래스(Class)**: 객체를 만들기 위한 **'설계도'** 또는 '붕어빵 틀'.
-**객체(Object)**: 클래스로부터 생성된 **'실체'** 또는 '팥 붕어빵', '슈크림 붕어빵'.
> [!IMPORTANT]
> ### AI 라이브러리와 클래스 & 객체
> `model = RandomForestClassifier()` 코드를 OOP 관점에서 해부해 봅시다.
> - **`RandomForestClassifier`**: 머신러닝 모델의 기능(데이터 학습, 예측 등)이 정의된 **클래스(설계도)**입니다.
> - **`model`**: 설계도로부터 막 생성된 **객체(실체)**입니다. 이 객체는 이제 자신만의 데이터와 상태를 가질 수 있습니다.
> - **`model.fit(X, y)`**: `model` 객체가 가진 기능, 즉 **메서드(행동)**를 호출하여 모델을 학습시킵니다.
> - **`model.feature_importances_`**: 학습이 끝난 후 `model` 객체 내부에 저장된 결과, 즉 **속성(상태)**을 확인합니다.
>
> 이처럼 AI 라이브러리를 사용한다는 것은 **'클래스를 가져와, 객체를 만들고, 그 객체의 메서드와 속성을 활용하는 과정'** 그 자체입니다.
> **`__init__`과 `self`**: `@dataclass`가 자동으로 만들어주는 `__init__`은 붕어빵 틀에 반죽과 **앙금(`flavor`, `price`)**을 넣는 과정입니다. `self`는 지금 만들어지고 있는 **'바로 그 붕어빵'** 자신을 가리키는 대명사로, 붕어빵들이 서로의 앙금을 헷갈리지 않게 해줍니다.
---
## 5. 상속: 새로운 맛의 붕어빵 출시하기
> **🎯 2일차 목표:** 상속으로 코드 중복을 줄이고, 메서드 오버라이딩과 `super()`로 기능을 확장합니다.
**상속(Inheritance)**은 '기본 붕어빵 틀'을 물려받아 '피자 붕어빵 틀' 같은 신제품을 만드는 것입니다.
> [!TIP]
> **AI 모델링과 상속**
> PyTorch 같은 딥러닝 프레임워크에서 나만의 모델을 만들 때, 우리는 항상 `torch.nn.Module` 이라는 클래스를 **상속**받습니다. 이는 PyTorch가 제공하는 학습, 최적화 등 모델의 핵심 기능들은 그대로 물려받되, 모델의 구조를 정의하는 `forward()` 메서드만 **재정의(Overriding)**하여 나만의 신경망을 만들기 위함입니다. 상속은 이처럼 AI 라이브러리의 기능을 확장하는 핵심 도구입니다.
> **메서드 오버라이딩과 `super()`**: 기본 붕어빵의 판매 방식(`sell`)을 피자 붕어빵에 맞게 바꾸는 것이 **오버라이딩**입니다. 프리미엄 붕어빵을 만들 때, 기존 가격 정책에 추가 금액만 더하는 것처럼 부모의 기능을 그대로 활용하며 확장할 때 **`super()`**를 사용합니다.
---
## 6. 다형성과 캡슐화: 유연하고 안전한 비즈니스
> **🎯 3일차 목표:** 다형성(Polymorphism)으로 코드의 유연성을 높이고, 캡슐화(Encapsulation)로 데이터를 안전하게 보호합니다.
-**다형성(Polymorphism)**: "주문하신 것 나왔습니다!" 라는 **동일한 요청(`sell()`)**에 대해, 대상 객체가 '팥 붕어빵'이냐 '피자 붕어빵'이냐에 따라 **다른 결과가 나오는 것**입니다. 코드의 유연성을 크게 높여줍니다.
-**캡슐화(Encapsulation)**: 붕어빵 맛의 핵심인 **'반죽의 비밀 레시피(`__secret_recipe`)'**를 외부에서 함부로 바꾸지 못하게 숨기고, 정해진 방법으로만 접근하게 하여 데이터를 보호하는 것입니다.
```python
classBungeoppangFactory:
def__init__(self,initial_flour_kg):
self.__flour_kg=initial_flour_kg# 밀가루 재고(비밀 데이터)
defget_stock(self):# 데이터를 확인하는 정해진 통로 (getter)
returnself.__flour_kg
defadd_flour(self,amount):# 데이터를 변경하는 정해진 통로 (setter)
ifamount>0:self.__flour_kg+=amount
factory=BungeoppangFactory(100)
# factory.__flour_kg = 999 #! 직접 수정 불가 (AttributeError)
factory.add_flour(20)# 정해진 방법으로만 수정 가능
print(f"현재 밀가루 재고: {factory.get_stock()}kg")
```
---
## 7. 추상화와 매직 메서드: 비즈니스 규칙과 마법
> **🎯 4일차 목표:** 추상화로 클래스의 필수 기능을 강제하고, 매직 메서드로 파이썬 내장 기능을 커스터마이징합니다.
-**추상화(Abstraction)**: 프랜차이즈 본사에서 "모든 가맹점은 반드시 **'굽기()' 기능을 스스로 구현해야 한다**"는 '운영 매뉴얼'을 만들어 규칙을 강제하는 것입니다.
-**매직 메서드(Magic Methods)**: `print(붕어빵)`을 했을 때 예쁜 설명이 나오게 하거나(`__str__`), `붕어빵1 + 붕어빵2` 처럼 객체 간의 연산을 정의하는 등, 파이썬의 내장 기능을 우리 객체에 맞게 만드는 마법입니다.
본격적으로 모델을 만들기 전에, 머신러닝이 해결할 수 있는 문제의 종류를 이해하는 것은 매우 중요합니다. 머신러닝은 크게 **지도학습, 비지도학습, 강화학습** 세 가지로 나뉩니다.
| 학습 유형 | 핵심 아이디어 | 대표적인 예시 | 주요 알고리즘 |
| :--- | :--- | :--- | :--- |
| **지도학습<br>(Supervised)** | **'정답'이 있는 데이터**로 학습 | 스팸 메일 분류, 집값 예측, 이미지 분류 (개/고양이) | 선형 회귀, 로지스틱 회귀, SVM, 결정 트리, 랜덤 포레스트 |
| **비지도학습<br>(Unsupervised)** | **'정답'이 없는 데이터**에서 패턴 발견 | 고객 그룹 분석, 토픽 모델링, 이상 탐지 | K-평균 군집, 주성분 분석(PCA) |
| **강화학습<br>(Reinforcement)** | **'보상'**을 최대화하는 행동을 학습 | 알파고(바둑), 자율주행, 로봇 제어 | Q-러닝, SARSA, DQN |

이번 파트에서는 이 중에서 가장 널리 사용되고 산업적으로도 중요한 **지도학습**에 집중하여, '정답'이 주어진 데이터를 통해 미래를 예측하는 모델을 만드는 방법을 깊이 있게 다룰 것입니다.
---
## 5. Scikit-learn으로 첫 머신러닝 모델 만들기
> **🎯 3-4일차 목표:** Scikit-learn을 사용하여 머신러닝의 기본 프로세스(학습, 예측, 평가)를 이해합니다.
...
...
@@ -89,7 +105,23 @@ plt.show()
>
> 훈련 데이터로만 반복해서 시험 보면 100점이 나오겠지만, 진짜 실력이라고 할 수 없겠죠? 그래서 우리는 훈련/테스트 데이터를 엄격히 분리하여 모델의 **일반화 성능**(처음 보는 데이터에 대한 예측 능력)을 측정합니다.
### 5-2. Scikit-learn 기본 4단계 프로세스
### 5-2. 핵심 개념: 과적합, 과소적합, 그리고 편향-분산 트레이드오프
모델을 훈련시킬 때 가장 흔하게 마주치는 문제는 **과적합(Overfitting)**과 **과소적합(Underfitting)**입니다.
-**과소적합 (Underfitting)**: 모델이 너무 단순해서 데이터의 내재된 패턴을 제대로 학습하지 못하는 상태입니다. **훈련 데이터에서도 성능이 낮고, 테스트 데이터에서도 성능이 낮은** 특징을 보입니다. (비유: 시험 범위의 절반만 공부한 학생)
-**과적합 (Overfitting)**: 모델이 훈련 데이터에만 너무 과도하게 맞춰져, 노이즈나 특정 패턴까지 전부 외워버린 상태입니다. **훈련 데이터에서는 성능이 매우 높지만, 새로운 테스트 데이터에서는 성능이 급격히 떨어지는** 특징을 보입니다. (비유: 모의고사 족보만 달달 외워, 새로운 유형의 수능 문제에 대처하지 못하는 학생)
이 두 문제는 **모델의 복잡도(Model Complexity)**와 깊은 관련이 있으며, 이를 **편향-분산 트레이드오프(Bias-Variance Tradeoff)** 라고 부릅니다.
### 5-6. 심화: 어떤 모델을 언제 사용해야 할까? (Model Selection Guide)
Scikit-learn에는 수많은 머신러닝 모델이 존재합니다. 문제의 종류, 데이터의 특성, 그리고 우리가 추구하는 목표(성능, 해석 가능성, 속도 등)에 따라 최적의 모델은 달라집니다. 여기서는 가장 대표적인 **분류(Classification)** 모델 몇 가지를 비교하고, 언제 어떤 모델을 선택하는 것이 좋은지에 대한 가이드라인을 제시합니다.
...
...
@@ -165,7 +242,41 @@ Scikit-learn에는 수많은 머신러닝 모델이 존재합니다. 문제의
이 가이드는 시작점일 뿐이며, 최고의 모델을 찾는 유일한 방법은 **직접 여러 모델을 실험해보고, 교차 검증(Cross-validation)을 통해 성능을 객관적으로 평가하는 것**입니다.
### 5-5. 실제 기업 적용 사례 (Real-world Enterprise Use Cases)
### 5-7. 핵심 개념: 교차 검증 (Cross-Validation)
우리가 데이터를 훈련/테스트 세트로 한 번 나누는 것은 마치 모의고사를 딱 한 번만 보고 수능 점수를 예측하는 것과 같습니다. 이 분할이 어떻게 되었는지에 따라 성능이 우연히 좋거나 나쁘게 나올 수 있습니다.
**교차 검증(Cross-Validation)**은 이 문제를 해결하기 위해 데이터를 여러 번 다른 방식으로 나누어 학습과 평가를 반복하는 방법입니다. 가장 널리 쓰이는 방법은 **K-겹 교차 검증(K-Fold Cross-Validation)**입니다.
1. 전체 데이터를 K개의 '겹(Fold)'으로 나눕니다.
2. 첫 번째 겹을 테스트 데이터로 사용하고, 나머지 K-1개 겹을 훈련 데이터로 사용하여 모델을 학습하고 평가합니다.
3. 두 번째 겹을 테스트 데이터로 사용하고, 나머지를 훈련 데이터로 사용하여 다시 학습하고 평가합니다.
6. 데이터를 훈련/테스트 세트로 분리하고 `StandardScaler`를 적용하여 스케일링하세요.
7.`DecisionTreeClassifier`로 모델을 학습시키고, 테스트 데이터에 대한 **정확도**를 계산하세요.
---
## 7. 심화 토론: 무엇이 잘못될 수 있을까?
Scikit-learn을 사용하면 몇 줄의 코드로 쉽게 모델을 만들 수 있지만, 그 과정에는 수많은 함정이 존재합니다. "동작하는" 코드를 넘어 "올바른" 코드를 작성하기 위해 다음 주제들에 대해 함께 토론해보세요.
...
...
@@ -206,22 +300,16 @@ Scikit-learn을 사용하면 몇 줄의 코드로 쉽게 모델을 만들 수
1.**전처리 순서가 초래한 데이터 누수(Data Leakage)**
-**상황**: 한 동료가 효율성을 위해 전체 데이터셋 `X`에 대해 `StandardScaler`를 먼저 적용(`fit_transform`)한 후, 그 결과를 `train_test_split`으로 나누어 모델을 학습시켰습니다. 코드는 오류 없이 잘 동작했고, 테스트 정확도도 꽤 높게 나왔습니다.
-**토론**:
- 이 접근 방식의 무엇이 치명적인 실수일까요? 테스트셋의 정보가 훈련 과정에 어떻게 "누수"되었을까요?
- 이 접근 방식의 무엇이 치명적인 실수일까요? 테스트셋의 정보가 훈련 과정에 어떻게 "누수"되었을까요? (힌트: `fit` 메소드는 데이터의 평균과 표준편차를 계산합니다.)
- 피처 스케일링과 같은 전처리 단계를 올바르게 적용하는 파이프라인은 어떤 순서로 구성되어야 할까요? 왜 그 순서가 중요한가요?
2.**99% 정확도의 함정: 불균형 데이터 문제**
-**상황**: 어떤 희귀병(전체 환자의 1%)을 예측하는 분류 모델을 만들었습니다. 테스트셋에서 99%의 정확도(Accuracy)를 달성했다고 팀에 보고하자, 한 선임 개발자가 결과에 우려를 표했습니다.
-**토론**:
- 왜 99%의 정확도가 이 상황에서는 매우 나쁜 성능 지표일 수 있을까요? 만약 모델이 무조건 "정상"이라고만 예측한다면, 그 모델의 정확도는 몇 %가 될까요?
- 이처럼 데이터 클래스가 심하게 불균형할 때, 정확도 대신 사용해야 할 더 나은 평가 지표는 무엇이 있을까요? 혼동 행렬(Confusion Matrix), 정밀도(Precision), 재현율(Recall), F1-점수(F1-score)는 각각 어떤 정보를 우리에게 알려주나요?
3.**"완벽한" 테스트 점수에 대한 의심**
2.**"완벽한" 테스트 점수에 대한 의심**
-**상황**: 타이타닉 생존자 예측 문제를 해결하기 위해 여러 모델과 특성을 조합해본 결과, 마침내 제공된 테스트셋에 대해 100%의 정확도를 달성했습니다.
-**토론**:
- 이 결과를 기뻐해야 할까요, 아니면 의심해야 할까요? "완벽한" 점수가 나올 수 있는 잠재적인 원인들은 무엇일까요? (예: 데이터 누수, 너무 작거나 대표성이 없는 테스트셋, 특정 테스트셋에 대한 과적합 등)
- 이 결과를 기뻐해야 할까요, 아니면 의심해야 할까요? "완벽한" 점수가 나올 수 있는 잠재적인 원인들은 무엇일까요? (예: 타겟 변수가 특성에 포함됨, 테스트셋이 너무 작거나 대표성이 없음, 특정 테스트셋에 대한 과적합 등)
- 실제 서비스를 만든다고 가정할 때, 왜 최종 성능 검증을 위해 단 한 번만 사용하는 별도의 "검증(validation) 데이터셋"을 따로 떼어놓는 것이 중요한지 토론해보세요.
4.**특성 중요도(Feature Importance)의 섣부른 해석**
3.**특성 중요도(Feature Importance)의 섣부른 해석**
-**상황**: 고객 이탈 예측을 위해 만든 랜덤 포레스트 모델이 '월 청구요금'을 가장 중요한 특성으로 지목했습니다. 이 결과를 보고, 마케팅팀은 모든 고객의 요금을 인하하는 캠페인을 기획하려 합니다.
-**토론**:
- 이러한 의사 결정이 왜 섣부른 판단일 수 있을까요? 랜덤 포레스트는 특성 중요도를 어떤 방식으로 계산하나요?
...
...
@@ -253,7 +341,7 @@ Scikit-learn을 사용하면 몇 줄의 코드로 쉽게 모델을 만들 수
```
-**`fit_transform()`은 훈련 데이터에만 사용하고, `transform()`은 테스트 데이터에 사용하라는 말이 무슨 뜻인가요?**
-`fit()`은 데이터로부터 스케일링에 필요한 정보(e.g., 평균, 표준편차, 최소/최대값)를 '학습'하는 과정입니다. `transform()`은 학습된 정보를 바탕으로 데이터를 변환합니다. `fit_transform()`은 이 두 과정을 한 번에 수행합니다. 테스트 데이터는 '미래의 데이터'를 의미하므로, 훈련 데이터에서 학습한 '규칙'을 그대로 적용해야 합니다. 따라서 테스트 데이터에는 `fit()`을 다시 사용하지 않고, 훈련 데이터로 `fit()`한 스케일러를 사용하여 `transform()`만 적용해야 합니다.
-`fit()`은 데이터로부터 스케일링에 필요한 정보(e.g., 평균, 표준편차, 최소/최대값)를 '학습'하는 과정입니다. `transform()`은 학습된 정보를 바탕으로 데이터를 변환합니다. `fit_transform()`은 이 두 과정을 한 번에 수행합니다. 테스트 데이터는 '미래의 데이터'를 의미하므로, 훈련 데이터로 `fit()`한 스케일러를 사용하여 `transform()`만 적용해야 합니다.