머신러닝의 이해
Python과 scikit-learn으로 직접 실습해 봅니다.
머신러닝(Machine Learning)은 컴퓨터가 데이터를 이용하여 규칙을 학습하고, 학습한 규칙을 이용해 새로운 데이터의 결과를 예측하는 기술입니다.
일반적인 프로그램에서는 사람이 규칙을 직접 작성합니다.
score = 80
if score >= 60:
print("합격")
else:
print("불합격")
이 프로그램에서 60점 이상이면 합격이라는 규칙은 사람이 직접 만들었습니다.
머신러닝은 다릅니다. 사람이 모든 규칙을 직접 작성하는 대신 컴퓨터에게 여러 데이터를 제공하고, 컴퓨터가 데이터에서 규칙을 찾도록 합니다.
데이터로부터 규칙을 찾아가는 과정을 학습(Training)이라고 합니다.
학습을 통해 만들어진 결과물을 모델(Model)이라고 합니다.
머신러닝은 데이터를 바탕으로 다양한 결과를 예측하거나 분류하는 데 사용할 수 있습니다.
| 입력 데이터 | 머신러닝이 예측하는 것 |
|---|---|
| 아파트 면적, 위치, 층수 | 아파트 가격 |
| 공부 시간 | 시험 점수 |
| 고객의 구매 기록 | 상품 구매 가능성 |
| 이메일 내용 | 스팸 여부 |
| 환자의 검사 데이터 | 질병 가능성 |
| 꽃의 크기 | 꽃의 종류 |
머신러닝 프로그램에서는 데이터가 매우 중요합니다. 좋은 데이터를 충분히 제공해야 좋은 모델을 만들 가능성이 높아집니다.
이 장의 실습은 다음 환경을 기준으로 진행합니다.
- Python
- VS Code
- scikit-learn
- NumPy
- Pandas
- Matplotlib
먼저 실습 파일을 저장할 폴더를 만듭니다.
python_machine_learning
VS Code에서 File → Open Folder → python_machine_learning 순서로 폴더를 엽니다.
VS Code에서 Terminal → New Terminal을 선택한 후 다음 명령을 실행합니다.
python -m venv .venv
Windows에서는 다음 명령으로 가상환경을 활성화합니다.
.venv\Scripts\activate
프로젝트에서 사용하는 Python 라이브러리를 다른 프로젝트와 분리하여 관리할 수 있습니다.
pip install scikit-learn pandas numpy matplotlib
01_test.py 파일을 만들고 설치 여부를 확인합니다.
import sklearn
print("scikit-learn 버전:", sklearn.__version__)
python 01_test.py
버전 번호가 출력되면 정상적으로 설치된 것입니다.
다음과 같은 공부 시간과 시험 점수 데이터가 있다고 가정해 봅시다.
| 공부 시간 | 시험 점수 |
|---|---|
| 1시간 | 50점 |
| 2시간 | 60점 |
| 3시간 | 70점 |
| 4시간 | 80점 |
| 5시간 | 90점 |
사람은 데이터의 규칙을 보고 약 100점이라고 예상할 수 있습니다. 이번에는 컴퓨터가 데이터를 직접 학습하고 예측하도록 만들어 봅니다.
from sklearn.linear_model import LinearRegression # 공부 시간 X = [[1], [2], [3], [4], [5]] # 시험 점수 y = [50, 60, 70, 80, 90] # 머신러닝 모델 생성 model = LinearRegression() # 데이터 학습 model.fit(X, y) # 6시간 공부했을 때 점수 예측 result = model.predict([[6]]) print("예측 점수:", result[0])
python 02_first_ml.py
프로그램에 6시간이면 100점이라는 규칙을 직접 작성하지 않았는데도 기존 데이터를 이용하여 새로운 결과를 예측했습니다.
from sklearn.linear_model import LinearRegression
sklearn은 Python의 머신러닝 라이브러리인 scikit-learn의 패키지 이름입니다.
LinearRegression은 데이터 사이의 관계를 직선 형태로 학습하는 모델입니다.
LinearRegression → 숫자 사이의 관계를 학습하여 새로운 숫자를 예측하는 머신러닝 모델
X = [[1], [2], [3], [4], [5]] y = [50, 60, 70, 80, 90]
4 → 80 5 → 90
머신러닝에서는 보통 입력 데이터를 X, 결과 데이터를 y라고 표현합니다.
model = LinearRegression()
model은 변수 이름이므로 다른 이름을 사용할 수도 있습니다.
ml = LinearRegression() score_model = LinearRegression()
머신러닝에서는 관례적으로 model이라는 이름을 많이 사용합니다.
데이터를 학습하여 규칙을 가지고 있는 객체라고 이해하면 쉽습니다.
model.fit(X, y)
fit()은 데이터를 이용하여 모델을 학습시키는 함수입니다.
↓
model.fit(X, y)
↓
공부 시간과 시험 점수의 관계 학습
fit → 학습
result = model.predict([[6]])
predict는 '예측한다'는 뜻입니다.
model.fit(X, y) → 학습
model.predict(new_data) → 예측
from sklearn.linear_model import LinearRegression X = [[1], [2], [3], [4], [5]] y = [50, 60, 70, 80, 90] model = LinearRegression() model.fit(X, y) result = model.predict([[6], [7], [8]]) print(result)
110점과 120점은 일반적인 시험 점수로는 현실적이지 않습니다.
머신러닝은 학습한 데이터의 관계를 이용하여 계산할 뿐 현실 세계의 모든 조건을 자동으로 이해하는 것은 아닙니다.
따라서 데이터와 결과가 현실적으로 타당한지 사람이 판단해야 합니다.
from sklearn.linear_model import LinearRegression
X = [[1], [2], [3], [4], [5]]
y = [45, 55, 68, 72, 85]
model = LinearRegression()
model.fit(X, y)
result = model.predict([[6]])
print("6시간 공부 예상 점수:", result[0])
머신러닝에서는 알고리즘뿐만 아니라 어떤 데이터를 이용하여 학습했는가도 매우 중요합니다.
숫자만 보는 것보다 그래프를 이용하면 데이터의 관계를 훨씬 쉽게 확인할 수 있습니다.
import matplotlib.pyplot as plt
X = [1, 2, 3, 4, 5]
y = [50, 60, 70, 80, 90]
plt.scatter(X, y)
plt.xlabel("Study Time")
plt.ylabel("Score")
plt.title("Study Time and Score")
plt.show()
scatter()는 데이터를 점으로 표시하는 함수입니다.
plt.scatter(X, y)
머신러닝에서는 모델을 만들기 전에 데이터를 그래프로 확인하는 작업도 매우 중요합니다.
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
X = [[1], [2], [3], [4], [5]]
y = [50, 60, 70, 80, 90]
model = LinearRegression()
model.fit(X, y)
prediction = model.predict(X)
plt.scatter([1, 2, 3, 4, 5], y)
plt.plot([1, 2, 3, 4, 5], prediction)
plt.xlabel("Study Time")
plt.ylabel("Score")
plt.title("Machine Learning")
plt.show()
점 → 실제 데이터
선 → 머신러닝 모델이 학습한 관계
→ ④ 데이터 학습 → ⑤ 새로운 데이터 입력 → ⑥ 결과 예측
# 1. 데이터 준비 X = [[1], [2], [3], [4], [5]] y = [50, 60, 70, 80, 90] # 2~3. 모델 선택 및 생성 model = LinearRegression() # 4. 학습 model.fit(X, y) # 5~6. 새로운 데이터 예측 result = model.predict([[6]])
이 구조는 앞으로 배우게 될 대부분의 머신러닝 프로그램에서도 반복됩니다.
지금까지 사용한 데이터에는 공부 시간과 함께 시험 점수라는 정답이 들어 있었습니다.
2시간 → 60점
3시간 → 70점
이처럼 정답이 있는 데이터를 이용하여 학습하는 방법을 지도학습(Supervised Learning)이라고 합니다.
├─ 회귀(Regression)
└─ 분류(Classification)
회귀(Regression)는 숫자를 예측하는 문제입니다.
- 공부 시간 → 시험 점수 예측
- 아파트 면적 → 아파트 가격 예측
- 광고비 → 매출 예측
분류(Classification)는 데이터가 어떤 종류에 속하는지를 예측합니다.
- 이메일 → 정상 / 스팸
- 사진 → 고양이 / 강아지
- 고객 → 구매 / 구매하지 않음
from sklearn.tree import DecisionTreeClassifier
X = [[1], [2], [3], [4], [5], [6]]
y = [
"불합격", "불합격", "불합격",
"합격", "합격", "합격"
]
model = DecisionTreeClassifier()
model.fit(X, y)
result = model.predict([[5]])
print("예측 결과:", result[0])
| 구분 | 회귀 | 분류 |
|---|---|---|
| 목적 | 숫자 예측 | 종류 예측 |
| 결과 예 | 85.3 | 합격 |
| 예 | 집값 예측 | 스팸 판별 |
| 예 | 매출 예측 | 질병 여부 |
| 예 | 온도 예측 | 고객 이탈 여부 |
내일 매출은 얼마일까? → 숫자를 예측하므로 회귀
이 고객은 상품을 구매할까? → 구매/미구매를 예측하므로 분류
비지도학습(Unsupervised Learning)은 정답이 없는 데이터를 이용하여 데이터 내부의 특징이나 그룹을 찾는 방법입니다.
고객 A → 구매금액 100만원 / 방문 30회
고객 B → 구매금액 10만원 / 방문 5회
고객 C → 구매금액 120만원 / 방문 35회
고객 D → 구매금액 15만원 / 방문 7회
VIP와 일반 고객이라는 정답을 미리 제공하지 않아도 비슷한 고객끼리 그룹으로 나눌 수 있습니다.
↓
그룹 1 / 그룹 2 / 그룹 3
이러한 방법을 군집화(Clustering)라고 합니다.
강화학습(Reinforcement Learning)은 컴퓨터가 행동하고 그 결과에 따라 보상 또는 불이익을 받으면서 더 좋은 행동을 학습하는 방법입니다.
좋은 결과 → 보상
나쁜 결과 → 불이익
↓
더 좋은 행동 학습
강화학습은 게임, 로봇 제어, 자율주행 등의 분야에서 활용됩니다.
| 종류 | 특징 | 예 |
|---|---|---|
| 지도학습 | 정답이 있음 | 점수 예측, 스팸 판별 |
| 비지도학습 | 정답이 없음 | 고객 그룹 분석 |
| 강화학습 | 보상을 이용 | 게임 AI, 로봇 |
from sklearn.linear_model import LinearRegression # 키 X = [[150], [155], [160], [165], [170], [175], [180]] # 몸무게 y = [48, 52, 55, 60, 65, 70, 75] model = LinearRegression() model.fit(X, y) height = 168 result = model.predict([[height]]) print("키:", height) print("예상 몸무게:", result[0])
height 값을 172, 185 등으로 변경하면서 예측 결과가 어떻게 달라지는지 확인해 보세요.
이 예제는 머신러닝의 원리를 익히기 위한 단순한 실습 데이터이며 실제 사람의 적정 몸무게를 판단하는 모델은 아닙니다.
from sklearn.linear_model import LinearRegression # 광고비(만원) X = [[10], [20], [30], [40], [50]] # 매출(만원) y = [100, 180, 260, 350, 430] model = LinearRegression() model.fit(X, y) ad = 60 result = model.predict([[ad]]) print("광고비:", ad, "만원") print("예상 매출:", result[0], "만원")
ad = 70, ad = 100 등으로 변경하면서 예측 결과를 비교해 봅니다.
from sklearn.linear_model import LinearRegression
X = [[10], [20], [30], [40], [50]]
y = [100, 180, 260, 350, 430]
model = LinearRegression()
model.fit(X, y)
ad = int(input("광고비를 입력하세요(만원): "))
result = model.predict([[ad]])
print("예상 매출:", result[0], "만원")
예상 매출: ...
# 데이터 X = ... y = ... # 모델 생성 model = ... # 학습 model.fit(X, y) # 예측 result = model.predict(...) # 결과 print(result)
알고리즘이 변경되어도 기본적인 사용 흐름은 비슷합니다.
# 회귀 model = LinearRegression() # 분류 model = DecisionTreeClassifier()
처음에는 다양한 데이터를 직접 넣고 모델을 학습한 뒤 예측 결과를 확인하면서 머신러닝의 동작 방식을 이해하는 것이 중요합니다.
다음 데이터를 이용하여 6일 동안 운동했을 때 체중 감소량을 예측하는 프로그램을 작성해 보세요.
| 운동 일수 | 체중 감소량 |
|---|---|
| 1 | 0.2 |
| 2 | 0.5 |
| 3 | 0.7 |
| 4 | 1.0 |
| 5 | 1.3 |
LinearRegression을 사용합니다.
다음 데이터를 이용하여 7시간 공부한 학생의 시험 점수를 예측해 보세요.
X = [[1], [2], [3], [4], [5], [6]] y = [45, 52, 61, 68, 78, 85]
실습 2의 프로그램을 수정하여 사용자가 공부 시간을 직접 입력할 수 있도록 만들어 보세요.
예상 시험 점수: 93.2
실제 출력되는 값은 학습 결과에 따라 달라질 수 있습니다.
X = [[1], [2], [3], [4], [5], [6]]
y = [
"불합격", "불합격", "불합격",
"합격", "합격", "합격"
]
사용자가 공부 시간을 입력하면 합격 또는 불합격을 예측하도록 프로그램을 작성해 보세요.
- 머신러닝은 데이터를 이용하여 규칙을 학습하고 새로운 데이터의 결과를 예측한다.
- 데이터로부터 규칙을 찾는 과정을 학습(Training)이라고 한다.
- 학습을 통해 만들어진 결과물을 모델(Model)이라고 한다.
- model.fit(X, y)는 데이터를 이용하여 모델을 학습한다.
- model.predict(new_data)는 학습된 모델을 이용하여 새로운 결과를 예측한다.
- 지도학습에는 회귀와 분류가 있다.
- 회귀는 숫자를 예측하고 분류는 데이터의 종류를 예측한다.
- 비지도학습은 정답 없이 데이터의 특징이나 그룹을 찾는다.
- 강화학습은 행동의 결과에 따른 보상을 이용하여 학습한다.
- 머신러닝에서는 알고리즘뿐 아니라 학습에 사용하는 데이터가 매우 중요하다.