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

Deep Learning以外の手法でユニクロコンに参戦してみた (Kaggle Meetup #3)

066c1bb1dace2970221a2ed30f63d3e0?s=47 mamastan
October 28, 2017
19k

Deep Learning以外の手法でユニクロコンに参戦してみた (Kaggle Meetup #3)

Kaggle Meetup #3で発表した内容です。

066c1bb1dace2970221a2ed30f63d3e0?s=128

mamastan

October 28, 2017
Tweet

Transcript

  1. Deep Learning以外の⼿法で ユニクロコンに参戦してみた @mamas16k Kaggle Tokyo Meetup #3

  2. Outline 0.はじめに 1.ユニクロコンペとは? 2.結果 3.⼿法 4.上位の⼈の⼿法まとめ

  3. 0.はじめに • Twitter ID: mamas16k • 物理系の学部2年⽣ • 機械学習暦・プログラミング暦共に1年ぐらいの初⼼者 •

    データ分析系の企業でインターンしてました • ユニクロコンは初の機械学習コンペ 今回のKaggle Meetupの初⼼者枠なので、あまり真に受けずにた くさんマサカリを投げてくれると有り難いです><
  4. 1.ユニクロコンペとは? • Kaggleではなく、オプトDSLで2017年4⽉ ~ 7⽉に開催 • スポンサー:Fast Retailing (ユニクロの親会社) •

    服、靴下、ベルト等の画像を24⾊にmulticlass分類 (ベージュ、⿊、⻘、茶⾊、緑、カーキ、オレンジ, etc) ※権利関係の都合で、全⼒でフリー素材を使います。 http://illustrain.com/?cat=79
  5. オプトのコンペの特徴(Kaggleとの違い) • 参加者がほとんど⽇本⼈の機械学習コンペ • KernelやDiscussionが存在しない。チームマージのルール、 Public LBのルールなど、多少違う点がある。 • ⽇本語であるため参加の敷居が低く、Kaggleと並⾏してやって みても良い?

    (今オプト引っ越しコンペ出てて、10/31締め切りなのでヤバイです・・・)
  6. 1-1. 全クラスの画像例 beige blue black brown dark_brown dark_gray dark_green gray

    dark_orange green khaki light_gray
  7. 1-1. 全クラスの画像例 light_green navy natural off_white olive orange pink red

    purple white wine yellow
  8. 1-2. クラスごとの画像数 Rank Color N_samples 1 blue 2036 2 navy

    1623 3 black 1582 4 gray 1129 5 pink 855 6 red 650 7 dark_gray 592 8 white 589 9 off_white 589 10 green 386 11 beige 315 12 purple 314 Rank Color N_samples 13 olive 211 14 wine 210 15 light_gray 200 16 orange 193 17 brown 190 18 dark_green 181 19 natural 138 20 yellow 121 21 dark_brown 120 22 light_green 87 23 dark_orange 49 24 khaki 39 合計: 12404枚
  9. ユニクロコン名物:三連靴下 ※ 1枚の画像です

  10. 1-3. metricsについて • Balanced accuracyで評価される。 ⼀⾔で⾔えば、24 classに対するaccuracyの平均

  11. 2. 結果 • 70.791%で6位でした。ついでに特別賞と10万円をゲット

  12. 3. ⼿法 コンペを始める前に思ったこと: ・⾊分類であれば、空間的情報はあまり関係しないのでは? ・関係ないのであれば、通常のCNNの空間⽅向に対する⾼い表 現⼒はほとんど無駄になっているのでは? ・上⼿く「⾊」分類であるということを⽣かせないか?

  13. 3-1. おおまかな⼿法 ①Deep Learningを使わずに、⾊に関する特徴を頑張って抽出 ②metricsの最適化にprobability calibrationを⽤いた。 ③XGBoost, LightGBMのStacking (5-foldで、最終層のモデルは、Logistic Regression)

  14. 3-2. 画像からの特徴抽出 • ⼤きく分けて⼆つの⼿法を⽤いた。 ①統計量を取る路線 ②ヒストグラムを特徴にする路線 ※閾値処理で⽩い背景を分離し、背景以外について⾏う (分離しないとwhiteの分類に悪影響があると考えられる)

  15. 3-2-1. 素朴なやり⽅(統計量路線) • R, G, Bの分布について統計量を取り、特徴にする。 Kaggle PlanetコンペのKernelで発⾒した。 R, G,

    Bについてそれぞれ平均、標準偏差、最⼤値、最⼩値、歪 度、尖度を特徴にしている。 https://www.kaggle.com/greenmtn/xgb-starter-lb-0- 88232/output
  16. 3-2-1. 素朴なやり⽅(統計量路線) • 変換のイメージ図 ⽩ 背 景 を 分 離

    Gの平均: 188.7 Gの分散: 33.25 Gの最⼤値: … Gの最⼩値: … Rの平均: 110.8 Rの分散: 8.921 Rの最⼤値: … Rの最⼩値: … Bの平均: 158.7 Bの分散: 22.7 Bの最⼤値: … Bの最⼩値: …
  17. 3-2-2. 素朴なやり⽅(ヒストグラム路線) • R, G, Bについてヒストグラムを作り、特定の範囲における画素 数を特徴量にする。 例えば、ビン数を256にすると、R, G, B各々から256個の特徴が

    得られるため、合計して 256 + 256 + 256 = 768個の特徴量が得られる。 特徴量の数と計算時間はトレードオフの関係になる。
  18. 3-2-2. 素朴なやり⽅(ヒストグラム路線) range 0 ~ 16 … 80 ~ 96

    96 ~ 112 … 242 ~ 256 n_pixels 0 … 2115 10414 … 0 range 0 ~ 16 … 192 ~ 208 208 ~ 224 … 242 ~ 256 n_pixels 0 … 35906 3 … 0 range 0 ~ 16 … 160 ~ 176 176 ~ 192 … 242 ~ 256 n_pixels 0 … 35963 2 … 0 count count count
  19. 3-2-3.素朴なやり⽅の問題点 実際は、この⼆つの素朴なやり⽅では良い精度は出ない。 理由として以下の3つが挙げられる。 (1)⾊空間の知覚均等性 (2)組み合わせに関する情報⽋損 (3)空間的な情報⽋損

  20. (1)⾊空間の知覚均等性 • RGB⾊空間において各画素は"の元として表されるが、 元同⼠の“距離”は⼈間の知覚的な差と⼀致しない。 つまり、距離は遠いが⼈間にはほぼ同じ⾊ 距離は近いが⼈間にはかなり違う⾊ というケースが存在する。 ※ここで”距離”はユークリッド距離を指す。実際は、Delta E CIE

    2000などの知覚に合うよう補正した距離の計算⽅法が存在 して、Pythonでも実装されているようである。 http://python- colormath.readthedocs.io/en/latest/delta_e.html
  21. (1)⾊空間の知覚均等性 ・CIE 1931 XYZ⾊空間におけるマクアダム楕円 楕円の内部の点は⼈間が区別できない⾊の範囲 を指すらしい。 ⼈間の知覚と⾊空間における距離が⼤きく離れ ていることがわかる。 ※ここらへん真剣に勉強したわけではないので、 あまりアテにしないで下さい

  22. (2)組み合わせに関する情報⽋損 • 組み合わせの⽋損の問題を考えるために、画像のR, G, BのGの 部分だけランダムにシャッフルしてみる G だ け ラ

    ン ダ ム シ ャ ッ フ ル
  23. (2)組み合わせに関する情報⽋損 ※簡単のため、閾値処 理は⾏っていない

  24. (2)組み合わせに関する情報⽋損 組み合わせの情報が無視されるため、1次元ヒストグラ ムに変換すると全く同じものとして扱われる! ( )=( )

  25. (3)空間的な情報⽋損 空間的情報は完全に⽋損している ( )=( )

  26. (1)知覚均等性問題への対処 ①⾊空間を増やす ⾊空間ごとに特定の⾊を(⾒分けやすい/⾒分けにくい)というこ とがありそうなので、増やせば精度が上がる ②ビンの数を増やす ヒストグラムの分割の幅を⼩さくすれば、細かい差にも対応出来 るかもしれない(ただし計算時間の増加と過学習のリスクがある)

  27. ⾊空間を増やす⽅法 • Pythonであれば、OpenCV, Scikit-Image, colour-science, colormath等のライブラリを使えば良い。 • 最終的には33個の⾊空間を使った。 • (RGB,

    XYZ, YCC, HSV, HLS, Lab, Luv, YUV, YPP, YIQ, etc.)
  28. (2)組み合わせ問題への対処 ①⾊空間を増やす ⾊空間変換によって(R, G, B)の組み合わせが考慮される ②2次元的、3次元的な特徴を作る 2次元ヒストグラム, 3次元ヒストグラム, 2次元統計量, 3次元統計量を作った

  29. 2次元ヒストグラム(2D-histogram) 0 0 0 0 10 0 0 3 10

    0 0 3 15 3 0 0 1 5 0 0 0 0 0 0 0 0 0 0 0 10 0 0 2 10 0 0 0 14 6 0 0 0 1 0 0 0 0 0 0 0 0 0 0 9 0 0 0 3 0 0 0 13 0 3 0 0 0 5 7 0 0 0 0 0 0 flatten flatten flatten GB count count count ※Count後の値は偽物です (スペースの都合)
  30. 2次元統計量(2D-stats) (RGグラフにおける) , の平均: … , の分散: … , の最⼤値:

    … GB 極座標に 変換 極座標に 変換 極座標に 変換 (GBグラフにおける) , の平均: … , の分散: … , の最⼤値: … (BRグラフにおける) , の平均: … , の分散: … , の最⼤値: …
  31. 3次元ヒストグラム(3D-histogram) ※Count後の値は偽物です (スペースの都合) RGB プ ロ ッ ト 0 0

    0 0 10 0 0 3 10 0 0 3 15 3 0 0 1 5 0 0 0 0 0 0 0 0 0 0 0 10 0 0 3 10 0 0 3 15 3 0 0 1 5 0 0 0 0 0 0 0 0 0 0 0 10 0 0 3 10 0 0 3 15 3 0 0 1 5 0 0 0 0 0 0 0 0 0 0 0 10 0 0 3 10 0 0 3 15 3 0 0 1 5 0 0 0 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 flatten
  32. 3次元統計量(3D-stats) ※Count後の値は偽物です (スペースの都合) RGB プ ロ ッ ト 球座標に 変換

    , , の平均: … , , の分散: … , , の最⼤値: …
  33. (3)空間的な情報⽋損に対する対処 • サボった。僕のResNet-50君はあまり精度がよくなかった・・ (おそらく)今回の敗因・・・ • Deepでなくとも、SIFTとかHOGを⼊れてBag-Of-Keypointsと かするべきだったかもしれない 4位の⼈のBlog 「⼥性ものはオフホワイトになりやすい。」 http://threeprogramming.lolipop.jp/blog/?p=1092

    やっぱり空間的情報は⼤事だった
  34. 結果 ⽤いた特徴量 Accuracy(5-fold CV, Local validation) 1次元ヒストグラム(bins = 256) 0.7716

    2次元ヒストグラム(bins = 8) 0.7738 3次元ヒストグラム(bins = 16) 0.7735 1次元統計量 0.7767 2次元統計量 0.7789 3次元統計量 0.7701 全部をconcatしたもの 0.7792 ⽤いた統計量: 平均、標準偏差、最⼤、最⼩、中央、最頻値、尖度、 歪度、(15, 33, 66, 83)percentile ⽤いた⾊空間: 33個
  35. ちなみに・・・ Q. こんなに⾊空間変換や職⼈的な特徴抽出をし なくても、CNNで⾊空間ヒストグラムを学習 させれば良いのでは?

  36. ちなみに・・・ A. KerasのConv3Dを⽤いて3D-CNNで⾊空間ヒストグラムを学習 させたのですが、精度は0.75程度で、単純にflattenしてMLPに かけた場合と変わりませんでした。 ただ、データ数が⾜りないのが原因かもしれないので、誰か巨⼤ な⾊分類データセットがある⼈がいたら3D-CNNで⾊空間ヒスト グラムを学習させてみてほしいです(もしかしたら⾮常に有効な ⼿法かも?)

  37. 3-3. metricsの最適化 • Balanced accuracyはaccuracyの平均 ⇛クラスごとのサンプルサイズの逆数に⽐例した重みが与えられ ている (データが多いクラスの画像には⼩さな評価、 データが少ないクラスの画像には⼤きな評価、ということ) ⇛予測”確率“に対してサンプルサイズの逆⽐に⽐例した重みをか

    けてやってargmaxを取ればbalanced accuracyは簡単に最⼤化出 来る!(しかも、Imbalanced Dataへの対処も同時に⾏える)
  38. 3-3. metricsの最適化 • しかし・・・ 多くの機械学習モデル(KNN, SVM, GBDT, RandomForest, etc..) は各クラスに所属する確率を出⼒することが出来る。

    これは本当に「確率」になっているのだろうか? ⾔い換えれば、 実際の出現頻度と出⼒された確率は⼀致しているのか?
  39. 3-3-1. 確率の補正の⼿法について http://scikit-learn.org/stable/modules/calibration.html • 横軸が出⼒された確率、縦軸 が実際の出現頻度 • Logistic Regressionを除けば、 全てのモデルが実際の出現頻

    度と⽐べて確率が⼤幅にずれ ている。→補正が必要!
  40. 3-3-1. 確率の補正の⼿法について • 補正の⽅法は単純で、予測確率→実際の出現頻度の回帰モデル を作れば良い。 • ただし、必ず単調⾮減少関数でなければならず、線形回帰では 表現⼒が⾜りないため、 Isotonic Regressionを⽤いる。

  41. Isotonic Regression • 線形回帰よりも複雑な関数を表現 でき、かつ単調⾮減少関数になっ ていることがわかる。

  42. Probability calibration • 確率を補正する⽅法を⼀般にProbability Calibrationと呼び、 Scikit-Learnで実装されている。使い⽅は次のようになる。 • cvで何foldにするかを指定でき、補正の際はそれぞれのfoldで 補正された予測結果を平均するらしい。ちなみにcvはデフォル トでstratifiedKfoldを⽤いている。

  43. Probability calibration こんな感じ from sklearn.datasets import load_iris from xgboost import

    XGBClassifier from sklearn.calibration import CalibratedClassifierCV from sklearn.model_selection import train_test_split X, y = load_iris(return_X_y = True) X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.33) model = XGBClassifier() isotonic = CalibratedClassifierCV(model, cv = 5, method = 'isotonic') isotonic.fit(X_train, y_train) y_pred = isotonic.predict_proba(X_val)
  44. 確率補正の結果 • 単純にXGBoostの出⼒した確率にサンプル数の逆⽐をかけると balanced accuracyはPublic LBで68%程度だった。 • Stackingの最終層のモデルをLogisticRegressionにすることで 確率が補正され、Public LBで70%弱になった。

    • 最終層のLogistic Regressionに対してprobability calibrationを ⾏うと、Public LBで70%強になった。 ※正確な数字がなくてすいません><
  45. 3-3-2. Imbalanced Dataへの対処 (1)XGBoostでClass_weightを指定して学習 →上⼿く学習できなかった (2)SMOTEでOversampling →全てのクラスの画像数を最多クラスと同じにして学習させたが、 依然として多数クラスへの予測が多く、良い精度は出なかった

  46. 3-3-2. Imbalanced Dataへの対処 • (3)UndersamplingしてBagging • →(1), (2)よりも良い結果だったが、probability calibrationを⽤ いた⼿法のほうがPublic

    LBでもLocalでも良い精度だった。
  47. 4-1. 上位の⼈の⼿法 • 表彰会で1位, 2位, 3位の⼈がプレゼンテーションを⾏っていた ので、軽くまとめて紹介します。 • その他、Twitter/Blog 等で⼿法を公開していた⼈についても紹

    介します。
  48. 9位 (Private LB Score: 0.70348) • ResNet-50のFine-Tuning • 100 ModelのEnsemble

    • Kerasでclass_weightにサンプル数の逆⽐で重み付け • 精度はResnet > inception, xceptionだった • augmentationはあまり効果がなかったため⾏わなかった https://togetter.com/li/1129936?page=2
  49. 4位 (Private LB Score: 0.71536) • VGG16(finetune), resnet(finetune), 1 *

    1フィルタを適⽤した CNN, 1 * 1フィルタのみのCNNの4つのモデルのアンサンブル (それぞれ10 ~ 20個の平均) • 確率 * サンプルサイズの逆⽐で最適化(class_weightによる学習 よりも精度が良かったらしい) • Accuracyではなくloglossを重視
  50. 4位 (Private LB Score: 0.71536) • Stackingモデルも加えてloglossを最⼩化するよう各モデルを加 重平均 • loglossを最⼩化するために確率にn乗をかける

    http://threeprogramming.lolipop.jp/blog/?p=1092 ※実は確率n乗は僕もやっていたのですが、すぐoverfitしてしまって難しかったです。というか、 probability calibrationを⾏って最適な nを求めたら綺麗に0.95 < n < 1.05ぐらいになったので、必要 なくなったという感じでした。
  51. 3位(Private LB Score: 0.71931) • ResNet50, Inception-V3, Xception, DenseNet169(全てfinetune) •

    ResNet50, ResNext, DenseNet121(全てscratchで学習) • DenseNet121(HSVで学習), DenseNet121(L *a *bで学習) • Spatial transformer network→VGG-likeなCNN • GLCM correlation matrixで特徴抽出 • 平均、分散等の統計量を計算
  52. 3位(Private LB Score: 0.71931) ①ResNet50, Inception-V3, Xception, DenseNet169, ResNet50, ResNext,

    DenseNet121, DenseNet121, DenseNet121, ②Spatial transformer network→VGG-likeなCNN ③GLCM correlation matrixで特徴抽出 ④平均、分散等の統計量を計算
  53. 3位(Private LB Score: 0.71931) ⑤2次元ヒストグラム(HSV, L *a *b), 3次元ヒストグラム(RGB) •

    ① ~ ⑤を全てconcatしてFC層→softmax • Class_weightをつけて学習 • 確率に重み付けして補正
  54. 2位(Private LB Score: 0.72273) • 3次元ヒストグラム(RGB, bins = 16)とHOGを特徴にして XGBoost,

    RandomForest, LogisticRegression • Deep LearningはVGG-16 • LabelをOne-hotにせずにじませる (model reguralization via label smoothing)
  55. 2位(Private LB Score: 0.72273) • Trainデータに対する⾊毎の正解率を⽤いてTestデータに対す る予測確率を補正 • Oversamplingとaugmentationでclass imbalanceに対処

    • Stacking NN系列だけでは精度は伸びず、他の特徴量を使ったXGBoostを 組み合わせると良いらしい
  56. 1位(Private LB Score: 0.72679) • 4⼈チームで参加 • (⾮常に⼤きなshake-upだったらしい?) • 3⼈の予測をsoft-votingした後に確率に重み(サンプル数の逆

    ⽐?)をかける
  57. 1位(Private LB Score: 0.72679) ⼀⼈⽬: • 画像を分割して特徴抽出し、XGBoost, RandomForest, ET •

    4層程度の浅いCNNで分類 ⼆⼈⽬: • ResNet-50 三⼈⽬: • 2層のCNNとInceptionV3をconcatしたらしい。 (浅いCNNと深いCNNの組み合わせで特徴を保持する)
  58. まとめ • 30空間ほど⾊空間を⽤いて、 1次元 ~ 3次元⾊空間ヒストグラムと 1次元 ~ 3次元⾊空間統計量を抽出し、特徴として⽤いた •

    Probability calibrationを⽤いて正確な確率を求めるのが metrics(balanced accuracy)の最適化に対して最も有効だった • 他の⼈の⼿法を紹介した。被っている部分も多かった。
  59. 結論 • やっぱり画像系コンペはDeep Learningが最強 • ⾊分類や、各クラスの画像の⾊の分布が⼤きく異なるデータ セットの分類であれば、⾊空間ヒストグラムからの職⼈的な特 徴抽出も精度改善には多少役に⽴つかもしれない。

  60. None
  61. ご清聴ありがとうございました。