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.1k
Featured
See All Featured
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
6
520
Rebuilding a faster, lazier Slack
samanthasiow
79
8.7k
The Pragmatic Product Professional
lauravandoore
32
6.3k
Building Flexible Design Systems
yeseniaperezcruz
327
38k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
95
17k
Fashionably flexible responsive web design (full day workshop)
malarkey
405
66k
Why Our Code Smells
bkeepers
PRO
335
57k
Intergalactic Javascript Robots from Outer Space
tanoku
270
27k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
365
25k
Done Done
chrislema
181
16k
How to train your dragon (web standard)
notwaldorf
88
5.7k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
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
ご清聴ありがとうございました。