205 lines
No EOL
8.8 KiB
Python
205 lines
No EOL
8.8 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*
|
|
import numpy as np
|
|
import random
|
|
|
|
def load_iris_dataset(train_ratio=0.7):
|
|
"""Cette fonction a pour but de lire le dataset Iris
|
|
|
|
Args:
|
|
train_ratio: le ratio des exemples (ou instances) qui vont etre attribués à l'entrainement,
|
|
le rest des exemples va etre utilisé pour les tests.
|
|
Par exemple : si le ratio est 50%, il y aura 50% des exemple (75 exemples) qui vont etre utilisé
|
|
pour l'entrainement, et 50% (75 exemples) pour le test.
|
|
|
|
Retours:
|
|
Cette fonction doit retourner 4 matrices de type Numpy, train, train_labels, test, et test_labels
|
|
|
|
- train : une matrice numpy qui contient les exemples qui vont etre utilisés pour l'entrainement, chaque
|
|
ligne dans cette matrice représente un exemple (ou instance) d'entrainement.
|
|
|
|
- train_labels : contient les labels (ou les étiquettes) pour chaque exemple dans train, de telle sorte
|
|
que : train_labels[i] est le label (ou l'etiquette) pour l'exemple train[i]
|
|
|
|
- test : une matrice numpy qui contient les exemples qui vont etre utilisés pour le test, chaque
|
|
ligne dans cette matrice représente un exemple (ou instance) de test.
|
|
|
|
- test_labels : contient les labels (ou les étiquettes) pour chaque exemple dans test, de telle sorte
|
|
que : test_labels[i] est le label (ou l'etiquette) pour l'exemple test[i]
|
|
"""
|
|
|
|
random.seed(1) # Pour avoir les meme nombres aléatoires à chaque initialisation.
|
|
|
|
# Vous pouvez utiliser des valeurs numériques pour les différents types de classes, tel que :
|
|
conversion_labels = {'Iris-setosa': 0, 'Iris-versicolor' : 1, 'Iris-virginica' : 2}
|
|
|
|
# Le fichier du dataset est dans le dossier datasets en attaché
|
|
|
|
f = open('datasets/bezdekIris.data', 'r')
|
|
lines=[line.strip() for line in f.readlines()]
|
|
f.close()
|
|
|
|
lines=[line.split(",") for line in lines if line]
|
|
|
|
features=[]
|
|
labels=[]
|
|
|
|
for line in lines:
|
|
features.append(line[0:4])
|
|
labels.append(conversion_labels[line[4]])
|
|
|
|
np_features=np.array(features,dtype=np.float)
|
|
np_labels=np.array(labels,dtype=np.int)
|
|
|
|
n_train = int(np_features.shape[0]*train_ratio)
|
|
|
|
all_indices = [i for i in range(np_features.shape[0])]
|
|
random.shuffle(all_indices)
|
|
|
|
train_index = all_indices[0:n_train]
|
|
test_index = all_indices[n_train:np_features.shape[0]]
|
|
|
|
train = np_features[train_index]
|
|
train_labels = np_labels[train_index]
|
|
test = np_features[test_index]
|
|
test_labels = np_labels[test_index]
|
|
|
|
|
|
# REMARQUE très importante :
|
|
# remarquez bien comment les exemples sont ordonnés dans
|
|
# le fichier du dataset, ils sont ordonnés par type de fleur, cela veut dire que
|
|
# si vous lisez les exemples dans cet ordre et que si par exemple votre ration est de 60%,
|
|
# vous n'allez avoir aucun exemple du type Iris-virginica pour l'entrainement, pensez
|
|
# donc à utiliser la fonction random.shuffle pour melanger les exemples du dataset avant de séparer
|
|
# en train et test.
|
|
|
|
|
|
# Tres important : la fonction doit retourner 4 matrices (ou vecteurs) de type Numpy.
|
|
return (train, train_labels, test, test_labels)
|
|
|
|
|
|
|
|
def load_congressional_dataset(train_ratio):
|
|
"""Cette fonction a pour but de lire le dataset Congressional Voting Records
|
|
|
|
Args:
|
|
train_ratio: le ratio des exemples (ou instances) qui vont servir pour l'entrainement,
|
|
le rest des exemples va etre utilisé pour les test.
|
|
|
|
Retours:
|
|
Cette fonction doit retourner 4 matrices de type Numpy, train, train_labels, test, et test_labels
|
|
|
|
- train : une matrice numpy qui contient les exemples qui vont etre utilisés pour l'entrainement, chaque
|
|
ligne dans cette matrice représente un exemple (ou instance) d'entrainement.
|
|
|
|
- train_labels : contient les labels (ou les étiquettes) pour chaque exemple dans train, de telle sorte
|
|
que : train_labels[i] est le label (ou l'etiquette) pour l'exemple train[i]
|
|
|
|
- test : une matrice numpy qui contient les exemples qui vont etre utilisés pour le test, chaque
|
|
ligne dans cette matrice représente un exemple (ou instance) de test.
|
|
|
|
- test_labels : contient les labels (ou les étiquettes) pour chaque exemple dans test, de telle sorte
|
|
que : test_labels[i] est le label (ou l'etiquette) pour l'exemple test[i]
|
|
"""
|
|
|
|
random.seed(1) # Pour avoir les meme nombres aléatoires à chaque initialisation.
|
|
|
|
# Vous pouvez utiliser un dictionnaire pour convertir les attributs en numériques
|
|
# Notez bien qu'on a traduit le symbole "?" pour une valeur numérique
|
|
# Vous pouvez biensur utiliser d'autres valeurs pour ces attributs
|
|
conversion_labels = {'republican' : 0, 'democrat' : 1,
|
|
'n' : 0, 'y' : 1, '?' : 2}
|
|
|
|
# Le fichier du dataset est dans le dossier datasets en attaché
|
|
f = open('datasets/house-votes-84.data', 'r')
|
|
lines=[line.strip() for line in f.readlines()]
|
|
f.close()
|
|
|
|
lines=[line.split(",") for line in lines if line]
|
|
|
|
features=[]
|
|
labels=[]
|
|
|
|
for line in lines:
|
|
features.append([conversion_labels[i] for i in line[1:17]])
|
|
labels.append(conversion_labels[line[0]])
|
|
|
|
np_features=np.array(features,dtype=np.float)
|
|
np_labels=np.array(labels,dtype=np.int)
|
|
|
|
train_index = np.random.rand(np_features.shape[0]) < train_ratio
|
|
|
|
train = np_features[train_index]
|
|
train_labels = np_labels[train_index]
|
|
test = np_features[~train_index]
|
|
test_labels = np_labels[~train_index]
|
|
|
|
# La fonction doit retourner 4 structures de données de type Numpy.
|
|
return (train, train_labels, test, test_labels)
|
|
|
|
|
|
def load_monks_dataset(numero_dataset):
|
|
"""Cette fonction a pour but de lire le dataset Monks
|
|
|
|
Notez bien que ce dataset est différent des autres d'un point de vue
|
|
exemples entrainement et exemples de tests.
|
|
Pour ce dataset, nous avons 3 différents sous problèmes, et pour chacun
|
|
nous disposons d'un fichier contenant les exemples d'entrainement et
|
|
d'un fichier contenant les fichiers de tests. Donc nous avons besoin
|
|
seulement du numéro du sous problème pour charger le dataset.
|
|
|
|
Args:
|
|
numero_dataset: lequel des sous problèmes nous voulons charger (1, 2 ou 3 ?)
|
|
par exemple, si numero_dataset=2, vous devez lire :
|
|
le fichier monks-2.train contenant les exemples pour l'entrainement
|
|
et le fichier monks-2.test contenant les exemples pour le test
|
|
les fichiers sont tous dans le dossier datasets
|
|
Retours:
|
|
Cette fonction doit retourner 4 matrices de type Numpy, train, train_labels, test, et test_labels
|
|
|
|
- train : une matrice numpy qui contient les exemples qui vont etre utilisés pour l'entrainement, chaque
|
|
ligne dans cette matrice représente un exemple (ou instance) d'entrainement.
|
|
- train_labels : contient les labels (ou les étiquettes) pour chaque exemple dans train, de telle sorte
|
|
que : train_labels[i] est le label (ou l'etiquette) pour l'exemple train[i]
|
|
|
|
- test : une matrice numpy qui contient les exemples qui vont etre utilisés pour le test, chaque
|
|
ligne dans cette matrice représente un exemple (ou instance) de test.
|
|
- test_labels : contient les labels (ou les étiquettes) pour chaque exemple dans test, de telle sorte
|
|
que : test_labels[i] est le label (ou l'etiquette) pour l'exemple test[i]
|
|
"""
|
|
|
|
|
|
# TODO : votre code ici, vous devez lire les fichiers .train et .test selon l'argument numero_dataset
|
|
|
|
f = open('datasets/monks-'+str(numero_dataset)+'.train', 'r')
|
|
lines_train=[line.strip() for line in f.readlines()]
|
|
f.close()
|
|
|
|
f = open('datasets/monks-'+str(numero_dataset)+'.test', 'r')
|
|
lines_test=[line.strip() for line in f.readlines()]
|
|
f.close()
|
|
|
|
lines_train=[line.split(" ") for line in lines_train if line]
|
|
lines_test=[line.split(" ") for line in lines_test if line]
|
|
|
|
features_train=[]
|
|
labels_train=[]
|
|
features_test=[]
|
|
labels_test=[]
|
|
|
|
for line in lines_train:
|
|
features_train.append(line[1:7])
|
|
labels_train.append(line[0])
|
|
|
|
for line in lines_test:
|
|
features_test.append(line[1:7])
|
|
labels_test.append(line[0])
|
|
|
|
train=np.array(features_train,dtype=np.float)
|
|
train_labels=np.array(labels_train,dtype=np.int)
|
|
|
|
test=np.array(features_test,dtype=np.float)
|
|
test_labels=np.array(labels_test,dtype=np.int)
|
|
|
|
# La fonction doit retourner 4 matrices (ou vecteurs) de type Numpy.
|
|
return (train, train_labels, test, test_labels) |