質問編集履歴
4
画像ファイルが表示されてなかったので再度アップロードした
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
Streamlitで外れ値検出の状態を可視化したい
|
1
|
+
Streamlitで外れ値検出(scikit-learnoのisolationforest等)の状態を可視化したい
|
test
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
外れ値検出のプログラムを、下記サイトを参考にして作ろうとしたのですが、scikit-learnの
|
5
5
|
エラーが解決できず詰まっています。
|
6
6
|
画面イメージ:
|
7
|
-
![イメージ説明](https://d1666c7av167g2.cloudfront.net/questions/2022-01-1
|
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
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
|
-
![イメージ説明](
|
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
|
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
関数名の不一致修正
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
|
65
|
+
def IsolationForest(X, Y, threthold):
|
64
66
|
|
65
67
|
""" ISOlationForestでの外れ値検出して、外れ値のindexを返却
|
66
68
|
|
1
コメント追加
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
|
|