Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Pythonで不均衡で一貫性のないデータセットを少しだけマシにする話

Ff0453fcbf27a84de92b9cc1f2aed9af?s=47 Makoto Koike
September 11, 2021

 Pythonで不均衡で一貫性のないデータセットを少しだけマシにする話

Python Charity Talks in Japan 2021.09 コミュニティセッション2:Unagi.py/Python駿河
https://pyconjp.connpass.com/event/218154/

Ff0453fcbf27a84de92b9cc1f2aed9af?s=128

Makoto Koike

September 11, 2021
Tweet

Transcript

  1. Pythonで不均衡で一貫性のない データセットを少しだけマシにする話 #2021/09/11 Python Charity Talks in Japan @ike_jpn (ごにょごにょ)

  2. 自己紹介 小池 @ike_jpn • キュウリ農家 • 組み込みエンジニア • Pythonでやってること ◦ 機械学習(時系列データ分析・画像認識)

    ◦ プロトタイプ開発全般 • 最近やってること ◦ 農業に使えるモノづくり! ◦ ロボットアーム作りたい! <キュウリ等級判別装置の開発> <自作ロボットアーム(開発中)>
  3. • スマート農業 • 省力化&高品質生産の実現 農業でもデータ活用! Data Analysis sensing Auto mation

    ハウス環境センサ 培地重センサ ボイラー稼働モニタ 等級選別の自動化 灌水自動化 データドリブン な経営判断
  4. 農業現場でのデータ活用の難しさ • 農業は感と経験の世界 ◦ 基本的には自然が相手 ◦ 明確な基準がない(定めるべきでない) • データ収集のための機材設置が困難 ◦

    電源がない ◦ 厳しい環境(冬は-2℃ ~ 夏50℃,防水) • 栽培失敗のデータが集まりにくい ◦ 失敗したら生活していけないからね! ⇒ 農業で扱うデータは不均衡で一貫性のないことが多い 等級:高 等級:中 【キュウリの等級判別の例】 違いなんて 見たらわかる だろ! なるほど, (わからん...)
  5. Garbage in, Garbage out (ゴミみたいなデータを入れても,出てくるのはゴミ)

  6. Pythonで何とかしよう! • 不均衡なデータセットを何とかする ◦ 使用ライブラリ: imbalanced-learn ◦ https://imbalanced-learn.org/stable/ • 一貫性のないデータセットを何とかする ◦

    使用ライブラリ: CLEANLAB ◦ https://github.com/cgnorthcutt/cleanlab
  7. 不均衡なデータへの主な対策 • Data-Centric ◦ Sampling Method ▪ Over-sampling ▪ Under-sampling

    ▪ Combination ◦ Active Learning Method [1]H.He, Y.Ma, “IMBALANCED LEARNING:Foundations, Algorithms, and Applications”, Wiley IEEE Press, 2013. [2]P.Branco, L.Torgo, R.P.Ribeiro, “A Survey of Predictive Modeling on Imbalanced Domains”, ACM Computing Surveys(CSUR), No. 42(2), 2016. ※これらを組み合わせたHybridな手法もある • Model-Centric ◦ Cost-Sensitive Method ▪ Loss weighting ▪ Ranking etc... ◦ Ensemble(+resampling) Method ▪ Boosting ▪ Bagging etc... ◦ One-Class Learning Method ▪ Anomaly Detection etc... imbalanced-learnで対応
  8. imbalanced-learn • インストール $ pip install -U imbalanced-learn OR $

    conda install -c conda-forge imbalanced-learn
  9. SMOTE(Over-Sampling) • k近傍法を用いたover-sampling手法 • 最もデータ数が多いクラスに合わせデータ数を均等にする from imblearn.over_sampling import SMOTE X

    = [データ配列] # 不均衡なデータセット y = [ラベル配列] # 不均衡なデータセット X_resampled, y_resampled = SMOTE().fit_resample(X, y) k=3の場合の例: 破線上にデータが追加 される :元データ :追加 たった1行で均等なサンプル数のデータセットが生成 できる!
  10. 実験:不均衡データの分類 データ比率:1.0 SVC:93.6% MLP:93.0% データ比率:0.5 SVC:93.6% MLP:93.6% データ比率:0.1 SVC:81.3% MLP:80.3% データ比率:0.05 SVC:69.0% MLP:52.6%

  11. 実験:SMOTE データ比率:1.0 SVC:93.6% MLP:93.0% データ比率:0.5 SVC:94.0% MLP:94.0% データ比率:0.1 SVC:94.3% MLP:93.6% データ比率:0.05 SVC:93.3% MLP:92.6%

  12. 一貫性のないデータセットへの対策 [3]C.Northcutt, L.Jiang, I.Chuang, “Confident Learning: Estimating Uncertainty in Dataset

    Labels”, JAIR, Vol.70, 2021. • Confident Learning[3] ◦ 誤ったラベルを学習から排除しよう! ◦ 誤ラベルの確率分布Q y^,y* を予測 ◦ Q y^,y* に基づき誤ラベルデータを取り除く ▪ 5つの手法がある • 論文著者による実装がCLEANLAB 鹿 鳥 馬 ・「鹿」を「鳥」と間違えてラベル付けする確率:0% ・「鹿」を「馬」と間違えてラベル付けする確率:10% ⇒ 誤ラベルが確率的に発生すると仮定
  13. CLEANLAB • インストール $ pip install -U cleanlab OR $

    conda install -c conda-forge cleanlab
  14. CELANLABを使った学習 • sklearnのAPIとほぼ同じ感じで使える from cleanlab.classification import LearningWithNoisyLabels tr_X = [一貫性のない教師データ]

    tr_y = [一貫性のない教師データラベル ] # SVC clf = SVC(C=6) lnl = LearningWithNoisyLabels(clf=clf) lnl.fit(tr_x, tr_y) y_ = lnl.predict(ts_y)
  15. 実験 • 3クラス分類 • 学習用データ数:各クラス600,テストデータ数:各クラス400 【誤ラベルなしの場合】 SVC:97.3% MLP:95.8%

  16. 実験 【誤ラベル率:20%】 Noise matrix P(s|y) SVC:91.5% MLP:90.3% w/o CELANLAB w

    CELANLAB SVC:95.8% MLP:95.0%
  17. 実験 【誤ラベル率:40%】 Noise matrix P(s|y) SVC:72.0% MLP:90.3% w/o CELANLAB w

    CELANLAB SVC:79.0% MLP:87.0%
  18. 実験2 • 誤ラベルの確率分布が 分かっている場合 ◦ 熟練者ならある程度予 測できそうな場合 SVC:72.0% MLP:90.3% w/o

    CELANLAB w CELANLAB SVC:83.8% MLP:91.3% Noise matrix P(s|y)
  19. まとめ • 不均衡なデータセットに対しては ◦ imbalanced-learnを用いたリサンプリングでデータ数を揃え認識 精度を向上することができる • 一貫性のないデータセットに対しては ◦ CLEANLABを用いた誤ラベル予測によって一貫性を向上させ認識

    精度を向上することができる Pythonで不均衡で一貫性のないデータセットに立ち向かい 農業データ活用を進めるぞ!