
선형 회귀분석은 주어진 데이터 포인트에 대해 가장 잘 맞는 직선을 찾는 방법이다. 이 직선은 독립 변수(입력 변수)와 종속 변수(출력 변수) 사이의 선형 관계를 설명한다. 텐서플로(TensorFlow)를 사용하여 선형 회귀 분석을 구현하는 간단한 예제를 작성해 보자. 가상의 데이터를 생성하여 선형 회귀 모델을 학습하고, 학습된 모델을 사용해 새로운 데이터에 대한 예측을 수행한다.
1. 라이브러리 임포트
먼저 필요한 라이브러리를 임포트한다.
import numpy as np
import tensorflow as tf
2. 데이터 생성
선형 회귀 모델을 학습시키기 위해 간단한 가상의 데이터를 생성한다.
# 가상의 데이터 생성
np.random.seed(42)
X = np.random.rand(100, 1) # 100개의 데이터 포인트 (독립 변수)
y = 3.5 * X + 2 + np.random.randn(100, 1) * 0.5 # 실제 값 (종속 변수)
X는 0과 1 사이의 랜덤 값을 가진 100개의 데이터 포인트를 나타내며, 독립 변수다.
y는 X와 3.5의 곱에 2를 더한 값이며, 여기에 약간의 노이즈를 추가하여 실제 데이터처럼 만든다.
3. 선형 회귀 모델 정의
이제 텐서플로를 사용하여 선형 회귀 모델을 정의합니다.
# 모델 정의
model = tf.keras.Sequential([
tf.keras.layers.Dense(1, input_shape=[1]) # 입력이 1개, 출력이 1개인 Dense 레이어
])
# 모델 컴파일
model.compile(optimizer='sgd', loss='mean_squared_error')
tf.keras.Sequential은 순차 모델을 정의하는 방법이다. 여기에 Dense 레이어를 추가하여 선형 회귀 모델을 구성한다. 이 레이어는 단일 입력과 단일 출력을 가지며, 가중치(W)와 바이어스(b)를 학습하게 된다. 모델은 확률적 경사 하강법(SGD)을 사용해 최적화되며, 손실 함수로 평균 제곱 오차(MSE, Mean Squared Error)를 사용한다.
4. 모델 학습
이제 생성한 가상의 데이터를 사용해 모델을 학습시킨다.
# 모델 학습
model.fit(X, y, epochs=100)
5. 모델 예측
학습된 모델을 사용하여 새로운 데이터에 대한 예측을 수행한다.
# 새로운 데이터에 대한 예측
X_new = np.array([[0.5]])
y_pred = model.predict(X_new)
print(f"입력: {X_new}, 예측된 출력: {y_pred}")
X_new에 새로운 입력 데이터를 정의하고, predict 메서드를 사용해 예측값을 계산한다.
6. 결과 확인
학습된 모델의 가중치와 바이어스를 확인해 본다.
# 학습된 모델의 가중치와 바이어스 확인
W, b = model.layers[0].get_weights()
print(f"학습된 가중치: {W}, 학습된 바이어스: {b}")
학습된 가중치(W)와 바이어스(b)는 모델이 데이터에 가장 잘 맞도록 학습된 값이다.
7. 전체 코드
모든 단계의 코드를 하나의 코드로 작성했다.
import numpy as np
import tensorflow as tf
# 데이터 생성
np.random.seed(42)
X = np.random.rand(100, 1)
y = 3.5 * X + 2 + np.random.randn(100, 1) * 0.5
# 모델 정의
model = tf.keras.Sequential([
tf.keras.layers.Dense(1, input_shape=[1])
])
# 모델 컴파일
model.compile(optimizer='sgd', loss='mean_squared_error')
# 모델 학습
model.fit(X, y, epochs=100)
# 새로운 데이터 예측
X_new = np.array([[0.5]])
y_pred = model.predict(X_new)
print(f"입력: {X_new}, 예측된 출력: {y_pred}")
# 학습된 가중치와 바이어스 확인
W, b = model.layers[0].get_weights()
print(f"학습된 가중치: {W}, 학습된 바이어스: {b}")
실행 결과
Epoch 1/100
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 983us/step - loss: 15.5896
Epoch 2/100
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 820us/step - loss: 13.9116
Epoch 3/100
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 892us/step - loss: 10.8053
Epoch 4/100
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 844us/step - loss: 9.4827
Epoch 5/100
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 820us/step - loss: 7.5100
Epoch 6/100
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 818us/step - loss: 6.1588
Epoch 7/100
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 866us/step - loss: 5.1334
Epoch 8/100
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 875us/step - loss: 4.3614
Epoch 9/100
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 820us/step - loss: 3.8173
Epoch 10/100
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 815us/step - loss: 2.9027
Epoch 11/100
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 871us/step - loss: 2.5967
Epoch 12/100
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 883us/step - loss: 2.2075
Epoch 13/100
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 901us/step - loss: 1.9884
...
4/4 ━━━━━━━━━━━━━━━━━━━━ 0s 835us/step - loss: 0.3371
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 16ms/step
입력: [[0.5]], 예측된 출력: [[3.7501862]]
학습된 가중치: [[1.9977674]], 학습된 바이어스: [2.7513025]
8. 시각화
그럼 이제 가상으로 생성한 데이터와 학습된 모델이 예측한 회귀선을 그려보자.
한글이 깨지지 않고 잘 표시되도록 matplotlib에 한글 폰트를 설정한다.
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
# 한글 폰트 설정
plt.rc('font', family='Nanum Gothic') # 맑은 고딕 폰트를 사용
plt.rcParams['axes.unicode_minus'] = False # 마이너스(-) 기호가 깨지는 것을 방지
X에 대한 예측을 수행하고 이를 시각화하려면 X 값을 정렬한 후 이에 따라 예측값을 얻어야 한다. 회귀선이 잘 표시되도록 X를 정렬하여 예측을 수행한다.
# X를 정렬하여 예측 수행
X_sorted = np.sort(X, axis=0)
y_pred = model.predict(X_sorted)
데이터를 파란색 점으로 표시한다. 그리고 예측된 회귀선을 빨간색 선으로 표시한다.
# 학습 데이터 및 회귀선 시각화
plt.figure(figsize=(10, 6))
plt.scatter(X, y, color='blue', label='데이터') # 실제 데이터
plt.plot(X_sorted, y_pred, color='red', label='회귀선') # 정렬된 X에 대한 예측된 회귀선
plt.xlabel('X')
plt.ylabel('y')
plt.title('선형 회귀 분석')
plt.legend()
plt.show()
그래프를 통해 데이터와 모델이 얼마나 잘 맞는지 시각적으로 확인할 수 있다.


'✨ 딥러닝·머신러닝' 카테고리의 다른 글
| BMI 비만도 예측 - TensorFlow로 키와 몸무게 분류하기 (0) | 2026.06.16 |
|---|---|
| TensorFlow - 텐서플로를 사용하여 MNIST 예제를 실행 (0) | 2026.06.16 |
| 사이킷런 - 지도학습으로 붓꽃의 품종을 판별 (0) | 2026.06.16 |
| 사이킷런 - 분류 알고리즘으로 붓꽃(iris)의 품종을 판별 (0) | 2026.06.15 |
| 케라스(Keras) - 최소한의 코드로 딥러닝을 구현한다 (0) | 2026.06.15 |
댓글