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

Предсказание активности ферментов

Ферменты — это белки, которые ускоряют химические реакции в организме, например, расщепление сахаров или синтез ДНК. Активность фермента зависит от его структуры, которая определяется последовательностью аминокислот. Представьте, что аминокислотная последовательность — это "рецепт" фермента, а активность — то, насколько хорошо он "готовит" реакцию.

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

Машинное обучение — это метод, который позволяет компьютеру "учиться" на данных. В нашем случае:

  • Данные: Набор аминокислотных последовательностей ферментов и метки (активен/неактивен).
  • Задача: Научить модель определять, активен ли фермент, по его последовательности.
  • Этапы:
    1. Загрузка и обработка данных.
    2. Преобразование последовательностей в числа (ML работает с числами, а не с буквами).
    3. Обучение модели ML.
    4. Оценка модели и визуализация результатов.

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

  1. Загрузка данных: Получаем таблицу с последовательностями ферментов и их активностью.
  2. Предобработка: Преобразуем аминокислотные последовательности в числовые признаки.
  3. Обучение модели: Используем алгоритм ML (например, логистическую регрессию) для предсказания активности.
  4. Визуализация: Строим графики, чтобы понять, как работает модель.
  5. Проверка генов: Используем Biopython для поиска информации о белках.

Программа для предсказания активности ферментов:

  • Загружает синтетический датасет с аминокислотными последовательностями и метками активности.
  • Преобразует последовательности в числовые признаки (например, частоту аминокислот).
  • Обучает модель логистической регрессии для предсказания активности.
  • Визуализирует результаты с помощью Matplotlib.
  • Проверяет информацию о белке с помощью Biopython.

Для простоты мы создадим небольшой датасет внутри кода, но вы можете использовать реальные данные из баз, таких как UniProt.

 

Этапы работы:

  1. Создание датасета:
    • Создаем маленький датасет с 10 аминокислотными последовательностями (по 10 символов) и метками (1 = активен, 0 = неактивен).
    • В реальной жизни можно загрузить данные из UniProt или другой базы.
  2. Предобработка:
    • Преобразуем последовательности в числовые признаки, подсчитывая частоту каждой аминокислоты (например, сколько раз "A" встречается в последовательности).
    • Получаем таблицу, где каждая строка — это фермент, а столбцы — частоты аминокислот.
  3. Разделение данных:
    • Делим данные на обучающую (70%) и тестовую (30%) выборки, чтобы проверить модель.
  4. Обучение модели:
    • Используем логистическую регрессию — простой алгоритм ML для классификации (активен/неактивен).
  5. Оценка модели:
    • Считаем точность (accuracy) — долю правильных предсказаний.
    • Строим матрицу ошибок, чтобы увидеть, где модель ошибается.
  6. Визуализация:
    • Матрица ошибок: Показывает, сколько ферментов правильно или неправильно классифицированы.
    • Важность аминокислот: Показывает, какие аминокислоты больше влияют на активность.
    • Частота аминокислот: Показывает, какие аминокислоты чаще встречаются в активных ферментах.
  7. Работа с Biopython:
    • Проверяем информацию о гене LCT (лактаза) в базе NCBI, чтобы узнать больше о ферменте.

Вывод:

  • Файл confusion_matrix.png: График, показывающий, как модель классифицирует ферменты.
  • Файл feature_importance.png: Гистограмма, показывающая, какие аминокислоты важны для активности.
  • Файл active_enzyme_aa_freq.png: Гистограмма частоты аминокислот в активных ферментах.
  • Вывод в консоли: Точность модели и информация о гене LCT.
 
import pandas as pd
import numpy as np
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. Создаем синтетический датасет
# Пример: последовательности (10 символов) и метки (1 = активен, 0 = неактивен)
data = {
    'Sequence': [
        'AGHKLMPRST', 'CFIKLNPQVY', 'ADGHMNPRTW', 'BCEIKLQRST',
        'AFGHKLMPRV', 'CDIKMNQSTW', 'AGKLNPQRTV', 'BDFHKMNPRW',
        'AHIKLMPQSV', 'CEGKMNPRTW'
    ],
    'Activity': [1, 0, 1, 0, 1, 0, 1, 0, 1, 0]
}
df = pd.DataFrame(data)

# 2. Предобработка: преобразование последовательностей в числовые признаки
# Считаем частоту каждой аминокислоты (A, C, G, H, I, K, L, M, N, P, Q, R, S, T, V, W)
amino_acids = 'ACFGHIKLMNPQRSTVW'
features = []
for seq in df['Sequence']:
    counts = [seq.count(aa) / len(seq) for aa in amino_acids]
    features.append(counts)
features = pd.DataFrame(features, columns=list(amino_acids))

# 3. Разделение данных на обучающую и тестовую выборки
X = features
y = df['Activity']
X_train, X_test, y_train, y_test = train_test_split(X, y, 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=['Inactive', 'Active'], yticklabels=['Inactive', 'Active'])
plt.xlabel('Predicted')
plt.ylabel('True')
plt.title('Confusion Matrix for Enzyme Activity Prediction')
plt.savefig('confusion_matrix.png')
plt.close()

# Визуализация: важность признаков (аминокислот)
feature_importance = pd.Series(model.coef_[0], index=amino_acids)
plt.figure(figsize=(8, 4))
feature_importance.sort_values().plot(kind='bar', color='skyblue')
plt.xlabel('Amino Acid')
plt.ylabel('Coefficient (Importance)')
plt.title('Amino Acid Importance for Enzyme Activity')
plt.savefig('feature_importance.png')
plt.close()

# 7. Проверка информации о ферменте с Biopython
# Ищем информацию о ферменте (например, лактаза, LCT)
enzyme = "LCT"
handle = Entrez.esearch(db="gene", term=f"{enzyme}[Gene Name] AND Homo sapiens[Organism]")
record = Entrez.read(handle)
handle.close()
print(f"Gene {enzyme} found in NCBI: {record['Count']} entries")

# Пример анализа частоты аминокислот в активных ферментах
active_features = features[df['Activity'] == 1].mean()
plt.figure(figsize=(8, 4))
active_features.plot(kind='bar', color='lightgreen')
plt.xlabel('Amino Acid')
plt.ylabel('Average Frequency')
plt.title('Amino Acid Frequency in Active Enzymes')
plt.savefig('active_enzyme_aa_freq.png')
plt.close()
 

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

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

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

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

  • UniProt: База данных белков с аминокислотными последовательностями и аннотациями (https://www.uniprot.org/). Поиск по ключевому слову "enzyme" и фильтр по активности.
  • PDB (Protein Data Bank): Данные о структуре ферментов (https://www.rcsb.org/).
  • BRENDA: База данных активности ферментов (https://www.brenda-enzymes.org/).

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

Печать