Ферменты — это белки, которые ускоряют химические реакции в организме, например, расщепление сахаров или синтез ДНК. Активность фермента зависит от его структуры, которая определяется последовательностью аминокислот. Представьте, что аминокислотная последовательность — это "рецепт" фермента, а активность — то, насколько хорошо он "готовит" реакцию.
Цель: Использовать машинное обучение, чтобы предсказать, будет ли фермент активным (например, сможет ли он катализировать реакцию) на основе его аминокислотной последовательности. Мы возьмем простой датасет с последовательностями и метками активности и построим модель ML для классификации.
Машинное обучение — это метод, который позволяет компьютеру "учиться" на данных. В нашем случае:
- Данные: Набор аминокислотных последовательностей ферментов и метки (активен/неактивен).
- Задача: Научить модель определять, активен ли фермент, по его последовательности.
- Этапы:
- Загрузка и обработка данных.
- Преобразование последовательностей в числа (ML работает с числами, а не с буквами).
- Обучение модели ML.
- Оценка модели и визуализация результатов.
Основные шаги
- Загрузка данных: Получаем таблицу с последовательностями ферментов и их активностью.
- Предобработка: Преобразуем аминокислотные последовательности в числовые признаки.
- Обучение модели: Используем алгоритм ML (например, логистическую регрессию) для предсказания активности.
- Визуализация: Строим графики, чтобы понять, как работает модель.
- Проверка генов: Используем Biopython для поиска информации о белках.
Программа для предсказания активности ферментов:
- Загружает синтетический датасет с аминокислотными последовательностями и метками активности.
- Преобразует последовательности в числовые признаки (например, частоту аминокислот).
- Обучает модель логистической регрессии для предсказания активности.
- Визуализирует результаты с помощью Matplotlib.
- Проверяет информацию о белке с помощью Biopython.
Для простоты мы создадим небольшой датасет внутри кода, но вы можете использовать реальные данные из баз, таких как UniProt.
Этапы работы:
- Создание датасета:
- Создаем маленький датасет с 10 аминокислотными последовательностями (по 10 символов) и метками (1 = активен, 0 = неактивен).
- В реальной жизни можно загрузить данные из UniProt или другой базы.
- Предобработка:
- Преобразуем последовательности в числовые признаки, подсчитывая частоту каждой аминокислоты (например, сколько раз "A" встречается в последовательности).
- Получаем таблицу, где каждая строка — это фермент, а столбцы — частоты аминокислот.
- Разделение данных:
- Делим данные на обучающую (70%) и тестовую (30%) выборки, чтобы проверить модель.
- Обучение модели:
- Используем логистическую регрессию — простой алгоритм ML для классификации (активен/неактивен).
- Оценка модели:
- Считаем точность (accuracy) — долю правильных предсказаний.
- Строим матрицу ошибок, чтобы увидеть, где модель ошибается.
- Визуализация:
- Матрица ошибок: Показывает, сколько ферментов правильно или неправильно классифицированы.
- Важность аминокислот: Показывает, какие аминокислоты больше влияют на активность.
- Частота аминокислот: Показывает, какие аминокислоты чаще встречаются в активных ферментах.
- Работа с 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()
Задания для практики
- Измените количество аминокислот в синтетическом датасете (например, сделайте последовательности длиннее) и проверьте, как это влияет на точность.
- Добавьте еще один график, сравнивающий частоту аминокислот в активных и неактивных ферментах.
- Попробуйте другой алгоритм ML, например, RandomForestClassifier из sklearn, и сравните результаты.
Реальные данные:
Наш код использует синтетический датасет, но вы можете загрузить реальные данные из следующих источников:
Чтобы использовать реальный датасет, загрузите его в формате .csv или .fasta и адаптируйте код для чтения данных (например, df = pd.read_csv('enzymes.csv')).