지난 포스팅에서는 회귀 분석 이론을 바탕으로 랜덤 포레스트라는 모델을 사용해서 로또 예측 프로그램을 만들어봤습니다. 이번 포스팅에서는 MPL(다중 퍼셉트론)을 활용해서 로또 예측 프로그램을 역시 심심풀이로 만들어보겠습니다. 이번에는 제가 5장을 구매하기 위해서 5게임을 뽑아주는 로또 예측 프로그램을 만들어어야 했습니다. 완성하자마자 예측 번호를 받고 로또를 구매했습니다.😁
import pandas as pd
import numpy as np
import tensorflow as tf
from sklearn.model_selection import train_test_split
from tensorflow import keras
from tensorflow.keras import layers
# 과거 로또 번호 데이터를 로드합니다. (lotto_data.csv 파일을 사용합니다)
df = pd.read_csv('lotto_history.csv')
# 데이터 전처리: 입력과 출력 데이터를 준비합니다.
X = df.iloc[:, :-1] # 입력 데이터: 마지막 열을 제외한 모든 열
y = df.iloc[:, -1] # 출력 데이터: 마지막 열 (다음 회차의 로또 번호)
# 레이블 값 수정: [0, 45) 범위 내의 정수로 수정
y = y - 1 # 모든 레이블 값을 1씩 감소하여 [0, 44] 범위로 수정
# 데이터를 훈련 세트와 테스트 세트로 나눕니다.
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 모델 생성: MLP 모델을 생성합니다.
def create_model():
model = keras.Sequential([
layers.Dense(128, activation='swish', input_shape=(X_train.shape[1],)),
layers.Dense(128, activation='swish'),
layers.Dense(128, activation='swish'),
layers.Dense(128, activation='swish'),
layers.Dense(128, activation='swish'),
layers.Dense(128, activation='swish'),
layers.Dense(45, activation='softmax') # 출력 레이어: 0부터 44까지의 번호를 예측
])
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
return model
num_sets = 5 # 생성할 로또 번호 세트 개수
predictions = []
for _ in range(num_sets):
model = create_model() # 새로운 모델 생성
model.fit(X_train, y_train, epochs=100, batch_size=32, validation_split=0.2) # 모델 훈련
next_round_predictions = model.predict(X_test.iloc[:6])
# 예측 결과에 1을 더하여 [1, 45] 범위로 복원
next_round_predictions = np.argsort(next_round_predictions, axis=1)[:, -6:] + 1
# 중복 제거 및 정렬
unique_numbers = np.unique(next_round_predictions)
sorted_numbers = np.sort(unique_numbers)
# 6개의 번호를 예측 결과에 추가
predictions.append(sorted_numbers[:6])
# 예측한 5세트의 번호 출력
for i, prediction in enumerate(predictions):
print(f'세트 {i+1}: {prediction}')
과거 로또 데이터 자료를 준비하고, 해당 코드를 실행시키면 전 포스팅에서 랜덤 포레스트로 만든 코드보다 처리 속도가 상당히 느리다는 것을 알 수 있습니다. 그 이유도 전 포스팅에서 대략적으로 설명드렸으니, 한 번 확인해보세요.
MLP(Multi-Layer Perceptron) 모델 역시 회귀 분석에서도 사용은 하지만 회귀 분석보다는 주로 분류(classification)와 같은 분류 문제에 사용되는 신경망 모델입니다.
어떻게 보면, 로또 번호를 예측하는 프로그램에는 MLP보다는 전 포스팅처럼 회귀 분석을 통해서 예측하는 게 맞을 것입니다. 그런데 로또 번호를 예측한다는 것 자체가 말이 안됩니다. 그냥 심심풀이로 해보는 거죠.
위 코드의 포인트는 확률 분포를 얻고 확률을 예측하고 가장 높은 확률을 가진 클래스를 선택하고 마지막으로 예측을 수행하는 프로세싱인데, 말이 좀 어렵죠? 확률 분포를 계산하지 않으면 숫자 6개를 뽑기가 불가능할 것입니다. 아무튼 그러한 이유로 소프트맥스(softmax)라는 활성화 함수를 활용했습니다.