Белки — это молекулы, которые выполняют множество функций в организме: ферменты ускоряют реакции, антитела защищают от инфекций, а структурные белки поддерживают форму клеток. Функция белка зависит от его структуры, которая определяется последовательностью аминокислот и их пространственным расположением (вторичной и третичной структурой). Определение функции экспериментально (например, с помощью CRISPR или масс-спектрометрии) — дорого и долго. Машинное обучение может предсказывать функцию на основе данных о структуре или последовательности белка.
Цель: Использовать машинное обучение, чтобы предсказать функцию белка (например, "фермент" или "не фермент") на основе характеристик его структуры, таких как содержание определенных аминокислот или элементы вторичной структуры (спирали, листы).
Основные шаги
- Загрузка данных: Получаем таблицу с характеристиками структуры белков и их функциями.
- Предобработка: Преобразуем данные в формат, подходящий для ML (числа).
- Обучение модели: Используем алгоритм ML (например, логистическую регрессию) для предсказания функции.
- Визуализация: Строим графики, чтобы понять, как модель работает.
- Проверка белков: Используем Biopython для поиска информации о белках.
Этапы работы программы:
- Создание датасета:
- Мы создали синтетический датасет с 10 белками. Для каждого белка указаны:
- Доля спиралей (Helix_Fraction) и листов (Sheet_Fraction) во вторичной структуре.
- Частота аминокислот A, C, G.
- Метка функции (1 = фермент, 0 = не фермент).
- В реальной жизни такие данные можно получить из базы PDB.
- Предобработка:
- Выбираем числовые признаки (доля спиралей, листов, частота аминокислот) для модели ML.
- Разделение данных:
- Делим данные на обучающую (70%) и тестовую (30%) выборки, чтобы проверить модель.
- Обучение модели:
- Используем логистическую регрессию — простой алгоритм ML для классификации (фермент/не фермент).
- Оценка модели:
- Считаем точность (accuracy) — долю правильных предсказаний.
- Строим матрицу ошибок, чтобы увидеть, где модель ошибается.
- Визуализация:
- Матрица ошибок: Показывает, сколько белков правильно или неправильно классифицированы.
- Важность признаков: Показывает, какие признаки (например, спирали или аминокислота C) больше влияют на функцию.
- Точечный график: Показывает, как спирали и листы связаны с функцией белка.
- Работа с Biopython:
- Проверяем информацию о гене LCT (лактаза) в базе NCBI, чтобы узнать больше о белке.
Для простоты мы создадим датасет внутри кода, но можно использовать реальные данные из баз, таких как PDB или UniProt.
Пример датасетов:
Код на scikit-learn
:
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, confusion_matrix
import seaborn as sns
from Bio import Entrez
# Установим email для Biopython (нужен для NCBI)
Entrez.email = "your_email@example.com"
# 1. Создаем синтетический датасет
# Признаки: доля спиралей, листов, частота аминокислот (A, C, G)
# Метки: 1 = фермент, 0 = не фермент
data = {
'Helix_Fraction': [0.4, 0.2, 0.5, 0.3, 0.6, 0.1, 0.4, 0.2, 0.5, 0.3],
'Sheet_Fraction': [0.3, 0.4, 0.2, 0.5, 0.1, 0.4, 0.3, 0.5, 0.2, 0.4],
'AA_A_Freq': [0.2, 0.1, 0.3, 0.15, 0.25, 0.1, 0.2, 0.15, 0.3, 0.1],
'AA_C_Freq': [0.05, 0.1, 0.05, 0.15, 0.05, 0.1, 0.05, 0.15, 0.05, 0.1],
'AA_G_Freq': [0.15, 0.2, 0.1, 0.2, 0.15, 0.25, 0.1, 0.2, 0.15, 0.2],
'Function': [1, 0, 1, 0, 1, 0, 1, 0, 1, 0] # 1 = фермент, 0 = не фермент
}
df = pd.DataFrame(data)
# 2. Предобработка
# Выбираем признаки для модели
features = df[['Helix_Fraction', 'Sheet_Fraction', 'AA_A_Freq', 'AA_C_Freq', 'AA_G_Freq']]
labels = df['Function']
# 3. Разделение данных на обучающую и тестовую выборки
X_train, X_test, y_train, y_test = train_test_split(features, labels, test_size=0.3, random_state=42)
# 4. Обучение модели логистической регрессии
model = LogisticRegression(random_state=42)
model.fit(X_train, y_train)
# 5. Предсказание и оценка
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy of the model: {accuracy:.2f}")
# 6. Визуализация: матрица ошибок
cm = confusion_matrix(y_test, y_pred)
plt.figure(figsize=(6, 4))
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=['Non-Enzyme', 'Enzyme'], yticklabels=['Non-Enzyme', 'Enzyme'])
plt.xlabel('Predicted')
plt.ylabel('True')
plt.title('Confusion Matrix for Protein Function Prediction')
plt.savefig('confusion_matrix.png')
plt.show()
plt.close()
# Визуализация: важность признаков
feature_importance = pd.Series(model.coef_[0], index=features.columns)
plt.figure(figsize=(8, 4))
feature_importance.sort_values().plot(kind='bar', color='skyblue')
plt.xlabel('Feature')
plt.ylabel('Coefficient (Importance)')
plt.title('Feature Importance for Protein Function')
plt.show()
plt.savefig('feature_importance.png')
plt.close()
# Визуализация: сравнение спиралей и листов
plt.figure(figsize=(8, 6))
scatter = plt.scatter(df['Helix_Fraction'], df['Sheet_Fraction'], c=df['Function'], cmap='viridis', s=100)
plt.colorbar(scatter, label='Function (0=Non-Enzyme, 1=Enzyme)')
plt.xlabel('Helix Fraction')
plt.ylabel('Sheet Fraction')
plt.title('Protein Structure Features by Function')
plt.savefig('structure_scatter.png')
plt.show()
plt.close()
# 7. Проверка информации о белке с Biopython
# Ищем информацию о белке (например, лактаза, LCT)
protein = "LCT"
handle = Entrez.esearch(db="gene", term=f"{protein}[Gene Name] AND Homo sapiens[Organism]")
record = Entrez.read(handle)
handle.close()
print(f"Protein {protein} found in NCBI: {record['Count']} entries")
Задания для практики
- Добавьте в датасет еще один признак, например, частоту другой аминокислоты (например, K), и проверьте, как это влияет на точность.
- Постройте график, сравнивающий долю спиралей в ферментах и не ферментах (например, с помощью boxplot).
- Попробуйте другой алгоритм ML, например, RandomForestClassifier из sklearn, и сравните результаты.
Реальные данные:
Наш код использует синтетический датасет, но вы можете загрузить реальные данные из следующих источников:
Чтобы использовать реальный датасет, загрузите его в формате .csv с колонками для признаков (например, доля спиралей) и функций, и замените синтетический датасет в коде на df = pd.read_csv('your_data.csv').