MLP를 활용한 로또 예측 프로그램

지난 포스팅에서는 회귀 분석 이론을 바탕으로 랜덤 포레스트라는 모델을 사용해서 로또 예측 프로그램을 만들어봤습니다. 이번 포스팅에서는 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)라는 활성화 함수를 활용했습니다.

More from author

Related posts

60코딩 커뮤니티spot_img

Latest posts

회귀 분석을 활용한 로또 예측 프로그램

import pandas as pd import numpy as np from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestRegressor # CSV 파일에서 과거 로또 번호 데이터 로드 (예: lotto_history.csv) # CSV 파일에는...

‘기초~중급 Python 문법’ 정모(2022.03.04)

최근에 기초~중급 수준의 내용으로 정모를 가졌어요. 물론, 저희 60coding은 클래스 모임이 아닌 코딩 공부(주제는 미리 공지) 리뷰와 잡담 위주의 모임을 추구합니다. 60Coding의 최민진 멘토님이...

파이썬 람다(Lambda) & Map 함수 #2

지난 콘텐츠에서는 람다(Lambda)와 Map을 살짝 살펴봤어요. 람다와 맵은 같이 사용하는 경우가 많고, 또 다른 Reduce() 역시 람다, 맵 함수와 같이 많이 사용하게 됩니다. 우선...