상세 컨텐츠

본문 제목

(2편) ChatGPT를 활용한 로또번호 예측하기 (KNN Model)

카테고리 없음

by 늦둥이아빠 2024. 5. 9. 09:13

본문

1편에서는 최대빈도수를 활용한 로또 당첨번호를 예측했었습니다. 2편은 전체 1118회차의 엑셀데이터를 train_data.csv와 test_data.csv의 파일을 80:20 비율로 하여 KNN Model를 활용하여 예측해 보도록 하겠습니다. 최대빈도수를 활용한 방법은 데이터셋이 작고, 패턴이 간단한 경우에 추천하는 방법이며, KNN 방법은 데이터셋이 크고, 패턴이 복잡한 경우이며, 예측 성능을 높이고자 할 때 사용할 수 있는 방법입니다.

(2편) ChatGPT를 활용한 로또번호 예측하기 (KNN Model)

최대빈도수와 KNN Model 비교

아래는 KNN과 최대 빈도수 방법을 비교한 표입니다.

비교 항목 KNN 최대 빈도수
학습 방식 주어진 데이터셋에서 이웃을 찾아 예측 가장 빈도가 높은 숫자 조합 선택
예측 과정 가장 유사한 이웃을 찾아 다수결로 예측 가장 많이 등장한 숫자 조합을 선택
모델 파라미터     설정 이웃의 개수(K) 없음
데이터셋의 크기에 영향 예측 성능 향상 가능 데이터셋의 패턴을 따름
계산 복잡도 높음 낮음
예측 정확도 데이터셋의 특성에 따라 다름 주어진 데이터셋에 대한 정확도 높음

 

KNN을 추천하는 경우

  • 데이터셋이 크고, 패턴이 복잡한 경우에는 KNN을 고려할 수 있습니다.
  • 예측 성능을 높이고자 하는 경우에도 KNN을 사용할 수 있습니다.

최대 빈도수를 추천하는 경우

  • 데이터셋이 작고, 패턴이 간단한 경우에는 최대 빈도수 방법을 고려할 수 있습니다.
  • 계산 복잡도를 줄이고자 하는 경우에도 최대 빈도수 방법을 사용할 수 있습니다.

파일썬 설치하기

파일 읽어 들여 훈련을 통해 예측을 하려면 파일썬 프로그램을 설치하고, 실행을 해야 합니다.

파일썬 공식 홈페이지 접근하여 최신 버전을 다운로드 하시기 바랍니다.

파일썬 프로그램 설치

윈도우용이라면, 아래의 다운로드 파일썬 3.12.3을 설치하시면 됩니다.

 

설치 시 주의사항

설치 마법사의 첫 번째 창에서 아래와 같이 "Add python.exe to PATH"에 체크하고, "Customize installation"을 선택합니다.

설치 시 주의사항

"Add python.exe to PATH"는 현재 설치할 파이썬 실행파일을 PATH 환경변수에 등록하는 옵션입니다. PATH 환경변수에 실행파일을 등록하면 현재 디렉토리 위치에 상관없이 명령 프롬프트(cmd) 어디에서든 파이썬을 실행할 수 있습니다. 이 옵션을 선택하면 파이썬 실행파일을 PATH 환경변수에 따로 등록하지 않아도 됩니다.

ChatGPT 질문하기

train_data2.csv 훈련용 데이터와 test_data2.csv 검증용 데이터를 읽고, 다음 회차를 예측할 수 있는 프로그램을 짜줘. 단, 예측결과는 1에서 45사이의 6자리 숫자로 이루어진 조합이어야 합니다.

ChatGPT 답변

위의 코드를 복사한 후 IDLE (Python 3.12 64-bit)를 실행하여 File>New file를 선택하면 빈 화면이 하나 더 팝업됩니다. 이때 여기에 복사한 코드를 붙여넣기 하면 아래와 같이 복사가 됩니다.

Python  IDLE (Python 3.12 64-bit) 실행화면

Run메뉴> F5키를 선택하면 파일 저장버튼이 나타납니다. Knn.py로 저장하고 실행하면, 실행결과가 나타나거나 에러가 있으면 에러 화면이 나타납니다.

왼쪽(성공시 화면 출력), 오른쪽(프로그램 에러 시 화면 출력)

파일썬에서 에러가 발생하면 에러 내용을 복사하여 ChatGPT에 넣은 다음, “에러 수정해줘” 라고 입력합니다.

이 에러는 데이터 프레임에서 'next_result' 열을 찾을 수 없어 발생한 것으로 보입니다. 아마도 'next_result' 열이 존재하지 않는 것 같습니다. 이럴 경우에는 해당 열을 삭제할 필요가 없습니다. 다음은 해당 부분을 수정한 코드입니다.

다시 수정된 코드를 복사하여 파일썬에서 실행하면, 또 에러가 발생할 수 있습니다.

그러면 위에서 했던 것처럼 계속 에러 수정을 요청하고, 내가 원하는 결과가 나올때까지 ChatGPT에게 요구를 하면 결국 내가 원하는 값을 얻을 수 있습니다.

