æŸå°Ÿç ç©¶æäž»å¬åæã³ã³ã [DS Dojo #1] åçããLLMã®åé¡ - 1st Solution -
ã¯ããã«
ã¯ãããŸããŠãæ ªåŒäŒç€ŸæŸå°Ÿç ç©¶æã§åããŠããé·è°·ã§ãã
2024幎4æã«å
¥ç€ŸããAIãœãªã¥ãŒã·ã§ã³éçºã®ãããžã§ã¯ããããŒãžã£ãŒãšããŠæŽ»åããŠããŸãã
ãããŸã§ã¯äŒæ¥ã®ç ç©¶æã§ããŒã¿è§£æãæ©æ¢°åŠç¿ã¢ã«ãŽãªãºã ã®ç ç©¶è
ãšããŠåãã€ã€ãAIã»ããŒã¿åæã®æè²ã®äŒç€Ÿãç«ã¡äžããŠäŒæ¥ãå人ã®ããŒã¿åæãªãã©ã·ãŒã®åºäžãã«å°œåããŠããŸããã
æŸå°Ÿç ã®æ§ç¯ãããšã³ã·ã¹ãã ã«æéãåããç ç©¶è
ãèµ·æ¥å®¶ãæè²è
ãšããŠæŸå°Ÿç ããäžçãããè¯ãããŠãããããšæãããžã§ã€ã³ããŸããã
ä»åã¯ãå æ¥æŸå°Ÿç ç©¶æã§éå¬ãããããŒã¿åæã³ã³ããã£ã·ã§ã³DS Dojo#1ã«ãããŠããããããããšç§(chome)ã®ããŒã ã1äœã«å ¥è³ããŸããã®ã§ããã®è§£æ³ãã玹ä»ããããŸãã
DS Dojo#1ãšã¯
DS Dojoã®äœçœ®ä»ããã³ã³ãã®è©³çްã«é¢ããŠã¯ãã¡ãã®èšäºãåç §ããã ããæ¬èšäºã§ã¯æŠèŠã玹ä»ããŸãã
ä»åã®ã¿ã¹ã¯ã¯ããããããã³ããã«å¯ŸããŠåçããããã¹ãããŒã¿ãã©ã®LLMããçæãããããåé¡ããããšãã§ãã
äžããããåŠç¿ããŒã¿(train.csv)ã®ã«ã©ã ã¯ä»¥äžã®ããã«ãªã£ãŠããŸããã
- prompt: çæAIã«å ¥åãããããã³ãã
- text: çæAIã«ããåç
- label: textãçæããLLMã«å¯Ÿå¿ããã©ãã«
- 0: GPT-3.5, 1: Claude-Haiku, 2: Gemini
ãã®ããŒã¿ãåŠç¿ãããã¹ãããŒã¿(test.csv)ã®labelãäºæž¬ãããã®ç²ŸåºŠãç«¶ããŸãã
ä»åã®è©äŸ¡ææšã¯F1-Score(macro)ã§ããã
F1-Scoreãšã¯ãåé¡ã¿ã¹ã¯ã®ç²ŸåºŠãè©äŸ¡ããè©äŸ¡ææšã®1ã€ã§ã0ãã1ã®éã®å€ãåããå€ã倧ããæ¹ããã粟床é«ãåé¡ã§ããŠãããšãããŸãã
åãçµã¿å 容
çµç€ã§ã®ã³ã³ãåå ãšãªã£ããããshigeãããå
¬éããŠããããŒã¹ã©ã€ã³ã®ææ³ã§ããLightGBMã®åé¡ã¢ãã«ãæµçšãã倧ããç¹åŸŽéäœæãšç¹åŸŽééžæã®2ã€ã«åãçµã¿ãŸããã
ãããã説æããŠãããŸãã
ç¹åŸŽéäœæ
äœæããfeatureã¯ä»¥äžã§ãã
- textã®æåãåèªãè¡ãæç« ã®æ°ãšpromptãšã®æ¯èŒ
- promptãštextã§åãåèªã䜿ã£ãŠããæ°
- 1æã«å«ãŸããåèªã®æ°
- textã«ååšããwordã®ãŠããŒã¯æ°
- promptãštextã®æåã®1åèª
- æ°åã«é¢ããç¹åŸŽ
- ã³ãŒãã®ããŒã¯ããŠã³èšæ³(```)ãšããã°ã©ãã³ã°èšèªã®ç¹åŸŽé
- èšå·ã«é¢ããç¹åŸŽ
- åãpromptã«å¯Ÿããtextã®æ¯èŒç¹åŸŽ
- TF-IDFç¹åŸŽé
ç¹åŸŽééžæãŸã§å®æœããåŸã®ç¹åŸŽééèŠåºŠã®äžäœã¯ä»¥äžã®ããã«ãªããŸããã

äžäœã«ã¯åãpromptã«å¯Ÿããtextã®æ¯èŒç¹åŸŽãããŠããŸããããŸããããã€ãã®TF-IDFç¹åŸŽãæå¹ã§ããã
以äžã§ã¯ç¹ã«æå¹ã ã£ããèšå·ã«é¢ããç¹åŸŽããšãåãpromptã«å¯Ÿããtextã®æ¯èŒç¹åŸŽãã«ã€ããŠè©³ãã説æããŸãã
èšå·ã«é¢ããç¹åŸŽ
åŠç¿ããŒã¿ããã©ãã©ãšã¿ãŠã¿ããšã2:Geminiã®åçæã«ãããèšå·ã䜿ãããŠããããšã«æ°ã¥ããŸããã
1ã€ãµã³ãã«ããŒã¿ãå
±æããŸãã
- prompt
Are there any new or emerging employee benefits that employers should consider offering? - 0: GPT-3.5
Some new or emerging employee benefits that employers may consider offering include wellness programs, mental health support, flexible work arrangements, remote work opportunities, financial wellness resources, and continued learning opportunities. These benefits can help improve employee satisfaction, well-being, and productivity. - 1: Claude-Haiku
Here are a few new or emerging employee benefits that employers should consider offering: 1. Remote work options: With the rise of remote work during the pandemic, employers should consider offering flexible work arrangements, such as remote work or hybrid models. 2. Mental health support: Providing access to mental health resources, counseling, or employee assistance programs can help support employee well-being. (以äžçç¥) - 2: Gemini
**Emerging Employee Benefits:** **1. Well-being and Mental Health Support:** * Access to therapy and counseling services * Flexible work arrangements (e.g., remote work, reduced hours) * Mindfulness and stress management programs **2. Financial Wellness:** * Student loan repayment assistance * Financial planning and counseling services * Equity incentives and profit-sharing programs (以äžçç¥)
åçæã¯Markdownèšæ³ã§æžãããŠãããã¢ã¹ã¿ãªã¹ã¯2ã€(**)ã§å²ãŸããæåã¯å€ªåã§è¡šèšãããŸãã
2:Geminiã§ã¯ãã®ã¢ã¹ã¿ãªã¹ã¯ã®äœ¿çšãä»ã®LLMãšæ¯ã¹ãŠãå€ãããŸããèŠåºãã«äœ¿çšãã#ãå€çšãããŠãããããèšå·ã®äœ¿çšã«é¢ããç¹åŸŽéãäœæããããšã§åé¡ç²ŸåºŠãäžããããšãã§ããã®ã§ã¯ãªãããšä»®èª¬ãç«ãŠãŸããã
ãããèžãŸããèšå·ã®å€ããèšå·ããå§ãŸã£ãŠãããã©ãããç¹åŸŽéãšããŠäœæããŸããã
以äžããµã³ãã«ã³ãŒãã§ãã
# symbol count, and whether text starts from symbol
pattern = r'[^\w]'
def symbol_count(x):
matches = re.findall(pattern, x)
return len(matches)
def is_symbol_first(x):
matches = re.findall(pattern, x[0])
return len(matches)
# èšå·ããå§ãŸãtextãåŠã
df_train['is_symbol_first_text'] = df_train['text'].apply(lambda x: is_symbol_first(x))
# textã®èšå·ã®æ°
df_train['symbol_count_text'] = df_train['text'].apply(lambda x: is_symbol_first(x))
# textå
ã®characteræ°ã«å¯Ÿããèšå·æ°ã®å²å
df_train['symbol_per_character_text'] = df_train['symbol_count_text'] / df_train['character_count_text']
äžã®æ¹ã«å ±æããç¹åŸŽééèŠåºŠã®äžäœã«èšå·ã«é¢ããç¹åŸŽéãããŠããããšããããã®ç¹åŸŽéãæå¹ã ã£ããšãããŸãã
åãpromptã«å¯Ÿããtextã®æ¯èŒç¹åŸŽ
ãã®ç¹åŸŽéã¯ãä»åã®åé¡èšå®ã«ç¹åããç¹åŸŽéã§ãã
ä»åã®ã¿ã¹ã¯ã¯ãããããã³ããã«å¯ŸããŠåçããããã¹ãããŒã¿ãã©ã®LLMããçæãããããåé¡ããããšããªã®ã§ãããåŠç¿ããŒã¿ãšãã¹ãããŒã¿ã«ã¯1ã€ã®ããã³ããã«å¯ŸããŠ3ã€ã®çæAIã®åçæãå¿
ãååšããŠããŸããã
æ¬æ¥ã§ããã°äžããããããã³ãããšåçæã®ã¿ããåçããLLMãäºæž¬ãã¹ããªã®ã§ããããã®åé¡èšå®ã«ãããŠã¯ãä»ã®LLMãåçããåçæãå å³ããäžã§LLMãäºæž¬ããããšãã§ããŸãã
ãªã®ã§ãåãpromptã«å¯Ÿããååçæã§äœæããç¹åŸŽéãæ¯èŒããçµæ(å²åãæå€§ãæå°ç)ãæ°ãã«ç¹åŸŽéãšããŠäœæããŸããã
以äžããµã³ãã«ã³ãŒãã§ãã
# compared texts by prompt
def compare_by_prompt(df, column='character_count_text'):
# feature aggregation group by prompt
df = pd.merge(
df,
df.groupby('prompt')[column].agg(['mean', 'max', 'min']).add_prefix(f'{column}_'),
on='prompt', how='left'
)
df[f'{column}_per_mean'] = df[column] / (df[f'{column}_mean'] + 1e3)
df[f'{column}_per_max'] = df[column] / (df[f'{column}_max'] + 1e3)
df[f'{column}_per_min'] = df[column] / (df[f'{column}_min'] + 1e3)
df[f'{column}_ismax'] = (df[column] == df[f'{column}_max']).astype(int)
df[f'{column}_ismin'] = (df[column] == df[f'{column}_min']).astype(int)
return df
df_train = compare_by_prompt(df_train, column='character_count_text')
(以äžç¥)
æ¯èŒç¹åŸŽéã¯TF-IDFç¹åŸŽé以å€ã®ãã¹ãŠã®åçæã«é¢ããç¹åŸŽéã§äœæããŸããã
ç¹åŸŽééèŠåºŠã®ã°ã©ããèŠããšãTF-IDFç¹åŸŽé以å€ã®ã»ãšãã©ã®ç¹åŸŽéããã®æ¯èŒç¹åŸŽéãšãªã£ãŠãããæå¹ã ã£ããšãããŸãã
ç¹åŸŽééžæ
ç¹ã«äœãèããã«ç¹åŸŽéãéç£ããããçžé¢ãé«ãç¹åŸŽéãå€åã«ãããšæã£ãã®ãšãTF-IDFç¹åŸŽãå«ãããš5,000ä»¶ãããã®ç¹åŸŽéãšãªã£ãŠããŠéåŠç¿ããŠããŸããšæããç¹åŸŽééžæãè¡ããŸããã
ç¹åŸŽééžæã¯ã以äžã®ã¹ãããã§å®æœããŸããã
- 1åç®ã®CVã§feature importanceã0ã®ããŒã¿ãšéèŠåºŠäžäœ100件以å€ã§çžé¢ä¿æ°ã0.95ãã倧ãããã¢ã®ç¹åŸŽéãå°ããæ¹ãåé€
- å床CVãåããŠãã¹ãã®Submissionãã¡ã€ã«ãäœæ
以äžãç¹åŸŽééžæã®ã³ãŒãã§ãã
# df_imp: CVã®çµæã®ç¹åŸŽééèŠåºŠã®åèšã®å€ãæ ŒçŽããDataFrame
# feature selection
features_use = df_imp[df_imp['lgb_gain'] != 0]['feature'].values
top_100_features = set(df_imp.head(100)['feature'].values.tolist())
thld = 0.95
# çžé¢è¡åãèšç®
corr_matrix = df_train[features_use].corr().abs()
# çžé¢ã®é«ãfeatureãã¢ã®ãã¡ãäžäœ100äœä»¥å€ã®ç¹åŸŽéãã¢ã®ç¹åŸŽéãäœãæ¹ãåé€
to_drop = []
for i in range(len(corr_matrix.columns)):
for j in range(i+1, len(corr_matrix.columns)):
if corr_matrix.iloc[i, j] > thld:
feat1 = corr_matrix.columns[i]
feat2 = corr_matrix.columns[j]
if (feat1 in top_100_features) and (feat2 in top_100_features):
continue
score_feat1 = df_imp[df_imp['feature'] == feat1]['lgb_gain'].values[0]
score_feat2 = df_imp[df_imp['feature'] == feat2]['lgb_gain'].values[0]
print(f'{feat1}: {score_feat1}, {feat2}: {score_feat2}')
if score_feat1 > score_feat2:
to_drop.append(feat2)
else:
to_drop.append(feat1)
features_use = list(set(features_use.tolist()).difference(set(to_drop)))
print(len(features_use))
ããã宿œããããšã«ããCVã¹ã³ã¢ã埮å¢ããŸããã
çµæ
Publicã§ã¯1äœãšå€§å·®ãã€ããããŠããŠã諊ããŠããã®ã§ããããã

Privateã§ã¯é転ããå
å·®ã§1äœã«ãªããŸããïŒ

Submissionåæ°ãæã ã®ããŒã ã1çªå€ãã£ãã§ãç¬
宿œãããã£ãããš
ä»åã¯ããã©ãããã£ãããæéã®å
Œãåãã§å®æœã§ããªãã£ãã§ããã以äžå®è£
ããŠã¿ããã£ãã§ãã
- èšèªã¢ãã«ç³»ïŒNLPã³ã³ãã§åŒ·ãèšèªã¢ãã«ã§ããDeBERTaã詊ããŠã¿ããã£ãã§ã
- ç¹åŸŽééžæïŒRFE(Recursive Feature Elimination)ãšããããå°ããã¯ãã«ã«ãªç¹åŸŽééžæã®ææ³ã䜿ã£ãŠã¿ããã£ãã§ã
- åŸåŠçïŒä»åã®ããŒã¿ã®ç¹æ§ãããã¹ãããŒã¿ã«ã1ã€ã®ããã³ããã«å¯ŸããŠ3ã€ã®åçæããããããäºæž¬çµæããããããªããªã©åŸåŠçé¢ã§ã®å·¥å€«ãå ¥ãããã£ãã§ã
ãããã«
ä¹
ã
ã®ã³ã³ãåå ã§ãããããã¯ãçæéã§åŠã³ãå€ããªãšæããŸããã
æ¥åã«ãããŠã¯åãã¿ã¹ã¯ãããããã®ããŒã¿ãµã€ãšã³ãã£ã¹ãã§è§£ãã±ãŒã¹ã¯ã»ãŒãªãã®ã§ãããããã®å®è£
ã¢ã€ãã£ã¢ãåŸãããã®ã¯ã³ã³ãåå ã®é
åã§ããïŒ
ç¹ã«ã¢ãã«å®è£
é¢ã«ãããŠæé·ã§ããæçã³ãŒã¹ã§ããããšã¯ééãç¡ããšæãã®ã§ãKaggleã®åæã³ã³ããå«ãåŒãç¶ãåå ããŠãããããšæããŸãïŒïŒ
Discussion