Showing
12 changed files
with
979 additions
and
0 deletions
1 | +5.1 3.5 1.4 0.2 | ||
2 | +4.9 3 1.4 0.2 | ||
3 | +4.7 3.2 1.3 0.2 | ||
4 | +4.6 3.1 1.5 0.2 | ||
5 | +5 3.6 1.4 0.2 | ||
6 | +5.4 3.9 1.7 0.4 | ||
7 | +4.6 3.4 1.4 0.3 | ||
8 | +5 3.4 1.5 0.2 | ||
9 | +4.4 2.9 1.4 0.2 | ||
10 | +4.9 3.1 1.5 0.1 | ||
11 | +5.4 3.7 1.5 0.2 | ||
12 | +4.8 3.4 1.6 0.2 | ||
13 | +4.8 3 1.4 0.1 | ||
14 | +4.3 3 1.1 0.1 | ||
15 | +5.8 4 1.2 0.2 | ||
16 | +5.7 4.4 1.5 0.4 | ||
17 | +5.4 3.9 1.3 0.4 | ||
18 | +5.1 3.5 1.4 0.3 | ||
19 | +5.7 3.8 1.7 0.3 | ||
20 | +5.1 3.8 1.5 0.3 | ||
21 | +5.4 3.4 1.7 0.2 | ||
22 | +5.1 3.7 1.5 0.4 | ||
23 | +4.6 3.6 1 0.2 | ||
24 | +5.1 3.3 1.7 0.5 | ||
25 | +4.8 3.4 1.9 0.2 | ||
26 | +5 3 1.6 0.2 | ||
27 | +5 3.4 1.6 0.4 | ||
28 | +5.2 3.5 1.5 0.2 | ||
29 | +5.2 3.4 1.4 0.2 | ||
30 | +4.7 3.2 1.6 0.2 | ||
31 | +4.8 3.1 1.6 0.2 | ||
32 | +5.4 3.4 1.5 0.4 | ||
33 | +5.2 4.1 1.5 0.1 | ||
34 | +5.5 4.2 1.4 0.2 | ||
35 | +4.9 3.1 1.5 0.1 | ||
36 | +5 3.2 1.2 0.2 | ||
37 | +5.5 3.5 1.3 0.2 | ||
38 | +4.9 3.1 1.5 0.1 | ||
39 | +4.4 3 1.3 0.2 | ||
40 | +5.1 3.4 1.5 0.2 | ||
41 | +5 3.5 1.3 0.3 | ||
42 | +4.5 2.3 1.3 0.3 | ||
43 | +4.4 3.2 1.3 0.2 | ||
44 | +5 3.5 1.6 0.6 | ||
45 | +5.1 3.8 1.9 0.4 | ||
46 | +4.8 3 1.4 0.3 | ||
47 | +5.1 3.8 1.6 0.2 | ||
48 | +4.6 3.2 1.4 0.2 | ||
49 | +5.3 3.7 1.5 0.2 | ||
50 | +5 3.3 1.4 0.2 | ||
51 | +7 3.2 4.7 1.4 | ||
52 | +6.4 3.2 4.5 1.5 | ||
53 | +6.9 3.1 4.9 1.5 | ||
54 | +5.5 2.3 4 1.3 | ||
55 | +6.5 2.8 4.6 1.5 | ||
56 | +5.7 2.8 4.5 1.3 | ||
57 | +6.3 3.3 4.7 1.6 | ||
58 | +4.9 2.4 3.3 1 | ||
59 | +6.6 2.9 4.6 1.3 | ||
60 | +5.2 2.7 3.9 1.4 | ||
61 | +5 2 3.5 1 | ||
62 | +5.9 3 4.2 1.5 | ||
63 | +6 2.2 4 1 | ||
64 | +6.1 2.9 4.7 1.4 | ||
65 | +5.6 2.9 3.6 1.3 | ||
66 | +6.7 3.1 4.4 1.4 | ||
67 | +5.6 3 4.5 1.5 | ||
68 | +5.8 2.7 4.1 1 | ||
69 | +6.2 2.2 4.5 1.5 | ||
70 | +5.6 2.5 3.9 1.1 | ||
71 | +5.9 3.2 4.8 1.8 | ||
72 | +6.1 2.8 4 1.3 | ||
73 | +6.3 2.5 4.9 1.5 | ||
74 | +6.1 2.8 4.7 1.2 | ||
75 | +6.4 2.9 4.3 1.3 | ||
76 | +6.6 3 4.4 1.4 | ||
77 | +6.8 2.8 4.8 1.4 | ||
78 | +6.7 3 5 1.7 | ||
79 | +6 2.9 4.5 1.5 | ||
80 | +5.7 2.6 3.5 1 | ||
81 | +5.5 2.4 3.8 1.1 | ||
82 | +5.5 2.4 3.7 1 | ||
83 | +5.8 2.7 3.9 1.2 | ||
84 | +6 2.7 5.1 1.6 | ||
85 | +5.4 3 4.5 1.5 | ||
86 | +6 3.4 4.5 1.6 | ||
87 | +6.7 3.1 4.7 1.5 | ||
88 | +6.3 2.3 4.4 1.3 | ||
89 | +5.6 3 4.1 1.3 | ||
90 | +5.5 2.5 4 1.3 | ||
91 | +5.5 2.6 4.4 1.2 | ||
92 | +6.1 3 4.6 1.4 | ||
93 | +5.8 2.6 4 1.2 | ||
94 | +5 2.3 3.3 1 | ||
95 | +5.6 2.7 4.2 1.3 | ||
96 | +5.7 3 4.2 1.2 | ||
97 | +5.7 2.9 4.2 1.3 | ||
98 | +6.2 2.9 4.3 1.3 | ||
99 | +5.1 2.5 3 1.1 | ||
100 | +5.7 2.8 4.1 1.3 | ||
101 | +6.3 3.3 6 2.5 | ||
102 | +5.8 2.7 5.1 1.9 | ||
103 | +7.1 3 5.9 2.1 | ||
104 | +6.3 2.9 5.6 1.8 | ||
105 | +6.5 3 5.8 2.2 | ||
106 | +7.6 3 6.6 2.1 | ||
107 | +4.9 2.5 4.5 1.7 | ||
108 | +7.3 2.9 6.3 1.8 | ||
109 | +6.7 2.5 5.8 1.8 | ||
110 | +7.2 3.6 6.1 2.5 | ||
111 | +6.5 3.2 5.1 2 | ||
112 | +6.4 2.7 5.3 1.9 | ||
113 | +6.8 3 5.5 2.1 | ||
114 | +5.7 2.5 5 2 | ||
115 | +5.8 2.8 5.1 2.4 | ||
116 | +6.4 3.2 5.3 2.3 | ||
117 | +6.5 3 5.5 1.8 | ||
118 | +7.7 3.8 6.7 2.2 | ||
119 | +7.7 2.6 6.9 2.3 | ||
120 | +6 2.2 5 1.5 | ||
121 | +6.9 3.2 5.7 2.3 | ||
122 | +5.6 2.8 4.9 2 | ||
123 | +7.7 2.8 6.7 2 | ||
124 | +6.3 2.7 4.9 1.8 | ||
125 | +6.7 3.3 5.7 2.1 | ||
126 | +7.2 3.2 6 1.8 | ||
127 | +6.2 2.8 4.8 1.8 | ||
128 | +6.1 3 4.9 1.8 | ||
129 | +6.4 2.8 5.6 2.1 | ||
130 | +7.2 3 5.8 1.6 | ||
131 | +7.4 2.8 6.1 1.9 | ||
132 | +7.9 3.8 6.4 2 | ||
133 | +6.4 2.8 5.6 2.2 | ||
134 | +6.3 2.8 5.1 1.5 | ||
135 | +6.1 2.6 5.6 1.4 | ||
136 | +7.7 3 6.1 2.3 | ||
137 | +6.3 3.4 5.6 2.4 | ||
138 | +6.4 3.1 5.5 1.8 | ||
139 | +6 3 4.8 1.8 | ||
140 | +6.9 3.1 5.4 2.1 | ||
141 | +6.7 3.1 5.6 2.4 | ||
142 | +6.9 3.1 5.1 2.3 | ||
143 | +5.8 2.7 5.1 1.9 | ||
144 | +6.8 3.2 5.9 2.3 | ||
145 | +6.7 3.3 5.7 2.5 | ||
146 | +6.7 3 5.2 2.3 | ||
147 | +6.3 2.5 5 1.9 | ||
148 | +6.5 3 5.2 2 | ||
149 | +6.2 3.4 5.4 2.3 | ||
150 | +5.9 3 5.1 1.8 | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
File mode changed
File mode changed
1 | +5.1 3.5 1.4 0.2 | ||
2 | +4.9 3 1.4 0.2 | ||
3 | +4.7 3.2 1.3 0.2 | ||
4 | +4.6 3.1 1.5 0.2 | ||
5 | +5 3.6 1.4 0.2 | ||
6 | +5.4 3.9 1.7 0.4 | ||
7 | +4.6 3.4 1.4 0.3 | ||
8 | +5 3.4 1.5 0.2 | ||
9 | +4.4 2.9 1.4 0.2 | ||
10 | +4.9 3.1 1.5 0.1 | ||
11 | +5.4 3.7 1.5 0.2 | ||
12 | +4.8 3.4 1.6 0.2 | ||
13 | +4.8 3 1.4 0.1 | ||
14 | +4.3 3 1.1 0.1 | ||
15 | +5.8 4 1.2 0.2 | ||
16 | +5 3.3 1.4 0.2 | ||
17 | +7 3.2 4.7 1.4 | ||
18 | +6.4 3.2 4.5 1.5 | ||
19 | +6.9 3.1 4.9 1.5 | ||
20 | +5.5 2.3 4 1.3 | ||
21 | +6.5 2.8 4.6 1.5 | ||
22 | +5.7 2.8 4.5 1.3 | ||
23 | +6.3 3.3 4.7 1.6 | ||
24 | +4.9 2.4 3.3 1 | ||
25 | +6.6 2.9 4.6 1.3 | ||
26 | +5.2 2.7 3.9 1.4 | ||
27 | +5 2 3.5 1 | ||
28 | +5.9 3 4.2 1.5 | ||
29 | +6 2.2 4 1 | ||
30 | +6.1 2.9 4.7 1.4 | ||
31 | +5.7 2.8 4.1 1.3 | ||
32 | +6.3 3.3 6 2.5 | ||
33 | +5.8 2.7 5.1 1.9 | ||
34 | +7.1 3 5.9 2.1 | ||
35 | +6.3 2.9 5.6 1.8 | ||
36 | +6.5 3 5.8 2.2 | ||
37 | +7.6 3 6.6 2.1 | ||
38 | +4.9 2.5 4.5 1.7 | ||
39 | +7.3 2.9 6.3 1.8 | ||
40 | +6.7 2.5 5.8 1.8 | ||
41 | +7.2 3.6 6.1 2.5 | ||
42 | +6.5 3.2 5.1 2 | ||
43 | +6.4 2.7 5.3 1.9 | ||
44 | +6.8 3 5.5 2.1 | ||
45 | +5.7 2.5 5 2 | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
1 | +Iris-setosa | ||
2 | +Iris-setosa | ||
3 | +Iris-setosa | ||
4 | +Iris-setosa | ||
5 | +Iris-setosa | ||
6 | +Iris-setosa | ||
7 | +Iris-setosa | ||
8 | +Iris-setosa | ||
9 | +Iris-setosa | ||
10 | +Iris-setosa | ||
11 | +Iris-setosa | ||
12 | +Iris-setosa | ||
13 | +Iris-setosa | ||
14 | +Iris-setosa | ||
15 | +Iris-setosa | ||
16 | +Iris-setosa | ||
17 | +Iris-versicolor | ||
18 | +Iris-versicolor | ||
19 | +Iris-versicolor | ||
20 | +Iris-versicolor | ||
21 | +Iris-versicolor | ||
22 | +Iris-versicolor | ||
23 | +Iris-versicolor | ||
24 | +Iris-versicolor | ||
25 | +Iris-versicolor | ||
26 | +Iris-versicolor | ||
27 | +Iris-versicolor | ||
28 | +Iris-versicolor | ||
29 | +Iris-versicolor | ||
30 | +Iris-versicolor | ||
31 | +Iris-versicolor | ||
32 | +Iris-virginica | ||
33 | +Iris-virginica | ||
34 | +Iris-virginica | ||
35 | +Iris-virginica | ||
36 | +Iris-virginica | ||
37 | +Iris-virginica | ||
38 | +Iris-virginica | ||
39 | +Iris-virginica | ||
40 | +Iris-virginica | ||
41 | +Iris-virginica | ||
42 | +Iris-virginica | ||
43 | +Iris-virginica | ||
44 | +Iris-virginica | ||
45 | +Iris-virginica | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
1 | +from sklearn.naive_bayes import MultinomialNB, BernoulliNB | ||
2 | + | ||
3 | +def scores(list1, list2): | ||
4 | + errores = 0 | ||
5 | + aciertos = 0 | ||
6 | + if len(list1) != len(list2): | ||
7 | + print("ERROR. LENGTH MISMATCH") | ||
8 | + for i in range(len(list1)): | ||
9 | + if list1[i] == list2[i]: | ||
10 | + aciertos += 1 | ||
11 | + else: | ||
12 | + errores += 1 | ||
13 | + cocienteErrores = errores / len(list1) | ||
14 | + return [aciertos, errores, cocienteErrores] | ||
15 | + | ||
16 | +data = [] | ||
17 | +lista = [] | ||
18 | +with open("C:\Users\cmendezc\Dropbox (UNAM-CCG)\Actividades_CCG\LICENCIATURA_LCG\BioInfo-I\lcg-bioinfoI-bionlp\clasificacion-automatica\iris-datasetdata.txt", encoding='utf8') \ | ||
19 | + as dataFile: | ||
20 | + for line in dataFile: | ||
21 | + listaFloat = [] | ||
22 | + line = line.strip('\n') | ||
23 | + lista = line.split('\t') | ||
24 | + for elem in lista: | ||
25 | + listaFloat.append(float(elem)) | ||
26 | + data.append(listaFloat) | ||
27 | + | ||
28 | +print(data) | ||
29 | + | ||
30 | +target = [] | ||
31 | +with open("C:\\Users\\cmendezc\\Documents\\GENOMICAS\\LICENCIATURA_LCGPDCB\\dataSet_Iris\\true_Classes.txt", encoding='utf8') \ | ||
32 | + as classFile: | ||
33 | + for line in classFile: | ||
34 | + line = line.strip('\n') | ||
35 | + target.append(line) | ||
36 | + | ||
37 | +myMultinomialNB = MultinomialNB() | ||
38 | +myBernoulliNB = BernoulliNB() | ||
39 | + | ||
40 | +y_pred = myMultinomialNB.fit(data, target).predict(data) | ||
41 | + | ||
42 | +''' | ||
43 | +for i in range(len(iris.target)): | ||
44 | + print(str(iris.target[i]) + "\t" + str(y_pred[i]) + "\t" + str(iris.data[i])) | ||
45 | +''' | ||
46 | + | ||
47 | +myRandomForest = RandomForestClassifier() | ||
48 | +y_pred = myRandomForest.fit(data, target).predict(data) | ||
49 | +results = scores(target, y_pred) | ||
50 | +print("Errores: {}".format(results[1])) | ||
51 | +print("Aciertos: {}".format(results[0])) | ||
52 | +print("Cociente error: {}".format(results[2])) | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
1 | +from sklearn import datasets | ||
2 | +from sklearn.naive_bayes import MultinomialNB, BernoulliNB | ||
3 | +from sklearn.ensemble import RandomForestClassifier | ||
4 | + | ||
5 | +def scores(list1, list2): | ||
6 | + errores = 0 | ||
7 | + aciertos = 0 | ||
8 | + if len(list1) != len(list2): | ||
9 | + print("ERROR. LENGTH MISMATCH") | ||
10 | + for i in range(len(list1)): | ||
11 | + if list1[i] == list2[i]: | ||
12 | + aciertos += 1 | ||
13 | + else: | ||
14 | + errores += 1 | ||
15 | + cocienteErrores = errores / len(list1) | ||
16 | + return [aciertos, errores, cocienteErrores] | ||
17 | + | ||
18 | +iris = datasets.load_iris() | ||
19 | + | ||
20 | +myMultinomialNB = MultinomialNB() | ||
21 | +myBernoulliNB = BernoulliNB() | ||
22 | + | ||
23 | +y_pred = myMultinomialNB.fit(iris.data, iris.target).predict(iris.data) | ||
24 | + | ||
25 | +''' | ||
26 | +for i in range(len(iris.target)): | ||
27 | + print(str(iris.target[i]) + "\t" + str(y_pred[i]) + "\t" + str(iris.data[i])) | ||
28 | +''' | ||
29 | + | ||
30 | +myRandomForest = RandomForestClassifier() | ||
31 | +y_pred = myRandomForest.fit(iris.data, iris.target).predict(iris.data) | ||
32 | +results = scores(iris.target, y_pred) | ||
33 | +print("Errores: {}".format(results[1])) | ||
34 | +print("Aciertos: {}".format(results[0])) | ||
35 | +print("Cociente error: {}".format(results[2])) | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
1 | +# -*- encoding: utf-8 -*- | ||
2 | + | ||
3 | +import os | ||
4 | +from time import time | ||
5 | +from optparse import OptionParser | ||
6 | +from sklearn.naive_bayes import MultinomialNB | ||
7 | +from sklearn.ensemble import RandomForestClassifier | ||
8 | +from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix, \ | ||
9 | + classification_report | ||
10 | +import sys | ||
11 | + | ||
12 | +__author__ = 'CMendezC' | ||
13 | + | ||
14 | +# Goal: training and test Iris dataset | ||
15 | + | ||
16 | +# Parameters: | ||
17 | +# 1) --inputPath Path to read input files. | ||
18 | +# 2) --inputFileData File to read data. | ||
19 | +# 3) --inputFileTrueClasses File to read text true classes. | ||
20 | +# 4) --outputPath Path to place output files. | ||
21 | +# 5) --outputFile File to place evaluation report. | ||
22 | +# 6) --classifier Classifier: MultinomialNB, SVM, RandomForest. | ||
23 | + | ||
24 | +# Ouput: | ||
25 | +# 1) Evaluation report. | ||
26 | + | ||
27 | +# Execution: | ||
28 | +# C:\Anaconda3\python trainingTest_Iris.py | ||
29 | +# --inputPath C:\Users\cmendezc\Documents\GENOMICAS\LICENCIATURA_LCGPDCB\dataSet_Iris | ||
30 | +# --inputFileData data.txt | ||
31 | +# --inputFileTrueClasses true_Classes.txt | ||
32 | +# --outputPath C:\Users\cmendezc\Documents\GENOMICAS\LICENCIATURA_LCGPDCB\dataSet_Iris | ||
33 | +# --outputFile report_MultinomialNB.txt | ||
34 | +# --classifier MultinomialNB | ||
35 | + | ||
36 | +# C:\Anaconda3\python trainingTest_Iris.py --inputPath C:\Users\cmendezc\Documents\GENOMICAS\LICENCIATURA_LCGPDCB\dataSet_Iris --inputFileData data.txt --inputFileTrueClasses true_Classes.txt --outputPath C:\Users\cmendezc\Documents\GENOMICAS\LICENCIATURA_LCGPDCB\dataSet_Iris --outputFile report_MultinomialNB.txt --classifier MultinomialNB | ||
37 | + | ||
38 | +########################################################### | ||
39 | +# MAIN PROGRAM # | ||
40 | +########################################################### | ||
41 | + | ||
42 | +if __name__ == "__main__": | ||
43 | + # Parameter definition | ||
44 | + parser = OptionParser() | ||
45 | + parser.add_option("--inputPath", dest="inputPath", | ||
46 | + help="Path to read input files", metavar="PATH") | ||
47 | + parser.add_option("--inputFileData", dest="inputFileData", | ||
48 | + help="File to read data", metavar="FILE") | ||
49 | + parser.add_option("--inputFileTrueClasses", dest="inputFileTrueClasses", | ||
50 | + help="File to read true classes", metavar="FILE") | ||
51 | + parser.add_option("--outputPath", dest="outputPath", | ||
52 | + help="Path to place output files", metavar="PATH") | ||
53 | + parser.add_option("--outputFile", dest="outputFile", | ||
54 | + help="File to write evaluation report", metavar="FILE") | ||
55 | + parser.add_option("--classifier", dest="classifier", | ||
56 | + help="Classifier", metavar="CLASSIFIER") | ||
57 | + | ||
58 | + (options, args) = parser.parse_args() | ||
59 | + if len(args) > 0: | ||
60 | + parser.error("None parameters indicated.") | ||
61 | + sys.exit(1) | ||
62 | + | ||
63 | + # Printing parameter values | ||
64 | + print('-------------------------------- PARAMETERS --------------------------------') | ||
65 | + print("Path to read input files: " + str(options.inputPath)) | ||
66 | + print("File to read data: " + str(options.inputFileData)) | ||
67 | + print("File to read true classes: " + str(options.inputFileTrueClasses)) | ||
68 | + print("Path to place output files: " + str(options.outputPath)) | ||
69 | + print("File to write evaluation report: " + str(options.outputFile)) | ||
70 | + print("Classifier: " + str(options.outputFile)) | ||
71 | + | ||
72 | + # Start time | ||
73 | + t0 = time() | ||
74 | + | ||
75 | + print(" Reading data and true classes...") | ||
76 | + trueClasses = [] | ||
77 | + with open(os.path.join(options.inputPath, options.inputFileTrueClasses), encoding='utf8', mode='r') \ | ||
78 | + as classFile: | ||
79 | + for line in classFile: | ||
80 | + line = line.strip('\r\n') | ||
81 | + trueClasses.append(line) | ||
82 | + print(trueClasses) | ||
83 | + | ||
84 | + data = [] | ||
85 | + with open(os.path.join(options.inputPath, options.inputFileData), encoding='utf8', mode='r') \ | ||
86 | + as dataFile: | ||
87 | + for line in dataFile: | ||
88 | + listTemp = [] | ||
89 | + listFloat = [] | ||
90 | + line = line.strip('\r\n') | ||
91 | + listTemp = line.split('\t') | ||
92 | + for elem in listTemp: | ||
93 | + listFloat.append(float(elem)) | ||
94 | + data.append(listFloat) | ||
95 | + print(data) | ||
96 | + print(" Reading data and true classes done!") | ||
97 | + | ||
98 | + if options.classifier == "MultinomialNB": | ||
99 | + classifier = MultinomialNB() | ||
100 | + elif options.classifier == "SVM": | ||
101 | + pass | ||
102 | + elif options.classifier == "RandomForest": | ||
103 | + classifier = RandomForestClassifier() | ||
104 | + | ||
105 | + print(" Training...") | ||
106 | + y_pred = classifier.fit(data, trueClasses).predict(data) | ||
107 | + print(" Training done!") | ||
108 | + | ||
109 | + # for i in range(len(trueClasses)): | ||
110 | + # print(str(trueClasses[i]) + "\t" + str(y_pred[i])) | ||
111 | + | ||
112 | + print(" Saving test report...") | ||
113 | + with open(os.path.join(options.outputPath, options.outputFile), mode='w', encoding='utf8') as oFile: | ||
114 | + oFile.write('********** EVALUATION REPORT **********\n') | ||
115 | + oFile.write('Classifier: {}\n'.format(options.classifier)) | ||
116 | + oFile.write('Accuracy: {}\n'.format(accuracy_score(trueClasses, y_pred))) | ||
117 | + oFile.write('Precision: {}\n'.format(precision_score(trueClasses, y_pred, average='weighted'))) | ||
118 | + oFile.write('Recall: {}\n'.format(recall_score(trueClasses, y_pred, average='weighted'))) | ||
119 | + oFile.write('F-score: {}\n'.format(f1_score(trueClasses, y_pred, average='weighted'))) | ||
120 | + # oFile.write('{}\t{}\t{}\t{}\n'.format(accuracy_score(trueClasses, y_pred), | ||
121 | + # precision_score(trueClasses, y_pred, average='weighted'), | ||
122 | + # recall_score(trueClasses, y_pred, average='weighted'), | ||
123 | + # f1_score(trueClasses, y_pred, average='weighted'))) | ||
124 | + oFile.write('Confusion matrix: \n') | ||
125 | + oFile.write(str(confusion_matrix(trueClasses, y_pred)) + '\n') | ||
126 | + oFile.write('Classification report: \n') | ||
127 | + oFile.write(classification_report(trueClasses, y_pred) + '\n') | ||
128 | + print(" Saving test report done!") | ||
129 | + | ||
130 | + print("Training and test done in: %fs" % (time() - t0)) |
1 | +# -*- encoding: utf-8 -*- | ||
2 | + | ||
3 | +import os | ||
4 | +from time import time | ||
5 | +from optparse import OptionParser | ||
6 | +from sklearn.naive_bayes import MultinomialNB | ||
7 | +from sklearn.ensemble import RandomForestClassifier | ||
8 | +from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix, \ | ||
9 | + classification_report | ||
10 | +import sys | ||
11 | + | ||
12 | +__author__ = 'CMendezC' | ||
13 | + | ||
14 | +# Goal: training and test Iris dataset | ||
15 | + | ||
16 | +# Parameters: | ||
17 | +# 1) --inputPath Path to read input files. | ||
18 | +# 2) --inputTrainingData File to read training data. | ||
19 | +# 3) --inputTrainingClasses File to read training true classes. | ||
20 | +# 4) --inputTestData File to read test data. | ||
21 | +# 5) --inputTestClasses File to read test true classes. | ||
22 | +# 6) --outputPath Path to place output files. | ||
23 | +# 7) --outputFile File to place evaluation report. | ||
24 | +# 8) --classifier Classifier: MultinomialNB, SVM, RandomForest. | ||
25 | + | ||
26 | +# Ouput: | ||
27 | +# 1) Evaluation report. | ||
28 | + | ||
29 | +# Execution: | ||
30 | +# C:\Anaconda3\python trainingTest_Iris_v2.py | ||
31 | +# --inputPath C:\Users\cmendezc\Documents\GENOMICAS\LICENCIATURA_LCGPDCB\dataSet_Iris | ||
32 | +# --inputTrainingData training_Data.txt | ||
33 | +# --inputTrainingClasses training_TrueClasses.txt | ||
34 | +# --inputTestData test_Data.txt | ||
35 | +# --inputTestClasses test_TrueClasses.txt | ||
36 | +# --outputPath C:\Users\cmendezc\Documents\GENOMICAS\LICENCIATURA_LCGPDCB\dataSet_Iris | ||
37 | +# --outputFile report_MultinomialNB.txt | ||
38 | +# --classifier MultinomialNB | ||
39 | + | ||
40 | +# C:\Anaconda3\python trainingTest_Iris_v2.py --inputPath C:\Users\cmendezc\Documents\GENOMICAS\LICENCIATURA_LCGPDCB\dataSet_Iris --inputTrainingData training_Data.txt --inputTrainingClasses training_TrueClasses.txt --inputTestData test_Data.txt --inputTestClasses test_TrueClasses.txt --outputPath C:\Users\cmendezc\Documents\GENOMICAS\LICENCIATURA_LCGPDCB\dataSet_Iris --outputFile report_MultinomialNB.txt --classifier MultinomialNB | ||
41 | + | ||
42 | +########################################################### | ||
43 | +# MAIN PROGRAM # | ||
44 | +########################################################### | ||
45 | + | ||
46 | +if __name__ == "__main__": | ||
47 | + # Parameter definition | ||
48 | + parser = OptionParser() | ||
49 | + parser.add_option("--inputPath", dest="inputPath", | ||
50 | + help="Path to read input files", metavar="PATH") | ||
51 | + parser.add_option("--inputTrainingData", dest="inputTrainingData", | ||
52 | + help="File to read training data", metavar="FILE") | ||
53 | + parser.add_option("--inputTrainingClasses", dest="inputTrainingClasses", | ||
54 | + help="File to read training true classes", metavar="FILE") | ||
55 | + parser.add_option("--inputTestData", dest="inputTestData", | ||
56 | + help="File to read test data", metavar="FILE") | ||
57 | + parser.add_option("--inputTestClasses", dest="inputTestClasses", | ||
58 | + help="File to read test true classes", metavar="FILE") | ||
59 | + parser.add_option("--outputPath", dest="outputPath", | ||
60 | + help="Path to place output files", metavar="PATH") | ||
61 | + parser.add_option("--outputFile", dest="outputFile", | ||
62 | + help="File to write evaluation report", metavar="FILE") | ||
63 | + parser.add_option("--classifier", dest="classifier", | ||
64 | + help="Classifier", metavar="CLASSIFIER") | ||
65 | + | ||
66 | + (options, args) = parser.parse_args() | ||
67 | + if len(args) <= 0: | ||
68 | + parser.error("None parameters indicated.") | ||
69 | + sys.exit(1) | ||
70 | + | ||
71 | + # Printing parameter values | ||
72 | + print('-------------------------------- PARAMETERS --------------------------------') | ||
73 | + print("Path to read input files: " + str(options.inputPath)) | ||
74 | + print("File to read training data: " + str(options.inputTrainingData)) | ||
75 | + print("File to read training true classes: " + str(options.inputTrainingClasses)) | ||
76 | + print("File to read test data: " + str(options.inputTestData)) | ||
77 | + print("File to read test true classes: " + str(options.inputTestClasses)) | ||
78 | + print("Path to place output files: " + str(options.outputPath)) | ||
79 | + print("File to write evaluation report: " + str(options.outputFile)) | ||
80 | + print("Classifier: " + str(options.outputFile)) | ||
81 | + | ||
82 | + # Start time | ||
83 | + t0 = time() | ||
84 | + | ||
85 | + print(" Reading training and test data and true classes...") | ||
86 | + trueTrainingClasses = [] | ||
87 | + trueTestClasses = [] | ||
88 | + with open(os.path.join(options.inputPath, options.inputTrainingClasses), encoding='utf8', mode='r') \ | ||
89 | + as classFile: | ||
90 | + for line in classFile: | ||
91 | + line = line.strip('\r\n') | ||
92 | + trueTrainingClasses.append(line) | ||
93 | + | ||
94 | + with open(os.path.join(options.inputPath, options.inputTestClasses), encoding='utf8', mode='r') \ | ||
95 | + as classFile: | ||
96 | + for line in classFile: | ||
97 | + line = line.strip('\r\n') | ||
98 | + trueTestClasses.append(line) | ||
99 | + # print(trueTestClasses) | ||
100 | + | ||
101 | + dataTraining = [] | ||
102 | + dataTest = [] | ||
103 | + with open(os.path.join(options.inputPath, options.inputTrainingData), encoding='utf8', mode='r') \ | ||
104 | + as dataFile: | ||
105 | + for line in dataFile: | ||
106 | + listTemp = [] | ||
107 | + listFloat = [] | ||
108 | + line = line.strip('\r\n') | ||
109 | + listTemp = line.split('\t') | ||
110 | + for elem in listTemp: | ||
111 | + listFloat.append(float(elem)) | ||
112 | + dataTraining.append(listFloat) | ||
113 | + print(dataTraining) | ||
114 | + | ||
115 | + with open(os.path.join(options.inputPath, options.inputTestData), encoding='utf8', mode='r') \ | ||
116 | + as dataFile: | ||
117 | + for line in dataFile: | ||
118 | + listTemp = [] | ||
119 | + listFloat = [] | ||
120 | + line = line.strip('\r\n') | ||
121 | + listTemp = line.split('\t') | ||
122 | + for elem in listTemp: | ||
123 | + listFloat.append(float(elem)) | ||
124 | + dataTest.append(listFloat) | ||
125 | + print(dataTest) | ||
126 | + print(" Reading data and true classes done!") | ||
127 | + | ||
128 | + if options.classifier == "MultinomialNB": | ||
129 | + classifier = MultinomialNB() | ||
130 | + elif options.classifier == "SVM": | ||
131 | + pass | ||
132 | + elif options.classifier == "RandomForest": | ||
133 | + classifier = RandomForestClassifier() | ||
134 | + | ||
135 | + print(" Training...") | ||
136 | + classifier.fit(dataTraining, trueTrainingClasses) | ||
137 | + print(" Prediction...") | ||
138 | + y_pred = classifier.predict(dataTest) | ||
139 | + print(" Training and predition done!") | ||
140 | + | ||
141 | + # for i in range(len(trueClasses)): | ||
142 | + # print(str(trueClasses[i]) + "\t" + str(y_pred[i])) | ||
143 | + | ||
144 | + print(" Saving test report...") | ||
145 | + with open(os.path.join(options.outputPath, options.outputFile), mode='w', encoding='utf8') as oFile: | ||
146 | + oFile.write('********** EVALUATION REPORT **********\n') | ||
147 | + oFile.write('Classifier: {}\n'.format(options.classifier)) | ||
148 | + oFile.write('Accuracy: {}\n'.format(accuracy_score(trueTestClasses, y_pred))) | ||
149 | + oFile.write('Precision: {}\n'.format(precision_score(trueTestClasses, y_pred, average='weighted'))) | ||
150 | + oFile.write('Recall: {}\n'.format(recall_score(trueTestClasses, y_pred, average='weighted'))) | ||
151 | + oFile.write('F-score: {}\n'.format(f1_score(trueTestClasses, y_pred, average='weighted'))) | ||
152 | + # oFile.write('{}\t{}\t{}\t{}\n'.format(accuracy_score(trueClasses, y_pred), | ||
153 | + # precision_score(trueClasses, y_pred, average='weighted'), | ||
154 | + # recall_score(trueClasses, y_pred, average='weighted'), | ||
155 | + # f1_score(trueClasses, y_pred, average='weighted'))) | ||
156 | + oFile.write('Confusion matrix: \n') | ||
157 | + oFile.write(str(confusion_matrix(trueTestClasses, y_pred)) + '\n') | ||
158 | + oFile.write('Classification report: \n') | ||
159 | + oFile.write(classification_report(trueTestClasses, y_pred) + '\n') | ||
160 | + print(" Saving test report done!") | ||
161 | + | ||
162 | + print("Training and test done in: %fs" % (time() - t0)) |
1 | +5.7 4.4 1.5 0.4 | ||
2 | +5.4 3.9 1.3 0.4 | ||
3 | +5.1 3.5 1.4 0.3 | ||
4 | +5.7 3.8 1.7 0.3 | ||
5 | +5.1 3.8 1.5 0.3 | ||
6 | +5.4 3.4 1.7 0.2 | ||
7 | +5.1 3.7 1.5 0.4 | ||
8 | +4.6 3.6 1 0.2 | ||
9 | +5.1 3.3 1.7 0.5 | ||
10 | +4.8 3.4 1.9 0.2 | ||
11 | +5 3 1.6 0.2 | ||
12 | +5 3.4 1.6 0.4 | ||
13 | +5.2 3.5 1.5 0.2 | ||
14 | +5.2 3.4 1.4 0.2 | ||
15 | +4.7 3.2 1.6 0.2 | ||
16 | +4.8 3.1 1.6 0.2 | ||
17 | +5.4 3.4 1.5 0.4 | ||
18 | +5.2 4.1 1.5 0.1 | ||
19 | +5.5 4.2 1.4 0.2 | ||
20 | +4.9 3.1 1.5 0.1 | ||
21 | +5 3.2 1.2 0.2 | ||
22 | +5.5 3.5 1.3 0.2 | ||
23 | +4.9 3.1 1.5 0.1 | ||
24 | +4.4 3 1.3 0.2 | ||
25 | +5.1 3.4 1.5 0.2 | ||
26 | +5 3.5 1.3 0.3 | ||
27 | +4.5 2.3 1.3 0.3 | ||
28 | +4.4 3.2 1.3 0.2 | ||
29 | +5 3.5 1.6 0.6 | ||
30 | +5.1 3.8 1.9 0.4 | ||
31 | +4.8 3 1.4 0.3 | ||
32 | +5.1 3.8 1.6 0.2 | ||
33 | +4.6 3.2 1.4 0.2 | ||
34 | +5.3 3.7 1.5 0.2 | ||
35 | +5.6 2.9 3.6 1.3 | ||
36 | +6.7 3.1 4.4 1.4 | ||
37 | +5.6 3 4.5 1.5 | ||
38 | +5.8 2.7 4.1 1 | ||
39 | +6.2 2.2 4.5 1.5 | ||
40 | +5.6 2.5 3.9 1.1 | ||
41 | +5.9 3.2 4.8 1.8 | ||
42 | +6.1 2.8 4 1.3 | ||
43 | +6.3 2.5 4.9 1.5 | ||
44 | +6.1 2.8 4.7 1.2 | ||
45 | +6.4 2.9 4.3 1.3 | ||
46 | +6.6 3 4.4 1.4 | ||
47 | +6.8 2.8 4.8 1.4 | ||
48 | +6.7 3 5 1.7 | ||
49 | +6 2.9 4.5 1.5 | ||
50 | +5.7 2.6 3.5 1 | ||
51 | +5.5 2.4 3.8 1.1 | ||
52 | +5.5 2.4 3.7 1 | ||
53 | +5.8 2.7 3.9 1.2 | ||
54 | +6 2.7 5.1 1.6 | ||
55 | +5.4 3 4.5 1.5 | ||
56 | +6 3.4 4.5 1.6 | ||
57 | +6.7 3.1 4.7 1.5 | ||
58 | +6.3 2.3 4.4 1.3 | ||
59 | +5.6 3 4.1 1.3 | ||
60 | +5.5 2.5 4 1.3 | ||
61 | +5.5 2.6 4.4 1.2 | ||
62 | +6.1 3 4.6 1.4 | ||
63 | +5.8 2.6 4 1.2 | ||
64 | +5 2.3 3.3 1 | ||
65 | +5.6 2.7 4.2 1.3 | ||
66 | +5.7 3 4.2 1.2 | ||
67 | +5.7 2.9 4.2 1.3 | ||
68 | +6.2 2.9 4.3 1.3 | ||
69 | +5.1 2.5 3 1.1 | ||
70 | +5.8 2.8 5.1 2.4 | ||
71 | +6.4 3.2 5.3 2.3 | ||
72 | +6.5 3 5.5 1.8 | ||
73 | +7.7 3.8 6.7 2.2 | ||
74 | +7.7 2.6 6.9 2.3 | ||
75 | +6 2.2 5 1.5 | ||
76 | +6.9 3.2 5.7 2.3 | ||
77 | +5.6 2.8 4.9 2 | ||
78 | +7.7 2.8 6.7 2 | ||
79 | +6.3 2.7 4.9 1.8 | ||
80 | +6.7 3.3 5.7 2.1 | ||
81 | +7.2 3.2 6 1.8 | ||
82 | +6.2 2.8 4.8 1.8 | ||
83 | +6.1 3 4.9 1.8 | ||
84 | +6.4 2.8 5.6 2.1 | ||
85 | +7.2 3 5.8 1.6 | ||
86 | +7.4 2.8 6.1 1.9 | ||
87 | +7.9 3.8 6.4 2 | ||
88 | +6.4 2.8 5.6 2.2 | ||
89 | +6.3 2.8 5.1 1.5 | ||
90 | +6.1 2.6 5.6 1.4 | ||
91 | +7.7 3 6.1 2.3 | ||
92 | +6.3 3.4 5.6 2.4 | ||
93 | +6.4 3.1 5.5 1.8 | ||
94 | +6 3 4.8 1.8 | ||
95 | +6.9 3.1 5.4 2.1 | ||
96 | +6.7 3.1 5.6 2.4 | ||
97 | +6.9 3.1 5.1 2.3 | ||
98 | +5.8 2.7 5.1 1.9 | ||
99 | +6.8 3.2 5.9 2.3 | ||
100 | +6.7 3.3 5.7 2.5 | ||
101 | +6.7 3 5.2 2.3 | ||
102 | +6.3 2.5 5 1.9 | ||
103 | +6.5 3 5.2 2 | ||
104 | +6.2 3.4 5.4 2.3 | ||
105 | +5.9 3 5.1 1.8 | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
1 | +Iris-setosa | ||
2 | +Iris-setosa | ||
3 | +Iris-setosa | ||
4 | +Iris-setosa | ||
5 | +Iris-setosa | ||
6 | +Iris-setosa | ||
7 | +Iris-setosa | ||
8 | +Iris-setosa | ||
9 | +Iris-setosa | ||
10 | +Iris-setosa | ||
11 | +Iris-setosa | ||
12 | +Iris-setosa | ||
13 | +Iris-setosa | ||
14 | +Iris-setosa | ||
15 | +Iris-setosa | ||
16 | +Iris-setosa | ||
17 | +Iris-setosa | ||
18 | +Iris-setosa | ||
19 | +Iris-setosa | ||
20 | +Iris-setosa | ||
21 | +Iris-setosa | ||
22 | +Iris-setosa | ||
23 | +Iris-setosa | ||
24 | +Iris-setosa | ||
25 | +Iris-setosa | ||
26 | +Iris-setosa | ||
27 | +Iris-setosa | ||
28 | +Iris-setosa | ||
29 | +Iris-setosa | ||
30 | +Iris-setosa | ||
31 | +Iris-setosa | ||
32 | +Iris-setosa | ||
33 | +Iris-setosa | ||
34 | +Iris-setosa | ||
35 | +Iris-versicolor | ||
36 | +Iris-versicolor | ||
37 | +Iris-versicolor | ||
38 | +Iris-versicolor | ||
39 | +Iris-versicolor | ||
40 | +Iris-versicolor | ||
41 | +Iris-versicolor | ||
42 | +Iris-versicolor | ||
43 | +Iris-versicolor | ||
44 | +Iris-versicolor | ||
45 | +Iris-versicolor | ||
46 | +Iris-versicolor | ||
47 | +Iris-versicolor | ||
48 | +Iris-versicolor | ||
49 | +Iris-versicolor | ||
50 | +Iris-versicolor | ||
51 | +Iris-versicolor | ||
52 | +Iris-versicolor | ||
53 | +Iris-versicolor | ||
54 | +Iris-versicolor | ||
55 | +Iris-versicolor | ||
56 | +Iris-versicolor | ||
57 | +Iris-versicolor | ||
58 | +Iris-versicolor | ||
59 | +Iris-versicolor | ||
60 | +Iris-versicolor | ||
61 | +Iris-versicolor | ||
62 | +Iris-versicolor | ||
63 | +Iris-versicolor | ||
64 | +Iris-versicolor | ||
65 | +Iris-versicolor | ||
66 | +Iris-versicolor | ||
67 | +Iris-versicolor | ||
68 | +Iris-versicolor | ||
69 | +Iris-versicolor | ||
70 | +Iris-virginica | ||
71 | +Iris-virginica | ||
72 | +Iris-virginica | ||
73 | +Iris-virginica | ||
74 | +Iris-virginica | ||
75 | +Iris-virginica | ||
76 | +Iris-virginica | ||
77 | +Iris-virginica | ||
78 | +Iris-virginica | ||
79 | +Iris-virginica | ||
80 | +Iris-virginica | ||
81 | +Iris-virginica | ||
82 | +Iris-virginica | ||
83 | +Iris-virginica | ||
84 | +Iris-virginica | ||
85 | +Iris-virginica | ||
86 | +Iris-virginica | ||
87 | +Iris-virginica | ||
88 | +Iris-virginica | ||
89 | +Iris-virginica | ||
90 | +Iris-virginica | ||
91 | +Iris-virginica | ||
92 | +Iris-virginica | ||
93 | +Iris-virginica | ||
94 | +Iris-virginica | ||
95 | +Iris-virginica | ||
96 | +Iris-virginica | ||
97 | +Iris-virginica | ||
98 | +Iris-virginica | ||
99 | +Iris-virginica | ||
100 | +Iris-virginica | ||
101 | +Iris-virginica | ||
102 | +Iris-virginica | ||
103 | +Iris-virginica | ||
104 | +Iris-virginica | ||
105 | +Iris-virginica | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
1 | +Iris-setosa | ||
2 | +Iris-setosa | ||
3 | +Iris-setosa | ||
4 | +Iris-setosa | ||
5 | +Iris-setosa | ||
6 | +Iris-setosa | ||
7 | +Iris-setosa | ||
8 | +Iris-setosa | ||
9 | +Iris-setosa | ||
10 | +Iris-setosa | ||
11 | +Iris-setosa | ||
12 | +Iris-setosa | ||
13 | +Iris-setosa | ||
14 | +Iris-setosa | ||
15 | +Iris-setosa | ||
16 | +Iris-setosa | ||
17 | +Iris-setosa | ||
18 | +Iris-setosa | ||
19 | +Iris-setosa | ||
20 | +Iris-setosa | ||
21 | +Iris-setosa | ||
22 | +Iris-setosa | ||
23 | +Iris-setosa | ||
24 | +Iris-setosa | ||
25 | +Iris-setosa | ||
26 | +Iris-setosa | ||
27 | +Iris-setosa | ||
28 | +Iris-setosa | ||
29 | +Iris-setosa | ||
30 | +Iris-setosa | ||
31 | +Iris-setosa | ||
32 | +Iris-setosa | ||
33 | +Iris-setosa | ||
34 | +Iris-setosa | ||
35 | +Iris-setosa | ||
36 | +Iris-setosa | ||
37 | +Iris-setosa | ||
38 | +Iris-setosa | ||
39 | +Iris-setosa | ||
40 | +Iris-setosa | ||
41 | +Iris-setosa | ||
42 | +Iris-setosa | ||
43 | +Iris-setosa | ||
44 | +Iris-setosa | ||
45 | +Iris-setosa | ||
46 | +Iris-setosa | ||
47 | +Iris-setosa | ||
48 | +Iris-setosa | ||
49 | +Iris-setosa | ||
50 | +Iris-setosa | ||
51 | +Iris-versicolor | ||
52 | +Iris-versicolor | ||
53 | +Iris-versicolor | ||
54 | +Iris-versicolor | ||
55 | +Iris-versicolor | ||
56 | +Iris-versicolor | ||
57 | +Iris-versicolor | ||
58 | +Iris-versicolor | ||
59 | +Iris-versicolor | ||
60 | +Iris-versicolor | ||
61 | +Iris-versicolor | ||
62 | +Iris-versicolor | ||
63 | +Iris-versicolor | ||
64 | +Iris-versicolor | ||
65 | +Iris-versicolor | ||
66 | +Iris-versicolor | ||
67 | +Iris-versicolor | ||
68 | +Iris-versicolor | ||
69 | +Iris-versicolor | ||
70 | +Iris-versicolor | ||
71 | +Iris-versicolor | ||
72 | +Iris-versicolor | ||
73 | +Iris-versicolor | ||
74 | +Iris-versicolor | ||
75 | +Iris-versicolor | ||
76 | +Iris-versicolor | ||
77 | +Iris-versicolor | ||
78 | +Iris-versicolor | ||
79 | +Iris-versicolor | ||
80 | +Iris-versicolor | ||
81 | +Iris-versicolor | ||
82 | +Iris-versicolor | ||
83 | +Iris-versicolor | ||
84 | +Iris-versicolor | ||
85 | +Iris-versicolor | ||
86 | +Iris-versicolor | ||
87 | +Iris-versicolor | ||
88 | +Iris-versicolor | ||
89 | +Iris-versicolor | ||
90 | +Iris-versicolor | ||
91 | +Iris-versicolor | ||
92 | +Iris-versicolor | ||
93 | +Iris-versicolor | ||
94 | +Iris-versicolor | ||
95 | +Iris-versicolor | ||
96 | +Iris-versicolor | ||
97 | +Iris-versicolor | ||
98 | +Iris-versicolor | ||
99 | +Iris-versicolor | ||
100 | +Iris-versicolor | ||
101 | +Iris-virginica | ||
102 | +Iris-virginica | ||
103 | +Iris-virginica | ||
104 | +Iris-virginica | ||
105 | +Iris-virginica | ||
106 | +Iris-virginica | ||
107 | +Iris-virginica | ||
108 | +Iris-virginica | ||
109 | +Iris-virginica | ||
110 | +Iris-virginica | ||
111 | +Iris-virginica | ||
112 | +Iris-virginica | ||
113 | +Iris-virginica | ||
114 | +Iris-virginica | ||
115 | +Iris-virginica | ||
116 | +Iris-virginica | ||
117 | +Iris-virginica | ||
118 | +Iris-virginica | ||
119 | +Iris-virginica | ||
120 | +Iris-virginica | ||
121 | +Iris-virginica | ||
122 | +Iris-virginica | ||
123 | +Iris-virginica | ||
124 | +Iris-virginica | ||
125 | +Iris-virginica | ||
126 | +Iris-virginica | ||
127 | +Iris-virginica | ||
128 | +Iris-virginica | ||
129 | +Iris-virginica | ||
130 | +Iris-virginica | ||
131 | +Iris-virginica | ||
132 | +Iris-virginica | ||
133 | +Iris-virginica | ||
134 | +Iris-virginica | ||
135 | +Iris-virginica | ||
136 | +Iris-virginica | ||
137 | +Iris-virginica | ||
138 | +Iris-virginica | ||
139 | +Iris-virginica | ||
140 | +Iris-virginica | ||
141 | +Iris-virginica | ||
142 | +Iris-virginica | ||
143 | +Iris-virginica | ||
144 | +Iris-virginica | ||
145 | +Iris-virginica | ||
146 | +Iris-virginica | ||
147 | +Iris-virginica | ||
148 | +Iris-virginica | ||
149 | +Iris-virginica | ||
150 | +Iris-virginica | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
-
Please register or login to post a comment