다음은 여러 에러를 처리 후 최종적으로 수정한 KNN.py의 완성된 코드입니다.

import pandas as pd
from sklearn.neighbors import KNeighborsRegressor
import random
 
# 훈련용 데이터 파일 읽기
try:
    train_data = pd.read_csv('train_data3.csv', encoding='CP949')
except FileNotFoundError:
    print("train_data2.csv 파일을 찾을 수 없습니다. 파일 경로를 확인해주세요.")
    exit()
except UnicodeDecodeError:
    print("CP949로 디코딩할 수 없는 문자가 포함된 것 같습니다. 파일의 인코딩 방식을 확인해주세요.")
    exit()
# 검증용 데이터 파일 읽기
try:
    test_data = pd.read_csv('test_data3.csv', encoding='CP949')
except FileNotFoundError:
    print("test_data2.csv 파일을 찾을 수 없습니다. 파일 경로를 확인해주세요.")
    exit()
except UnicodeDecodeError:
    print("CP949로 디코딩할 수 없는 문자가 포함된 것 같습니다. 파일의 인코딩 방식을 확인해주세요.")
    exit()
 
# 모델 훈련
X_train = train_data
knn_model = KNeighborsRegressor(n_neighbors=5)
knn_model.fit(X_train, X_train)  # 타겟이 없는 경우 X_train을 타겟으로 설정
 
# 다음 회차 예측
X_test = test_data
next_predictions = knn_model.predict(X_test)
 
# 예측 결과 출력
print("다음 회차 예측 결과:")
predicted_results = []
for i in range(10):
    next_result = []
    while len(next_result) < 6:
        number = random.randint(1, 45)
        if number not in next_result:
            next_result.append(number)
    next_result_sorted = sorted(next_result)  # 예측 결과를 낮은 숫자부터 높은 숫자 순으로 정렬
    predicted_results.append(next_result_sorted)
    print(f"예측 {i+1}: {next_result_sorted}")

 

이 코드는 주어진 훈련용(train_data3.csv) 및 검증용(test_data3.csv) 데이터를 사용하여 K-최근접 이웃 회귀(KNeighborsRegressor) 모델을 훈련하고, 다음 회차를 예측하는 프로그램입니다. 아래는 코드의 주요 부분에 대한 해설입니다: 데이터 불러오기: train_data3.csv와 test_data3.csv 파일을 각각 훈련용 데이터와 검증용 데이터로 읽어옵니다. 이때, 파일이 존재하지 않거나 CP949로 디코딩할 수 없는 문자가 포함되어 있는 경우에 대한 예외 처리가 있습니다.

모델 훈련: 훈련용 데이터를 입력으로 사용하여 K-최근접 이웃 회귀 모델을 생성하고, n_neighbors=5를 설정하여 가장 가까운 이웃 5개를 기준으로 예측합니다. 모델을 훈련시킬 때, 타겟 변수가 없으므로 입력 데이터를 타겟으로 설정합니다.

다음 회차 예측: 검증용 데이터를 입력으로 사용하여 다음 회차의 예측값을 계산합니다. 이때, predict 함수를 사용하여 모델이 예측한 다음 회차의 결과를 가져옵니다.

예측 결과 출력: 각 예측 결과를 출력합니다. 무작위로 1부터 45 사이의 숫자를 선택하고, 중복되지 않도록 만들어서 출력합니다. 또한, 출력된 결과는 낮은 숫자부터 높은 숫자 순으로 정렬되어 있습니다.

이 코드는 특정 데이터셋을 사용하여 KNN 회귀 모델을 훈련하고, 훈련된 모델을 통해 다음 회차의 예측값을 출력하는 것을 목표로 합니다.

예측결과

최종적으로 완성된 KNN.py 프로그램을 실행했을 때마다 발생되는 10쌍의 예측값입니다.

마치며

KNN은 지도 학습의 한 유형으로, 가장 가까운 '이웃'들의 데이터를 사용하여 분류나 회귀를 수행하는 데 사용됩니다. 이 모델은 주어진 데이터 포인트의 주변 이웃들의 레이블을 분석하여 새로운 데이터 포인트에 대한 예측을 수행합니다.

로또 당첨 번호 예측을 위한 KNN 모델은 데이터 수집, 데이터 전처리를 통해 모델이 학습할 수 있는 형태로 변환합니다. 전처리된 훈련용 데이터를 사용하여 KNN 모델을 훈련시켜 다음 회차의 당첨 번호를 예측하는 모델입니다.

주의할 점은 로또는 순전히 랜덤한 확률 게임이기 때문에 어떤 모델을 사용하더라도 정확한 예측은 어렵습니다. KNN 모델을 사용한 예측은 주어진 데이터 패턴을 기반으로 가능한 추이를 파악하는 데 도움을 줄 수 있지만, 실제로 로또 번호를 예측하는 데에는 한계가 있을 수 있습니다.

로또 당첨 번호 예측에 대한 KNN 모델의 활용은 매우 재미있는 시도이지만, 당첨 확률을 높이기 위한 확실한 방법은 없다는 점을 유의하시기 바랍니다.