JavaRush /Java Blog /Random-IT /Machine Learning per sviluppatori Java, parte 1

Machine Learning per sviluppatori Java, parte 1

Pubblicato nel gruppo Random-IT
Configura un algoritmo di machine learning e sviluppa la tua prima funzione predittiva utilizzando Java. Le auto a guida autonoma, i sistemi di riconoscimento facciale e gli assistenti vocali sono tutti sviluppati utilizzando tecnologie e framework di apprendimento automatico. E questa è solo la prima ondata. Nei prossimi 10 anni, una nuova generazione di prodotti trasformerà il nostro mondo, dando vita a nuovi approcci allo sviluppo di programmi, prodotti e applicazioni. Apprendimento automatico per sviluppatori Java, parte 1 - 1In qualità di programmatore Java, vuoi cogliere l'occasione ora che le aziende tecnologiche stanno iniziando a investire pesantemente nell'apprendimento automatico. Ciò che impari oggi potrai utilizzarlo per i prossimi cinque anni. Ma da dove cominciare? Questo articolo mira a rispondere a questa domanda. Avrai una prima impressione dei principi dell'apprendimento automatico seguendo la nostra breve guida all'implementazione e alla preparazione di un algoritmo di apprendimento automatico. Dopo aver appreso la struttura di un algoritmo di apprendimento e le funzionalità che puoi utilizzare per addestrarlo, valutarlo e selezionare la funzione che fornisce la migliore precisione di previsione, acquisirai una comprensione di come utilizzare il framework JVM (Weka) per costruire soluzioni di machine learning. Questo articolo si concentra sull'apprendimento automatico supervisionato perché è il principio più comunemente utilizzato nello sviluppo di applicazioni intelligenti.

Apprendimento automatico e intelligenza artificiale

L’apprendimento automatico si è evoluto dal campo dell’intelligenza artificiale, che mira a creare macchine in grado di imitare l’intelligenza umana. Sebbene il termine “apprendimento automatico” abbia origine nell’informatica, l’intelligenza artificiale non è un nuovo campo della scienza. Il test di Turing , sviluppato dal matematico Alan Turing all'inizio degli anni Cinquanta del XX secolo, è uno dei primi test progettati per determinare se una macchina informatica possiede una vera intelligenza. Secondo il test di Turing, un computer dimostra la presenza dell'intelligenza umana impersonando una persona senza che questa si renda conto che sta parlando con la macchina.
Machine Learning per sviluppatori Java, parte 1 - 2
Molti approcci popolari al machine learning oggi si basano su idee vecchie di decenni. Ma l’ultimo decennio nel campo dell’informatica (e delle piattaforme informatiche distribuite) ha portato una potenza sufficiente per applicare algoritmi di apprendimento automatico. La maggior parte di essi richiede un'enorme quantità di moltiplicazioni di matrici e altri calcoli matematici. Vent'anni fa semplicemente non esistevano tecnologie informatiche che consentissero tali calcoli, ma ora sono diventate realtà. Gli algoritmi di apprendimento automatico consentono ai programmi di eseguire il processo di miglioramento della qualità ed espandere le proprie capacità senza l'intervento umano. Un programma sviluppato utilizzando l'apprendimento automatico è in grado di aggiornare o estendere autonomamente il proprio codice.

Apprendimento supervisionato vs apprendimento non supervisionato

L’apprendimento supervisionato e quello non supervisionato sono i due approcci più popolari all’apprendimento automatico. Entrambe le opzioni richiedono di fornire alla macchina enormi quantità di record di dati per costruire relazioni e da cui imparare. Tali dati raccolti vengono solitamente chiamati "vettore di funzionalità" . Ad esempio, abbiamo un certo edificio residenziale. In questo caso, il vettore delle caratteristiche può contenere caratteristiche come: la superficie totale della casa, il numero di stanze, l'anno di costruzione della casa e così via. Nell'apprendimento supervisionato , un algoritmo di apprendimento automatico viene addestrato a rispondere a domande relative ai vettori di caratteristiche. Per addestrare l'algoritmo, viene alimentato un insieme di vettori di caratteristiche ed etichette associate. L'etichetta associata viene fornita da una persona (il docente) e contiene la "risposta" corretta alla domanda posta. L'algoritmo di apprendimento analizza i vettori delle caratteristiche e corregge le etichette per trovare la struttura interna e le relazioni tra di essi. In questo modo la macchina impara a rispondere correttamente alle domande. Ad esempio, possiamo considerare una certa applicazione intelligente per il commercio immobiliare. Può essere addestrato utilizzando un vettore di caratteristiche che include dimensioni, numero di stanze e anno di costruzione per un insieme di case. Una persona deve assegnare a ciascuna casa un'etichetta con il prezzo corretto della casa in base a questi fattori. Analizzando questi dati, un’applicazione intelligente dovrebbe allenarsi a rispondere alla domanda: “Quanti soldi posso ottenere per questa casa?”
Interessato a leggere su Java? Unisciti al gruppo di sviluppatori Java !
Una volta completato il processo di preparazione, i nuovi dati di input non vengono più contrassegnati. La macchina deve essere in grado di rispondere correttamente alle domande, anche per vettori di caratteristiche sconosciuti e senza etichetta. Nell’apprendimento non supervisionato, l’algoritmo è progettato per prevedere le risposte senza etichettature umane (o anche senza porre domande). Invece di determinare un’etichetta o un risultato, gli algoritmi di apprendimento non supervisionato utilizzano grandi quantità di dati e potenza di calcolo per scoprire relazioni precedentemente sconosciute. Ad esempio, nel marketing dei prodotti di consumo, l’apprendimento non supervisionato può essere utilizzato per identificare relazioni nascoste o gruppi di clienti, che in definitiva possono aiutare a migliorare il programma di marketing o crearne uno nuovo. In questo articolo ci concentreremo sull’apprendimento automatico supervisionato; questo è attualmente l'approccio più comunemente utilizzato.

