5.4.Implementare
În această secțiune se vor prezenta detaliile de implementare ale aplicației. Se vor menționa limbajul de programare ales, tipul aplicației și bibliotecile folosite. Se va descrie cum a fost implementată interfața cu utilizatorul și se vor prezenta câteva secvențe de cod relevante din aplicație.
5.4.1.Limbajul și bibliotecile folosite
Limbajul de programare în care a fost dezvoltată aplicatia este Java. Aplicația este de tip desktop, cu o interfață utilizator dezvoltată cu ajutorul framework-ului Swing, din pachetele standard Java.
Pentru implementarea metodelor de învățare automată, au fost folosite următoarele biblioteci:
-
Neuroph 2.6 pentru rețele neuronale [24].
-
JGAP (Java Genetic Algorithms Package) 3.6.2 pentru programare genetică [25].
-
LibSVM 3.11 pentru mașini cu suport vectorial [26].
Pentru generarea de grafice pentru a arăta diferența dintre valorile reale și cele estimate în cazul testării unui model s-a folosit biblioteca JFreeChart 1.0.14 [27].
5.4.2.Implementarea interfeței cu utilizatorul
Interfața cu utilizatorul este formată din ferestre, butoane, meniuri și alte componente standard pentru o aplicație desktop. Clasele care descriu interfața cu utilizatorul sunt următoarele:
-
MainWindow – definește fereastra principală din aplicație. În cadrul acesteia sunt definite functionalitățile de bază și componentele care apar în cadrul ferestrei.
-
SettingsFrame – definește fereastra de setare a parametrilor. Aceată fereastră este facută vizibilă atunci când utilizatorul alege să seteze parametrii din cadrul ferestrei principale.
-
CorrelationFrame – definește fereastra în care este prezentat tabelul cu coeficienții de corelație. Această fereastră este facută vizibilă atunci când utilizatorul alege să vadă coeficienții de corelație dintre variabile din cadrul ferestrei principale, după încărcarea setului de date.
-
TrainingDialog – definește dialogul care apare atunci când are loc antrenarea unui model. Acesta prezintă progresul la care s-a ajuns în antrenare.
-
TestResultsFrame – definește fereastra care prezintă graficul cu rezultatele obținute în urma testării. Este făcută vizibilă atunci când utilizatorul alege să testeze modelul din fereastra principală.
Diagrama care arată relațiile dintre clasele de interfață este următoarea:
Figura . Diagrama claselor care implementează interfața utilizator
5.4.3.Secvențe de cod relevante -
Codul clasei TrainingTask, interioară clasei MainWindow, care definește operația de antrenament al unui model. Pentru fiecare subset creat pentru cross-validare, se construiește modelul și se antrenează cu datele de antrenament care nu includ subsetul de validare. Dupa fiecare antrenare se actualizează progresul antrenamentului și se adaugă eroarea obținută în lista de erori.
private class TrainingTask extends Thread {
@Override
public void run() {
for (int i = 0; i < problem.getNumValidationSets(); i++) {
if (trainingCanceled) {
return;
}
problem.setValidationSetIndex(i);
learningModel = constructSelectedModel();
learningModel.setProblem(problem);
learningModel.initModel();
learningModel.train();
final double error =learningModel.getErrorForSet(problem.getValidationSamples());
final int iter = i + 1;
System.out.println("Finishing iteration " + i + ", error: " + error);
errorList.add(error);
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
trainingDialog.getPbTraining().setValue(iter * 100 /
problem.getNumValidationSets());
trainingDialog.getPbTraining().invalidate();
if (iter == problem.getNumValidationSets()) {
trainingDialog.getCancelButton().setEnabled(false);
trainingDialog.getFinishButton().setEnabled(true);
trainingDialog.getLblProgress().setText("Training done!");
}
}
});
}
}
}
-
Codul metodei test() din cadrul clasei MainWindow. Prin această metodă se testează modelul cu datele selectate ca fiind de test și se creează un obiect TestResultsFrame în care se generează graficul cu valorile reale și valorile estimate.
public void test() {
lblStatus.setText("Testing...");
List testSamples = problem.getTestSamples();
testResults = learningModel.testBatch(testSamples);
testRealValues = new double[testResults.length];
int past = problem.getNumPastSamples();
int N = testSamples.size();
for (int i = past; i < N; i++) {
Variable outputVar = problem.getOutputVariable();
testRealValues[i - past] =
testSamples.get(i).getValueForVariable(outputVar).getValue();
}
resultsFrame = new TestResultsFrame(problem.getOutputVariable().getName(),
testRealValues, testResults);
resultsFrame.setVisible(true);
mntmSaveResults.setEnabled(true);
}
-
Codul metodei computeCorrelation() din clasa CorrelationFrame. Se calculează coeficienții de corelație între variabile, în funcție de exemplele de date din setul de date încărcat. Se salvează coeficienții în matricea correlationValues, care apoi este folosită pentru a completa tabelul generat.
private void computeCorrelation() {
int numVars = dataSet.getVariablesList().size();
int N = dataSet.getDataSamplesList().size();
ArrayList> valueLists = new ArrayList>();
ArrayList> rankLists = new ArrayList>();
// Computing ranks for all values
for (int i = 0; i < numVars; i++) {
valueLists.add(new ArrayList());
rankLists.add(new ArrayList());
}
for (DataSample sample : dataSet.getDataSamplesList()) {
for (int i = 0; i < numVars; i++) {
valueLists.get(i).add(sample.getValues().get(i).getValue());
}
}
for (int i = 0; i < numVars; i++) {
Collections.sort(valueLists.get(i));
for (int j = 0; j < N; j++) {
double value = dataSet.getDataSamplesList().get(j).getValues().get(i).getValue();
int position = Collections.binarySearch(valueLists.get(i), value);
rankLists.get(i).add(position);
}
}
// Computing correlation for all pairs
long longN = N;
correlationValues = new double[numVars][numVars];
for (int i = 0; i < numVars; i++) {
correlationValues[i][i] = 1;
for (int j = i + 1; j < numVars; j++) {
double dSum = 0;
for (int k = 0; k < N; k++) {
long diff = rankLists.get(i).get(k) - rankLists.get(j).get(k);
dSum += diff * diff;
}
correlationValues[i][j] = (double) (1 - ((6 * dSum) /
(double) (longN * (longN * longN - 1))));
correlationValues[j][i] = correlationValues[i][j];
}
}
}
-
Codul metodei test() din clasa NeuralNetworkModel. Metoda respectivă este folosită pentru a testa modelul antrenat pe un singur caz de test. Metoda returnează valoarea estimată de model. Se observă ca datele de intrare sunt ajustate să fie în intervalul [0, 1], prin metoda getValueBetweenZeroAndOne() din clasa Value. Această metodă se folosește de valorile minime și maxime ale variabilei pentru a ajusta valorile la intervalul [0, 1]. Valoarea generată de rețeaua neuronală la fel este între 0 și 1. De aceea, înainte să fie returnată valoarea, este ajustată inapoi la intervalul specific variabilei de ieșire. Celelalte clase care implementează tehnici de învățare au o metodă de test asemănătoare.
@Override
public double test(List inputSamples) {
int numInputs = problem.getInputVariables().size();
// Get the inputs
int past = inputSamples.size();
double[] inputs = new double[past * numInputs];
int current = 0;
for (int j = 0; j < past; j++) {
for (int k = 0; k < numInputs; k++) {
Variable var = problem.getInputVariables().get(k);
Value value = inputSamples.get(j).getValueForVariable(var);
inputs[current++] = value.getValueBetweenZeroAndOne();
}
}
// Use the network
neuralNetwork.setInput(inputs);
neuralNetwork.calculate();
double output = neuralNetwork.getOutput()[0];
double rangeLength = problem.getOutputVariable().getUpperBound() -
problem.getOutputVariable().getLowerBound();
double adjustedOutput = output * rangeLength +
problem.getOutputVariable().getLowerBound();
return adjustedOutput;
}
5.5.Testare
Aplicația a fost testată cu setul de date și problema descrisă în studiul de caz din Capitolul 4. A fost încărcat setul de date dorit, s-au configurat parametrii de intrare și de ieșire pentru problema studiată și s-au făcut experimente cu tehnicile implementate în aplicație pe setul de date respectiv, cu diverse valori pentru parametrii metodelor. Valorile parametrilor și rezultatele obținute au fost prezentate în studiul de caz.
5.6.Manual de utilizare
În această secțiune vom prezenta instrucțiunile de utilizare a aplicatiei și vom explica modul în care aplicația trebuie utilizată pentru a obține rezultatul dorit.
Primul pas care trebuie făcut dupa ce e pornita aplicația este încărcarea setului de date din fișier. Aceasta se face navigând spre File Load data set.
Figura . Încărcarea setului de date
După aceasta, utilizatorul primește informațiile despre setul de date.
Figura . Fereastra principală, cu informații despre setul de date
Imediat după ce a fost încărcat setul de date, utilizatorul poate seta parametrii pentru modelul ce urmează a fi antrenat. Utilizatorul poate să aleagă: variabilele de intrare, variabila de ieșire, numărul de exemple precedente care să fie luate în considerare pentru datele de intrare, metoda de învățare, numărul de subseturi pentru cross-validare și parametrii specifici fiecărei metode în parte.
Figura . Setări generale
Figura . Setări pentru rețele neuronale
Figura . Setări pentru programare genetică
Figura . Setări pentru mașini cu suport vectorial
O altă acțiune pe care o poate face utilizatorul imediat după ce au fost încărcate datele este vizualizarea tabelului de corelație. La alegerea acestei opțiuni, apare o fereastră care conține un tabel. Acest tabel are numărul de coloane și numarul de linii egale cu numărul de variabile și în fiecare celulă conține câte un coeficient de corelație între două variabile.
Figura . Tabelul de corelație
După ce au fost setați parametrii doriți, utilizatorul poate apăsa butonul Train din cadrul ferestrei principale pentru a antrena modelul. În acest caz, apare un dialog care indică progresul antrenamentului.
Figura . Dialogul de antrenament
La sfârșitul antrenamentului, sunt afișate erorile obținute, precum și media și deviația standard a acestora.
Figura . Dialogul cu rezultatele antrenamentului
Dupa antrenament, utilizatorul poate apăsa butonul Test din cadrul ferestrei principale. Este testat modelul cu datele selectate ca fiind de test și este afișat un grafic cu valorile reale și valorile estimate de model pentru variabila de ieșire.
Figura . Graficul cu rezultatele testării
Dupa ce s-a facut și testarea, utilizatorul poate alege să salveze rezultatele obținute. Pentru aceasta, navighează spre File Save results și alege fisierul în care vor fi salvate rezultatele antrenamentului și ale testării.
5.7.Extinderi posibile
Aplicația discutată poate fi extinsă în mai multe moduri. În această secțiune vom prezenta câteva idei pentru extinderea funcționalităților acesteia.
Unul din lucrurile care pot fi modificate la aplicație este oferirea posibilității setarii mai multor parametri specifici metodelor de învățare folosite. De exemplu, pentru rețele neuronale se poate oferi posibilitatea setarii numarului de straturi ascunse și numarul de neuroni pe fiecare strat, a valorii pentru momentum sau a funcției de activare. Pentru programare genetică s-ar mai putea seta din aplicație: setul de funcții pentru construirea arborilor de expresii, adâncimea maximă a unui arbore de expresie, setul de constante care să fie incluse în construirea arborilor de expresii. Pentru mașini cu suport vectorial, s-ar mai putea configura ca să se poată seta din aplicație: parametrul gamma în formula pentru funcția RBF și alți parametri pentru alte funcții kernel, cum ar fi gradul pentru funcția polinomială.
Aplicația mai poate fi extinsă prin implementarea altor tehnici de învățare și punerea lor în lista metodelor din care se poate alege pentru antrenament și testare. Două din metodele care pot fi adăugate sunt: locally-weighted regression și rețele RBF.
O altă extindere posibilă ar fi oferirea posibilității generării unor tabele cu coeficienți de corelație între variabile calculați după alte formule. În această aplicatie este calculat coeficientul lui Spearman, dar se poate extinde să includă și optiunea calculării coeficientului lui Pearson sau a coeficientului lui Kendall.
Aplicația a fost gândită astfel încât să se poată studia probleme de predicții în care seturile de date au structura unei serii de timp. Dar modelul de date folosit în aplicație poate fi extins fără mari dificultăți să includă și alte tipuri de probleme de predicție. Se poate modifica codul astfel încât să poată fi studiate chiar și probleme de clasificare, nu doar regresie. Pentru acest lucru, ar trebui ca pentru fiecare variabila să se indice mulțimea valorilor posibile și aceasta să poată fi exprimată ca o enumerare de valori sau ca un interval.
S-ar mai putea adăuga și posibilitatea generării și altor grafice pentru analiza antrenamentului și testării. De exemplu, s-ar putea crea un grafic care să prezinte evoluția erorii în timpul antrenamentului. Această functionalitate nu este posibila pentru toate metodele, pentru ca nu toate bibliotecile folosite ofera posibilitatea asocierii unei acțiuni evenimentului de terminare a unei iterații. Dar se pot căuta alte biblioteci care să nu aibă acest impediment. Un alt grafic relevant ar fi cu valorile obținute de mai multe modele în urma testării lor. Astfel, s-ar putea compara mai ușor rezultatele obținute de modele diferite.
O altă extensie utilă ar fi oferirea posibilității automatizării antrenamentului și testării pentru o serie de configurații. De exemplu, s-ar putea configura astfel încât să se antreneze și să se testeze mai multe rețele neuronale care să aibă parametrii indicați în aplicație, dar rata de învățare să varieze de la 0.05 la 0.15 cu pasul 0.01. Astfel, am putea face mai ușor experimente care să ne indice ce valori trebuie să alegem pentru un anumit parametru.asd
Inteligența artificială în general și învățarea automată în special sunt domenii de cercetare relativ noi. S-au facut multe descoperiri în ultimele decenii și s-au construit tehnici eficiente care au fost folosite în scopuri comerciale, cum ar fi: recunoașterea vorbirii, recunoașterea scrisului de mână, controlul roboților. Unul din scopurile acestei lucrări a fost să prezinte tematica învățării automate și să demonstreze utilitatea acestui domeniu în probleme reale.
Dar există și numeroase probleme în care nu s-au exploatat îndeajuns algoritmii de învățare automată existenți. Una din aceste probleme este previziunea vremii. Deși au fost încercări de a utiliza învățarea automată pentru predicția indicatorilor meteorologici și se fac tot mai multe cercetări în domeniu, această problemă rămâne un subiect important de cercetare în continuare. Studiul de caz din această lucrare a avut scopul să demonstreze că se pot aplica tehnici de învățare automată pentru problema respectivă. Algoritmii de învățare folosesc date din trecut ca să construiască modele matematice care să fie capabile să facă predicții meteorologice.
Proiectând o aplicație care să permită realizarea de experimente pentru a studia problema previzionării vremii folosind tehnici de învățare automată, s-a observat că aplicația poate fi construită fără prea mult efort în plus, astfel încât să permită și studierea altor probleme de predicție. În rezultat, s-a creat o aplicație care poate fi folosită pentru orice set de date care are caracterul unei serii de timp și care permite folosirea a trei tehnici de învățare automată: rețele neuronale, programare genetică și mașini cu suport vectorial. Aceste tehnici se pot folosi în aplicație pentru antrenarea și testarea modelelor care să genereze predicții pentru variabilele din setul de date încărcat. Mergând pe aceeași idee, aplicația poate fi extinsă ca să includă și posibilitatea studierii altori probleme de învățare, cum s-a discutat și în secțiunea Extinderi posibile, din Capitolul 5.
Bibliografie
-
S. J. Russel, P. Norvig, Artificial Intelligence: A Modern Approach, Prentice Hall, New Jersey, 1995, pp. 4-8, 567-570.
-
D. Cristea, I. Pistol, Inteligența Artificială, Facultatea de Informatica, Univ. Al. I. Cuza, Iași, 2011, pp. 5-10, 166-170.
-
T. Mitchell, Machine Learning, McGraw-Hill, March 1997, pp.1, 81-96, 262-266.
-
T. Mitchell, Discipline of Machine Learning, Universitatea Carnegie Mellon, Pittsburgh, 2006, pp. 1-3
-
E. G. Learned-Miller, Supervised Learning and Bayesian Classification, University of Massachusetts, Amherst, septembrie 2011
-
S. B. Kotsiantis, Supervised Machine Learning: A Review of Classification Techniques, Informatica 31, Universitatea din Peloponnese, Grecia, 2007, pp. 249-251
-
Simon Haykin, Neural Networks: A Comprehensive Foundation, Pearson Education, McMaster University, Ontario, Canada, 1999, pp. 12-13.
-
C. Fyfe, Artificial Neural Networks, University of Paisley, Marea Britanie, 1996 pp. 37-39
-
J. R. Koza et al., Genetic Programming IV: Routine Human-Competitive Machine Intelligence, 2003, pp. 1-10
-
J.R. Koza, What is genetic programming?, 2003,
http://www.genetic-programming.com/gpanimatedtutorial.html
-
Y. Radhika, M. Shashi, Atmospheric Temperature Prediction using Support Vector Machines, International Journal of Computer Theory and Engineering, Vol. 1, No. 1, aprilie 2009.
-
A. Ben-Hur, J.Weston, A User’s Guide to Support Vector Machines, Colorado State University, Colorado, NEC Labs America, Princeton, NJ, pp. 1-3
-
P. Kar, Support Vector Machines and their Applications, Indian Institute of Technology Kanpur, 2009, pp. 56-70.
-
W. W. Eckerson, Predictive Analytics, TDWI Best Practices Report, 2007, pp. 4-10.
-
R. Weber, Time Series, Statistical Laboratory, University of Cambridge, pp.1-2
-
S. Sayad, Model Evaluation - Regression, University of Toronto, 2010,
http://chem-eng.utoronto.ca/~datamining/dmc/model_evaluation_r.htm
-
L. Alter, Meteorology, The Atmosphere and the Ocean, Vol. V, Yale-New Haven Teachers Institue, New Haven, Connecticut, SUA, 1994
-
P. Lynch, The origins of computer weather predictions and climate modelling, Journal of Computational Physics 227, pp. 3431–3444, 2008
-
U. Rebbapragada, Introduction to Machine Learning Research on Time Series, Tufts University, ianuarie 2007.
-
K. Sreelakshmi, P. Ramakanthkumar, Neural Networks for Short Term Wind Speed Prediction, World Academy of Science, Engineering and Technology 42, 2008.
-
A. Polumetla, Machine Learning Methods for the Detection of RWIS Sensor Malfunctions, University of Minnesota, iulie 2006, pp. 71-79.
-
B. A. Smith, R. W. McClendon, G. Hoogenboom, Improving Air Temperature Prediction with Artificial Neural Networks, University of Georgia, martie 2006
-
National Climatic Data Center, Global Surface Summary of Day Data, http://www.ncdc.noaa.gov/
-
Biblioteca Neuroph, http://neuroph.sourceforge.net/
-
Biblioteca JGAP, http://jgap.sourceforge.net/
-
Biblioteca LibSVM, http://www.csie.ntu.edu.tw/~cjlin/libsvm/
-
Biblioteca JFreeChart, http://www.jfree.org/jfreechart/
Dostları ilə paylaş: |