Archivos de la categoría Investigación

He intentado hacer como Moneyball para predecir el resultado de los partidos de fútbol y he fracasado

Hace ya algún tiempo leí un post interesante sobre como un data scientist usó el concepto presentado en el libro Moneyball para escoger mejor los jugadores del FIFA 2016 cuando jugaba con “Career Mode”. El concepto de Moneyball es básicamente hacer data mining para conseguir el mejor equipo de béisbol con el menor precio. El argumento principal del libro es que al fichar los jugadores de béisbol las personas usan sus propios inclinaciones que normalmente no coinciden con la realidad o que están ancladas al pasado. Como ejemplo en el libro pone que a menudo el resultado de una táctica ofensiva de un jugador se puede medir mejor usando la frecuencia con que el bateador llega a la base en vez de la velocidad con la que batea. La velocidad de bateo ha sido la métrica que se ha usado des del principio pero después de un análisis detallado los analistas descubrieron que otras métricas son más relevantes.

A partir de este concepto creé mi propio experimento. La idea era que normalmente los analistas usan datos reales de los partidos para definir la habilidad del jugador. El problema que tiene esto es que lo que se luce el jugador depende del nivel del contrincante. Por eso mi idea era usar una valoración más o menos neutra y absoluta para predecir la calidad de cada jugador. Estas métricas las usaría para predecir la calidad del once inicial y así poder determinar el resultado final del partido.

Lo primero que hice fue recopilar tanta información como pude de todos los jugadores que pude. Para determinar la calidad del jugador usé la que usan en el videojuego FIFA 2015. El valor de las apuestas que se habían hecho en distintos sitios web de apuestas lo saqué de football-data. La alineación inicial y el resultado final del partido lo saqué de 11v11.

Todo el scrapping que hice puede sonar muy divertido y rápido pero no fue así. Durante el proceso pasé por alto varias cosas importantes. Lo primero es que en la liga española tenemos muchos jugadores españoles y con nombres españoles. El problema de los nombres españoles es que usan caracteres especiales como acentos o la ñ causando problemas con el encoding. El segundo problema es que el scrapping es divertido si la página web es consistente y está bien ordenada. Resultó no ser el caso. Por algún motivo que desconozco algunas de las páginas de la web no tenían un formato consistente con el resto de la web y tuve que programar excepciones. El tercer y último punto es que las webs de dónde extraje la información tenían herramientas para evitar el scrapping. Por suerte no eran muy estrictos con el número de peticiones que un mismo ordenador podía hacer y conseguí toda la información que buscaba en relativamente poco tiempo.

El resultado final fue que no funcionó. Me pareció una idea innovadora pero quizás no muy realista. El fútbol se ha caracterizado por las sorpresas. Usando sólo la información de las apuestas puedo predecir en un 50% cual será el resultado final del partido. Curiosamente con regresión lineal y toda la información de los jugadores se puede predecir también con un 50% quién será el ganador del partido. Si quitamos el empate de la ecuación todos los algoritmos que probé siguen funcionando igual de “bien”. Básicamente podría tirar una moneda en el aire y decir que cara gana el equipo local y cruz el visitante y acertaría el mismo número de veces que todos los algoritmos probados. Una pena que no funcionara pero me alegra haberlo probado.

Consigue todos las publicaciones científicas que quieras

Cuando nos pica la curiosidad y buscamos algunos papers por internet algunas (y en según que campos muchas) veces las publicaciones científicas solo se pueden conseguir si tienes una institución grande respaldándote. Supongo que algunas empresas permiten a sus empleados comprar papers interesantes pero no todo el mundo tiene esta suerte. Por mi parte puedo decir que la TUM (mi uni) me ofrece un extenso abanico de opciones de dónde poder descargar los papers.

El siguiente sitio ruso nos permite descargar la mayoría de ellos usando como proxy algunas universidades.

http://sci-hub.cc/

Lo que se tiene que hacer es buscar el paper como si estuvieras en google scholar (si ya sabes lo que quieres puedes poner el título). Luego pinchamos sobre el resultado de la búsqueda adecuado y automáticamente el website nos muestra el pdf (eso si, spameado con publicidad a tope).

Pero esto no se termina aquí. Si le pones “.sci-hub.iodespués del “.com” del dominio te redirige automáticamente al artículo. Ejemplo: Vemos que http://www.sciencedirect.com/science/article/pii/S0045782501002717 se tiene que pagar pero si ponemos http://www.sciencedirect.com.sci-hub.io/science/article/pii/S0045782501002717 nos pedirá un captcha y luego ya nos mostrará el pdf.

Me cansé de editar documentos Latex a mano

Hace ya un tiempo escribía mis ficheros Latex a mano. Para los que no lo sepan, es un tipo de documento dónde escribes lo que quieres ver. A diferencia de Word no lo puedes hacer de forma visual sino que para que nos entendamos lo “programas”. Una vez terminado el documento lo compilas (como los programas) y tienes un pdf muy bonito. Latex lo hace bastante fácil para los dominios técnicos con las fórmulas y todo eso.

Escribirlos a mano queda de hacker badass, pero es algo duro. Para esto busqué una solución sencilla. Y esta solución la voy a compartir con vosotros (que majo que soy :D)
Lo mejor que he encontrado ha sido Kile. Lo mejor de todo es que funciona en Linux (party!!!). Lo recomiendo porqué:

  • Tiene interfaz gráfica
  • Completa los comandos
  • Tiene corrector ortográfico
  • Compila y muestra el documento con un click
  • Te señala los errores
  • Puedes tener la lista de tus ficheros latex

Nada más que añadir!

Que formato es el mejor para guardar números con decimales (float)?

