import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.cluster import KMeans
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score,confusion_matrix,classification_report
from Bio import SeqIO
from sklearn.preprocessing import StandardScaler
import seaborn as sns
import matplotlib.pyplot as plt
sequence=[]
for record in SeqIO.parse('genome_sequences.fasta','fasta'):
    sequence.append(str(record.seq))
df=pd.DataFrame({'sequence':sequence})
df['length']=df['sequence'].apply(len)
X=df['length'].values.reshape(-1,1)
scaler=StandardScaler()
X_scaled=scaler.fit_transform(X)
kmeans=KMeans(n_clusters=3,random_state=42)
df['cluster']=kmeans.fit_predict(X_scaled)
sns.scatterplot(data=df,x='length',y=df.index)
df['label']=[0,1]*(len(df)//2)+[0]*(len(df)%2)
y=df['label']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
svm = SVC(kernel='linear', random_state=42)
svm.fit(X_train, y_train)

y_pred = svm.predict(X_test)

print("SVM Accuracy:", accuracy_score(y_test, y_pred))
print("Confusion Matrix:\n", confusion_matrix(y_test, y_pred))
print("Classification Report:\n", classification_report(y_test, y_pred))
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LSTM, Embedding
from tensorflow.keras.preprocessing.sequence import pad_sequences
from tensorflow.keras.preprocessing.text import Tokenizer
# ===================== LSTM MODEL =====================
# Tokenize sequences
tokenizer = Tokenizer(char_level=True)
tokenizer.fit_on_texts(df['sequence'])

X_seq = tokenizer.texts_to_sequences(df['sequence'])

# Pad sequences
max_length = 100
X_padded = pad_sequences(X_seq, maxlen=max_length)

# Train-test split
X_train, X_test, y_train, y_test = train_test_split(
    X_padded, y, test_size=0.2, random_state=42
)

# Build LSTM model
lstm_model = Sequential()
lstm_model.add(Embedding(input_dim=len(tokenizer.word_index) + 1, output_dim=64, input_length=max_length))
lstm_model.add(LSTM(100, activation='relu'))
lstm_model.add(Dense(1, activation='sigmoid'))

# Compile
lstm_model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

# Train
history_lstm = lstm_model.fit(
    X_train, y_train,
    epochs=10,
    batch_size=32,
    validation_split=0.2
)

# Evaluate
loss, accuracy = lstm_model.evaluate(X_test, y_test)
print(f"LSTM Model Accuracy: {accuracy}")


# ===================== PLOT TRAINING =====================
plt.plot(history_lstm.history['accuracy'], label='train')
plt.plot(history_lstm.history['val_accuracy'], label='validation')

plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend()
plt.title('LSTM Training vs Validation Accuracy')
plt.show()