Apprendimento automatico supervisionato

Tutto il machine learning si basa sui dati. Per un progetto di machine learning supervisionato, è necessario contrassegnare i dati con marcatori in modo da fornire risposte significative alla domanda posta. Di seguito, nella Tabella 1, ogni record informativo sulla casa è etichettato come “prezzo della casa”. Identificando la relazione tra i dati record e il prezzo di una casa, l'algoritmo dovrebbe essere in grado di prevedere il prezzo di mercato per le case non incluse nell'elenco fornito. (Si prega di notare che la superficie della casa è indicata in metri quadrati, e il prezzo della casa è in euro).
Tabella 1. Elenco delle case
Cartello Cartello Cartello Etichetta
Zona casa Numero di stanze Età della casa Prezzo della casa previsto
90 m2 / 295 piedi 2 stanze 23 anni € 249.000
101 m2 / 331 piedi 3 stanze n / a € 338.000
1330 m2 / 4363 piedi 11 stanze 12 anni 6.500.000 €
Nelle fasi iniziali, probabilmente etichetterai i dati manualmente, ma alla fine insegnerai al tuo programma a farlo da solo. Probabilmente hai già visto questo approccio funzionare con i client di posta elettronica, dove per spostare un'email nella cartella Spam, rispondi alla domanda "Questa email è spam?" Quando rispondi, alleni il programma a riconoscere le email che non vuoi vedere. Il filtro antispam dell'applicazione è addestrato a contrassegnare i messaggi provenienti dalla stessa fonte o contenenti lo stesso contenuto e gestirli secondo le regole appropriate. I set di dati etichettati sono necessari solo a scopo di preparazione e test. Una volta completato questo passaggio, l'algoritmo di machine learning lavora sui dati senza etichetta. Ad esempio, è possibile fornire a un algoritmo di previsione un nuovo record di dati senza etichetta su una casa e questo dovrebbe prevedere automaticamente il prezzo atteso della casa in base alla “conoscenza” acquisita dai dati preparatori.

Come una macchina impara a prevedere

La sfida con l’apprendimento automatico supervisionato è trovare la funzione di previsione appropriata per una determinata domanda. Matematicamente, la difficoltà è trovare una funzione che prenda una variabile come input хe restituisca il valore previsto у. Questa funzione delle ipotesi (hθ)è il risultato di un processo di preparazione. Spesso la funzione di ipotesi è chiamata anche funzione obiettivo o funzione di previsione.
y = hθ ( x)
Nella maggior parte dei casi, хsi tratta di un array di dati. Nel nostro esempio si tratta di una serie bidimensionale di elementi che definiscono una casa, composta dal numero di stanze e dall'area della casa. Un array di tali valori è un vettore di caratteristiche. Specificando una funzione obiettivo specifica, possiamo usarla per prevedere ciascun vettore di caratteristiche х. Per prevedere il prezzo di una casa è necessario richiamare la funzione obiettivo utilizzando un vettore caratteristica {101.0, 3.0}costituito dall'area della casa e dal numero di stanze:
// целевая функция h (результат процесса обучения)
Function<Double[], Double> h = ...;

// определяем целевой вектор с площадью дома=101 и количеством комнат=3
Double[] x = new Double[] { 101.0, 3.0 };

// и предсказываем цену дома (метка)
double y = h.apply(x);
Nel codice sorgente dell'Esempio 1, i valori nell'array хrappresentano un vettore di caratteristiche della casa. Il valore уrestituito dalla funzione obiettivo è il prezzo previsto della casa. L'obiettivo dell'apprendimento automatico è determinare la funzione obiettivo che funzionerà nel modo più accurato possibile dati parametri di input sconosciuti. Nell'apprendimento automatico, la funzione obiettivo (hθ)è talvolta chiamata modello. Questo modello è il risultato di un processo di apprendimento.
Machine Learning per sviluppatori Java, parte 1 - 3
Sulla base di campioni di addestramento etichettati, l'algoritmo di apprendimento cerca strutture o modelli nei dati di addestramento. Quindi costruisce un modello generalmente valido per i dati. Di norma, il processo di apprendimento è di natura esplorativa. Nella maggior parte dei casi, il processo viene ripetuto più volte utilizzando diverse varianti di algoritmi e configurazioni di apprendimento. Di conseguenza, tutti i modelli vengono valutati in base a parametri prestazionali, tra i quali viene selezionato quello migliore. E questo modello viene utilizzato per calcolare i valori stimati per i futuri dati senza tag.

