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

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

takashi oya
October 28, 2017
21k

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

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

takashi oya

October 28, 2017
Tweet

Transcript

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

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

    服、靴下、ベルト等の画像を24⾊にmulticlass分類 (ベージュ、⿊、⻘、茶⾊、緑、カーキ、オレンジ, etc) ※権利関係の都合で、全⼒でフリー素材を使います。 http://illustrain.com/?cat=79
  3. 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枚
  4. 3-2-1. 素朴なやり⽅(統計量路線) • R, G, Bの分布について統計量を取り、特徴にする。 Kaggle PlanetコンペのKernelで発⾒した。 R, G,

    Bについてそれぞれ平均、標準偏差、最⼤値、最⼩値、歪 度、尖度を特徴にしている。 https://www.kaggle.com/greenmtn/xgb-starter-lb-0- 88232/output
  5. 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の最⼩値: …
  6. 3-2-2. 素朴なやり⽅(ヒストグラム路線) • R, G, Bについてヒストグラムを作り、特定の範囲における画素 数を特徴量にする。 例えば、ビン数を256にすると、R, G, B各々から256個の特徴が

    得られるため、合計して 256 + 256 + 256 = 768個の特徴量が得られる。 特徴量の数と計算時間はトレードオフの関係になる。
  7. 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
  8. 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後の値は偽物です (スペースの都合)
  9. 2次元統計量(2D-stats) (RGグラフにおける) , の平均: … , の分散: … , の最⼤値:

    … GB 極座標に 変換 極座標に 変換 極座標に 変換 (GBグラフにおける) , の平均: … , の分散: … , の最⼤値: … (BRグラフにおける) , の平均: … , の分散: … , の最⼤値: …
  10. 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
  11. 結果 ⽤いた特徴量 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個
  12. 3-3. metricsの最適化 • しかし・・・ 多くの機械学習モデル(KNN, SVM, GBDT, RandomForest, etc..) は各クラスに所属する確率を出⼒することが出来る。

    これは本当に「確率」になっているのだろうか? ⾔い換えれば、 実際の出現頻度と出⼒された確率は⼀致しているのか?
  13. 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)
  14. 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
  15. 4位 (Private LB Score: 0.71536) • VGG16(finetune), resnet(finetune), 1 *

    1フィルタを適⽤した CNN, 1 * 1フィルタのみのCNNの4つのモデルのアンサンブル (それぞれ10 ~ 20個の平均) • 確率 * サンプルサイズの逆⽐で最適化(class_weightによる学習 よりも精度が良かったらしい) • Accuracyではなくloglossを重視
  16. 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ぐらいになったので、必要 なくなったという感じでした。
  17. 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で特徴抽出 • 平均、分散等の統計量を計算
  18. 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で特徴抽出 ④平均、分散等の統計量を計算
  19. 3位(Private LB Score: 0.71931) ⑤2次元ヒストグラム(HSV, L *a *b), 3次元ヒストグラム(RGB) •

    ① ~ ⑤を全てconcatしてFC層→softmax • Class_weightをつけて学習 • 確率に重み付けして補正
  20. 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)
  21. 1位(Private LB Score: 0.72679) ⼀⼈⽬: • 画像を分割して特徴抽出し、XGBoost, RandomForest, ET •

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

    Probability calibrationを⽤いて正確な確率を求めるのが metrics(balanced accuracy)の最適化に対して最も有効だった • 他の⼈の⼿法を紹介した。被っている部分も多かった。