對雙色球結果預測的一次無聊的嘗試


今天晚上突然腦子不知怎么的,本來正在人工給12306驗證碼做打標工作,突然想看看雙色球每期的開獎結果是否有規律

這里下載從03年到今年的每期雙色球開獎結果

用t-SNE降維到3維打印出來看看

似乎並沒有什么規律

准備用線性回歸來擬合一個模型,馬上就有一個問題,對於雙色球預測,自變量取什么?這是個非常復雜的問題了,而且可能是無解的問題,因為如果雙色球是完全的獨立隨機事件,那也就無法提取出自變量,自然也就沒法提取特征空間,這里姑且用開獎期號作為自變量特征,用結果(6維的紅球結果,1維的藍球結果)作為label

# -*- coding: utf-8 -*-

import os
import numpy as np
import matplotlib.pyplot as plt
import pickle
from sklearn.manifold import TSNE
from mpl_toolkits.mplot3d import Axes3D
from sklearn import datasets, linear_model
from sklearn.metrics import mean_squared_error, r2_score

def load_historydata():
    if not os.path.isfile("ssq.pkl"):
        ori_data = np.loadtxt('ssq.TXT', delimiter=' ', usecols=(0, 2, 3, 4, 5, 6, 7, 8), unpack=False)
        pickle.dump(ori_data, open("ssq.pkl", "w"))
        return ori_data
    else:
        ori_data = pickle.load(open("ssq.pkl", "r"))
        return ori_data

def load_tsnedata(ori_data):
    if not os.path.isfile("ssq_tsne.pkl"):
        tsne = TSNE(n_components=3, random_state=0)
        tsne_data = tsne.fit_transform(ori_data)
        pickle.dump(tsne_data, open("ssq_tsne.pkl", "w"))
        return tsne_data
    else:
        tsne_data = pickle.load(open("ssq_tsne.pkl", "r"))
        return tsne_data

def show_oridata(show_date):
    fig = plt.figure(1, figsize=(8, 6))
    ax = Axes3D(fig, elev=-150, azim=110)
    ax.scatter(show_date[:, 0], show_date[:, 1], show_date[:, 2], edgecolor='k', s=40)
    plt.show()

if __name__ == '__main__':
    ori_data = load_historydata()
    np.random.shuffle(ori_data)
    # tsne_data = load_tsnedata(ori_data)
    # show_oridata(tsne_data)

    X_data = ori_data[:, 0].reshape(-1, 1)
    Y_data = ori_data[:, 1:]
    print "X_data[0]: ", X_data[0]
    print "Y_data[0]: ", Y_data[0]

    # Split the data into training/testing sets
    split_len = int(len(X_data) * 0.8)
    X_train = X_data[:split_len]
    X_test = X_data[split_len:]
    print "X_train"
    print X_train

    # Split the targets into training/testing sets
    y_train = Y_data[:split_len]
    y_test = Y_data[split_len:]
    print "y_train"
    print y_train

    # Create linear regression object
    regr = linear_model.LinearRegression()

    # Train the model using the training sets
    regr.fit(X_train, y_train)

    # Make predictions using the testing set
    #y_pred = regr.predict(X_train).round()
    y_pred = regr.predict(X_test).round()
    print "y_pred"
    print y_pred

    print "y_pred distinct"
    y_pred_cache = list()
    for line in y_pred:
        line = list(line)
        if line not in y_pred_cache:
            y_pred_cache.append(line)
    for line in y_pred_cache:
        print line

    # 預測的准確度
    print "Prediction accurate: {0}%".format(np.mean(X_test == y_pred) * 100)

線性回歸的預測結果如下

y_pred distinct
[5.0, 9.0, 14.0, 19.0, 24.0, 29.0, 9.0]
[5.0, 10.0, 15.0, 19.0, 24.0, 29.0, 9.0]
[5.0, 10.0, 14.0, 19.0, 24.0, 29.0, 9.0]

模型對所有的training set的每一條預測結果都相同,這說明,對於開獎期號來說,開獎結果是一個完全隨機的事件

如果考慮每期和每期之間可能有關聯性,可以考慮試試用RNN來訓練,輸入依然是開獎期號

但是反過來也給了我一個啟示,在進行機器學習項目的時候,如果train或者test的結果不好或者不符合預期,不要急於去調參數或者換模型,更應該回過頭來想想自己給模型輸入的特征是否確實隱含了規律,算法是無法對隨機事件進行預測的,只有原始數據中確實隱含了規律,使用適當的模型才能從中抽象出模型,特征工程是非常關鍵的,也是需要長久思考的

Relevant Link:

https://datachart.500.com/ssq/history/history.shtml
http://blog.csdn.net/supperman_009/article/details/40623503
https://zhuanlan.zhihu.com/p/26341086
http://ssq.50018.com/zou-shi-tu/default.aspx
http://www.sohu.com/a/134552307_116235


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM