Corso di Keras per machine learning – prima lezione

AI, INTELLIGENZA ARTIFICIALE

Che cosa è Keras?

Keras è una libreria open source  nata per  facilitare lo sviluppo di applicazioni che sfruttano tecniche di apprendimento automatico basate su  reti neurali. La libreria è stata scritta in Python ed  è stata  progettata come un’interfaccia di astrazione per altre librerie di più basso livello, in particolare TensorFlow, Microsoft Cognitive Toolkit (CNTK) e Theano i quali in Keras sono identificati con il nome di Backend.
Keras semplifica, pertanto,  la vita a tutti coloro vogliano approcciare al mondo delle reti neurali, ma non hanno interesse ad approfondire le tecniche matematiche connesse all’uso delle stesse. La libreria nel suo complesso è veramente interessante perché è stata progettata con l’obiettivo di consentire  una rapida prototipazione di modelli neurali, inoltre supporta oltre alle classiche reti feedforward, anche modelli convoluzionali e reti ricorrenti e schemi di connettività arbitrari. Essa, lavora inoltre senza problemi sia su  CPU e che GPU.

Perché usare Keras?

Keras basa la propria forza sulla semplicità e sulla velocità di implementazione. Con Keras è infatti possibile,  creare modelli complessi con un numero minimo di righe di codice mantenendo lo stesso  robusto, e consente nel contempo una grande flessibilità grazie alla sua caratteristica modulare. In Keras il concetto di modello, infatti, è inteso come una sequenza o un grafo di singoli moduli che possono essere assemblati insieme, per creare nuovi modelli,  con il minimo numero di restrizioni possibili. Le reti neurali, le funzioni di costo, gli ottimizzatori, gli schemi di inizializzazione, le funzioni di attivazione, gli schemi di regolarizzazione sono tutti visti in Keras come moduli e possono essere combinati tra loro per crearne di nuovi.

Installazione

Come abbiamo anticipato Keras è una libreria che ci consente di ottenere un livello di astrazione di librerie (backend)  più articolate. In tal senso se si desidera utilizzare Keras dovremmo installare di conseguenza anche il backend di riferimento, pertanto nel caso in cui volessimo usare Keras con tensorflow sarà necessario installare entrambi.

In questo primo articolo darò delle indicazioni su come usare Keras con  TensorFlow  che  dal mio punto di vista è la scelta da perseguire , tra l’altro Keras per impostazioni predefinite, utilizza il backend TensorFlow , qualora già installato.

Quindi in prima istanza dovrete installare TensorFlow ed  il modo più semplice per farlo è quello di  lanciare il comando.

$ pip install tensorflow

Nel caso in cui vogliate utilizzare Tensorflow per Gpu sarà sufficiente lanciare il comando:

$ pip install tensorflow-gpu

ma dovrete fare un buon lavoro di configurazione delle librerie CUDA della vostra scheda altrimenti non sarà possibile sfruttare la GPU. ( Per questa installazione più complessa vi rimando in un altra occasione). Per installare Keras da PyPI sarà sufficiente lanciare il comando

$ sudo pip install keras

Alternativamente  scaricate  Keras usando git da seguente repository:

$ git clone https://github.com/keras-team/keras.git

accedete alla cartella Keras ed eseguite il comando install:

$ cd keras
$ python setup.py install

Configurazione

Se avete eseguito Keras almeno una volta, dovreste trovare il file di configurazione di Keras nel path della home:

~/.keras/keras.json

nel caso non fosse presente sarà possibile crearne uno che abbia questo aspetto:

{
    "image_dim_ordering": "tf",
    "epsilon": 1e-07,
    "floatx": "float32",
    "backend": "tensorflow"
}  

A questo punto dovreste essere già in grado di usare l’ambiente.

Come è strutturato  ?

Come già anticipato, Keras basa la sua logica sul concetto  di  modello che è  un modo semplice per organizzare i livelli della rete neurale. Il   modello più comunemente usato in Keras è quello  sequenziale, che, in sostanza implementa, una pila lineare di livelli della rete neurale, ma esiste anche la possibilità di usare il modello funzionale.

Cerchiamo di capire di cosa stiamo parlando, approcciando al problema  con un esempio, ma prima di andare avanti vi invito a leggere qualche nozione sulle reti neurali feedforward qualora ne foste allo scuro, perché sarà utile per la comprensione di questo articolo. Se vi va potete leggere qualcosa su questo mio vecchio articolo.

Esempio di Applicazione

Nei prossimi articoli impareremo ad usare Keras e  scriveremo due esempi con l’obiettivo di spiegare come utilizzare keras per implementare tipi diversi di rete neurale. Nel caso specifico tenteremo di approfondire due casi tipici di supervised learning :

  • regressione lineare
  • classificatore

