You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
119 lines
6.1 KiB
119 lines
6.1 KiB
# Plotabit
|
|
Dataset link: https://www.kaggle.com/datasets/fedesoriano/stellar-classification-dataset-sdss17
|
|
|
|
Deep Learning: https://machinelearningmastery.com/tutorial-first-neural-network-python-keras/
|
|
|
|
Python Machine Learning: https://machinelearningmastery.com/machine-learning-in-python-step-by-step/
|
|
|
|
AI Plot data: https://machinelearningmastery.com/visualize-machine-learning-data-python-pandas/
|
|
|
|
## Columns
|
|
|
|
|Keep |Skip |
|
|
|:-----------:|:----------:|
|
|
|alpha |obj_ID |
|
|
|delta |run_ID |
|
|
|u |rerun_ID |
|
|
|g |plate |
|
|
|r |MJD |
|
|
|i |fiber_ID |
|
|
|z | |
|
|
|redshift | |
|
|
|
|
## Analysis
|
|
|
|
- [X] Train models with just 20000 "GALAXY" class (has an impact?)
|
|
- [X] Which model is the best, ratio learn_time/precision
|
|
- [X] Can we drop more categories and have same results (useless data?)
|
|
- [X] Compare prediction with y_test that were false
|
|
|
|
## Dataset
|
|
Nous avons décidés de prendre un dataset sur le site Kaggle, il contient 100 000 lignes qui réprésentent
|
|
chacune un objet stellaire observé en lui attribuant plusieurs caractéristiques comme son inclinaison,
|
|
les longueurs d'ondes observées et autres valeurs scientifiques.
|
|
Chaque ligne est donc associée à une classe qui peut-être "QSO" un quasar, "Galaxy" ou "Star" une étoile.
|
|
|
|
Notre première étape à été de regarder le dataset pour savoir si certaines données sont manquantes.
|
|
En utilisant `df.info()` nous pouvons avoir certaines informations sur les données, il ne manque aucune valeur.
|
|
|
|
Nous pouvons maintenant regarder la répartition des classes, celle-ci est assez inégale avec ~60.000 Galaxie,
|
|
~21.000 étoiles et ~19000 quasar. Nous pouvons en déduire que les galaxies sont plus communes mais cela
|
|
pourrait-il avoir une incidence sur la précision de notre modèle ?
|
|
|
|
Après avoir testé avec un nombre égal de Galaxies, Etoiles et Quasars, les résultats sont moins bon qu'en utilisant
|
|
le dataset de base. La précision n'est donc pas impactée par le grand nombre de galaxies.
|
|
|
|
|
|
## Choix des données d'entrainement
|
|
Pour entrainer des modèles nous devons d'abord diviser notre dataset en deux parties, les caractéristiques
|
|
de chaque objet (x) ainsi que la classe à laquelle il est associé (y). La valeur (x) ne représente pas
|
|
forcément toutes des caractéristiques pertinantes, nous avons d'abord du effectuer un tri.
|
|
|
|
Voici la liste des colonnes avec leurs descriptions:
|
|
|
|
1) **obj_ID** = Object Identifier, the unique value that identifies the object in the image catalog used by the CAS
|
|
2) **alpha** = Right Ascension angle (at J2000 epoch)
|
|
3) **delta** = Declination angle (at J2000 epoch)
|
|
4) **u** = Ultraviolet filter in the photometric system
|
|
5) **g** = Green filter in the photometric system
|
|
6) **r** = Red filter in the photometric system
|
|
7) **i** = Near Infrared filter in the photometric system
|
|
8) **z** = Infrared filter in the photometric system
|
|
9) **run_ID** = Run Number used to identify the specific scan
|
|
10) **rereun_ID** = Rerun Number to specify how the image was processed
|
|
11) **cam_col** = Camera column to identify the scanline within the run
|
|
12) **field_ID** = Field number to identify each field
|
|
13) **spec_obj_ID** = Unique ID used for optical spectroscopic objects (this means that 2 different observations with the same spec_obj_ID must share the output class)
|
|
14) **class** = object class (galaxy, star or quasar object)
|
|
15) **redshift** = redshift value based on the increase in wavelength
|
|
16) **plate** = plate ID, identifies each plate in SDSS
|
|
17) **MJD** = Modified Julian Date, used to indicate when a given piece of SDSS data was taken
|
|
18) **fiber_ID** = fiber ID that identifies the fiber that pointed the light at the focal plane in each observation
|
|
|
|
Plusieurs colonnes n'ont enfait aucun rapport avec l'astre en lui-meme, mais sont plutôt des informations sur
|
|
l'équipement utilisé pendant les observations. Nous les avons donc enlevées de (x) car leurs présence ne fait que
|
|
baisser la précision des modèles entrainés.
|
|
|
|
## Entrainement
|
|
Nous avons testés plusieurs modèles au cours de ce projet dans le but de trouver celui qui est le plus précis
|
|
pour prédire la catégorie d'un astre grace à ses caractéristiques. Au début de manière aléatoire en jouant
|
|
avec les hyper-paramètres, puis nous avons utilisés [l'arbre de choix de sklearn](https://scikit-learn.org/stable/tutorial/machine_learning_map/index.html).
|
|
Nous voulons prédire une catégorie, il faut donc utiliser un *Classifier* et nous avons 100.000 lignes, vu que la conditions est "<100K" nous avons utilisés
|
|
les modèles pour < et > à 100.000 lignes:
|
|
|
|
- KNN
|
|
- Decision Tree
|
|
- Linear SVC
|
|
- Random Forest
|
|
|
|
Mais aussi d'autre modèles pour tester leurs efficacité:
|
|
|
|
- Multi-Layer Perceptron
|
|
- Nearest Centroid
|
|
- SGD
|
|
|
|
Pour entrainer et tester nos modèles, il nous faut faire plusieurs groupes de données, celles d'entrainement
|
|
**Xtrain** et **Xtest**, pour les test **Ytrain** et **Ytest**. Ces groupes ont été générés en utilisant
|
|
`train_test_split(x, y,test_size=0.25, random_state=0)`, *test_size* défini le % du dataset à utiliser pour les tests.
|
|
L'ajout du paramètre `stratified=y` qui doit garder une répartition égale dans les groupes de test et train n'a pas
|
|
augmenté la précision de nos modèles pour autant.
|
|
|
|
Maintenant il ne reste plus qu'à utiliser la méthode `fit(Xtrain, Ytrain)` des modèles en utilisant **Xtrain** et **Ytrain**.
|
|
Ensuite il nous faut tester le modèle en lui faisant prédire les classes des données **Ytrain** en utilisant
|
|
`predictions = model.predict(Xtest)` et enfin récupérer la précision du modèle en comparant nos prédictions
|
|
avec **Ytest**: `accuracy_score(Ytest, predictions).`
|
|
|
|
## Résultat
|
|
Le meilleur modèle pour notre dataset est d'après nos expérimentations le **RandomForestClassifier** avec une précision
|
|
de 98%.
|
|
|
|
Voici les résultats obtenu sur l'ensemble des modèles:
|
|
|
|
- KNN (accuracy: 70,724%, f1: 61.35%)
|
|
- Decision Tree (accuracy: 96,82%, f1: 96,32%)
|
|
- Linear SVC (n'a jamais fini)
|
|
- Random Forest (accuracy: 98.012%, f1: 97,61%)
|
|
- Multi-Layer Perceptron (accuracy: 59.22%, f1: 24.7%)
|
|
- Nearest Centroid (accuracy: 36.328%, f1: 36,85%)
|
|
- SGD (accuracy: 21%, f1: 11%)
|