Hace ya algunos días que le estoy dando vueltas al crear un script que me cogiera determinados datos y los fuera guardando en un archivo. Como quiero guardar muchos datos durante un largo periodo de tiempo he pensado que quizás debería empezar por lo básico. Que formato de archivo es mejor para almacenar este tipo de datos.

Para averiguar que formato es el ideal para tal propósito he ideado un script en python que lo que hace es generar cuatro números aleatorios entre -10 y 10 por cada una de las 100.000 hileras disponibles (en total 400.000 valores). Luego, usando el mismo data set, he almacenado esta información usando distintos formatos. Los formatos que he usado son texto plano, CSV, TSV, JSON, SQLite y HDF5. Estos formatos son los que me han parecido adecuados para este tipo de tarea. He dejado fuera XML porque me pareció que tiene gran similitud con JSON y realmente no necesito la jerarquía ni flexibilidad que este formato me ofrece.

Véase que el mismo script indica el tamaño de cada fichero. El tiempo de ejecución es de unos 65 segundos en mi laptop.

El script:


import numpy as np
import os
from os import listdir
from os.path import isfile, join

import json
import csv
import sqlite3
import h5py #pip install h5py

#generated 4 rows with number_of_floats data
def data_generation(number_of_floats):
	ret = np.ndarray((number_of_floats, 4))
	for i in range(number_of_floats):
		ret[i] = np.random.uniform( -10, 10, 4 )
	return ret

#standard text saving
def save_text_file(data):
	f = open('text.txt', 'w')
	for el in data:
		f.write(str(el).strip('[]'))
		f.write('\n')
	f.close()
	return True

#saving with json files
def save_json(data):
	f = open('json.json', 'w')
	j=json.dumps(data.tolist())
	json.dump(j, f)
	f.close()
	return True

#saving numbers on csv
def save_csv(data):
	with open('csv.csv', 'w') as csvfile:
		fieldnames = ['Col_A', 'Col_B', 'Col_C', 'Col_D']
		writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
		for el in data:
			writer.writerow({'Col_A': str(el[0]), 'Col_B': str(el[1]),'Col_C': str(el[2]),'Col_D': str(el[3])})
	return True

#Tab Separated Values (TSV)
def save_tsv(data):
	with open('tsv.tsv', 'w') as tsvfile:
		writer = csv.writer(tsvfile, delimiter='\t')
		for el in data:
				writer.writerow(el)
	return True

#save data in sqlite
def save_sqlite(data):
	conn = sqlite3.connect('data.sqlite3')
	cur = conn.cursor()
	cur.execute('DROP TABLE IF EXISTS Data ')
	cur.execute('CREATE TABLE Data (Col_A REAL, Col_B REAL, Col_C REAL, Col_D REAL)')
	for el in data:
		cur.execute('INSERT INTO Data VALUES ('+str(el[0])+', '+str(el[1])+', '+str(el[2])+', '+str(el[3])+')')
	conn.commit()
	conn.close()

#save the data in a hdf file
def save_hdf(data):
	h = h5py.File('data.hdf5', 'w')
	dset = h.create_dataset('data', data=data)

#check the file size
def show_file_size():
	mypath = '.'
	onlyfiles = [ f for f in listdir(mypath) if isfile(join(mypath,f)) ]
	for fil in onlyfiles:
		statinfo = os.stat(fil)
		print 'name: '+str(fil)
		print 'size: '+str(statinfo.st_size)
		print ' '
	print onlyfiles

##############################
#
# Main
#
##############################

data = data_generation(100000)
save_text_file(data)
save_csv(data)
save_json(data)
save_csv(data)
save_tsv(data)
save_sqlite(data)
save_hdf(data)
show_file_size()
print 'Done'

Finalmente los resultados:

data-format-comparsion-plot

Formato Tamaño (Bytes)
Texto plano 4806060
CSV 5900742
TSV 7901330
JSON 8109034
SQLite 4468736
HDF5 3202144

Como se puede observar HDF5 es el ganador claramente siendo casi un 30% menor en tamaño que Sqlite que está ocupando el segundo lugar. No es de extrañar puesto que HDF es un formato de fichero diseñado especialmente para organizar y almacenar grandes cantidades de datos (ideado para supercomputadores). Para nuestra suerte las librerías tienen licencia BSD permitiendo mejoras y creación aplicaciones por parte de terceros. Lo que no me esperaba es que TSV obtuviera un tamaño similar a JSON y no a CSV. Sinceramente pensaba que CSV y TSV eran básicamente lo mismo.

Bonus: Para los interesados el script está en github.

Inclusión de publicaciones científicas en Google Scholar

Google Scholar es el motor de búsqueda que tiene como fin de devolver todos los artículos relacionados con unas determinadas palabras clave. Prestigiosas organizaciones como IEEE o ACM ya son incluidas por defecto en el índice de Google Scholar pero si eres un autor individual la cosa se complica un poco más.

Principalmente tienes dos grandes requisitos. El primero es que subas el fichero con la publicación en formato pdf a tu sitio web. El segundo requisito es que tengas una página que actualices indicando todas las publicaciones que has escrito y colaborado a escribir con el link directo hacia el fichero pdf. El fichero pdf además debe cumplir una serie de requisitos:

  1. La publicación que está en formato PDF debe terminar con la extensión .pdf

  2. El título de la publicación aparece en la primera página con un tamaño de fuente mayor al resto del texto.

  3. Justo debajo del título, en una linea nueva, aparecen los autores.

  4. La publicación contiene un apartado con uno de los siguientes nombres “References” o “Bibliography”.

Con esto debería bastar, sino recomiendo echarle una ojeada a las directrices de Google Scholar.

Fuente: http://scholar.google.de/intl/en/scholar/inclusion.html