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

質問編集履歴

1

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

2020/03/29 02:30

投稿

Pfele
Pfele

スコア17

title CHANGED
@@ -1,1 +1,1 @@
1
- リストの複数データをモデルに順に組込みアレイで返したい。
1
+ 複数データをモデルに順に組込みアレイで返したい。
body CHANGED
@@ -1,56 +1,107 @@
1
1
  見よう見まねのPython初心者です。
2
- 機械学習で構築したモデルで予測をしたいと思っています。
2
+ LightGBMで構築したモデルでAを予測をしたいと思っています。
3
- 予測する件数と入力するパラメータ数が多いので、ある程度とめ入力したのです。
3
+ ータにはカテゴリ変と欠損値ていす。
4
4
 
5
+ (A_DATA)
6
+ |A|B|C|D|E|F|G|
7
+ |:--|:--:|--:|
8
+ |1|1||1|A|1|1|
9
+ |2|2|2|2|B||2|
10
+ |3|2|4|4|A|3|2|
11
+ |4|5|5|6|B|3|5|
12
+ |5|5||3|A|2|3|
13
+ |2|1|2|1|B|1|1|
14
+ |5|2|2|2|B|3|2|
15
+ |3|2|4|4|B|3|2|
16
+ |4|5|5|6|B|3|5|
17
+ |2|5|6|3|B|2|3|
18
+
19
+
20
+
21
+
5
22
  ```ここに言語を入力
6
- data = data.append(pd.DataFrame.from_dict({
23
+ import numpy as np
7
- "stg": [1],"No": [6],"Type": [4],"sex": ["M"],"age": [65],"Dw": [78],
8
- "wt": [81],"post1": [1],"post2": [8],"post3": [3],"post4": [1],
9
- "post5": [5],"min": [3],"mode": ["HD"],"weather": ["曇"],
10
- "or": [-1]
24
+ import pandas as pd
11
- })).reset_index(drop=True)
25
+ import os
26
+ import sys
27
+
12
- data.replace(0,np.nan)
28
+ import lightgbm as lgb
29
+ from sklearn.model_selection import train_test_split
30
+
31
+ import matplotlib.pyplot as plt
13
- X = create_feature(data)
32
+ import seaborn as sns
14
- model.predict(X[-1:])
15
33
  ```
34
+ ```ここに言語を入力
35
+ # A_DATA読み込み
16
- これですと直接入力した分はarrayで表示されます。
36
+ data = pd.read_excel("A_DATA.xlsx")
17
37
 
38
+ # 学習データとテストデータを分ける
39
+ train_data, test_data = train_test_split(data, test_size=3, random_state=0)
18
40
 
41
+ # 特徴量はB、C、D、E、F、G Eをカテゴリ ターゲットはA
19
- これに3件分のデータを入力したい場合、
42
+ def create_feature(data):
43
+ feature = data[["B", "C", "D", "E", "F", "G"]].copy()
44
+ cat_cols = ['E']
45
+ feature[cat_cols] = feature[cat_cols].astype("category")
46
+
20
- |stg|No|Type|sex|…|
47
+ return feature
48
+
49
+ X_train = create_feature(train_data)
21
- |:--|:--:|--:|--:|
50
+ y_train = train_data["A"]
22
- |1|6|4|M|…
23
- |2|8|2|F|…
24
- |1|13|5|M|…
25
51
 
52
+ # LightGBMでモデル構築
53
+ X_trn, X_val, y_trn, y_val = train_test_split(X_train, y_train, test_size=3, random_state=0)
54
+
55
+ lgb_dataset_trn = lgb.Dataset(X_trn, label=y_trn, categorical_feature='auto')
56
+ lgb_dataset_val = lgb.Dataset(X_val, label=y_val, categorical_feature='auto')
57
+
58
+ params = {
59
+ 'objective' : 'rmse',
26
- for文を使うとは思いますが、いまいち文法が理解できていません。
60
+ 'learning_rate' : 0.1,
61
+ 'max_depth' : -1,
62
+ }
63
+
64
+ model = lgb.train(
65
+ params=params,
66
+ train_set=lgb_dataset_trn,
67
+ valid_sets=[lgb_dataset_val],
68
+ num_boost_round=100,
69
+ early_stopping_rounds=10,
70
+ verbose_eval=10
71
+ )
72
+ ```
73
+ このモデルに値(B=6、C=1、D=2、E="B"、F=5、G=4、A=-1)を入力すると
74
+
27
75
  ```ここに言語を入力
76
+ # Aを予測 B=6、C=1、D=2、E="B"、F=5、G=4、A=-1
28
77
  data = data.append(pd.DataFrame.from_dict({
78
+ "B": [6],
79
+ "C": [1],
29
- "stg": [1,2,1],"No": [6,8,13],"Type": [4,2,5],"sex": ["M","F","M"],"age": [65,71,70],"Dw": [78,45,62],
80
+ "D": [2],
30
- "wt": [81,47.5,66.2],"post1": [1,2,8],"post2": [8,5,8],"post3": [3,3,5],"post4": [1,2,5],
81
+ "E": ["B"],
31
- "post5": [5,4,0],"min": [3,3,3],"mode": ["D","O","I"],"weather": ["曇","曇","曇"],
82
+ "F": [5],
83
+ "G": [4],
32
- "or": [-1]
84
+ "A": [-1]
33
85
  })).reset_index(drop=True)
34
86
  data.replace(0,np.nan)
35
- for i in data:
36
- X = create_feature(data)
87
+ X = create_feature(data)
37
-
38
88
  model.predict(X[-1:])
39
89
  ```
40
- arrayも一つしか表示されません
90
+ array([2.5])とAの予測結果が表示されま
41
91
 
42
-
43
- あとは、
44
- ```ここに言語を入力
45
- dat1 = [1,6,2,"M",65,78,81,1,8,3,1,5,3,"D","曇"]
46
- dat2 = [2,8,2,"F",71,45,47.5,2,5,3,2,4,3,"O","曇"]
47
- dat3 = [1,13,5,"M",70,62,66.2,8,8,5,5,0,3,"I","曇"]
48
- x_pred = [dat1,dat2,dat3]
49
92
 
50
- model.predict(x_pred)
51
- ```
52
- というような書き方もてみまし
93
+ これで例えば3件分のデータでAを予測したい場合
53
- TypeError: list indices must be integers or slices, not str.
94
+ ・B=6、C=1、D=4、E="B"、F=3、G=2、A=-1
54
- になってしまいます。
95
+ ・B=1、C=2、D=3、E="A"、F=2、G=4、A=-1
96
+ ・B=3、C=2、D=1、E="B"、F=5、G=1、A=-1
55
97
 
98
+ 入力するパラメータが多いのと1件ずつ入力しないといけないので、何とかまとめて入力できないかと考えています。
99
+ 可能なら、
100
+ ・[6,1,4,B,3,2,-1]
101
+ ・[1,2,3,A,2,4,-1]
102
+ ・[3,2,1,B,5,1,-1]
103
+ という感じに行方向だと入力も楽になります。
104
+ for文を使うとは思いますが、いまいち文法が理解できていません。
105
+
106
+
56
107
  是非ともご教授下さるようお願いいたします。