import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Embedding, LSTM, Dense, Dropout
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
# Sample data setup (simplified)
texts = ["good movie", "bad movie", "excellent film", "terrible film"] * 100
labels = [1, 0, 1, 0] * 100
# Group labels: 0 for group A, 1 for group B
groups = np.array([0, 0, 1, 1] * 100)
# Tokenize texts
max_words = 1000
tokenizer = Tokenizer(num_words=max_words)
tokenizer.fit_on_texts(texts)
sequences = tokenizer.texts_to_sequences(texts)
data = pad_sequences(sequences, maxlen=5)
# Create sample weights to reduce bias: give higher weight to group B samples
sample_weights = np.where(groups == 1, 2.0, 1.0)
# Split data
X_train, X_val, y_train, y_val, sw_train, sw_val, groups_train, groups_val = train_test_split(
data, labels, sample_weights, groups, test_size=0.2, random_state=42, stratify=labels)
# Build simple model
model = Sequential([
Embedding(max_words, 16, input_length=5),
LSTM(16),
Dropout(0.5),
Dense(1, activation='sigmoid')
])
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
# Train with sample weights to reduce bias
model.fit(X_train, y_train, sample_weight=sw_train, epochs=10, batch_size=16, validation_data=(X_val, y_val, sw_val))
# Evaluate overall accuracy
val_preds = (model.predict(X_val) > 0.5).astype(int).flatten()
accuracy_overall = accuracy_score(y_val, val_preds) * 100
# Evaluate accuracy on group B in validation
group_b_mask = (groups_val == 1)
accuracy_group_b = accuracy_score(y_val[group_b_mask], val_preds[group_b_mask]) * 100
print(f"Validation accuracy overall: {accuracy_overall:.2f}%")
print(f"Validation accuracy group B: {accuracy_group_b:.2f}%")