Untitled

 avatar
unknown
plain_text
20 days ago
4.6 kB
2
Indexable
import tensorflow as tf
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Input, Embedding, LSTM, Dense, Dropout

# Ustaw losowe seed-y dla powtarzalności (opcjonalne)
np.random.seed(42)
tf.random.set_seed(42)

# --------------------------------------------------------------------------
# 1. Wczytanie danych z pliku CSV
# --------------------------------------------------------------------------
# Upewnij się, że plik "test.csv" znajduje się w tym samym folderze co ten skrypt
# i że zawiera kolumnę "text" oraz "label".
df = pd.read_csv("test.csv")  # Możesz dodać argument 'encoding' jeśli potrzebne
print("Pierwsze wiersze pliku:")
print(df.head())

# Jeśli w pliku jest zbędna kolumna indeksowa (np. "Unnamed: 0"), można ją usunąć:
df = df.drop(columns=["Unnamed: 0"], errors='ignore')

# Zakładamy, że mamy kolumnę 'text' i 'label'
required_columns = ["text", "label"]
for col in required_columns:
    if col not in df.columns:
        raise ValueError(f"Brak wymaganej kolumny: {col} w pliku CSV.")

# Wyciągamy dane wejściowe (X) i etykiety (y)
X_raw = df["text"].astype(str).values  # tekst w formie string
y_raw = df["label"].values            # etykiety numeryczne (np. 0..5)

# Sprawdźmy, ile jest unikalnych etykiet:
num_classes = len(np.unique(y_raw))
print("Liczba unikalnych klas:", num_classes)

# --------------------------------------------------------------------------
# 2. Tokenizacja i wektoryzacja tekstu
# --------------------------------------------------------------------------
VOCAB_SIZE = 10000
tokenizer = Tokenizer(num_words=VOCAB_SIZE, oov_token="<OOV>")
tokenizer.fit_on_texts(X_raw)

sequences = tokenizer.texts_to_sequences(X_raw)

MAX_LEN = 50
X = pad_sequences(sequences, maxlen=MAX_LEN, padding='post', truncating='post')

y = np.array(y_raw, dtype=np.int32)

print("Przykładowy tekst:", X_raw[0])
print("Przykładowa sekwencja:", sequences[0][:10], "...")
print("Przykładowa etykieta:", y[0])

# --------------------------------------------------------------------------
# 3. Podział na zbiór treningowy i testowy
# --------------------------------------------------------------------------
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

print("Rozmiar zbioru treningowego:", X_train.shape[0])
print("Rozmiar zbioru testowego:", X_test.shape[0])

# --------------------------------------------------------------------------
# 4. Budowa modelu (multi-class single-label)
# --------------------------------------------------------------------------
model = Sequential([
    Input(shape=(MAX_LEN,)),  # Użycie warstwy Input usuwa ostrzeżenie
    Embedding(input_dim=VOCAB_SIZE, output_dim=64),
    LSTM(128),
    Dropout(0.3),
    Dense(num_classes, activation='softmax')  # Aktywacja softmax dla multi-class
])

# Używamy 'sparse_categorical_crossentropy' dla etykiet jako liczb całkowitych
model.compile(
    loss='sparse_categorical_crossentropy',
    optimizer='adam',
    metrics=['accuracy']
)

model.summary()

# --------------------------------------------------------------------------
# 5. Trenowanie
# --------------------------------------------------------------------------
EPOCHS = 5  # Możesz zwiększyć do 10 lub więcej
BATCH_SIZE = 32

history = model.fit(
    X_train, y_train,
    validation_data=(X_test, y_test),
    epochs=EPOCHS,
    batch_size=BATCH_SIZE
)

# --------------------------------------------------------------------------
# 6. Predykcja + podgląd wyników
# --------------------------------------------------------------------------
SAMPLES_TO_PREDICT = 5
predictions = model.predict(X_test[:SAMPLES_TO_PREDICT])
predicted_classes = np.argmax(predictions, axis=1)

for i in range(SAMPLES_TO_PREDICT):
    decoded_text = tokenizer.sequences_to_texts([X_test[i]])[0]
    true_class = y_test[i]
    pred_class = predicted_classes[i]
    probability = predictions[i][pred_class]
    print("\n===== Przykład #%d =====" % (i+1))
    print(f"Tekst: {decoded_text}")
    print(f"Prawdziwa etykieta: {true_class}")
    print(f"Przewidywana etykieta: {pred_class} (prawdopodobieństwo: {probability:.4f})")
    print("=========================")
Leave a Comment