質問編集履歴
3
修正
title
CHANGED
File without changes
|
body
CHANGED
@@ -178,7 +178,7 @@
|
|
178
178
|
next_prediction = model.predict(latest_x)
|
179
179
|
next_prediction = scaler.inverse_transform(next_prediction)
|
180
180
|
#予測結果を出力
|
181
|
-
print("次の当選番号の予測は: {}".format(e[round(next_prediction[0][0])]))
|
181
|
+
print("次の当選番号の予測は: {}".format(e[np.round(next_prediction[0][0])]))
|
182
182
|
|
183
183
|
#測定時間を出力
|
184
184
|
print("時間: {0:.1f}sec".format(time.time() - START_TIME))
|
2
修正
title
CHANGED
File without changes
|
body
CHANGED
@@ -1,40 +1,29 @@
|
|
1
1
|
pythonで機械学習、深層学習によって宝くじ当選番号予測プログラム ロト7Versionを作っています。
|
2
2
|
参考資料は[こちら](https://www.microstone.info/ai技術で宝くじ当選番号を予測、億万長者の夢を実/)
|
3
|
-
下記のコードを実行するとこうなりました。
|
4
3
|
(実行時は時間短縮のためself.epochsを1にしています。)
|
5
|
-
Train Score: 0.223 RMSE
|
6
|
-
Test Score: 0.216 RMSE
|
7
|
-
次の当選番号の予測は: 3767366844416
|
8
|
-
Time: 41.3sec
|
9
4
|
|
10
|
-
|
5
|
+
整理整頓しました。
|
11
|
-
当選番号の表示を第1数字,第2数字...とカンマ区切りで表示させたいのですが、うまくできません。データを一次元配列化しているからできないのでしょうか?
|
12
|
-
また、本来ロト7の最大数値は37までなのですが、3767366844416 こちらをどこで区切ってもとてつもない数字になってしまいます。例えば 3,76,73 や 37,67,36のように 37以上表示されていると思いますがこれはおかしいですよね。機械学習、深層学習ってそういうものなんですか?
|
13
6
|
|
7
|
+
質問
|
8
|
+
個人的にパラメータの部分がよくわからないのですが、コメントのような理解でよろしいでしょうか?self.units = 6これについては何の意味があるのか 単位?単位が6?
|
9
|
+
|
14
10
|
ロト7のcsvは[こちら](https://loto7.thekyo.jp/download/index)からダウンロードしています。ボーナス数字以下については使わないため、削除しています。
|
15
11
|
|
16
|
-
もう一つ解決方法として思いついたのが
|
17
|
-
現在第1~第7までの数値を一つに合体しているため、第1数字が一桁の場合、合体すると13桁の場合もあれば14桁の場合もあります。
|
18
|
-
そこで、csvをロードしたときに、一桁の数字があれば、頭に0をつけるようにプログラムすれば全てが14桁になり、カンマ区切りで区別しなくともわかるようになると思います。
|
19
|
-
”csvを読み込んだ後に頭に一桁があれば0をつける”
|
20
|
-
こちらをプログラムで行うにはどのようにすればいいのでしょうか。
|
21
|
-
excelで行う方法はいくつかありましたが、プログラムはわかりませんでした。
|
22
12
|
|
23
|
-
|
24
|
-
個人的にパラメータの部分がよくわからないのですが、コメントのような理解でよろしいでしょうか?self.units = 6これについては何の意味があるのか 単位?単位が6?
|
25
|
-
|
26
13
|
```python
|
27
14
|
#各インポート宣言
|
28
15
|
#numpy 数値計算を効率的に行うためのライブラリ
|
29
16
|
#pandas データ分析を効率的に行うためのライブラリ
|
30
17
|
#tflearn 深層学習ライブラリ
|
31
18
|
#time 時刻に関するさまざまな関数を提供
|
19
|
+
#itertools 効率的なループ実行のためのイテレータ生成関数
|
32
20
|
#sklearn 機械学習ライブラリ
|
33
21
|
#preprocessing 前処理用のライブラリ
|
34
22
|
import numpy as np
|
35
23
|
import pandas as pd
|
36
24
|
import tflearn
|
37
25
|
import time
|
26
|
+
import itertools
|
38
27
|
from sklearn import preprocessing
|
39
28
|
|
40
29
|
#予測LSTMクラス
|
@@ -43,16 +32,16 @@
|
|
43
32
|
#LSTM訓練パラメータ
|
44
33
|
#steps_of_history いくつ前のデータまでを学習に用いるか
|
45
34
|
#steps_of_history いくつ先のデータを予測するか
|
46
|
-
|
35
|
+
#units よくわからない
|
47
36
|
#epochs 一つの訓練データを何回繰り返して学習させるか
|
48
37
|
#batch_size バッチサイズ
|
49
38
|
self.steps_of_history = 10
|
50
39
|
self.steps_of_future = 1
|
51
40
|
self.units = 6
|
52
|
-
self.epochs =
|
41
|
+
self.epochs = 1
|
53
42
|
self.batch_size = 1
|
54
43
|
|
55
|
-
|
44
|
+
#データセット作成
|
56
45
|
def create_dataset(self,data):
|
57
46
|
x,y = [],[]
|
58
47
|
for i in range(0,len(data) - self.steps_of_history,self.steps_of_future):
|
@@ -63,7 +52,7 @@
|
|
63
52
|
y = np.reshape(np.array(y),[-1,1])
|
64
53
|
return x,y
|
65
54
|
|
66
|
-
|
55
|
+
#予測データ作成
|
67
56
|
def create_predict_dataset(self,data):
|
68
57
|
latest_x = np.array([data[-self.steps_of_history:]])
|
69
58
|
latest_x = np.reshape(latest_x,(-1,self.steps_of_history,1))
|
@@ -120,16 +109,28 @@
|
|
120
109
|
#処理の速さを図る
|
121
110
|
START_TIME = time.time()
|
122
111
|
|
123
|
-
#
|
112
|
+
#1~37までの数字を用意
|
124
|
-
|
113
|
+
a = {m for m in range(1,38)}
|
114
|
+
d = {tuple(p): i for i, p in enumerate(itertools.combinations(a,7))}
|
115
|
+
e = {v: k for k, v in d.items()}
|
116
|
+
|
125
117
|
dataframe = pd.read_csv("./loto7.csv",encoding='cp932')
|
126
118
|
dataframe = dataframe[["第1数字","第2数字","第3数字","第4数字","第5数字","第6数字","第7数字"]]
|
119
|
+
data = dataframe.index.map(
|
120
|
+
lambda _:d[ tuple(sorted(
|
121
|
+
[(dataframe.第1数字[_]),
|
122
|
+
(dataframe.第2数字[_]),
|
123
|
+
(dataframe.第3数字[_]),
|
124
|
+
(dataframe.第4数字[_]),
|
125
|
+
(dataframe.第5数字[_]),
|
126
|
+
(dataframe.第6数字[_]),
|
127
|
+
(dataframe.第7数字[_])
|
128
|
+
]
|
129
|
+
))
|
130
|
+
]
|
131
|
+
)
|
132
|
+
data = data.values.reshape(data.shape[0], 1).astype(dtype=np.float32)
|
127
133
|
|
128
|
-
#読み込んだデータを文字列に結合して数値型に変換
|
129
|
-
#データを一次元配列化 データタイプはfloat32
|
130
|
-
data = dataframe.index.map(lambda _:int(str(dataframe.第1数字[_]) + str(dataframe.第2数字[_]) + str(dataframe.第3数字[_]) + str(dataframe.第4数字[_]) + str(dataframe.第5数字[_]) + str(dataframe.第6数字[_]) + str(dataframe.第7数字[_])))
|
131
|
-
data = data.values.reshape(data.shape[0],1).astype(dtype = np.float32)
|
132
|
-
|
133
134
|
#正規化
|
134
135
|
#データが0~1に入るよう変換
|
135
136
|
#fit_transform()について
|
@@ -172,12 +173,13 @@
|
|
172
173
|
#予測
|
173
174
|
#latest_xにcreate_predict_datasetの処理を正規化したデータを用いて行う
|
174
175
|
#次の予測に訓練データをlatest_xを用いて行う
|
175
|
-
#
|
176
|
+
#予測に正規化のinverse_transformを”次の予測”を用いて行う
|
176
177
|
latest_x = lstm.create_predict_dataset(data)
|
177
178
|
next_prediction = model.predict(latest_x)
|
178
179
|
next_prediction = scaler.inverse_transform(next_prediction)
|
180
|
+
#予測結果を出力
|
179
|
-
print("次の当選番号の予測は: {
|
181
|
+
print("次の当選番号の予測は: {}".format(e[round(next_prediction[0][0])]))
|
180
182
|
|
181
|
-
#
|
183
|
+
#測定時間を出力
|
182
|
-
print("
|
184
|
+
print("時間: {0:.1f}sec".format(time.time() - START_TIME))
|
183
185
|
```
|
1
追加
title
CHANGED
File without changes
|
body
CHANGED
@@ -13,7 +13,14 @@
|
|
13
13
|
|
14
14
|
ロト7のcsvは[こちら](https://loto7.thekyo.jp/download/index)からダウンロードしています。ボーナス数字以下については使わないため、削除しています。
|
15
15
|
|
16
|
+
もう一つ解決方法として思いついたのが
|
17
|
+
現在第1~第7までの数値を一つに合体しているため、第1数字が一桁の場合、合体すると13桁の場合もあれば14桁の場合もあります。
|
18
|
+
そこで、csvをロードしたときに、一桁の数字があれば、頭に0をつけるようにプログラムすれば全てが14桁になり、カンマ区切りで区別しなくともわかるようになると思います。
|
19
|
+
”csvを読み込んだ後に頭に一桁があれば0をつける”
|
20
|
+
こちらをプログラムで行うにはどのようにすればいいのでしょうか。
|
21
|
+
excelで行う方法はいくつかありましたが、プログラムはわかりませんでした。
|
16
22
|
|
23
|
+
|
17
24
|
個人的にパラメータの部分がよくわからないのですが、コメントのような理解でよろしいでしょうか?self.units = 6これについては何の意味があるのか 単位?単位が6?
|
18
25
|
|
19
26
|
```python
|