Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

自己紹介 小池 @ike_jpn ● キュウリ農家 ● 組み込みエンジニア ● Pythonでやってること ○ 機械学習(時系列データ分析・画像認識) ○ プロトタイプ開発全般 ● 最近やってること ○ 農業に使えるモノづくり! ○ ロボットアーム作りたい! <キュウリ等級判別装置の開発> <自作ロボットアーム(開発中)>

Slide 3

Slide 3 text

● スマート農業 ● 省力化&高品質生産の実現 農業でもデータ活用! Data Analysis sensing Auto mation ハウス環境センサ 培地重センサ ボイラー稼働モニタ 等級選別の自動化 灌水自動化 データドリブン な経営判断

Slide 4

Slide 4 text

農業現場でのデータ活用の難しさ ● 農業は感と経験の世界 ○ 基本的には自然が相手 ○ 明確な基準がない(定めるべきでない) ● データ収集のための機材設置が困難 ○ 電源がない ○ 厳しい環境(冬は-2℃ ~ 夏50℃,防水) ● 栽培失敗のデータが集まりにくい ○ 失敗したら生活していけないからね! ⇒ 農業で扱うデータは不均衡で一貫性のないことが多い 等級:高 等級:中 【キュウリの等級判別の例】 違いなんて 見たらわかる だろ! なるほど, (わからん...)

Slide 5

Slide 5 text

Garbage in, Garbage out (ゴミみたいなデータを入れても,出てくるのはゴミ)

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

不均衡なデータへの主な対策 ● 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で対応

Slide 8

Slide 8 text

imbalanced-learn ● インストール $ pip install -U imbalanced-learn OR $ conda install -c conda-forge imbalanced-learn

Slide 9

Slide 9 text

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行で均等なサンプル数のデータセットが生成 できる!

Slide 10

Slide 10 text

実験:不均衡データの分類 データ比率: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%

Slide 11

Slide 11 text

実験: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%

Slide 12

Slide 12 text

一貫性のないデータセットへの対策 [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% ⇒ 誤ラベルが確率的に発生すると仮定

Slide 13

Slide 13 text

CLEANLAB ● インストール $ pip install -U cleanlab OR $ conda install -c conda-forge cleanlab

Slide 14

Slide 14 text

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)

Slide 15

Slide 15 text

実験 ● 3クラス分類 ● 学習用データ数:各クラス600,テストデータ数:各クラス400 【誤ラベルなしの場合】 SVC:97.3% MLP:95.8%

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

実験2 ● 誤ラベルの確率分布が 分かっている場合 ○ 熟練者ならある程度予 測できそうな場合 SVC:72.0% MLP:90.3% w/o CELANLAB w CELANLAB SVC:83.8% MLP:91.3% Noise matrix P(s|y)

Slide 19

Slide 19 text

まとめ ● 不均衡なデータセットに対しては ○ imbalanced-learnを用いたリサンプリングでデータ数を揃え認識 精度を向上することができる ● 一貫性のないデータセットに対しては ○ CLEANLABを用いた誤ラベル予測によって一貫性を向上させ認識 精度を向上することができる Pythonで不均衡で一貫性のないデータセットに立ち向かい 農業データ活用を進めるぞ!