質問編集履歴

1

検証可能なように変更しました

2020/03/29 02:30

投稿

Pfele
Pfele

スコア17

test CHANGED
@@ -1 +1 @@
1
- リストの複数データをモデルに順に組込みアレイで返したい。
1
+ 複数データをモデルに順に組込みアレイで返したい。
test CHANGED
@@ -1,22 +1,170 @@
1
1
  見よう見まねのPython初心者です。
2
2
 
3
- 機械学習で構築したモデルで予測をしたいと思っています。
3
+ LightGBMで構築したモデルでAを予測をしたいと思っています。
4
-
4
+
5
- 予測する件数と入力するパラメータ数が多いので、ある程度とめ入力したのです。
5
+ ータにはカテゴリ変と欠損値ていす。
6
+
7
+
8
+
9
+ (A_DATA)
10
+
11
+ |A|B|C|D|E|F|G|
12
+
13
+ |:--|:--:|--:|
14
+
15
+ |1|1||1|A|1|1|
16
+
17
+ |2|2|2|2|B||2|
18
+
19
+ |3|2|4|4|A|3|2|
20
+
21
+ |4|5|5|6|B|3|5|
22
+
23
+ |5|5||3|A|2|3|
24
+
25
+ |2|1|2|1|B|1|1|
26
+
27
+ |5|2|2|2|B|3|2|
28
+
29
+ |3|2|4|4|B|3|2|
30
+
31
+ |4|5|5|6|B|3|5|
32
+
33
+ |2|5|6|3|B|2|3|
34
+
35
+
36
+
37
+
38
+
39
+
6
40
 
7
41
 
8
42
 
9
43
  ```ここに言語を入力
10
44
 
45
+ import numpy as np
46
+
47
+ import pandas as pd
48
+
49
+ import os
50
+
51
+ import sys
52
+
53
+
54
+
55
+ import lightgbm as lgb
56
+
57
+ from sklearn.model_selection import train_test_split
58
+
59
+
60
+
61
+ import matplotlib.pyplot as plt
62
+
63
+ import seaborn as sns
64
+
65
+ ```
66
+
67
+ ```ここに言語を入力
68
+
69
+ # A_DATA読み込み
70
+
71
+ data = pd.read_excel("A_DATA.xlsx")
72
+
73
+
74
+
75
+ # 学習データとテストデータを分ける
76
+
77
+ train_data, test_data = train_test_split(data, test_size=3, random_state=0)
78
+
79
+
80
+
81
+ # 特徴量はB、C、D、E、F、G Eをカテゴリ ターゲットはA
82
+
83
+ def create_feature(data):
84
+
85
+ feature = data[["B", "C", "D", "E", "F", "G"]].copy()
86
+
87
+ cat_cols = ['E']
88
+
89
+ feature[cat_cols] = feature[cat_cols].astype("category")
90
+
91
+
92
+
93
+ return feature
94
+
95
+
96
+
97
+ X_train = create_feature(train_data)
98
+
99
+ y_train = train_data["A"]
100
+
101
+
102
+
103
+ # LightGBMでモデル構築
104
+
105
+ X_trn, X_val, y_trn, y_val = train_test_split(X_train, y_train, test_size=3, random_state=0)
106
+
107
+
108
+
109
+ lgb_dataset_trn = lgb.Dataset(X_trn, label=y_trn, categorical_feature='auto')
110
+
111
+ lgb_dataset_val = lgb.Dataset(X_val, label=y_val, categorical_feature='auto')
112
+
113
+
114
+
115
+ params = {
116
+
117
+ 'objective' : 'rmse',
118
+
119
+ 'learning_rate' : 0.1,
120
+
121
+ 'max_depth' : -1,
122
+
123
+ }
124
+
125
+
126
+
127
+ model = lgb.train(
128
+
129
+ params=params,
130
+
131
+ train_set=lgb_dataset_trn,
132
+
133
+ valid_sets=[lgb_dataset_val],
134
+
135
+ num_boost_round=100,
136
+
137
+ early_stopping_rounds=10,
138
+
139
+ verbose_eval=10
140
+
141
+ )
142
+
143
+ ```
144
+
145
+ このモデルに値(B=6、C=1、D=2、E="B"、F=5、G=4、A=-1)を入力すると
146
+
147
+
148
+
149
+ ```ここに言語を入力
150
+
151
+ # Aを予測 B=6、C=1、D=2、E="B"、F=5、G=4、A=-1
152
+
11
153
  data = data.append(pd.DataFrame.from_dict({
12
154
 
13
- "stg": [1],"No": [6],"Type": [4],"sex": ["M"],"age": [65],"Dw": [78],
155
+ "B": [6],
156
+
14
-
157
+ "C": [1],
158
+
159
+ "D": [2],
160
+
15
- "wt": [81],"post1": [1],"post2": [8],"post3": [3],"post4": [1],
161
+ "E": ["B"],
16
-
162
+
17
- "post5": [5],"min": [3],"mode": ["HD"],"weather": ["曇"],
163
+ "F": [5],
164
+
18
-
165
+ "G": [4],
166
+
19
- "or": [-1]
167
+ "A": [-1]
20
168
 
21
169
  })).reset_index(drop=True)
22
170
 
@@ -28,83 +176,37 @@
28
176
 
29
177
  ```
