Calcolo delle metriche di valutazione
double TP, FP, FN, TN;
double totalePrecisione, totaleTP0, totaleTP1, totaleTP2, totaleFP0, totaleFP1, totaleFP2;
totalePrecisione = totaleTP0 = totaleTP1 = totaleTP2 = totaleFP0 = totaleFP1 = totaleFP2 = TP = FP = FN = TN = 0;
double MediaPrecisione, MediaTP0, MediaTP1, MediaTP2, MediaFP0, MediaFP1, MediaFP2;
MediaPrecisione = MediaTP0 = MediaTP1 = MediaTP2 = MediaFP0 = MediaFP1 = MediaFP2 = 0;
Nel processo di 10-fold cross-validation, il set di dati viene suddiviso in 10 parti (folds). Il modello viene addestrato su 9 di queste parti e testato sulla restante. Questo processo viene ripetuto 10 volte, ogni volta con un diverso fold come set di test.
// Inizializzo l'oggetto trainingSet. Questo oggetto verrà popolato con i dati di addestramento
// Inizializzo l'oggetto testSet. Questo verrà utilizzato per i dati di test.
Instances trainingSet = null;
Instances testSet = null;
for (int i = 0; i < NUMBER_FOLDS; i++) {
01/12/2023 …. - Matricola: …..
Inizializzo
una matrice di confusione (confusionMatrix) utilizzata per valutare le prestazioni del modello di classificazione.
confusionMatrix = new double[Calcoli.NumClusters][Calcoli.NumClusters];
int rows = confusionMatrix.length;
int columns = confusionMatrix[0].length;
String str = ""\t"";
/*Inizializzo tre variabili (Centroide0, Centroide1, Centroide2) utilizzate per contare quanti elementi di ciascuna classe sono associati a un certo centroide con indice 0, per il processo di clustering o classificazione in cui i dati sono assegnati a centroidi monitorandone la distribuzione delle classi nei vari centroidi.*/
int Centroide00 = 0;
int Centroide01 = 0;
int Centroide02 = 0;
int Centroide10 = 0;
int Centroide11 = 0;
int Centroide12 = 0;
int Centroide20 = 0;
int Centroide21 = 0;
int Centroide22 = 0;
/* trainingSet - Restituisce il sottoinsieme del set di dati da utilizzare come set di addestramento durante l'iterazione (fold) della cross-validation. Calcoli.numberOfFolds indica il numero totale di fold */
Instances(trainNoLabel);
Filtro.setAttributeIndices("last");
Filtro.setInputFormat(trainNoLabel);
Instances dataClusterer = Filter.useFilter(trainNoLabel, Filtro);```html
Remove();
EuclideanDistance df = new EuclideanDistance();
Filtro.setAttributeIndices(""" + (trainNoLabel.classIndex() +1));
01/12/2023 …. - Matricola: …..
Filtro.setInputFormat(trainNoLabel);
Instances dataClusterer = Filter.useFilter(trainNoLabel,Filtro); //applico KMeans clustering
SimpleKMeans model = new SimpleKMeans();
model.setNumClusters(3);
model.setDistanceFunction(df);
model.buildClusterer(dataClusterer);
Instances centroid = model.getClusterCentroids();
Remove filter2 = new Remove();
filter2.setAttributeIndices(""" + (trainLabel.classIndex() +1));
filter2.setInputFormat(trainLabel);
Instances trainLabel2 = Filter.useFilter(trainLabel,filter2);
/* dopo aver generato K-Means clustering, considero tutte le istanze etichettate ditraining set e calcolo la distanza di ciascuno di essi dai centroidi. Assegnol'istanza al cluster più vicino*/
for (int j = 0; j < trainLabel2.size(); j++){
Instance InstanceEtic = trainLabel.get(j);
Instance instance =
```
trainLabel2.instance(j);
EuclideanDistance e = new EuclideanDistance(centroid);
double[] vettDist1 = new double[3];
vettDist1[0] = e.distance(instance, centroid.get(0));
vettDist1[1] = e.distance(instance, centroid.get(1));
vettDist1[2] = e.distance(instance, centroid.get(2));
int MinimoCentroide = Calcoli.MinimoIndice(vettDist1);
/*identifico l'etichetta di ciascun cluster basandomi sul numero di istanze etichettate
del set di addestramento assegnate ad esso*/
if (MinimoCentroide == 0) {
if (InstanceEtic.classValue() == 0.0) {
Centroide00++;
} else if (InstanceEtic.classValue() == 1.0) {
Centroide01++;
} else {
Centroide02++;
}
} else if (MinimoCentroide == 1) {
if (InstanceEtic.classValue() == 0.0) {
Centroide10++;
} else if (InstanceEtic.classValue() == 1.0) {
Centroide11++;
} else {
Centroide12++;
}
} else {
if (InstanceEtic.classValue() == 0.0) {
Centroide20++;
} else if (InstanceEtic.classValue() == 1.0) {
Centroide21++;
} else {
Centroide22++;
}
}
01/12/2023 …. - Matricola: …..
}}
System.out.println(
"CENTROIDI CONTEGGI"
0: Centroide00 Centroide01 Centroide02
1: Centroide10 Centroide11 Centroide12
2: Centroide20 Centroide21 Centroide22
double[] alfa1 = new double[3];
alfa1[0] = Centroide00;
alfa1[1] = Centroide01;
alfa1[2] = Centroide02;
double[] alfa2 = new double[3];
alfa2[0] = Centroide10;
alfa2[1] = Centroide11;
alfa2[2] = Centroide12;
double[] alfa3 = new double[3];
alfa3[0] = Centroide20;
alfa3[1] = Centroide21;
alfa3[2] = Centroide22;
double[] Centroide = new double[3];
Centroide[0] = (double) (Calcoli.MaggioreIndice(alfa1));
Centroide[1] = (double) (Calcoli.MaggioreIndice(alfa2));
Centroide[2] = (double) (Calcoli.MaggioreIndice(alfa3));
Remove filter3 = new Remove();
filter3.setAttributeIndices("" + (testSet.classIndex() + 1));
filter3.setInputFormat(testSet);
Instances testSet2 = Filter.useFilter(testSet,
filter3);
for (int x = 0; x < testSet2.size(); x++) {
int count = 1;
Instance instance = testSet2.get(x);
Instance InstanceEtic = testSet.get(x);
EuclideanDistance e = new EuclideanDistance(centroid);
double[] vettDist2 = new double[3];
vettDist2[0] = e.distance(instance, centroid.get(0));
vettDist2[1] = e.distance(instance, centroid.get(1));
vettDist2[2] = e.distance(instance, centroid.get(2));
int MinimoCentroide = Calcoli.MinimoIndice(vettDist2);
double result = Centroide[MinimoCentroide];
double classValue = InstanceEtic.classValue();
confusionMatrix[(int) result][(int) classValue] = confusionMatrix[(int) result][(int) classValue] + count;
}
01/12/2023 …. - Matricola: …..
System.out.println("CONFUSION MATRIX: ");
System.out.println("\n");
for (int y = 0; y < rows; y++) {
for (int z = 0; z < columns; z++) {
str += confusionMatrix[y][z] + "\t";
}
System.out.println(str + "");
str = "\t";
}
/** Stampo risultati ottenuti*/
double TP0 = Calcoli.numTruePositives(confusionMatrix,
0);
double TP1 = Calcoli.numTruePositives(confusionMatrix, 1);
double TP2 = Calcoli.numTruePositives(confusionMatrix, 2);
double TN0 = Calcoli.numTrueNegatives(confusionMatrix, 0);
double TN1 = Calcoli.numTrueNegatives(confusionMatrix, 1);
double TN2 = Calcoli.numTrueNegatives(confusionMatrix, 2);
double FP0 = Calcoli.numFalsePositives(confusionMatrix, 0);
double FP1 = Calcoli.numFalsePositives(confusionMatrix, 1);
double FP2 = Calcoli.numFalsePositives(confusionMatrix, 2);
double FN0 = Calcoli.numFalseNegatives(confusionMatrix, 0);
double FN1 = Calcoli.numFalseNegatives(confusionMatrix, 1);
double FN2 = Calcoli.numFalseNegatives(confusionMatrix, 2);
System.out.println("<br>");
System.out.println("TP(0): " + TP0);
System.out.println("FP(0): " + FP0);
System.out.println("FN(0): " + FN0);
System.out.println("TN(0): " + TN0);
System.out.println("TP(1): " + TP1);
System.out.println("FP(1): " + FP1);
System.out.println("FN(1): " + FN1);
System.out.println("TN(1): " + TN1);
System.out.println("TP(2): " + TP2);
System.out.println("FP(2): " + FP2);
System.out.println("FN(2): " + FN2);
System.out.println("TN(2): " + TN2);
TP1);
System.out.println("FP(1):" + " " + FP1);
System.out.println("FN(1):" + " " + FN1);
System.out.println("TN(1):" + " " + TN1);
System.out.println("TP(2):" + " " + TP2);
System.out.println("FP(2):" + " " + FP2);
System.out.println("FN(2):" + " " + FN2);
System.out.println("TN(2):" + " " + TN2);
System.out.println("\n");
TP = TP0 + TP1 + TP2;
TN = TN0 + TN1 + TN2;
FP = FP0 + FP1 + FP2;
FN = FN0 + FN1 + FN2;
if (TP + TN + FP + FN > 0){
accuracy[i] = (TP + TN) / (TP + TN + FP + FN);
}
truePositiveRateA0[i] = Calcoli.truePositiveRate(TP0, FN0);
01/12/2023 …. - Matricola: …..
truePositiveRateA1[i] = Calcoli.truePositiveRate(TP1, FN1);
truePositiveRateA2[i] = Calcoli.truePositiveRate(TP2, FN2);
falsePositiveRateA0[i] = Calcoli.falsePositiveRate(FP0, TN0);
falsePositiveRateA1[i] = Calcoli.falsePositiveRate(FP1, TN1);
falsePositiveRateA2[i] = Calcoli.falsePositiveRate(FP2,
TN2);
totalePrecisione += accuracy[i];
totaleTP0 += truePositiveRateA0[i];
totaleTP1 += truePositiveRateA1[i];
totaleTP2 += truePositiveRateA2[i];
totaleFP0 += falsePositiveRateA0[i];
totaleFP1 += falsePositiveRateA1[i];
totaleFP2 += falsePositiveRateA2[i];
}
MediaPrecisione = (totalePrecisione / NUMBER_FOLDS) * 100;
MediaTP0 = (totaleTP0 / NUMBER_FOLDS) * 100;
MediaTP1 = (totaleTP1 / NUMBER_FOLDS) * 100;
MediaTP2 = (totaleTP2 / NUMBER_FOLDS) * 100;
MediaFP0 = (totaleFP0 / NUMBER_FOLDS) * 100;
MediaFP1 = (totaleFP1 / NUMBER_FOLDS) * 100;
MediaFP2 = (totaleFP2 / NUMBER_FOLDS) * 100;
System.out.println(" FOLD ACCURACY: " + String.format("%.2f%%", MediaPrecisione));
System.out.println("TPR - 0: " + String.format("%.2f%%", MediaTP0));
System.out.println("FPR - 0: " + String.format("%.2f%%", MediaFP0));
System.out.println("TPR - 1 : " + String.format("%.2f%%", MediaTP1));
System.out.println("FPR - 1: " + String.format("%.2f%%", MediaFP1));
MediaFP1));
System.out.println("TPR - 2: " + String.format("%.2f%%", MediaTP2));
System.out.println("FPR - 2: " + String.format("%.2f%%", MediaFP2)+"\nFINE");
} catch (Exception e) {
e.printStackTrace();
}
}
}
//Calcoli.java
//…..
package we
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
-
Esercitazione svolta Data Mining con Codice Sorgente
-
Informatica - Esercitazione
-
Macroeconomia: Esercitazione
-
Terza esercitazione