ఫిబ్రవరి-మార్చి 2019లో, సోషల్ నెట్వర్క్ ఫీడ్కి ర్యాంక్ ఇవ్వడానికి పోటీ జరిగింది SNA హ్యాకథాన్ 2019, ఇందులో మా జట్టు మొదటి స్థానంలో నిలిచింది. వ్యాసంలో నేను పోటీ యొక్క సంస్థ, మేము ప్రయత్నించిన పద్ధతులు మరియు పెద్ద డేటాపై శిక్షణ కోసం క్యాట్బూస్ట్ సెట్టింగ్ల గురించి మాట్లాడతాను.
SNA హ్యాకథాన్
ఈ పేరుతో హ్యాకథాన్ నిర్వహించడం ఇది మూడోసారి. ఇది వరుసగా సోషల్ నెట్వర్క్ ok.ru ద్వారా నిర్వహించబడుతుంది, పని మరియు డేటా నేరుగా ఈ సోషల్ నెట్వర్క్కు సంబంధించినవి.
ఈ సందర్భంలో SNA (సోషల్ నెట్వర్క్ విశ్లేషణ) అనేది సామాజిక గ్రాఫ్ యొక్క విశ్లేషణగా కాకుండా సోషల్ నెట్వర్క్ యొక్క విశ్లేషణగా మరింత సరిగ్గా అర్థం చేసుకోబడుతుంది.
2014లో, ఒక పోస్ట్కు ఎన్ని లైక్లు వస్తాయో అంచనా వేయడం టాస్క్.
2016 లో - VVZ టాస్క్ (బహుశా మీకు తెలిసి ఉండవచ్చు), సామాజిక గ్రాఫ్ యొక్క విశ్లేషణకు దగ్గరగా ఉంటుంది.
2019లో, వినియోగదారు పోస్ట్ను ఇష్టపడే సంభావ్యత ఆధారంగా వినియోగదారు ఫీడ్కు ర్యాంక్ ఇవ్వడం.
నేను 2014 గురించి చెప్పలేను, కానీ 2016 మరియు 2019లో, డేటా విశ్లేషణ సామర్థ్యాలతో పాటు, పెద్ద డేటాతో పని చేసే నైపుణ్యాలు కూడా అవసరం. మెషిన్ లెర్నింగ్ మరియు పెద్ద డేటా ప్రాసెసింగ్ సమస్యల కలయిక ఈ పోటీలకు నన్ను ఆకర్షించింది మరియు ఈ రంగాలలో నా అనుభవం నేను గెలవడానికి సహాయపడింది.
ఈ పోటీ ఫిబ్రవరి 7న ఆన్లైన్లో ప్రారంభమైంది మరియు 3 టాస్క్లను కలిగి ఉంది. ఎవరైనా సైట్లో నమోదు చేసుకోవచ్చు, డౌన్లోడ్ చేసుకోవచ్చు ఆధార మరియు కొన్ని గంటల పాటు మీ కారును లోడ్ చేయండి. మార్చి 15న ఆన్లైన్ వేదిక ముగింపులో, ప్రతి షో జంపింగ్ ఈవెంట్లోని టాప్ 15 మందిని ఆఫ్లైన్ స్టేజ్ కోసం Mail.ru కార్యాలయానికి ఆహ్వానించారు, ఇది మార్చి 30 నుండి ఏప్రిల్ 1 వరకు జరిగింది.
పని
మూలం డేటా వినియోగదారు IDలు (userId) మరియు పోస్ట్ IDలు (objectId) అందిస్తుంది. వినియోగదారుకు పోస్ట్ చూపబడితే, అప్పుడు డేటాలో userId, objectId, ఈ పోస్ట్కి వినియోగదారు ప్రతిచర్యలు (అభిప్రాయం) మరియు వివిధ ఫీచర్లు లేదా చిత్రాలు మరియు టెక్స్ట్లకు లింక్ల సెట్ను కలిగి ఉన్న లైన్ ఉంటుంది.
వినియోగదారుని గుర్తింపు
objectId
యజమాని ఐడి
చూడు
చిత్రాలు
3555
22
5677
[ఇష్టపడింది, క్లిక్ చేయబడింది]
[హాష్1]
12842
55
32144
[ఇష్టపడలేదు]
[హాష్2,హాష్3]
13145
35
5677
[క్లిక్, భాగస్వామ్యం]
[హాష్2]
పరీక్ష డేటా సెట్ ఒకే విధమైన నిర్మాణాన్ని కలిగి ఉంది, కానీ ఫీడ్బ్యాక్ ఫీల్డ్ లేదు. ఫీడ్బ్యాక్ ఫీల్డ్లో 'ఇష్టపడిన' ప్రతిచర్య ఉనికిని అంచనా వేయడం పని.
సమర్పణ ఫైల్ క్రింది నిర్మాణాన్ని కలిగి ఉంది:
వినియోగదారుని గుర్తింపు
క్రమబద్ధీకరించబడిన జాబితా[objectId]
123
78,13,54,22
128
35,61,55
131
35,68,129,11
మెట్రిక్ అనేది వినియోగదారులకు సగటు ROC AUC.
డేటా యొక్క మరింత వివరణాత్మక వివరణ ఇక్కడ చూడవచ్చు కౌన్సిల్ వెబ్సైట్. మీరు పరీక్షలు మరియు చిత్రాలతో సహా అక్కడ డేటాను కూడా డౌన్లోడ్ చేసుకోవచ్చు.
ఆన్లైన్ వేదిక
ఆన్లైన్ దశలో, పనిని 3 భాగాలుగా విభజించారు
సహకార వ్యవస్థ - చిత్రాలు మరియు పాఠాలు మినహా అన్ని లక్షణాలను కలిగి ఉంటుంది;
చిత్రం - చిత్రాల గురించి సమాచారాన్ని మాత్రమే కలిగి ఉంటుంది;
పాఠం — వచనాల గురించి మాత్రమే సమాచారాన్ని కలిగి ఉంటుంది.
ఆఫ్లైన్ దశ
ఆఫ్లైన్ దశలో, డేటా అన్ని లక్షణాలను కలిగి ఉంటుంది, అయితే టెక్స్ట్లు మరియు చిత్రాలు చాలా తక్కువగా ఉన్నాయి. డేటాసెట్లో 1,5 రెట్లు ఎక్కువ అడ్డు వరుసలు ఉన్నాయి, వాటిలో ఇప్పటికే చాలా ఉన్నాయి.
సమస్య పరిష్కారం
నేను పనిలో CV చేస్తున్నందున, నేను ఈ పోటీలో "చిత్రాలు" టాస్క్తో నా ప్రయాణాన్ని ప్రారంభించాను. అందించిన డేటా userId, objectId, ownerId (పోస్ట్ ప్రచురించబడిన సమూహం), పోస్ట్ను సృష్టించడం మరియు ప్రదర్శించడం కోసం టైమ్స్టాంప్లు మరియు, వాస్తవానికి, ఈ పోస్ట్ కోసం చిత్రం.
టైమ్స్టాంప్ల ఆధారంగా అనేక ఫీచర్లను రూపొందించిన తర్వాత, ఇమేజ్నెట్లో ముందుగా శిక్షణ పొందిన న్యూరాన్ యొక్క చివరి పొరను తీసుకొని, ఈ ఎంబెడ్డింగ్లను బూస్టింగ్కు పంపడం తదుపరి ఆలోచన.
ఫలితాలు ఆకట్టుకోలేదు. ఇమేజ్నెట్ న్యూరాన్ నుండి పొందుపరచడం అసంబద్ధం, నేను నా స్వంత ఆటోఎన్కోడర్ని తయారు చేసుకోవాలని అనుకున్నాను.
ఇది చాలా సమయం పట్టింది మరియు ఫలితం మెరుగుపడలేదు.
ఫీచర్ జనరేషన్
చిత్రాలతో పని చేయడానికి చాలా సమయం పడుతుంది, కాబట్టి నేను సరళమైనదాన్ని చేయాలని నిర్ణయించుకున్నాను.
మీరు వెంటనే చూడగలిగినట్లుగా, డేటాసెట్లో అనేక వర్గీకరణ లక్షణాలు ఉన్నాయి మరియు ఎక్కువ ఇబ్బంది పడకుండా ఉండటానికి, నేను క్యాట్బూస్ట్ తీసుకున్నాను. పరిష్కారం అద్భుతమైనది, ఎటువంటి సెట్టింగ్లు లేకుండా నేను వెంటనే లీడర్బోర్డ్ యొక్క మొదటి పంక్తికి చేరుకున్నాను.
చాలా డేటా ఉంది మరియు ఇది పారేకెట్ ఫార్మాట్లో వేయబడింది, కాబట్టి రెండుసార్లు ఆలోచించకుండా, నేను స్కాలా తీసుకొని ప్రతిదీ స్పార్క్లో రాయడం ప్రారంభించాను.
ఇమేజ్ ఎంబెడ్డింగ్ల కంటే ఎక్కువ వృద్ధిని అందించిన సరళమైన లక్షణాలు:
ఆబ్జెక్ట్ఐడి, యూజర్ఐడి మరియు ఓనర్ఐడి డేటాలో ఎన్నిసార్లు కనిపించాయి (జనాదరణతో పరస్పర సంబంధం కలిగి ఉండాలి);
ownerId నుండి userId ఎన్ని పోస్ట్లను చూసింది (సమూహంలో వినియోగదారు ఆసక్తితో పరస్పర సంబంధం కలిగి ఉండాలి);
ఓనర్ఐడి నుండి ఎన్ని ప్రత్యేకమైన యూజర్ఐడిలు పోస్ట్లను చూశారు (సమూహం ప్రేక్షకుల పరిమాణాన్ని ప్రతిబింబిస్తుంది).
టైమ్స్టాంప్ల నుండి వినియోగదారు ఫీడ్ని (ఉదయం/మధ్యాహ్నం/సాయంత్రం/రాత్రి) వీక్షించిన రోజు సమయాన్ని పొందడం సాధ్యమైంది. ఈ వర్గాలను కలపడం ద్వారా, మీరు లక్షణాలను రూపొందించడాన్ని కొనసాగించవచ్చు:
సాయంత్రం యూజర్ఐడి ఎన్నిసార్లు లాగిన్ అయ్యింది;
ఈ పోస్ట్ ఏ సమయంలో ఎక్కువగా చూపబడుతుంది (objectId) మరియు మొదలైనవి.
ఇవన్నీ క్రమంగా మెట్రిక్లను మెరుగుపరిచాయి. కానీ శిక్షణ డేటాసెట్ పరిమాణం దాదాపు 20M రికార్డులు, కాబట్టి లక్షణాలను జోడించడం వల్ల శిక్షణ బాగా మందగించింది.
నేను డేటాను ఉపయోగించడంలో నా విధానాన్ని పునరాలోచించాను. డేటా సమయం మీద ఆధారపడి ఉన్నప్పటికీ, "భవిష్యత్తులో" స్పష్టమైన సమాచారం లీక్లు ఏవీ నేను చూడలేదు, అయినప్పటికీ, నేను దానిని ఇలా విడదీశాను:
మాకు అందించిన శిక్షణా సమితి (ఫిబ్రవరి మరియు మార్చి 2 వారాలు) 2 భాగాలుగా విభజించబడింది.
మోడల్ గత N రోజుల నుండి డేటాపై శిక్షణ పొందింది. పైన వివరించిన అగ్రిగేషన్లు పరీక్షతో సహా మొత్తం డేటాపై నిర్మించబడ్డాయి. అదే సమయంలో, టార్గెట్ వేరియబుల్ యొక్క వివిధ ఎన్కోడింగ్లను రూపొందించడం సాధ్యమయ్యే డేటా కనిపించింది. ఇప్పటికే కొత్త ఫీచర్లను సృష్టిస్తున్న కోడ్ని మళ్లీ ఉపయోగించడం మరియు శిక్షణ పొందని డేటాను ఫీడ్ చేయడం మరియు లక్ష్యం = 1 చేయడం సరళమైన విధానం.
కాబట్టి, మేము ఇలాంటి లక్షణాలను పొందాము:
గ్రూప్ ఓనర్ఐడిలో యూజర్ఐడి పోస్ట్ను ఎన్నిసార్లు చూసింది;
గ్రూప్ ఓనర్ఐడిలోని పోస్ట్ను యూజర్ఐడి ఎన్నిసార్లు లైక్ చేసింది;
userId ownerId నుండి లైక్ చేసిన పోస్ట్ల శాతం.
అంటే తేలింది లక్ష్య ఎన్కోడింగ్ అని అర్థం వర్గీకరణ లక్షణాల యొక్క వివిధ కలయికల కోసం డేటాసెట్లో భాగంగా. సూత్రప్రాయంగా, క్యాట్బూస్ట్ లక్ష్య ఎన్కోడింగ్ను కూడా నిర్మిస్తుంది మరియు ఈ దృక్కోణం నుండి ఎటువంటి ప్రయోజనం లేదు, అయితే, ఉదాహరణకు, ఈ గుంపులోని పోస్ట్లను ఇష్టపడిన ప్రత్యేక వినియోగదారుల సంఖ్యను లెక్కించడం సాధ్యమైంది. అదే సమయంలో, ప్రధాన లక్ష్యం సాధించబడింది - నా డేటాసెట్ అనేక సార్లు తగ్గించబడింది మరియు లక్షణాలను రూపొందించడం కొనసాగించడం సాధ్యమైంది.
క్యాట్బూస్ట్ ఇష్టపడిన ప్రతిచర్య ఆధారంగా మాత్రమే ఎన్కోడింగ్ను రూపొందించగలదు, ఫీడ్బ్యాక్ ఇతర ప్రతిచర్యలను కలిగి ఉంటుంది: మళ్లీ భాగస్వామ్యం చేయబడింది, ఇష్టపడలేదు, ఇష్టపడలేదు, క్లిక్ చేయబడింది, విస్మరించబడింది, ఎన్కోడింగ్లు మాన్యువల్గా చేయవచ్చు. నేను అన్ని రకాల కంకరలను మళ్లీ లెక్కించాను మరియు డేటాసెట్ను పెంచకుండా ఉండటానికి తక్కువ ప్రాముఖ్యత కలిగిన ఫీచర్లను తొలగించాను.
అప్పటికి నేను చాలా తేడాతో మొదటి స్థానంలో ఉన్నాను. గందరగోళంగా ఉన్న ఏకైక విషయం ఏమిటంటే, ఇమేజ్ ఎంబెడ్డింగ్లు దాదాపుగా వృద్ధిని చూపించలేదు. అన్నీ క్యాట్బూస్ట్కు ఇవ్వాలనే ఆలోచన వచ్చింది. మేము Kmeans చిత్రాలను క్లస్టర్ చేస్తాము మరియు కొత్త వర్గీకరణ ఫీచర్ ఇమేజ్క్యాట్ని పొందుతాము.
KMeans నుండి పొందిన క్లస్టర్ల మాన్యువల్ ఫిల్టరింగ్ మరియు విలీనం తర్వాత ఇక్కడ కొన్ని తరగతులు ఉన్నాయి.
imageCat ఆధారంగా మేము ఉత్పత్తి చేస్తాము:
కొత్త వర్గీకరణ లక్షణాలు:
యూజర్ఐడి ద్వారా ఏ ఇమేజ్క్యాట్ ఎక్కువగా వీక్షించబడింది;
ఏ ఇమేజ్క్యాట్ ఎక్కువగా యజమాని ఐడిని చూపుతుంది;
ఏ ఇమేజ్క్యాట్ని యూజర్ఐడి ఎక్కువగా ఇష్టపడింది;
వివిధ కౌంటర్లు:
యూజర్ఐడిని ఎన్ని ప్రత్యేకమైన ఇమేజ్క్యాట్ చూసింది;
పైన వివరించిన విధంగా దాదాపు 15 సారూప్య లక్షణాలు ప్లస్ టార్గెట్ ఎన్కోడింగ్.
పాఠం
చిత్ర పోటీలో ఫలితాలు నాకు సరిపోతాయి మరియు నేను టెక్ట్స్లో నా చేతిని ప్రయత్నించాలని నిర్ణయించుకున్నాను. నేను ఇంతకు ముందు టెక్స్ట్లతో ఎక్కువ పని చేయలేదు మరియు మూర్ఖంగా, నేను tf-idf మరియు svdలో రోజుని చంపాను. అప్పుడు నేను doc2vecతో బేస్లైన్ని చూశాను, అది నాకు అవసరమైనది చేస్తుంది. doc2vec పారామితులను కొద్దిగా సర్దుబాటు చేసిన తర్వాత, నాకు టెక్స్ట్ ఎంబెడ్డింగ్లు వచ్చాయి.
ఆపై నేను చిత్రాల కోసం కోడ్ను మళ్లీ ఉపయోగించాను, అందులో నేను ఇమేజ్ ఎంబెడ్డింగ్లను టెక్స్ట్ ఎంబెడ్డింగ్లతో భర్తీ చేసాను. ఫలితంగా, నేను పాఠ్య పోటీలో 2వ స్థానంలో నిలిచాను.
సహకార వ్యవస్థ
ఒక పోటీ మిగిలి ఉంది, నేను ఇంకా స్టిక్తో "పోక్" చేయలేదు మరియు లీడర్బోర్డ్లో AUC ద్వారా తీర్పునిస్తే, ఈ నిర్దిష్ట పోటీ ఫలితాలు ఆఫ్లైన్ వేదికపై గొప్ప ప్రభావాన్ని చూపి ఉండాలి.
నేను సోర్స్ డేటాలో ఉన్న అన్ని ఫీచర్లను తీసుకున్నాను, వర్గీకరించిన వాటిని ఎంచుకున్నాను మరియు ఇమేజ్ల ఆధారంగా ఉన్న ఫీచర్లను మినహాయించి ఇమేజ్ల కోసం అదే కంకరలను లెక్కించాను. దీన్ని క్యాట్బూస్ట్లో ఉంచడం వల్ల నేను 2వ స్థానానికి చేరుకున్నాను.
క్యాట్బూస్ట్ ఆప్టిమైజేషన్ యొక్క మొదటి దశలు
ఒకటి మొదటి మరియు రెండు రెండవ స్థానాలు నాకు సంతోషాన్నిచ్చాయి, కానీ నేను ప్రత్యేకంగా ఏమీ చేయలేదని ఒక అవగాహన ఉంది, అంటే నేను స్థానం కోల్పోవడాన్ని ఆశించవచ్చు.
పోటీ యొక్క పని వినియోగదారులోని పోస్ట్లను ర్యాంక్ చేయడం, మరియు ఈ సమయంలో నేను వర్గీకరణ సమస్యను పరిష్కరిస్తున్నాను, అంటే తప్పు మెట్రిక్ను ఆప్టిమైజ్ చేయడం.
నేను మీకు ఒక సాధారణ ఉదాహరణ ఇస్తాను:
వినియోగదారుని గుర్తింపు
objectId
ప్రిడిక్షన్
అసలు నిజము
1
10
0.9
1
1
11
0.8
1
1
12
0.7
1
1
13
0.6
1
1
14
0.5
0
2
15
0.4
0
2
16
0.3
1
చిన్న పునర్వ్యవస్థీకరణ చేద్దాం
వినియోగదారుని గుర్తింపు
objectId
ప్రిడిక్షన్
అసలు నిజము
1
10
0.9
1
1
11
0.8
1
1
12
0.7
1
1
13
0.6
0
2
16
0.5
1
2
15
0.4
0
1
14
0.3
1
మేము ఈ క్రింది ఫలితాలను పొందుతాము:
మోడల్
AUC
వినియోగదారు1 AUC
వినియోగదారు2 AUC
AUC అని అర్థం
ఎంపిక 1
0,8
1,0
0,0
0,5
ఎంపిక 2
0,7
0,75
1,0
0,875
మీరు చూడగలిగినట్లుగా, మొత్తం AUC మెట్రిక్ను మెరుగుపరచడం అంటే వినియోగదారులో సగటు AUC మెట్రిక్ని మెరుగుపరచడం కాదు.
క్యాట్బూస్ట్ ర్యాంకింగ్ మెట్రిక్లను ఎలా ఆప్టిమైజ్ చేయాలో తెలుసు పెట్టె నుండి. నేను ర్యాంకింగ్ కొలమానాల గురించి చదివాను, విజయ గాథలు క్యాట్బూస్ట్ని ఉపయోగిస్తున్నప్పుడు మరియు రాత్రిపూట శిక్షణ ఇచ్చేలా YetiRankPairwise సెట్ చేయండి. ఫలితం ఆకట్టుకోలేదు. నేను శిక్షణ పొందలేదని నిర్ణయించుకుని, నేను ఎర్రర్ ఫంక్షన్ను QueryRMSEకి మార్చాను, ఇది క్యాట్బూస్ట్ డాక్యుమెంటేషన్ ద్వారా అంచనా వేయడం, వేగంగా కలుస్తుంది. చివరికి, నేను వర్గీకరణ కోసం శిక్షణ పొందినప్పుడు అదే ఫలితాలను పొందాను, కానీ ఈ రెండు నమూనాల బృందాలు మంచి పెరుగుదలను ఇచ్చాయి, ఇది నన్ను మూడు పోటీలలో మొదటి స్థానానికి తీసుకువచ్చింది.
"సహకార వ్యవస్థలు" పోటీ యొక్క ఆన్లైన్ దశ ముగియడానికి 5 నిమిషాల ముందు, సెర్గీ షాల్నోవ్ నన్ను రెండవ స్థానానికి తరలించాడు. మేము కలిసి తదుపరి మార్గంలో నడిచాము.
ఆఫ్లైన్ దశకు సిద్ధమవుతోంది
RTX 2080 TI వీడియో కార్డ్తో ఆన్లైన్ దశలో మేము విజయం సాధించగలమని హామీ ఇవ్వబడింది, కానీ ప్రధాన బహుమతి 300 రూబిళ్లు మరియు చాలా మటుకు, చివరి మొదటి స్థానం కూడా ఈ 000 వారాల పాటు పని చేయవలసి వచ్చింది.
ఇది ముగిసినప్పుడు, సెర్గీ క్యాట్బూస్ట్ను కూడా ఉపయోగించాడు. మేము ఆలోచనలు మరియు లక్షణాలను మార్పిడి చేసుకున్నాము మరియు నేను దాని గురించి తెలుసుకున్నాను అన్నా వెరోనికా డోరోగుష్ నివేదిక ఇందులో నా అనేక ప్రశ్నలకు సమాధానాలు ఉన్నాయి మరియు అప్పటికి నా దగ్గర లేనివి కూడా ఉన్నాయి.
నివేదికను వీక్షించడం వలన మేము అన్ని పారామితులను డిఫాల్ట్ విలువకు తిరిగి ఇవ్వాలి మరియు సెట్టింగులను చాలా జాగ్రత్తగా చేయాలి మరియు లక్షణాల సమితిని పరిష్కరించిన తర్వాత మాత్రమే చేయాలి అనే ఆలోచన నాకు వచ్చింది. ఇప్పుడు ఒక శిక్షణ దాదాపు 15 గంటలు పట్టింది, అయితే ఒక మోడల్ ర్యాంకింగ్తో సమిష్టిలో పొందిన దాని కంటే మెరుగైన వేగాన్ని పొందగలిగింది.
ఫీచర్ జనరేషన్
సహకార వ్యవస్థల పోటీలో, మోడల్కు పెద్ద సంఖ్యలో ఫీచర్లు ముఖ్యమైనవిగా అంచనా వేయబడతాయి. ఉదాహరణకి, auditweights_spark_svd - అతి ముఖ్యమైన సంకేతం, కానీ దాని అర్థం గురించి సమాచారం లేదు. ముఖ్యమైన లక్షణాల ఆధారంగా వివిధ కంకరలను లెక్కించడం విలువైనదని నేను భావించాను. ఉదాహరణకు, సగటు auditweights_spark_svd వినియోగదారు ద్వారా, సమూహం ద్వారా, వస్తువు ద్వారా. ఎలాంటి శిక్షణ నిర్వహించబడని డేటాను ఉపయోగించి అదే లెక్కించవచ్చు మరియు లక్ష్యం = 1, అంటే సగటు auditweights_spark_svd అతను ఇష్టపడే వస్తువుల ద్వారా వినియోగదారు ద్వారా. అంతేకాకుండా ముఖ్యమైన సంకేతాలు auditweights_spark_svd, అనేక ఉన్నాయి. వాటిలో కొన్ని ఇక్కడ ఉన్నాయి:
ఆడిట్వెయిట్స్CtrGender
ఆడిట్వెయిట్స్CtrHigh
userOwnerCounterCreateLikes
ఉదాహరణకు, సగటు ఆడిట్వెయిట్స్CtrGender userId ప్రకారం ఇది సగటు విలువ వలె ఒక ముఖ్యమైన లక్షణంగా మారింది userOwnerCounterCreateLikes userId+ownerId ద్వారా. మీరు ఫీల్డ్ల అర్థాన్ని అర్థం చేసుకోవాలని ఇది ఇప్పటికే మీరు భావించేలా చేయాలి.
ముఖ్యమైన లక్షణాలు కూడా ఉన్నాయి ఆడిట్వెయిట్స్లైక్లకౌంట్ и ఆడిట్వెయిట్స్ షోల కౌంట్. ఒకదానికొకటి విభజిస్తే, మరింత ముఖ్యమైన లక్షణం పొందబడింది.
డేటా లీక్ అవుతుంది
పోటీ మరియు ఉత్పత్తి మోడలింగ్ చాలా భిన్నమైన పనులు. డేటాను సిద్ధం చేస్తున్నప్పుడు, అన్ని వివరాలను పరిగణనలోకి తీసుకోవడం మరియు పరీక్షలో లక్ష్య వేరియబుల్ గురించి కొంత చిన్నవిషయం కాని సమాచారాన్ని తెలియజేయడం చాలా కష్టం. మేము ఉత్పత్తి పరిష్కారాన్ని రూపొందిస్తున్నట్లయితే, మోడల్కు శిక్షణ ఇచ్చేటప్పుడు డేటా లీక్లను ఉపయోగించకుండా ఉండటానికి ప్రయత్నిస్తాము. కానీ మేము పోటీలో గెలవాలనుకుంటే, డేటా లీక్లు ఉత్తమ ఫీచర్లు.
డేటాను అధ్యయనం చేసిన తర్వాత, ఆబ్జెక్ట్ఐడి విలువల ప్రకారం మీరు దాన్ని చూడవచ్చు ఆడిట్వెయిట్స్లైక్లకౌంట్ и ఆడిట్వెయిట్స్ షోల కౌంట్ మార్పు, అంటే ఈ లక్షణాల యొక్క గరిష్ట విలువల నిష్పత్తి ప్రదర్శన సమయంలో ఉన్న నిష్పత్తి కంటే పోస్ట్ మార్పిడిని బాగా ప్రతిబింబిస్తుంది.
మేము కనుగొన్న మొదటి లీక్ auditweightsLikesCountMax/auditweightsShowsCountMax.
కానీ మేము డేటాను మరింత దగ్గరగా చూస్తే? ప్రదర్శన తేదీ ద్వారా క్రమబద్ధీకరించండి మరియు పొందండి:
objectId
వినియోగదారుని గుర్తింపు
ఆడిట్వెయిట్స్ షోల కౌంట్
ఆడిట్వెయిట్స్లైక్లకౌంట్
లక్ష్యం (ఇష్టపడింది)
1
1
12
3
బహుశా కాకపోవచ్చు
1
2
15
3
అవును అనుకుంట
1
3
16
4
నేను అలాంటి మొదటి ఉదాహరణను కనుగొన్నప్పుడు ఆశ్చర్యంగా ఉంది మరియు నా అంచనా నిజం కాలేదని తేలింది. కానీ, ఆబ్జెక్ట్లోని ఈ లక్షణాల యొక్క గరిష్ట విలువలు పెరుగుదలను ఇచ్చాయనే వాస్తవాన్ని పరిగణనలోకి తీసుకుంటే, మేము సోమరితనం కాదు మరియు కనుగొనాలని నిర్ణయించుకున్నాము ఆడిట్వెయిట్లు షోస్కౌంట్ నెక్స్ట్ и ఆడిట్వెయిట్స్లైక్స్కౌంట్నెక్స్ట్, అంటే, తదుపరి క్షణంలో విలువలు. లక్షణాన్ని జోడించడం ద్వారా (ఆడిట్వెయిట్స్ షోస్ కౌంట్ నెక్స్ట్-ఆడిట్వెయిట్స్ షోస్ కౌంట్)/(ఆడిట్వెయిట్స్ లైక్స్ కౌంట్-ఆడిట్వెయిట్స్ లైక్స్ కౌంట్ నెక్స్ట్) మేము త్వరగా ఒక పదునైన జంప్ చేసాము.
కింది విలువలను కనుగొనడం ద్వారా ఇలాంటి లీక్లను ఉపయోగించవచ్చు userOwnerCounterCreateLikes యూజర్ఐడి+ఓనర్ఐడిలో మరియు ఉదాహరణకు, ఆడిట్వెయిట్స్CtrGender objectId+userGender లోపల. మేము లీక్లతో సారూప్యమైన 6 ఫీల్డ్లను కనుగొన్నాము మరియు వాటి నుండి వీలైనంత ఎక్కువ సమాచారాన్ని సేకరించాము.
ఆ సమయానికి, మేము సహకార ఫీచర్ల నుండి వీలైనంత ఎక్కువ సమాచారాన్ని స్క్వీజ్ చేసాము, కానీ ఇమేజ్ మరియు టెక్స్ట్ పోటీలకు తిరిగి వెళ్ళలేదు. నేను తనిఖీ చేయడానికి ఒక గొప్ప ఆలోచన కలిగి ఉన్నాను: సంబంధిత పోటీలలో చిత్రాలు లేదా టెక్స్ట్ల ఆధారంగా నేరుగా ఫీచర్లు ఎంత ఇస్తాయి?
చిత్రం మరియు టెక్స్ట్ పోటీలలో ఎటువంటి లీక్లు లేవు, కానీ ఆ సమయానికి నేను డిఫాల్ట్ క్యాట్బూస్ట్ పారామితులను తిరిగి ఇచ్చాను, కోడ్ను శుభ్రపరిచాను మరియు కొన్ని లక్షణాలను జోడించాను. ఫలితం:
నిర్ణయం
త్వరలో
చిత్రాలతో గరిష్టంగా
0.6411
గరిష్టంగా చిత్రాలు లేవు
0.6297
రెండో స్థానం ఫలితం
0.6295
నిర్ణయం
త్వరలో
వచనాలతో గరిష్టంగా
0.666
వచనాలు లేకుండా గరిష్టంగా
0.660
రెండో స్థానం ఫలితం
0.656
నిర్ణయం
త్వరలో
సహకారంలో గరిష్టంగా
0.745
రెండో స్థానం ఫలితం
0.723
మేము టెక్స్ట్లు మరియు చిత్రాల నుండి చాలా వరకు దూరమయ్యే అవకాశం లేదని స్పష్టమైంది మరియు కొన్ని ఆసక్తికరమైన ఆలోచనలను ప్రయత్నించిన తర్వాత, మేము వాటితో పనిచేయడం మానేశాము.
సహకార వ్యవస్థలలో ఫీచర్ల తదుపరి తరం పెరుగుదలను అందించలేదు మరియు మేము ర్యాంకింగ్ ప్రారంభించాము. ఆన్లైన్ దశలో, వర్గీకరణ మరియు ర్యాంకింగ్ సమిష్టి నాకు చిన్న పెరుగుదలను అందించింది, ఎందుకంటే నేను వర్గీకరణలో శిక్షణ పొందాను. YetiRanlPairwiseతో సహా ఎర్రర్ ఫంక్షన్లు ఏవీ లాగ్లాస్ చేసిన (0,745 vs. 0,725) ఫలితానికి సమీపంలో ఎక్కడా ఉత్పత్తి చేయలేదు. QueryCrossEntropy కోసం ఇంకా ఆశ ఉంది, అది ప్రారంభించబడలేదు.
ఆఫ్లైన్ దశ
ఆఫ్లైన్ దశలో, డేటా నిర్మాణం అలాగే ఉంది, కానీ చిన్న మార్పులు ఉన్నాయి:
ఐడెంటిఫైయర్లు userId, objectId, ownerId మళ్లీ రాండమైజ్ చేయబడ్డాయి;
అనేక సంకేతాలు తొలగించబడ్డాయి మరియు అనేక పేరు మార్చబడ్డాయి;
డేటా సుమారు 1,5 రెట్లు పెరిగింది.
జాబితా చేయబడిన ఇబ్బందులతో పాటు, ఒక పెద్ద ప్లస్ కూడా ఉంది: బృందానికి RTX 2080TIతో పెద్ద సర్వర్ కేటాయించబడింది. నేను చాలా కాలంగా htopని ఆస్వాదించాను.
ఒకే ఒక ఆలోచన ఉంది - ఇప్పటికే ఉన్నదాన్ని పునరుత్పత్తి చేయడం. సర్వర్లో పర్యావరణాన్ని సెటప్ చేయడం కోసం కొన్ని గంటలు గడిపిన తర్వాత, ఫలితాలు పునరుత్పత్తి చేయగలవని మేము క్రమంగా ధృవీకరించడం ప్రారంభించాము. మేము ఎదుర్కొంటున్న ప్రధాన సమస్య డేటా వాల్యూమ్ పెరుగుదల. మేము లోడ్ని కొద్దిగా తగ్గించి, catboost పరామితిని ctr_complexity=1 సెట్ చేయాలని నిర్ణయించుకున్నాము. ఇది వేగాన్ని కొద్దిగా తగ్గిస్తుంది, కానీ నా మోడల్ పని చేయడం ప్రారంభించింది, ఫలితం బాగుంది - 0,733. సెర్గీ, నాలా కాకుండా, డేటాను 2 భాగాలుగా విభజించలేదు మరియు మొత్తం డేటాపై శిక్షణ పొందాడు, అయితే ఇది ఆన్లైన్ దశలో ఉత్తమ ఫలితాలను అందించినప్పటికీ, ఆఫ్లైన్ దశలో చాలా ఇబ్బందులు ఉన్నాయి. మేము రూపొందించిన అన్ని ఫీచర్లను తీసుకొని వాటిని క్యాట్బూస్ట్లోకి నెట్టడానికి ప్రయత్నించినట్లయితే, ఆన్లైన్ దశలో ఏదీ పని చేయదు. సెర్గీ టైప్ ఆప్టిమైజేషన్ చేసాడు, ఉదాహరణకు, ఫ్లోట్64 రకాలను ఫ్లోట్32కి మార్చడం. ఈ వ్యాసం లో, మీరు పాండాల్లో మెమొరీ ఆప్టిమైజేషన్ సమాచారాన్ని కనుగొనవచ్చు. ఫలితంగా, సెర్గీ మొత్తం డేటాను ఉపయోగించి CPUపై శిక్షణ పొందాడు మరియు సుమారు 0,735 పొందాడు.
ఈ ఫలితాలు గెలవడానికి సరిపోతాయి, కానీ మేము మా నిజమైన వేగాన్ని దాచిపెట్టాము మరియు ఇతర జట్లు కూడా అదే పని చేయడం లేదని నిర్ధారించుకోలేకపోయాము.
చివరి వరకు పోరాడండి
క్యాట్బూస్ట్ ట్యూనింగ్
మా పరిష్కారం పూర్తిగా పునరుత్పత్తి చేయబడింది, మేము టెక్స్ట్ డేటా మరియు చిత్రాల లక్షణాలను జోడించాము, కాబట్టి క్యాట్బూస్ట్ పారామితులను ట్యూన్ చేయడం మాత్రమే మిగిలి ఉంది. సెర్గీ తక్కువ సంఖ్యలో పునరావృతాలతో CPUలో శిక్షణ పొందాడు మరియు నేను ctr_complexity=1తో శిక్షణ పొందాను. ఒక రోజు మిగిలి ఉంది మరియు మీరు కేవలం పునరావృత్తులు లేదా పెరిగిన ctr_complexityని జోడించినట్లయితే, ఉదయం నాటికి మీరు మరింత మెరుగైన వేగాన్ని పొందవచ్చు మరియు రోజంతా నడవవచ్చు.
ఆఫ్లైన్ దశలో, సైట్లో ఉత్తమమైన పరిష్కారాన్ని ఎంచుకోకుండా స్పీడ్లను చాలా సులభంగా దాచవచ్చు. సమర్పణలు ముగియడానికి ముందు చివరి నిమిషాల్లో లీడర్బోర్డ్లో తీవ్రమైన మార్పులను మేము ఆశించాము మరియు ఆపకూడదని నిర్ణయించుకున్నాము.
అన్నా వీడియో నుండి, మోడల్ నాణ్యతను మెరుగుపరచడానికి, కింది పారామితులను ఎంచుకోవడం ఉత్తమం అని నేను తెలుసుకున్నాను:
నేర్చుకునే_రేటు — డిఫాల్ట్ విలువ డేటాసెట్ పరిమాణం ఆధారంగా లెక్కించబడుతుంది. లెర్నింగ్_రేట్ని పెంచడానికి పునరావృతాల సంఖ్యను పెంచడం అవసరం.
l2_leaf_reg — రెగ్యులరైజేషన్ కోఎఫీషియంట్, డిఫాల్ట్ విలువ 3, ప్రాధాన్యంగా 2 నుండి 30 వరకు ఎంచుకోండి. విలువను తగ్గించడం ఓవర్ ఫిట్లో పెరుగుదలకు దారితీస్తుంది.
బ్యాకింగ్_ఉష్ణోగ్రత - నమూనాలోని వస్తువుల బరువులకు యాదృచ్ఛికతను జోడిస్తుంది. డిఫాల్ట్ విలువ 1, ఇక్కడ బరువులు ఘాతాంక పంపిణీ నుండి తీసుకోబడతాయి. విలువ తగ్గడం ఓవర్ ఫిట్ పెరుగుదలకు దారితీస్తుంది.
యాదృచ్ఛిక_బలం - నిర్దిష్ట పునరావృతం వద్ద విభజనల ఎంపికను ప్రభావితం చేస్తుంది. యాదృచ్ఛిక_బలం ఎంత ఎక్కువగా ఉంటే, తక్కువ ప్రాముఖ్యత కలిగిన స్ప్లిట్ ఎంపిక చేయబడే అవకాశం ఎక్కువగా ఉంటుంది. ప్రతి తదుపరి పునరావృతం వద్ద, యాదృచ్ఛికత తగ్గుతుంది. విలువ తగ్గడం ఓవర్ ఫిట్ పెరుగుదలకు దారితీస్తుంది.
ఇతర పారామితులు తుది ఫలితంపై చాలా తక్కువ ప్రభావాన్ని కలిగి ఉంటాయి, కాబట్టి నేను వాటిని ఎంచుకోవడానికి ప్రయత్నించలేదు. ctr_complexity=1తో నా GPU డేటాసెట్పై శిక్షణ యొక్క ఒక పునరుక్తికి 20 నిమిషాలు పట్టింది మరియు తగ్గించబడిన డేటాసెట్లోని ఎంచుకున్న పారామీటర్లు పూర్తి డేటాసెట్లోని సరైన వాటి నుండి కొద్దిగా భిన్నంగా ఉంటాయి. చివరికి, నేను 30% డేటాపై దాదాపు 10 పునరావృత్తులు చేసాను, ఆపై మొత్తం డేటాపై మరో 10 పునరావృత్తులు చేసాను. ఇది ఇలా మారింది:
నేర్చుకునే_రేటు నేను డిఫాల్ట్ నుండి 40% పెంచాను;
l2_leaf_reg దానిని అలాగే వదిలేశాడు;
బ్యాకింగ్_ఉష్ణోగ్రత и యాదృచ్ఛిక_బలం 0,8కి తగ్గింది.
డిఫాల్ట్ పారామితులతో మోడల్ తక్కువ శిక్షణ పొందిందని మేము నిర్ధారించగలము.
లీడర్బోర్డ్లో ఫలితాన్ని చూసినప్పుడు నేను చాలా ఆశ్చర్యపోయాను:
మోడల్
మోడల్ 1
మోడల్ 2
మోడల్ 3
సమిష్టి
ట్యూనింగ్ లేకుండా
0.7403
0.7404
0.7404
0.7407
ట్యూనింగ్తో
0.7406
0.7405
0.7406
0.7408
మోడల్ యొక్క శీఘ్ర అప్లికేషన్ అవసరం లేకపోతే, ఆప్టిమైజ్ చేయని పారామితులను ఉపయోగించి అనేక మోడళ్ల సమిష్టితో పారామితుల ఎంపికను భర్తీ చేయడం ఉత్తమం అని నేను నా కోసం నిర్ధారించాను.
సెర్గీ దానిని GPUలో అమలు చేయడానికి డేటాసెట్ పరిమాణాన్ని ఆప్టిమైజ్ చేస్తున్నాడు. డేటాలో కొంత భాగాన్ని కత్తిరించడం సరళమైన ఎంపిక, కానీ ఇది అనేక విధాలుగా చేయవచ్చు:
డేటాసెట్ మెమరీకి సరిపోయే వరకు పాత డేటాను (ఫిబ్రవరి ప్రారంభం) క్రమంగా తొలగించండి;
అతి తక్కువ ప్రాముఖ్యత కలిగిన లక్షణాలను తొలగించండి;
ఒకే ఒక్క ఎంట్రీ ఉన్న userIdలను తీసివేయండి;
పరీక్షలో ఉన్న యూజర్ఐడిలను మాత్రమే వదిలివేయండి.
మరియు అంతిమంగా, అన్ని ఎంపికల నుండి సమిష్టిని రూపొందించండి.
చివరి సమిష్టి
చివరి రోజు సాయంత్రం నాటికి, మేము 0,742 దిగుబడిని అందించిన మా మోడల్ల సమిష్టిని రూపొందించాము. రాత్రిపూట నేను నా మోడల్ను ctr_complexity=2తో ప్రారంభించాను మరియు 30 నిమిషాలకు బదులుగా అది 5 గంటల పాటు శిక్షణ పొందింది. తెల్లవారుజామున 4 గంటలకు మాత్రమే లెక్కించబడింది మరియు పబ్లిక్ లీడర్బోర్డ్లో 0,7433 అందించిన చివరి ఎన్సెంబుల్ని నేను తయారు చేసాను.
సమస్యను పరిష్కరించడానికి వివిధ విధానాల కారణంగా, మా అంచనాలు బలంగా పరస్పరం సంబంధం కలిగి లేవు, ఇది సమిష్టిలో మంచి పెరుగుదలను ఇచ్చింది. మంచి సమిష్టిని పొందడానికి, రా మోడల్ ప్రిడిక్షన్స్ ప్రిడిక్షన్ (prediction_type='RawFormulaVal')ని ఉపయోగించడం మరియు scale_pos_weight=neg_count/pos_count సెట్ చేయడం ఉత్తమం.
అనేక బృందాలు సిఫార్సుదారు సిస్టమ్ అల్గారిథమ్ల నియమావళిని అనుసరించాయి. నేను, ఈ రంగంలో నిపుణుడిని కానందున, వాటిని విశ్లేషించలేను, కానీ నేను 2 ఆసక్తికరమైన పరిష్కారాలను గుర్తుంచుకున్నాను.
నికోలాయ్ అనోఖిన్ యొక్క పరిష్కారం. నికోలాయ్, Mail.ru యొక్క ఉద్యోగి కావడంతో, బహుమతుల కోసం దరఖాస్తు చేయలేదు, కాబట్టి అతని లక్ష్యం గరిష్ట వేగాన్ని సాధించడం కాదు, సులభంగా కొలవగల పరిష్కారాన్ని పొందడం.
జ్యూరీ ప్రైజ్ విజేత జట్టు నిర్ణయం ఆధారంగా facebook నుండి ఈ కథనం, మాన్యువల్ పని లేకుండా చాలా మంచి ఇమేజ్ క్లస్టరింగ్ కోసం అనుమతించబడింది.
తీర్మానం
నా జ్ఞాపకశక్తిలో ఎక్కువగా నిలిచినవి:
డేటాలో వర్గీకరణ లక్షణాలు ఉంటే మరియు లక్ష్య ఎన్కోడింగ్ని సరిగ్గా ఎలా చేయాలో మీకు తెలిస్తే, క్యాట్బూస్ట్ని ప్రయత్నించడం ఇంకా మంచిది.
మీరు పోటీలో పాల్గొంటున్నట్లయితే, లెర్నింగ్_రేట్ మరియు పునరావృత్తులు కాకుండా ఇతర పారామితులను ఎంచుకోవడంలో మీరు సమయాన్ని వృథా చేయకూడదు. అనేక నమూనాల సమిష్టిని తయారు చేయడం వేగవంతమైన పరిష్కారం.
GPUలో బూస్టింగ్లు నేర్చుకోవచ్చు. క్యాట్బూస్ట్ GPUలో చాలా త్వరగా నేర్చుకోగలదు, కానీ ఇది చాలా మెమరీని తింటుంది.
ఆలోచనల అభివృద్ధి మరియు పరీక్ష సమయంలో, చిన్న rsm~=0.2 (CPU మాత్రమే) మరియు ctr_complexity=1 సెట్ చేయడం మంచిది.
ఇతర జట్లకు భిన్నంగా, మా మోడల్ల సమిష్టి పెద్ద పెరుగుదలను ఇచ్చింది. మేము ఆలోచనలను మాత్రమే ఇచ్చిపుచ్చుకున్నాము మరియు వివిధ భాషలలో వ్రాసాము. డేటాను విభజించడానికి మాకు భిన్నమైన విధానం ఉంది మరియు ప్రతి దాని స్వంత బగ్లు ఉన్నాయని నేను అనుకుంటున్నాను.
వర్గీకరణ ఆప్టిమైజేషన్ కంటే ర్యాంకింగ్ ఆప్టిమైజేషన్ అధ్వాన్నంగా ఎందుకు పని చేసిందో స్పష్టంగా లేదు.
నేను టెక్స్ట్లతో పని చేయడంలో కొంత అనుభవాన్ని పొందాను మరియు సిఫార్సుదారు సిస్టమ్లు ఎలా తయారు చేయబడతాయో అర్థం చేసుకున్నాను.
భావోద్వేగాలు, జ్ఞానం మరియు బహుమతులు అందుకున్నందుకు నిర్వాహకులకు ధన్యవాదాలు.