Regressione lineare

Per insegnare a una macchina a “pensare”, devi prima scegliere l’algoritmo di apprendimento che utilizzerai. Ad esempio, la regressione lineare. Questo è uno degli algoritmi di machine learning supervisionati più semplici e popolari. L'algoritmo presuppone che la relazione tra le caratteristiche di input e gli indicatori di risultato sia lineare. La funzione di regressione lineare generale riportata di seguito restituisce il valore previsto sommando tutti gli elementi del vettore delle caratteristiche moltiplicati per il parametro θ (theta) . Questo parametro viene utilizzato durante il processo di training per adattare o “ottimizzare” la funzione di regressione in base ai dati di training.
( x) = θ 0 * 1 + θ 1 * x 1 + ... θ n * x n
In una funzione di regressione lineare, il parametro theta e i parametri delle caratteristiche sono numerati con pedici. Il pedice determina la posizione del parametro (θ)e del parametro della caratteristica (х)nel vettore. Si noti che la caratteristica x 0 è un termine di spostamento costante ed è significativo 1ai fini computazionali. Di conseguenza, l'indice di parametri significativi come l'area della casa inizia con x 1 . Quindi, se a x 1 viene assegnato il primo valore del vettore delle caratteristiche (area della casa), allora x 2 assumerà il valore successivo (numero di stanze) e così via. L'esempio 2 dimostra l'implementazione Java della funzione di regressione lineare, matematicamente indicata come h θ (x). Per semplicità, i calcoli vengono eseguiti utilizzando il file double. Nel metodo apply()è previsto che il primo elemento dell'array sia uguale a 1.0 e venga impostato al di fuori di questa funzione. Esempio 2: regressione lineare in Java
public class LinearRegressionFunction implements Function<Double[], Double> {
 private final double[] thetaVector;

 LinearRegressionFunction(double[] thetaVector) {
 this.thetaVector = Arrays.copyOf(thetaVector, thetaVector.length);
 }

 public Double apply(Double[] featureVector) {
 // с целью упрощения вычислений первый элемент должен быть equals 1.0
 assert featureVector[0] == 1.0;

 // простое последовательное сложение
 double prediction = 0;
 for (int j = 0; j < thetaVector.length; j++) {
 prediction += thetaVector[j] * featureVector[j];
 }
 return prediction;
 }

 public double[] getThetas() {
 return Arrays.copyOf(thetaVector, thetaVector.length);
 }
}
Per creare una nuova istanza LinearRegressionFunction, è necessario specificare il parametro θ. Questo parametro o vettore viene utilizzato per adattare la funzione di regressione lineare generale ai dati di addestramento sottostanti. Il parametro θutilizzato nel programma verrà modificato durante il processo di formazione, sulla base di esempi di formazione. La qualità della funzione target addestrata dipenderà dalla qualità dei dati preparati per l'addestramento. Nell'esempio seguente utilizziamo LinearRegressionFunctionle previsioni dei prezzi in base alle dimensioni della casa per illustrare. Considerando che x 0 deve essere una costante con valore 1.0, la funzione obiettivo viene inizializzata utilizzando due parametri θ, dove sono il risultato del processo di apprendimento. Dopo aver creato un nuovo esempio, il prezzo di una casa con una superficie di 1330 mq verrà previsto come mostrato di seguito:
// тета вектор, используемый в этом примере, является результатом процесса обучения
double[] thetaVector = new double[] { 1.004579, 5.286822 };
LinearRegressionFunction targetFunction = new LinearRegressionFunction(thetaVector);

// создание вектора признаков со значениями x0=1 (для удобства вычислений) и //x1=площадь дома
Double[] featureVector = new Double[] { 1.0, 1330.0 };

// выполняем расчеты
double predictedPrice = targetFunction.apply(featureVector);
Nella figura sotto potete vedere il grafico della funzione obiettivo della previsione (linea blu). Si ottiene calcolando la funzione obiettivo per tutti i valori dell'area della casa. Nel grafico sono inoltre presenti le coppie zona-prezzo utilizzate per la formazione.
Machine Learning per sviluppatori Java, parte 1 - 4
In questo momento il grafico delle previsioni sembra piuttosto buono. Le coordinate del grafico (posizione e pendenza) sono determinate dal vettore θ { 1.004579, 5.286822 }. Ma come puoi determinare quale θ-vettore è più adatto alla tua applicazione? La funzione si adatterà meglio se si modifica il primo o forse il secondo parametro? Per determinare il vettore theta più adatto, è necessaria una funzione di utilità che valuti quanto bene la funzione obiettivo svolge il lavoro. CONTINUA Traduzione dall'inglese. Autore: Gregor Roth, architetto software, JavaWorld.
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION