teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

3

修正

2020/09/29 05:19

投稿

EDM
EDM

スコア30

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

修正

2020/09/29 05:18

投稿

EDM
EDM

スコア30

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 = 100
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
- #csvファイルの第1数字から第7数字だけを読み込む
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
- #次の予測に正規化のinverse_transformを”次の予測”を用いて行う
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("次の当選番号の予測は: {0:.0f}".format((next_prediction)[0][0]))
181
+ print("次の当選番号の予測は: {}".format(e[round(next_prediction[0][0])]))
180
182
 
181
- #経過時間?の測定結果を出力
183
+ #測定時間を出力
182
- print("Time: {0:.1f}sec".format(time.time() - START_TIME))
184
+ print("時間: {0:.1f}sec".format(time.time() - START_TIME))
183
185
  ```

1

追加

2020/09/28 08:28

投稿

EDM
EDM

スコア30

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