Статья Автор: Деникина Н.В., Деникин А.В.

Предсказание функции белка по его структуре

Белки — это молекулы, которые выполняют множество функций в организме: ферменты ускоряют реакции, антитела защищают от инфекций, а структурные белки поддерживают форму клеток. Функция белка зависит от его структуры, которая определяется последовательностью аминокислот и их пространственным расположением (вторичной и третичной структурой). Определение функции экспериментально (например, с помощью CRISPR или масс-спектрометрии) — дорого и долго. Машинное обучение может предсказывать функцию на основе данных о структуре или последовательности белка.

Цель: Использовать машинное обучение, чтобы предсказать функцию белка (например, "фермент" или "не фермент") на основе характеристик его структуры, таких как содержание определенных аминокислот или элементы вторичной структуры (спирали, листы).

Основные шаги

  1. Загрузка данных: Получаем таблицу с характеристиками структуры белков и их функциями.
  2. Предобработка: Преобразуем данные в формат, подходящий для ML (числа).
  3. Обучение модели: Используем алгоритм ML (например, логистическую регрессию) для предсказания функции.
  4. Визуализация: Строим графики, чтобы понять, как модель работает.
  5. Проверка белков: Используем 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")
 

Задания для практики

  1. Добавьте в датасет еще один признак, например, частоту другой аминокислоты (например, K), и проверьте, как это влияет на точность.
  2. Постройте график, сравнивающий долю спиралей в ферментах и не ферментах (например, с помощью boxplot).
  3. Попробуйте другой алгоритм ML, например, RandomForestClassifier из sklearn, и сравните результаты.

Реальные данные:

Наш код использует синтетический датасет, но вы можете загрузить реальные данные из следующих источников:

  • PDB (Protein Data Bank): Данные о структуре белков, включая вторичную структуру (https://www.rcsb.org/).
  • UniProt: База данных белков с аминокислотными последовательностями и функциями (https://www.uniprot.org/).
  • CATH: Классификация белковых структур (https://www.cathdb.info/).

Чтобы использовать реальный датасет, загрузите его в формате .csv с колонками для признаков (например, доля спиралей) и функций, и замените синтетический датасет в коде на df = pd.read_csv('your_data.csv').

Печать