Il primo esempio dimostrerà come implementare un classificatore per fornire un “parere” qualitativo sul valore di un immobile, quale ad esempio:

  • economico,
  • costoso

Il secondo esempio invece  risolverà un classico problema di regressione e fornirà la predizione del prezzo di un immobile.

In sintesi con  l’implementazione di un regressore  saremo  in grado di  calcolare un valore approssimato dell’immobile, mentre con l’implementazione di  un classificatore potremmo verificare esclusivamente l’appartenenza dell’immobile ad un classe ed ottenere pertanto una risposta qualitativa quale ad esempio la bontà dell’immobile (costoso, economico).

Uno dei primi problemi da affrontare quando si vuole di addestrare una rete neurale e di avere un dataset utile per effettuare il training. Per gli esempi seguenti proveremo a costruire uno dataset, lavorando su dati che possiamo recuperare da internet.

Estrazione di un dataset

La tecnica che farò vedere per costruire il  dataset si basa sullo scraping, e poiché la tecnica non viene ben vista, anzi in taluni casi è illegale, non mi assumo responsabilità dell’utilizzo che ne farete.  Il primo passo da cui partire è l’identificazione del target, nel nostro caso sarà immobiliare.it; il secondo passo è quello di costruirsi uno strumento per recuperare i dati in automatico; solo a scopo didattico vi lascio lo script per costruire il dataset ed  il link da cui scaricare il codice sorgente.

#!/usr/bin/env python
# coding: utf-8

import requests
from bs4 import BeautifulSoup
from sklearn.feature_extraction.text import CountVectorizer
import pandas as pd

a_prezzo=[]
a_locali=[]
a_m2superficie=[]
a_bagni=[]
a_piano=[]

for index in range(0,70,1):
	print (index)
	page = 'https://www.immobiliare.it/vendita-case/salerno/?pag='+str(index)
	web_result = requests.get(page).text
	soup = BeautifulSoup(web_result,'lxml')
	for ul in soup.findAll('ul',{'class':'listing-features list-piped'}):
		li=ul.findAll('li',{'class':'lif__item'});		
		
		try:
			prezzo=str(li[0].text).strip()
		except Exception as e:
			prezzo="ND"

		
		try:
			locali=str(li[1].span.text).strip()
		except Exception as e:
			locali="ND"

		try:
			m2superficie=str(li[2].span.text).strip()
		except Exception as e:
			m2superficie="ND"

		
		try:
			bagni=str(li[3].span.text).strip()
		except Exception as e:
			bagni="ND"
		

		try:
			piano=(li[4].abbr.text).strip()
		except Exception as e:
			piano="ND"
	
		a_prezzo.append(prezzo)
		a_locali.append(locali)
		a_m2superficie.append(m2superficie)
		a_bagni.append(bagni)
		a_piano.append(piano)

		print("prezzo: " + prezzo)
		print("locali: " + locali)
		print("m2superficie: " + m2superficie)
		print("bagni: " + bagni)
		print("piano: " + piano)

		print("************************************************************")

df = pd.DataFrame({'prezzo': a_prezzo,
                   'locali': a_locali,
                   'm2superficie': a_m2superficie,
                   'bagni' : a_bagni,
                   'piano' : a_piano})

df.to_csv('./dataset.csv')

Lo script costruirà un file in formato csv su cui  sarà necessario effettuare qualche piccola operazione di ripulitura, ma nulla di particolarmente complesso. Ad esempio sarà necessario eliminare o modificare con dati numerici le righe dove compaiono ad esempio campi non definito ND o valori di prezzo non dichiarati :PREZZO SU RICHIESTA.

Giusto per non avere dubbi : La rete neurale lavora esclusivamente su dati numerici.

Di seguito una sintesi di quello che si dovrebbe ottenere come risultato finale.

bagni locali Superficie piano prezzo
2 4 100 2 € 240.000
2 3 115 2 € 295.000
2 4 125 6 € 340.000
2 3 109 3 € 379.000
2 5 150 3 € 345.000
1 2 60 3 € 139.000
2 4 120 5 € 295.000
1 4 89 4 € 225.000

Come vedremo in seguito, osservando il dataset possiamo immaginare che la rete neurale che andremo a creare gestirà 4 parametri di ingresso (Locali,Superficie,Piano e Numero di Bagni), ed uno in uscita uscita, ovvero il  valore dell’immobile, ma di questo parleremo nelle prossime lezioni.

 

seconda lezione >>

Se vuoi farmi qualche richiesta o contattarmi per un aiuto riempi il seguente form