Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Deep Learning以外の手法でユニクロコンに参戦してみた (Kaggle Meetup...
Search
takashi oya
October 28, 2017
11
21k
Deep Learning以外の手法でユニクロコンに参戦してみた (Kaggle Meetup #3)
Kaggle Meetup #3で発表した内容です。
takashi oya
October 28, 2017
Tweet
Share
More Decks by takashi oya
See All by takashi oya
Airflow入門
takashioya
7
4.2k
Featured
See All Featured
Statistics for Hackers
jakevdp
797
220k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
98
18k
Designing for Performance
lara
604
68k
Rebuilding a faster, lazier Slack
samanthasiow
79
8.8k
Keith and Marios Guide to Fast Websites
keithpitt
410
22k
Building a Scalable Design System with Sketch
lauravandoore
460
33k
The Cult of Friendly URLs
andyhume
78
6.1k
Fantastic passwords and where to find them - at NoRuKo
philnash
50
2.9k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
3
360
Code Review Best Practice
trishagee
65
17k
VelocityConf: Rendering Performance Case Studies
addyosmani
327
24k
Java REST API Framework Comparison - PWX 2021
mraible
28
8.3k
Transcript
Deep Learning以外の⼿法で ユニクロコンに参戦してみた @mamas16k Kaggle Tokyo Meetup #3
Outline 0.はじめに 1.ユニクロコンペとは? 2.結果 3.⼿法 4.上位の⼈の⼿法まとめ
0.はじめに • Twitter ID: mamas16k • 物理系の学部2年⽣ • 機械学習暦・プログラミング暦共に1年ぐらいの初⼼者 •
データ分析系の企業でインターンしてました • ユニクロコンは初の機械学習コンペ 今回のKaggle Meetupの初⼼者枠なので、あまり真に受けずにた くさんマサカリを投げてくれると有り難いです><
1.ユニクロコンペとは? • Kaggleではなく、オプトDSLで2017年4⽉ ~ 7⽉に開催 • スポンサー:Fast Retailing (ユニクロの親会社) •
服、靴下、ベルト等の画像を24⾊にmulticlass分類 (ベージュ、⿊、⻘、茶⾊、緑、カーキ、オレンジ, etc) ※権利関係の都合で、全⼒でフリー素材を使います。 http://illustrain.com/?cat=79
オプトのコンペの特徴(Kaggleとの違い) • 参加者がほとんど⽇本⼈の機械学習コンペ • KernelやDiscussionが存在しない。チームマージのルール、 Public LBのルールなど、多少違う点がある。 • ⽇本語であるため参加の敷居が低く、Kaggleと並⾏してやって みても良い?
(今オプト引っ越しコンペ出てて、10/31締め切りなのでヤバイです・・・)
1-1. 全クラスの画像例 beige blue black brown dark_brown dark_gray dark_green gray
dark_orange green khaki light_gray
1-1. 全クラスの画像例 light_green navy natural off_white olive orange pink red
purple white wine yellow
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枚
ユニクロコン名物:三連靴下 ※ 1枚の画像です
1-3. metricsについて • Balanced accuracyで評価される。 ⼀⾔で⾔えば、24 classに対するaccuracyの平均
2. 結果 • 70.791%で6位でした。ついでに特別賞と10万円をゲット
3. ⼿法 コンペを始める前に思ったこと: ・⾊分類であれば、空間的情報はあまり関係しないのでは? ・関係ないのであれば、通常のCNNの空間⽅向に対する⾼い表 現⼒はほとんど無駄になっているのでは? ・上⼿く「⾊」分類であるということを⽣かせないか?
3-1. おおまかな⼿法 ①Deep Learningを使わずに、⾊に関する特徴を頑張って抽出 ②metricsの最適化にprobability calibrationを⽤いた。 ③XGBoost, LightGBMのStacking (5-foldで、最終層のモデルは、Logistic Regression)
3-2. 画像からの特徴抽出 • ⼤きく分けて⼆つの⼿法を⽤いた。 ①統計量を取る路線 ②ヒストグラムを特徴にする路線 ※閾値処理で⽩い背景を分離し、背景以外について⾏う (分離しないとwhiteの分類に悪影響があると考えられる)
3-2-1. 素朴なやり⽅(統計量路線) • R, G, Bの分布について統計量を取り、特徴にする。 Kaggle PlanetコンペのKernelで発⾒した。 R, G,
Bについてそれぞれ平均、標準偏差、最⼤値、最⼩値、歪 度、尖度を特徴にしている。 https://www.kaggle.com/greenmtn/xgb-starter-lb-0- 88232/output
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の最⼩値: …
3-2-2. 素朴なやり⽅(ヒストグラム路線) • R, G, Bについてヒストグラムを作り、特定の範囲における画素 数を特徴量にする。 例えば、ビン数を256にすると、R, G, B各々から256個の特徴が
得られるため、合計して 256 + 256 + 256 = 768個の特徴量が得られる。 特徴量の数と計算時間はトレードオフの関係になる。
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
3-2-3.素朴なやり⽅の問題点 実際は、この⼆つの素朴なやり⽅では良い精度は出ない。 理由として以下の3つが挙げられる。 (1)⾊空間の知覚均等性 (2)組み合わせに関する情報⽋損 (3)空間的な情報⽋損
(1)⾊空間の知覚均等性 • RGB⾊空間において各画素は"の元として表されるが、 元同⼠の“距離”は⼈間の知覚的な差と⼀致しない。 つまり、距離は遠いが⼈間にはほぼ同じ⾊ 距離は近いが⼈間にはかなり違う⾊ というケースが存在する。 ※ここで”距離”はユークリッド距離を指す。実際は、Delta E CIE
2000などの知覚に合うよう補正した距離の計算⽅法が存在 して、Pythonでも実装されているようである。 http://python- colormath.readthedocs.io/en/latest/delta_e.html
(1)⾊空間の知覚均等性 ・CIE 1931 XYZ⾊空間におけるマクアダム楕円 楕円の内部の点は⼈間が区別できない⾊の範囲 を指すらしい。 ⼈間の知覚と⾊空間における距離が⼤きく離れ ていることがわかる。 ※ここらへん真剣に勉強したわけではないので、 あまりアテにしないで下さい
(2)組み合わせに関する情報⽋損 • 組み合わせの⽋損の問題を考えるために、画像のR, G, BのGの 部分だけランダムにシャッフルしてみる G だ け ラ
ン ダ ム シ ャ ッ フ ル
(2)組み合わせに関する情報⽋損 ※簡単のため、閾値処 理は⾏っていない
(2)組み合わせに関する情報⽋損 組み合わせの情報が無視されるため、1次元ヒストグラ ムに変換すると全く同じものとして扱われる! ( )=( )
(3)空間的な情報⽋損 空間的情報は完全に⽋損している ( )=( )
(1)知覚均等性問題への対処 ①⾊空間を増やす ⾊空間ごとに特定の⾊を(⾒分けやすい/⾒分けにくい)というこ とがありそうなので、増やせば精度が上がる ②ビンの数を増やす ヒストグラムの分割の幅を⼩さくすれば、細かい差にも対応出来 るかもしれない(ただし計算時間の増加と過学習のリスクがある)
⾊空間を増やす⽅法 • Pythonであれば、OpenCV, Scikit-Image, colour-science, colormath等のライブラリを使えば良い。 • 最終的には33個の⾊空間を使った。 • (RGB,
XYZ, YCC, HSV, HLS, Lab, Luv, YUV, YPP, YIQ, etc.)
(2)組み合わせ問題への対処 ①⾊空間を増やす ⾊空間変換によって(R, G, B)の組み合わせが考慮される ②2次元的、3次元的な特徴を作る 2次元ヒストグラム, 3次元ヒストグラム, 2次元統計量, 3次元統計量を作った
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後の値は偽物です (スペースの都合)
2次元統計量(2D-stats) (RGグラフにおける) , の平均: … , の分散: … , の最⼤値:
… GB 極座標に 変換 極座標に 変換 極座標に 変換 (GBグラフにおける) , の平均: … , の分散: … , の最⼤値: … (BRグラフにおける) , の平均: … , の分散: … , の最⼤値: …
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
3次元統計量(3D-stats) ※Count後の値は偽物です (スペースの都合) RGB プ ロ ッ ト 球座標に 変換
, , の平均: … , , の分散: … , , の最⼤値: …
(3)空間的な情報⽋損に対する対処 • サボった。僕のResNet-50君はあまり精度がよくなかった・・ (おそらく)今回の敗因・・・ • Deepでなくとも、SIFTとかHOGを⼊れてBag-Of-Keypointsと かするべきだったかもしれない 4位の⼈のBlog 「⼥性ものはオフホワイトになりやすい。」 http://threeprogramming.lolipop.jp/blog/?p=1092
やっぱり空間的情報は⼤事だった
結果 ⽤いた特徴量 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個
ちなみに・・・ Q. こんなに⾊空間変換や職⼈的な特徴抽出をし なくても、CNNで⾊空間ヒストグラムを学習 させれば良いのでは?
ちなみに・・・ A. KerasのConv3Dを⽤いて3D-CNNで⾊空間ヒストグラムを学習 させたのですが、精度は0.75程度で、単純にflattenしてMLPに かけた場合と変わりませんでした。 ただ、データ数が⾜りないのが原因かもしれないので、誰か巨⼤ な⾊分類データセットがある⼈がいたら3D-CNNで⾊空間ヒスト グラムを学習させてみてほしいです(もしかしたら⾮常に有効な ⼿法かも?)
3-3. metricsの最適化 • Balanced accuracyはaccuracyの平均 ⇛クラスごとのサンプルサイズの逆数に⽐例した重みが与えられ ている (データが多いクラスの画像には⼩さな評価、 データが少ないクラスの画像には⼤きな評価、ということ) ⇛予測”確率“に対してサンプルサイズの逆⽐に⽐例した重みをか
けてやってargmaxを取ればbalanced accuracyは簡単に最⼤化出 来る!(しかも、Imbalanced Dataへの対処も同時に⾏える)
3-3. metricsの最適化 • しかし・・・ 多くの機械学習モデル(KNN, SVM, GBDT, RandomForest, etc..) は各クラスに所属する確率を出⼒することが出来る。
これは本当に「確率」になっているのだろうか? ⾔い換えれば、 実際の出現頻度と出⼒された確率は⼀致しているのか?
3-3-1. 確率の補正の⼿法について http://scikit-learn.org/stable/modules/calibration.html • 横軸が出⼒された確率、縦軸 が実際の出現頻度 • Logistic Regressionを除けば、 全てのモデルが実際の出現頻
度と⽐べて確率が⼤幅にずれ ている。→補正が必要!
3-3-1. 確率の補正の⼿法について • 補正の⽅法は単純で、予測確率→実際の出現頻度の回帰モデル を作れば良い。 • ただし、必ず単調⾮減少関数でなければならず、線形回帰では 表現⼒が⾜りないため、 Isotonic Regressionを⽤いる。
Isotonic Regression • 線形回帰よりも複雑な関数を表現 でき、かつ単調⾮減少関数になっ ていることがわかる。
Probability calibration • 確率を補正する⽅法を⼀般にProbability Calibrationと呼び、 Scikit-Learnで実装されている。使い⽅は次のようになる。 • cvで何foldにするかを指定でき、補正の際はそれぞれのfoldで 補正された予測結果を平均するらしい。ちなみにcvはデフォル トでstratifiedKfoldを⽤いている。
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)
確率補正の結果 • 単純にXGBoostの出⼒した確率にサンプル数の逆⽐をかけると balanced accuracyはPublic LBで68%程度だった。 • Stackingの最終層のモデルをLogisticRegressionにすることで 確率が補正され、Public LBで70%弱になった。
• 最終層のLogistic Regressionに対してprobability calibrationを ⾏うと、Public LBで70%強になった。 ※正確な数字がなくてすいません><
3-3-2. Imbalanced Dataへの対処 (1)XGBoostでClass_weightを指定して学習 →上⼿く学習できなかった (2)SMOTEでOversampling →全てのクラスの画像数を最多クラスと同じにして学習させたが、 依然として多数クラスへの予測が多く、良い精度は出なかった
3-3-2. Imbalanced Dataへの対処 • (3)UndersamplingしてBagging • →(1), (2)よりも良い結果だったが、probability calibrationを⽤ いた⼿法のほうがPublic
LBでもLocalでも良い精度だった。
4-1. 上位の⼈の⼿法 • 表彰会で1位, 2位, 3位の⼈がプレゼンテーションを⾏っていた ので、軽くまとめて紹介します。 • その他、Twitter/Blog 等で⼿法を公開していた⼈についても紹
介します。
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
4位 (Private LB Score: 0.71536) • VGG16(finetune), resnet(finetune), 1 *
1フィルタを適⽤した CNN, 1 * 1フィルタのみのCNNの4つのモデルのアンサンブル (それぞれ10 ~ 20個の平均) • 確率 * サンプルサイズの逆⽐で最適化(class_weightによる学習 よりも精度が良かったらしい) • Accuracyではなくloglossを重視
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ぐらいになったので、必要 なくなったという感じでした。
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で特徴抽出 • 平均、分散等の統計量を計算
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で特徴抽出 ④平均、分散等の統計量を計算
3位(Private LB Score: 0.71931) ⑤2次元ヒストグラム(HSV, L *a *b), 3次元ヒストグラム(RGB) •
① ~ ⑤を全てconcatしてFC層→softmax • Class_weightをつけて学習 • 確率に重み付けして補正
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)
2位(Private LB Score: 0.72273) • Trainデータに対する⾊毎の正解率を⽤いてTestデータに対す る予測確率を補正 • Oversamplingとaugmentationでclass imbalanceに対処
• Stacking NN系列だけでは精度は伸びず、他の特徴量を使ったXGBoostを 組み合わせると良いらしい
1位(Private LB Score: 0.72679) • 4⼈チームで参加 • (⾮常に⼤きなshake-upだったらしい?) • 3⼈の予測をsoft-votingした後に確率に重み(サンプル数の逆
⽐?)をかける
1位(Private LB Score: 0.72679) ⼀⼈⽬: • 画像を分割して特徴抽出し、XGBoost, RandomForest, ET •
4層程度の浅いCNNで分類 ⼆⼈⽬: • ResNet-50 三⼈⽬: • 2層のCNNとInceptionV3をconcatしたらしい。 (浅いCNNと深いCNNの組み合わせで特徴を保持する)
まとめ • 30空間ほど⾊空間を⽤いて、 1次元 ~ 3次元⾊空間ヒストグラムと 1次元 ~ 3次元⾊空間統計量を抽出し、特徴として⽤いた •
Probability calibrationを⽤いて正確な確率を求めるのが metrics(balanced accuracy)の最適化に対して最も有効だった • 他の⼈の⼿法を紹介した。被っている部分も多かった。
結論 • やっぱり画像系コンペはDeep Learningが最強 • ⾊分類や、各クラスの画像の⾊の分布が⼤きく異なるデータ セットの分類であれば、⾊空間ヒストグラムからの職⼈的な特 徴抽出も精度改善には多少役に⽴つかもしれない。
None
ご清聴ありがとうございました。