Model oluşturma ve eğitme, iş akışının yalnızca bir parçasıdır. Verilerinizin özelliklerini önceden anlamak daha iyi bir model oluşturmanıza olanak sağlar. Bu, daha yüksek doğruluk elde etmeniz anlamına gelebilir. Ayrıca eğitim için daha az veri veya daha az bilgi işlem kaynağı kullanılmasını da gerektirebilir.
Veri Kümesini Yükleme
İlk olarak veri kümesini Python'a yükleyelim.
def load_imdb_sentiment_analysis_dataset(data_path, seed=123): """Loads the IMDb movie reviews sentiment analysis dataset. # Arguments data_path: string, path to the data directory. seed: int, seed for randomizer. # Returns A tuple of training and validation data. Number of training samples: 25000 Number of test samples: 25000 Number of categories: 2 (0 - negative, 1 - positive) # References Mass et al., http://www.aclweb.org/anthology/P11-1015 Download and uncompress archive from: http://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz """ imdb_data_path = os.path.join(data_path, 'aclImdb') # Load the training data train_texts = [] train_labels = [] for category in ['pos', 'neg']: train_path = os.path.join(imdb_data_path, 'train', category) for fname in sorted(os.listdir(train_path)): if fname.endswith('.txt'): with open(os.path.join(train_path, fname)) as f: train_texts.append(f.read()) train_labels.append(0 if category == 'neg' else 1) # Load the validation data. test_texts = [] test_labels = [] for category in ['pos', 'neg']: test_path = os.path.join(imdb_data_path, 'test', category) for fname in sorted(os.listdir(test_path)): if fname.endswith('.txt'): with open(os.path.join(test_path, fname)) as f: test_texts.append(f.read()) test_labels.append(0 if category == 'neg' else 1) # Shuffle the training data and labels. random.seed(seed) random.shuffle(train_texts) random.seed(seed) random.shuffle(train_labels) return ((train_texts, np.array(train_labels)), (test_texts, np.array(test_labels)))
Verileri kontrol etme
Verileri yükledikten sonra, bazı kontroller gerçekleştirmeniz önerilir: Birkaç örnek seçin ve beklentilerinizle tutarlı olup olmadığını manuel olarak kontrol edin. Örneğin, duygu etiketinin yorumun duygularına uygun olup olmadığını görmek için birkaç rastgele örnek yazdırın. IMDb veri kümesinden rastgele seçtiğimiz bir yorumu burada bulabilirsiniz: "On dakika değerinde hikaye, iki saatten kısa bir süreye yayıldı. Yarıda bırakmam gereken, hiçbir önemli nokta yoktu." Beklenen duygu (negatif), örneğin etiketiyle eşleşiyor.
Temel Metrikleri Toplama
Verileri doğruladıktan sonra metin sınıflandırma sorununuzun tanımlanmasına yardımcı olabilecek aşağıdaki önemli metrikleri toplayın:
Örnek sayısı: Verilerdeki toplam örnek sayısı.
Sınıf sayısı: Verilerdeki toplam konu veya kategori sayısı.
Sınıf başına örnek sayısı: Sınıf başına örnek sayısı (konu/kategori). Dengeli bir veri kümesinde, tüm sınıfların örnek sayısı benzer olacaktır. Dengesiz bir veri kümesinde, her sınıftaki örnek sayısı büyük farklılıklar gösterir.
Örnek başına kelime sayısı: Tek bir örnekteki kelimelerin ortalama sayısı.
Kelimelerin sıklık dağılımı: Veri kümesindeki her bir kelimenin sıklığını (oluşma sayısı) gösteren dağılım.
Örnek uzunluğu dağılımı: Veri kümesindeki örnek başına kelime sayısını gösteren dağılım.
Şimdi, IMDb yorumları veri kümesi için bu metriklerin değerlerinin ne olduğuna bakalım (Kelime sıklığı ve örnek uzunluğu dağılımları için Şekiller 3 ve 4'e bakın).
Metrik adı | Metrik değeri |
---|---|
Örnek sayısı | 25000 |
Sınıf sayısı | 2 |
Sınıf başına örnek sayısı | 12500 |
Örnek başına kelime sayısı | 174 |
1. Tablo: IMDb, veri kümesi metriklerini inceler
explore_data.py
bu metrikleri hesaplamaya ve analiz etmeye yönelik işlevler içerir. Aşağıda birkaç örnek verilmiştir:
import numpy as np import matplotlib.pyplot as plt def get_num_words_per_sample(sample_texts): """Returns the median number of words per sample given corpus. # Arguments sample_texts: list, sample texts. # Returns int, median number of words per sample. """ num_words = [len(s.split()) for s in sample_texts] return np.median(num_words) def plot_sample_length_distribution(sample_texts): """Plots the sample length distribution. # Arguments samples_texts: list, sample texts. """ plt.hist([len(s) for s in sample_texts], 50) plt.xlabel('Length of a sample') plt.ylabel('Number of samples') plt.title('Sample length distribution') plt.show()
Şekil 3: IMDb için kelimelerin sıklık dağılımı
Şekil 4: IMDb için örnek uzunluğu dağılımı