epitope / Cellect_Epitope.py
yunuk0's picture
Update Cellect_Epitope.py
db225b2 verified
import streamlit as st
import base64
# =====================================================
# 0. ํŽ˜์ด์ง€ ์„ค์ • ๋ฐ ์ƒ๋‹จ ํ—ค๋”
# =====================================================
st.set_page_config(
page_title="Cellect Epitope",
page_icon="assets/team_icon.png",
layout="wide",
initial_sidebar_state="expanded"
)
st.image("assets/team_icon.png", width=150)
st.title("Cellect Epitope")
st.markdown("""
๋ณธ ํ”Œ๋žซํผ์€ **๋‹จ๋ฐฑ์งˆ ์–ธ์–ด ๋ชจ๋ธ(PLM) ๊ธฐ๋ฐ˜ 2๋‹จ๊ณ„ ํŒŒ์ดํ”„๋ผ์ธ**์„ ํ†ตํ•ด, ์‹คํ—˜ ์ „ ๋‹จ๊ณ„์—์„œ ์ตœ์ ์˜ **B-cell epitope ํ›„๋ณด**๋ฅผ ์„ ๋ณ„ํ•ฉ๋‹ˆ๋‹ค.
์‹ค์ œ ์‹คํ—˜ ํ™˜๊ฒฝ์—์„œ ๋ฐœ์ƒํ•˜๋Š” **๋†’์€ ๋น„์šฉ ๋Œ€๋น„ ๋‚ฎ์€ ์„ฑ๊ณต๋ฅ  ๋ฌธ์ œ**๋ฅผ ์™„ํ™”ํ•˜๊ณ , **๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜ ํ•ฉ๋ฆฌ์  ์‹คํ—˜ ์˜์‚ฌ๊ฒฐ์ •**์„ ์ง€์›ํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
""")
# =====================================================
# 1. ์˜ˆ์ธก ํŒŒ์ดํ”„๋ผ์ธ ์นด๋“œ (3๋‹จ๊ณ„)
# =====================================================
images = ["assets/method1.png", "assets/method2.png", "assets/method3.png"]
titles = [
"1. ๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ ๋ฐ ํŠน์ง• ์ถ”์ถœ",
"2. PLM ๋ชจ๋ธ์„ ํ†ตํ•œ ๋งฅ๋ฝ ์ •๋ณด ํ•™์Šต",
"3. ์ตœ์ข… ํ›„๋ณด ์„ ๋ณ„ ๋ฐ ๊ฒฐ๊ณผ ์ œ๊ณต"
]
details = [
"ํ•ญ์› ์„œ์—ด์„ 16์ž๋กœ ์ž˜๋ผ ์—ํ”ผํ† ํ”„ ์ƒ์„ฑ",
"ProtT5/ESM-2 ์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ ์ ์šฉ",
"Epitope ํ›„๋ณด๊ตฐ ๊ฒฐํ•ฉ ๊ฐ€๋Šฅ์„ฑ ๊ณ„์‚ฐ"
]
st.markdown("""
<div style="margin:auto; min-width:2500px; max-width:2500px; text-align:center;">
""", unsafe_allow_html=True)
col1, col2, col3 = st.columns(3, gap="large")
for i, col in enumerate([col1, col2, col3]):
with col:
with st.container():
st.image(images[i], width=300)
st.markdown(
f'''
<div style="text-align:center; margin-top:5px;">
<strong>{titles[i]}</strong>
<p style="margin:0;">{details[i]}</p>
</div>
''',
unsafe_allow_html=True
)
st.markdown("</div>", unsafe_allow_html=True)
st.markdown("""
""")
st.markdown(
"""
<div style="text-align:center; color:#9aa0a6; font-size:0.85rem; margin-top:8px;">
<strong>๐Ÿ’ก Tip:<strong> ์›ํ™œํ•œ ๋Œ€์‹œ๋ณด๋“œ ์‚ฌ์šฉ์„ ์œ„ํ•ด ์ƒ๋‹จ ์นด๋“œ๊ฐ€ ๊ท ํ˜• ์žˆ๊ฒŒ ํ‘œ์‹œ๋˜๋„๋ก ๋ธŒ๋ผ์šฐ์ € ์ฐฝ์„ ์ ์ ˆํžˆ ๋งž์ถฐ ์‚ฌ์šฉํ•ด ์ฃผ์„ธ์š”.
</div>
""",
unsafe_allow_html=True
)
st.divider()
# =====================================================
# 2. ์—ฐ๊ตฌ ๋ฐฐ๊ฒฝ ๋ฐ ๋™๊ธฐ
# =====================================================
st.header("์—ฐ๊ตฌ ์ค‘์š”์„ฑ")
st.markdown("""
B-cell ์—ํ”ผํ† ํ”„ ์‹คํ—˜์€ **์„ฑ๊ณต ํ™•๋ฅ ์ด ๋‚ฎ๊ณ  ๋น„์šฉ์ด ๋งŽ์ด ์†Œ์š”**๋ฉ๋‹ˆ๋‹ค.
์ผ๋ฐ˜์ ์ธ ์‹คํ—˜ ์›Œํฌํ”Œ๋กœ์šฐ์—์„œ๋Š” ๊ฒฐํ•ฉ ๊ฐ€๋Šฅ์„ฑ์ด ๋‚ฎ์€ ํ›„๋ณด์™€ ๋†’์€ ํ›„๋ณด๊ฐ€ ๋™์ผํ•œ ๋น„์šฉ๊ณผ ์‹œ๊ฐ„์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์–ด **์ž์› ๋‚ญ๋น„**๊ฐ€ ์‹ฌ๊ฐํ•ฉ๋‹ˆ๋‹ค.
""")
st.markdown(
'<p style="background-color:#d4edda; color:#000000; font-weight:bold; '
'padding:1px 3px; border-radius:1px; display:inline-block; font-size:17px;">์ฃผ์š” ๋ฌธ์ œ์ </p>',
unsafe_allow_html=True
)
st.markdown("""
- ์‹ค์ œ ์—ํ”ผํ† ํ”„ ๋น„์œจ์ด ์ „์ฒด ์„œ์—ด์˜ 1% ๋ฏธ๋งŒ โ†’ ๊ทน๋‹จ์  ๋ฐ์ดํ„ฐ ๋ถˆ๊ท ํ˜•
- ๋ฌด์ž‘์œ„ ์‹คํ—˜ ์‹œ 99% ์ด์ƒ ์ž์› ๋น„ํšจ์œจ์  ์†Œ๋ชจ
""")
st.markdown(
'<p style="background-color:#d4edda; color:#000000; font-weight:bold; '
'padding:1px 3px; border-radius:1px; display:inline-block; font-size:17px;">ํ˜„์‹ค์  ์š”๊ตฌ</p>',
unsafe_allow_html=True
)
st.markdown("""
- ์ค‘์š”ํ•œ epitope๋Š” ๋†“์น˜์ง€ ์•Š์œผ๋ฉด์„œ **์‹คํ—˜ ๋น„์šฉ๊ณผ ์‹œ๊ฐ„์„ ์ตœ์†Œํ™”**ํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์ „ ํ•„ํ„ฐ๋ง ์ „๋žต ํ•„์š”
""")
st.divider()
# =====================================================
# 3. ์‹œ์Šคํ…œ ์ž‘๋™ ์›๋ฆฌ
# =====================================================
st.header("ํŒŒ์ดํ”„๋ผ์ธ ์„ค๊ณ„")
st.markdown("""
> **์—ฐ๊ตฌ ๊ฐ€์„ค**: โ€œ1์ฐจ ๋ชจ๋ธ๋กœ ๋…ธ์ด์ฆˆ 90% ์ œ๊ฑฐ ํ›„, 2์ฐจ ๋ชจ๋ธ๋กœ ๊ฒฐํ•ฉ ํ™•์‹ ๋„ ๊ฒ€์ฆ โ†’ ์‹คํ—˜ ์„ฑ๊ณต๋ฅ  ๊ทน๋Œ€ํ™”โ€
""")
st.markdown("๋‹จ๋ฐฑ์งˆ ์„œ์—ด์„ ์ž…๋ ฅ๋ฐ›์•„ 2-stage ํŒŒ์ดํ”„๋ผ์ธ์— ๋”ฐ๋ผ **B-cell epitope ํ›„๋ณด๋ฅผ ๋‹จ๊ณ„์ ์œผ๋กœ ์„ ๋ณ„**ํ•ฉ๋‹ˆ๋‹ค.")
st.markdown(
'<p style="background-color:#d4edda; color:#000000; font-weight:bold; '
'padding:1px 3px; border-radius:1px; display:inline-block; font-size:17px;">Step 1. ๊ตฌ์กฐยท๋งฅ๋ฝ์  ์ž„๋ฒ ๋”ฉ</p>',
unsafe_allow_html=True
)
st.markdown("""
- **ProtT5-XL-U50:** ์•„๋ฏธ๋…ธ์‚ฐ ์„œ์—ด์˜ ์–ธ์–ดยท๋ฌธ๋งฅ์  ์ •๋ณด ์ถ”์ถœ
- **ESM-2:** ๋‹จ๋ฐฑ์งˆ 3์ฐจ์› ๊ตฌ์กฐ ๋ฐ ์ง„ํ™”์  ์ƒ๊ด€๊ด€๊ณ„ ๋ฐ˜์˜
""")
st.markdown(
'<p style="background-color:#d4edda; color:#000000; font-weight:bold; '
'padding:1px 3px; border-radius:1px; display:inline-block; font-size:17px;">Step 2. High Recall ๊ธฐ๋ฐ˜ 1์ฐจ ํ•„ํ„ฐ๋ง</p>',
unsafe_allow_html=True
)
st.markdown("""
- **CatBoost ๋ชจ๋ธ:** ์ž ์žฌ์  ํ›„๋ณด๋ฅผ ์ตœ๋Œ€ํ•œ ๋†“์น˜์ง€ ์•Š๊ณ  ์„ ๋ณ„
""")
st.markdown(
'<p style="background-color:#d4edda; color:#000000; font-weight:bold; '
'padding:1px 3px; border-radius:1px; display:inline-block; font-size:17px;">Step 3. High Precision ๊ธฐ๋ฐ˜ 2์ฐจ ์ •์ œ</p>',
unsafe_allow_html=True
)
st.markdown("""
- **XGBoost ๋ชจ๋ธ:** ์ƒ๋ฌผํ•™์  ๋งฅ๋ฝ ๋‚ด ํ•ญ์ฒด ๊ฒฐํ•ฉ ํ™•์‹ ๋„ ์ •๋ฐ€ ํ‰๊ฐ€
""")
st.divider()
# =====================================================
# 4. ๋ชจ๋ธ ์„ค๊ณ„ ์›์น™
# =====================================================
st.header("๋ชจ๋ธ ์„ค๊ณ„ ์ „๋žต")
st.markdown("""
- **Accuracy ์ค‘์‹ฌ ์„ค๊ณ„ ๋ฐฐ์ œ** โ†’ ๊ทน๋‹จ์  ๋ถˆ๊ท ํ˜• ํ™˜๊ฒฝ์— ์ ํ•ฉํ•œ MCC ํ‰๊ฐ€ ์ง€ํ‘œ ์ฑ„ํƒ
- **๋ฐ์ดํ„ฐ ๋ถˆ๊ท ํ˜• ๊ณ ๋ ค ํ•™์Šต** โ†’ Class Weight ๊ธฐ๋ฐ˜, ์›๋ณธ ๋ถ„ํฌ ์œ ์ง€
- **์ž„๊ณ„๊ฐ’ ์ „๋žต์  ํ†ตํ•ฉ** โ†’ ์‹คํ—˜ ์‹คํŒจ ๋น„์šฉ ์ตœ์†Œํ™”
- **์‹คํ—˜ ์›Œํฌํ”Œ๋กœ์šฐ ์นœํ™”์  ๊ตฌ์กฐ** โ†’ ๋‹จ๊ณ„์  ํ•„ํ„ฐ๋ง ์„ค๊ณ„
""")
st.markdown(
'<p style="background-color:#d4edda; color:#000000; font-weight:bold; '
'padding:1px 3px; border-radius:1px; display:inline-block; font-size:17px;">ํ™œ์šฉ ๋Œ€์ƒ</p>',
unsafe_allow_html=True
)
st.markdown("""
- **Wet-lab ์—ฐ๊ตฌ์ž:** ๋‹ค์ˆ˜ ํ›„๋ณด ์ค‘ ์‹ค์ œ ์‹คํ—˜์— ํˆฌ์ž…ํ•  **์šฐ์„ ์ˆœ์œ„ ํ›„๋ณด ์„ ๋ณ„**, ์‹คํŒจ ๋ฆฌ์Šคํฌ ์ตœ์†Œํ™”
- **Bioinformatics ์—ฐ๊ตฌ์ž:** ๊ทน๋‹จ์  ๋ฐ์ดํ„ฐ ๋ถˆ๊ท ํ˜• ํ™˜๊ฒฝ์—์„œ์˜ ๋ชจ๋ธ๋ง ์ „๋žต, **์ƒ๋ฌผํ•™์  ํŠน์„ฑ์„ ๋ฐ˜์˜ํ•œ ํ‰๊ฐ€ ์ง€ํ‘œ ์„ค๊ณ„** ๊ด€์‹ฌ
""")
st.divider()
st.caption("๋ณธ ํ”Œ๋žซํผ์€ ๋ชจ๋ธ ๊ตฌ์กฐ, ์ž„๊ณ„๊ฐ’ ์„ค์ • ๊ทผ๊ฑฐ, ์ƒ์„ธ ํ‰๊ฐ€ ์ง€ํ‘œ๋ฅผ ํˆฌ๋ช…ํ•˜๊ฒŒ ๊ณต๊ฐœํ•˜์—ฌ ์—ฐ๊ตฌ์ž๊ฐ€ ํŒ๋‹จ์„ ๋น„ํŒ์ ์œผ๋กœ ๊ฒ€ํ†  ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.")
st.markdown("<div style='height:12px;'></div>", unsafe_allow_html=True)
col1, col2, col3 , = st.columns([2, 1, 3])
with col1:
st.image("assets/team_logo_h.png", width=250)
with col2:
st.image("assets/team_sparta_logo.png", width=100)