반응형

안녕하세요. Johncom 입니다.

AI 분석 로또 번호 추첨기가 인기있는 글이 되어서 이번에 조금 더 간편한 버전으로 왔습니다.

업그레이드 버전에 앞서 내용들을 알고 싶으시다면 아래 링크 2개 참고하시면

더욱 이해가 빠릅니다.

(상, 하)

https://johncom.tistory.com/71

 

AI 빅데이터 분석을 이용한 로또 번호 예측하기 (상) - GPT와 함께

안녕하세요. JohnComputer 입니다.오늘은 한번 GPT를 이용해서 로또 번호 예측 시스템을 만들어 보려고 해요. 아래는 GPT와 빅데이터 분석에 대한 글들이 있어로또 예측기를 바로 만들고 싶은 분들 (

johncom.tistory.com

 

https://johncom.tistory.com/72

 

AI 빅데이터 분석을 이용한 로또 번호 예측 만들기 (하) - GPT와 함께

(상)편에 이어서Python을 이용하여 실제 번호 예측을 진행해 보겠습니다.#로또번호예측기 코드는 블로그 최하단에 넣어 둘게요.csv파일은 https://johncom.tistory.com/71 AI 빅데이터 분석을 이용한 로또

johncom.tistory.com

 

앞서 Python 설치는 블로그 내에서 확인이 가능합니다. (아래 URL)

https://johncom.tistory.com/49

 

python3 설치 부터 경로 설정까지 (pip, python, 환경 변수, path)

안녕하세요. JohnCom 입니다. 오늘은 제 로컬 PC에 Python3 를 설치를 진행하는데 설치하는 방법을 정리해두면 처음 시작하는 분들에게 도움이 될 것 같아서 이렇게 따로 정리해둘려고 글을 씁니다. "

johncom.tistory.com

 

본격적으로 로또 본허 생성기 (추첨기) 제작을 진행하겠습니다.

 

1. 패키지 설치

pip install numpy
pip install pandas
pip install scikit-learn
pip install tensorflow

- 패키지 설치가 되지 않을 경우 오류를 유발할 수 있습니다.

 

2. 역대 로또 번호 CSV 파일 준비

위 상단 URL 참고하여 Lotto csv 파일 준비

- `lotto.csv` 파일이 필요합니다 (과거 로또 당첨 번호 데이터)
- CSV 파일 형식: 각 행에 회차별 6개의 당첨번호가 포함되어야 합니다

 

3.코드 구성

## 3. 코드 구성 요소 설명

### 데이터 처리 부분
```python
# 데이터 로드 및 전처리
data = pd.read_csv('lotto.csv')
scaler = MinMaxScaler()
data_scaled = scaler.fit_transform(data)
```
- CSV 파일에서 데이터를 읽어옵니다
- MinMaxScaler를 사용하여 데이터를 0~1 사이의 값으로 정규화합니다

### 시계열 데이터 준비
```python
def create_dataset(data, time_steps=1):
    X, y = [], []
    for i in range(len(data) - time_steps):
        X.append(data[i:(i + time_steps)])
        y.append(data[i + time_steps])
    return np.array(X), np.array(y)
```
- 이전 35회차의 데이터를 사용하여 다음 회차를 예측하기 위한 데이터셋을 만듭니다

### LSTM 모델 구성
```python
model = Sequential()
model.add(LSTM(50, return_sequences=True, input_shape=(X.shape[1], X.shape[2])))
model.add(LSTM(50, return_sequences=False))
model.add(Dense(6))
```
- LSTM 레이어 2개와 Dense 레이어 1개로 구성된 딥러닝 모델을 만듭니다
- 최종적으로 6개의 숫자를 출력합니다

### 예측 및 번호 생성
```python
def generate_multiple_predictions(predictions, num_sets=5):
    # 중복되지 않는 6개의 숫자를 5세트 생성
    # 예측값을 기반으로 확률을 계산하여 번호 선택
```
- 학습된 모델의 예측값을 기반으로 5세트의 로또 번호를 생성합니다
- 각 세트는 1~45 사이의 중복되지 않는 6개 숫자로 구성됩니다
- 생성된 번호는 오름차순으로 정렬됩니다

 

4. 번호 추첨 및 소스코드

import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense

# CSV 파일 로드
data = pd.read_csv('lotto.csv')

# 데이터 스케일링
scaler = MinMaxScaler()
data_scaled = scaler.fit_transform(data)

# 시계열 데이터 준비
def create_dataset(data, time_steps=1):
    X, y = [], []
    for i in range(len(data) - time_steps):
        X.append(data[i:(i + time_steps)])
        y.append(data[i + time_steps])
    return np.array(X), np.array(y)

time_steps = 35
X, y = create_dataset(data_scaled, time_steps)
X = X.reshape(X.shape[0], X.shape[1], X.shape[2])

# LSTM 모델 구성
model = Sequential()
model.add(LSTM(50, return_sequences=True, input_shape=(X.shape[1], X.shape[2])))
model.add(LSTM(50, return_sequences=False))
model.add(Dense(6))
model.compile(optimizer='adam', loss='mean_squared_error')

# 모델 학습
model.fit(X, y, epochs=100, batch_size=32, validation_split=0.2)

# 예측
predictions = model.predict(X)

# 원래 스케일로 역변환
predictions_scaled_back = scaler.inverse_transform(predictions)

def generate_multiple_predictions(predictions, num_sets=5):
    all_predictions = []
    
    # 수정된 부분: 확률 배열 생성
    numbers = np.arange(1, 46)  # 1부터 45까지의 숫자
    probabilities = np.ones(45) / 45  # 균등한 확률 분포 사용
    
    for _ in range(num_sets):
        # 중복되지 않는 6개의 숫자 선택
        selected_numbers = np.random.choice(
            numbers,
            size=6,
            replace=False,
            p=probabilities
        )
        # 오름차순 정렬
        sorted_numbers = np.sort(selected_numbers)
        all_predictions.append(sorted_numbers)
    
    return np.array(all_predictions)

# 5세트의 예측 번호 생성
predicted_sets = generate_multiple_predictions(predictions_scaled_back, num_sets=5)

# 결과 출력
print("\n=== 예측된 5세트의 로또 번호 (오름차순) ===")
for i, numbers in enumerate(predicted_sets, 1):
    formatted_numbers = ' '.join(f"{int(num):02d}" for num in numbers)
    print(f"세트 {i}: {formatted_numbers}")

 

- 위 소스코드를 실행하면 원하는 출력값을 얻을 수 있습니다.

 

 

반응형