質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
scikit-learn

scikit-learnは、Pythonで使用できるオープンソースプロジェクトの機械学習用ライブラリです。多くの機械学習アルゴリズムが実装されていますが、どのアルゴリズムも同じような書き方で利用できます。

Streamlit

Streamlitは、Pythonでフロントエンドアプリケーションを構築できるフレームワーク。HTML/CSSの知識が不要で、描画ライブラリで作成したグラフを埋め込むことが可能です。機械学習のレポート作成やデータ分析にも応用できます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1571閲覧

Streamlitで外れ値検出(scikit-learnoのisolationforest等)の状態を可視化したい

H.K2

総合スコア88

scikit-learn

scikit-learnは、Pythonで使用できるオープンソースプロジェクトの機械学習用ライブラリです。多くの機械学習アルゴリズムが実装されていますが、どのアルゴリズムも同じような書き方で利用できます。

Streamlit

Streamlitは、Pythonでフロントエンドアプリケーションを構築できるフレームワーク。HTML/CSSの知識が不要で、描画ライブラリで作成したグラフを埋め込むことが可能です。機械学習のレポート作成やデータ分析にも応用できます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2022/01/09 06:57

編集2022/01/12 17:46

前提・実現したいこと

現在、streamlitを使って、読み込んだデータに対して、外れ値を検出して可視化するプログラムを作りたいと思っています。下記の図のようにざっくり画面は作成したのですが、
外れ値検出のプログラムを、下記サイトを参考にして作ろうとしたのですが、scikit-learnの
エラーが解決できず詰まっています。
画面イメージ:
イメージ説明

参考サイト1
参考サイト2:

取り込みデータ
kaggle内のwine-quality_redを使用

発生している問題・エラーメッセージ

外れ値のロジックを調べていて、参考サイトのisolationForest(scikit-learn)を
使用してみようと思い、サイトを参考に関数化して、読み取ったindexをもとに検出した
インデックスから除去できるindexで散布図を追加で描画しようと思ったのですが、
下記エラーが発生しました。上記エラーを解決し、上図のように、外れ値として除去した
プロットを表示する方法についてご教示いただけましたら幸甚です。

pred_od_index, pred_od = od_detect.IsolationForest(X, Y, slider_val)
File "c:\hiro_env\python_workspace\streamlit_env\lib\site-packages\sklearn\ensemble_base.py", line 173, in iter
return iter(self.estimators_)
AttributeError: 'IsolationForest' object has no attribute 'estimators_'

該当のソースコード

Python3

1# 外れ値検出処理 2# (isolationforestを関数化(そのうちほかのロジックも関数で呼び出して切り替えたいので)) 3def od_isolationforest(X, Y, threthold): 4 """ ISOlationForestでの外れ値検出して、外れ値のindexを返却 5 6 [extended_summary] 7 8 Args: 9 X ([type]): [description] 10 Y ([type]): [description] 11 threthold ([type]): [description] 12 """ 13 14 # X座標の値とY座標の値がばらばらなので、一つの変数にまとめる 15 X_train = np.concatenate([X, Y[:, np.newaxis]], 1) 16 17 # IsolationForestインスタンスを作成する 18 clf = IsolationForest( 19 contamination='auto', behaviour='new', max_features=2, random_state=42 20 ) 21 22 # 外れ値スコアを算出する 23 outlier_score = clf.decision_function(X_train) 24 predicted_outlier_index = np.where(outlier_score < threthold) 25 26 # 外れ値と判定したデータを緑色でプロットする 27 predicted_outlier = X_train[predicted_outlier_index] 28 return predicted_outlier_index, predicted_outlier 29 30# メイン処理内(細かいところは省略、vis_data:入力データ(wineのデータセット)のdf) 31 val_list = list(vis_data.select_dtypes(exclude=[object])) 32 x_select = st.selectbox("x選択ください", val_list, index=1) 33 y_select = st.selectbox("y選択ください", val_list, index=2) 34 slider_val = st.slider("外れ値検出の閾値を決定してください。") 35 X = vis_data[x_select].values 36 Y = vis_data[y_select].values 37 38 st.subheader("元データの散布図表示") 39 fig1 = px.scatter(vis_data, x=x_select, y=y_select, marginal_y="violin", marginal_x="box", trendline="ols", template="simple_white") 40 st.plotly_chart(fig1, use_container_width=True) 41 42 # 外れ値検出からの、検出したindexから外れ値を散布図表示したいがエラーが出る 43 pred_od_index, pred_od = od_detect.IsolationForest(X, Y, slider_val) 44 st.text(pred_od_index) 45 st.text(type(pred_od_index)) 46 st.text(pred_od) 47 st.text(type(pred_od)) 48

試したこと

外れ値検出のアルゴリズムを調査した。
関連サイトをチェックし,エラーを調査した。

補足情報(FW/ツールのバージョン

Python 3.8.7
pandas 1.3.0
scikit-learn 0.23.2
streamlit          1.1.0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

下記の記事を参考に実施できました。
★天気データでの異常検知。sklearnでの実装例などが示されてた。
https://qiita.com/cvusk/items/9c8a52d4248f31406900

他にも、調査過程で勉強になったものがあるので、いくつかURLを張っておきます。
主に1次元外れ値の検出について
https://www.codexa.net/python-outlier/

★2次元以降の方法(Isoration Forest)とかも解説、コードあり
https://qiita.com/papi_tokei/items/6f77a2a250752cfa850b

★Pycaretの前処理方法(外れ値除去も含む)
https://qiita.com/tomiyou/items/e1842775e7aaee04ada3

Pycaretで外れ値除去する場合は、setup()へ下記の引数を与えることで実行できるとのこと。
remove_outliers(bool型, default= False):本処理の実行有無(True/False)を指定
outliers_threshold(float型, default= 0.05):
データセット内の外れ値の割合を指定。(デフォルトの0.05を指定で、分布の裾の両側の値の0.025%が除去)

★その他外れ値除去の手法(Pythonコードあり)
(正規分布3∂、Zスコアの外れ値の検出、MADベースのZスコアの外れ値の検出、レバレッジポイント、DFFITS値、SRスチューデント化残差、クック距離、covratio値)
https://www.codetd.com/ja/article/12820819

★Pycaretにおける異常検出(ちょっと違うかも)
https://ichi.pro/pycaret-niyoru-ijo-kenshutsu-91691321788828

★Python 「PyCaret」ベストな回帰モデルを自動選定するautoml(記事が若干古い,1年前)
https://hk29.hatenablog.jp/entry/2020/09/29/021418

★Pycaretの初心者向けまとめ
https://qiita.com/shuhigashi/items/0fb37468e64c76f4b245

★Pycaretを使う(外れ値検出、ここのブログはPycaretシリーズで記事があるので時間あるとき見る)
https://takacity.blog.fc2.com/?tag=PyCaret

★スミルノフグラブス検定を用いる外れ値除去のPython実装(関数)
http://blog.graviness.com/?eid=949269

★簡易な異常検知実装
https://www.tcom242242.net/entry/ai-2/ai-ge/%E7%95%B0%E5%B8%B8%E6%A4%9C%E7%9F%A5/simple_abnomaly_detection/

★AILOGの記事。簡易な四分位範囲による外れ値の判定実装。kaggleネタが他にも豊富
https://ailog.site/2021/02/10/2021/0210/

投稿2022/01/14 00:05

H.K2

総合スコア88

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

H.K2

2022/01/14 00:07

(恥ずかしながら、sklearnにpandasのdfが渡せることを知らずにはまり込んでました…。)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問