前提・実現したいこと
現在、streamlitを使って、読み込んだデータに対して、外れ値を検出して可視化するプログラムを作りたいと思っています。下記の図のようにざっくり画面は作成したのですが、
外れ値検出のプログラムを、下記サイトを参考にして作ろうとしたのですが、scikit-learnの
エラーが解決できず詰まっています。
画面イメージ:
取り込みデータ:
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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/01/14 00:07