質問編集履歴

4

画像ファイルが表示されてなかったので再度アップロードした

2022/01/12 17:46

投稿

H.K2
H.K2

スコア88

test CHANGED
@@ -1 +1 @@
1
- Streamlitで外れ値検出の状態を可視化したい
1
+ Streamlitで外れ値検出(scikit-learnoisolationforest等)の状態を可視化したい
test CHANGED
@@ -4,7 +4,7 @@
4
4
  外れ値検出のプログラムを、下記サイトを参考にして作ろうとしたのですが、scikit-learnの
5
5
  エラーが解決できず詰まっています。
6
6
  画面イメージ:
7
- ![イメージ説明](https://d1666c7av167g2.cloudfront.net/questions/2022-01-12/72ef7606-d5be-4e63-a3cc-a4001a50dc54.png)
7
+ ![イメージ説明](https://d1666c7av167g2.cloudfront.net/questions/2022-01-13/cbd523be-7a86-434e-acf7-a2c1126997a7.png)
8
8
 
9
9
  [参考サイト1](https://qiita.com/papi_tokei/items/6f77a2a250752cfa850b):
10
10
  [参考サイト2](https://qiita.com/tk-tatsuro/items/a49ccab4441dc1dfc86c#k-%E8%BF%91%E5%82%8D%E6%B3%95-k-nn):

3

2022/01/12 06:05

投稿

H.K2
H.K2

スコア88

test CHANGED
File without changes
test CHANGED
@@ -1,181 +1,90 @@
1
1
  ### 前提・実現したいこと
2
2
 
3
-
4
-
5
3
  現在、streamlitを使って、読み込んだデータに対して、外れ値を検出して可視化するプログラムを作りたいと思っています。下記の図のようにざっくり画面は作成したのですが、
6
-
7
4
  外れ値検出のプログラムを、下記サイトを参考にして作ろうとしたのですが、scikit-learnの
8
-
9
5
  エラーが解決できず詰まっています。
10
-
11
6
  画面イメージ:
12
-
13
- ![イメージ説明](20a2b17dd32721e3f8babdf91537cf32.png)
7
+ ![イメージ説明](https://d1666c7av167g2.cloudfront.net/questions/2022-01-12/72ef7606-d5be-4e63-a3cc-a4001a50dc54.png)
14
-
15
-
16
8
 
17
9
  [参考サイト1](https://qiita.com/papi_tokei/items/6f77a2a250752cfa850b):
18
-
19
10
  [参考サイト2](https://qiita.com/tk-tatsuro/items/a49ccab4441dc1dfc86c#k-%E8%BF%91%E5%82%8D%E6%B3%95-k-nn):
20
11
 
21
-
22
-
23
12
  [取り込みデータ](https://www.kaggle.com/sh6147782/winequalityred?select=winequality-red.csv):
24
-
25
13
  kaggle内のwine-quality_redを使用
26
14
 
27
-
28
-
29
15
  ### 発生している問題・エラーメッセージ
30
-
31
16
  外れ値のロジックを調べていて、参考サイトのisolationForest(scikit-learn)を
32
-
33
17
  使用してみようと思い、サイトを参考に関数化して、読み取ったindexをもとに検出した
34
-
35
18
  インデックスから除去できるindexで散布図を追加で描画しようと思ったのですが、
36
-
37
19
  下記エラーが発生しました。上記エラーを解決し、上図のように、外れ値として除去した
38
-
39
20
  プロットを表示する方法についてご教示いただけましたら幸甚です。
40
21
 
41
-
42
-
43
22
  pred_od_index, pred_od = od_detect.IsolationForest(X, Y, slider_val)
44
-
45
23
  File "c:\hiro_env\python_workspace\streamlit_env\lib\site-packages\sklearn\ensemble\_base.py", line 173, in __iter__
46
-
47
24
  return iter(self.estimators_)
48
-
49
25
  AttributeError: 'IsolationForest' object has no attribute 'estimators_'
50
-
51
-
52
26
 
53
27
  ### 該当のソースコード
54
28
 
55
-
56
-
57
29
  ``` Python3
58
-
59
30
  # 外れ値検出処理
60
-
61
31
  # (isolationforestを関数化(そのうちほかのロジックも関数で呼び出して切り替えたいので))
62
-
63
- # import od_detection as od_detectで、下記関数を定義
64
-
65
- def IsolationForest(X, Y, threthold):
32
+ def od_isolationforest(X, Y, threthold):
66
-
67
33
  """ ISOlationForestでの外れ値検出して、外れ値のindexを返却
68
-
69
-
70
34
 
71
35
  [extended_summary]
72
36
 
73
-
74
-
75
37
  Args:
76
-
77
38
  X ([type]): [description]
78
-
79
39
  Y ([type]): [description]
80
-
81
40
  threthold ([type]): [description]
82
-
83
41
  """
84
42
 
85
-
86
-
87
43
  # X座標の値とY座標の値がばらばらなので、一つの変数にまとめる
88
-
89
44
  X_train = np.concatenate([X, Y[:, np.newaxis]], 1)
90
45
 
91
-
92
-
93
46
  # IsolationForestインスタンスを作成する
94
-
95
47
  clf = IsolationForest(
96
-
97
48
  contamination='auto', behaviour='new', max_features=2, random_state=42
98
-
99
49
  )
100
50
 
101
-
102
-
103
51
  # 外れ値スコアを算出する
104
-
105
52
  outlier_score = clf.decision_function(X_train)
106
-
107
53
  predicted_outlier_index = np.where(outlier_score < threthold)
108
54
 
109
-
110
-
111
55
  # 外れ値と判定したデータを緑色でプロットする
112
-
113
56
  predicted_outlier = X_train[predicted_outlier_index]
114
-
115
57
  return predicted_outlier_index, predicted_outlier
116
58
 
117
-
118
-
119
59
  # メイン処理内(細かいところは省略、vis_data:入力データ(wineのデータセット)のdf)
120
-
121
60
  val_list = list(vis_data.select_dtypes(exclude=[object]))
122
-
123
61
  x_select = st.selectbox("x選択ください", val_list, index=1)
124
-
125
62
  y_select = st.selectbox("y選択ください", val_list, index=2)
126
-
127
63
  slider_val = st.slider("外れ値検出の閾値を決定してください。")
128
-
129
64
  X = vis_data[x_select].values
130
-
131
65
  Y = vis_data[y_select].values
132
66
 
133
-
134
-
135
67
  st.subheader("元データの散布図表示")
136
-
137
68
  fig1 = px.scatter(vis_data, x=x_select, y=y_select, marginal_y="violin", marginal_x="box", trendline="ols", template="simple_white")
138
-
139
69
  st.plotly_chart(fig1, use_container_width=True)
140
70
 
141
-
142
-
143
71
  # 外れ値検出からの、検出したindexから外れ値を散布図表示したいがエラーが出る
144
-
145
72
  pred_od_index, pred_od = od_detect.IsolationForest(X, Y, slider_val)
146
-
147
73
  st.text(pred_od_index)
148
-
149
74
  st.text(type(pred_od_index))
150
-
151
75
  st.text(pred_od)
152
-
153
76
  st.text(type(pred_od))
154
-
155
-
156
77
 
157
78
  ```
158
79
 
159
-
160
-
161
80
  ### 試したこと
162
81
 
163
-
164
-
165
82
  外れ値検出のアルゴリズムを調査した。
166
-
167
83
  関連サイトをチェックし,エラーを調査した。
168
-
169
-
170
84
 
171
85
  ### 補足情報(FW/ツールのバージョン
172
86
 
173
-
174
-
175
87
  Python 3.8.7
176
-
177
88
  pandas 1.3.0
178
-
179
89
  scikit-learn 0.23.2
180
-
181
90
  streamlit          1.1.0

2

関数名の不一致修正

2022/01/10 07:29

投稿

H.K2
H.K2

スコア88

test CHANGED
File without changes
test CHANGED
@@ -60,7 +60,9 @@
60
60
 
61
61
  # (isolationforestを関数化(そのうちほかのロジックも関数で呼び出して切り替えたいので))
62
62
 
63
+ # import od_detection as od_detectで、下記関数を定義
64
+
63
- def od_isolationforest(X, Y, threthold):
65
+ def IsolationForest(X, Y, threthold):
64
66
 
65
67
  """ ISOlationForestでの外れ値検出して、外れ値のindexを返却
66
68
 

1

コメント追加

2022/01/10 07:29

投稿

H.K2
H.K2

スコア88

test CHANGED
File without changes
test CHANGED
@@ -34,7 +34,9 @@
34
34
 
35
35
  インデックスから除去できるindexで散布図を追加で描画しようと思ったのですが、
36
36
 
37
- 下記エラーが発生しました。
37
+ 下記エラーが発生しました。上記エラーを解決し、上図のように、外れ値として除去した
38
+
39
+ プロットを表示する方法についてご教示いただけましたら幸甚です。
38
40
 
39
41
 
40
42