30
178
 
31
- これですと直接入力した分はarray表示されます。
179
+ array([2.5])とAの予測結果が表示されます。
32
-
33
-
34
-
35
-
36
-
180
+
181
+
182
+
183
+
184
+
37
- これ3件分のデータを入力したい場合、
185
+ これで例えば3件分のデータでA予測したい場合、
38
-
186
+
39
- |stg|No|Type|sex|…|
187
+ ・B=6、C=1、D=4、E="B"、F=3、G=2、A=-1
188
+
40
-
189
+ ・B=1、C=2、D=3、E="A"、F=2、G=4、A=-1
190
+
191
+ ・B=3、C=2、D=1、E="B"、F=5、G=1、A=-1
192
+
193
+
194
+
195
+ 入力するパラメータが多いのと1件ずつ入力しないといけないので、何とかまとめて入力できないかと考えています。
196
+
197
+ 可能なら、
198
+
41
- |:--|:--:|--:|--:|
199
+ ・[6,1,4,B,3,2,-1]
42
-
43
- |1|6|4|M|…
200
+
44
-
45
- |2|8|2|F|…
46
-
47
- |1|13|5|M|…
201
+ ・[1,2,3,A,2,4,-1]
202
+
48
-
203
+ ・[3,2,1,B,5,1,-1]
204
+
49
-
205
+ という感じに行方向だと入力も楽になります。
50
206
 
51
207
  for文を使うとは思いますが、いまいち文法が理解できていません。
52
208
 
53
- ```ここに言語を入力
209
+
54
-
55
- data = data.append(pd.DataFrame.from_dict({
56
-
57
- "stg": [1,2,1],"No": [6,8,13],"Type": [4,2,5],"sex": ["M","F","M"],"age": [65,71,70],"Dw": [78,45,62],
58
-
59
- "wt": [81,47.5,66.2],"post1": [1,2,8],"post2": [8,5,8],"post3": [3,3,5],"post4": [1,2,5],
60
-
61
- "post5": [5,4,0],"min": [3,3,3],"mode": ["D","O","I"],"weather": ["曇","曇","曇"],
62
-
63
- "or": [-1]
64
-
65
- })).reset_index(drop=True)
66
-
67
- data.replace(0,np.nan)
68
-
69
- for i in data:
70
-
71
- X = create_feature(data)
72
-
73
-
74
-
75
- model.predict(X[-1:])
76
-
77
- ```
78
-
79
- arrayも一つしか表示されません。
80
-
81
-
82
-
83
-
84
-
85
- あとは、
86
-
87
- ```ここに言語を入力
88
-
89
- dat1 = [1,6,2,"M",65,78,81,1,8,3,1,5,3,"D","曇"]
90
-
91
- dat2 = [2,8,2,"F",71,45,47.5,2,5,3,2,4,3,"O","曇"]
92
-
93
- dat3 = [1,13,5,"M",70,62,66.2,8,8,5,5,0,3,"I","曇"]
94
-
95
- x_pred = [dat1,dat2,dat3]
96
-
97
-
98
-
99
- model.predict(x_pred)
100
-
101
- ```
102
-
103
- というような書き方もしてみましたが、
104
-
105
- TypeError: list indices must be integers or slices, not str.
106
-
107
- になってしまいます。
108
210
 
109
211
 
110
212