Machine Learning With R
Machine Learning With R
Afortunadamente, en el momento de escribir este artículo, las máquinas todavía requieren la participación del
usuario.
Aunque sus impresiones del aprendizaje de la máquina pueden ser coloreadas por estas representaciones de los
medios de comunicación, los algoritmos de hoy en día son demasiado específicos de la aplicación para representar
cualquier peligro de volverse autoconsciente. El objetivo del aprendizaje automático actual no es crear un cerebro
artificial, sino ayudarnos a encontrarle sentido a las grandes cantidades de datos almacenados en el mundo.
Dejando a un lado los conceptos erróneos populares, al final de este capítulo, obtendrá una comprensión más
matizada del aprendizaje de máquinas. También se le presentarán los conceptos fundamentales que definen y
diferencian los enfoques de aprendizaje automático más utilizados.
Aprenderás:
Desde el advenimiento del lenguaje escrito, se han registrado observaciones humanas. Los cazadores
monitorearon el movimiento de los rebaños de animales, los primeros astrónomos registraron la alineación de
planetas y estrellas, y las ciudades registraron pagos de impuestos, nacimientos y muertes. Hoy en día, esas
observaciones, y muchas más, se automatizan cada vez más y se registran sistemáticamente en las bases de
datos informatizadas, que son cada vez más numerosas.
Entre bases de datos y sensores se registran muchos aspectos de nuestras vidas. Los gobiernos, las empresas y
los individuos están registrando y reportando información, desde lo monumental hasta lo mundano. Los
sensores meteorológicos registran datos de temperatura y presión, las cámaras de vigilancia vigilan las aceras y
los túneles del metro, y se supervisan todo tipo de comportamientos electrónicos: transacciones,
comunicaciones, amistades y muchos otros.
Esta avalancha de datos ha llevado a algunos a afirmar que hemos entrado en una era de Big Data, pero esto
puede ser un poco inapropiado. Los seres humanos siempre han estado rodeados de grandes cantidades de
datos. Lo que hace única a la era actual es que tenemos una gran cantidad de datos registrados, muchos de los
cuales pueden ser accedidos directamente por las computadoras. Más grande y más interesantes conjuntos de
datos son cada vez más accesibles en la punta de los dedos, sólo una búsqueda web de distancia. Esta riqueza de
información tiene el potencial para informar la acción, dada una manera sistemática de darle sentido a todo
esto.
El campo de estudio interesado en el desarrollo de algoritmos informáticos para transformar datos en acción
inteligente se conoce como aprendizaje automático. Este campo se originó en un entorno en el que los datos
disponibles, los métodos estadísticos y la potencia de computación evolucionaron rápida y simultáneamente. El
crecimiento de los datos requirió una mayor capacidad de computación, lo que a su vez estimuló el desarrollo de
métodos estadísticos para analizar grandes conjuntos de datos. Esto creó un ciclo de avance, lo que permitió
recopilar datos aún más amplios e interesantes.
Un hermano cercano del aprendizaje automático, la minería de datos, se ocupa de la generación de nuevos
conocimientos desde grandes bases de datos. Como se supone, la minería de datos involucra una búsqueda
sistemática de pepitas de inteligencia accionable. Aunque existe un cierto desacuerdo sobre cuán ampliamente
se superponen el aprendizaje automático y la minería de datos, un punto de distinción potencial es que el
aprendizaje automático se centra en enseñar a las computadoras cómo usar los datos para resolver un
problema, mientras que la minería de datos se centra en enseñar a las computadoras a identificar patrones que
los humanos usan para resolver un problema.
Prácticamente toda la minería de datos implica el uso del aprendizaje automático, pero no todo el aprendizaje
automático implica la minería de datos. Por ejemplo, usted podría aplicar el aprendizaje automático a los datos
de tráfico automovilístico para los patrones relacionados con las tasas de accidentes; por otra parte, si la
computadora está aprendiendo a conducir el coche en sí, esto es puramente aprendizaje automático sin minería
de datos.
Consejo
La frase "minería de datos" también se utiliza a veces como un peyorativo para describir la práctica engañosa
de seleccionar datos para apoyar una teoría.
La verdad es que, a pesar de que las máquinas alcanzan hitos tan impresionantes, su capacidad para comprender a
fondo un problema sigue siendo relativamente limitada. Son pura potencia intelectual sin dirección. Una
computadora puede ser más capaz que un humano de encontrar patrones sutiles en grandes bases de datos, pero
todavía necesita un humano para motivar el análisis y convertir el resultado en acción significativa.
Las máquinas no son buenas para hacer preguntas, ni siquiera para saber qué preguntas hacer. Son mucho mejores
para contestarlas, siempre y cuando la pregunta se plantee de una manera que el ordenador pueda comprender. Los
algoritmos actuales de aprendizaje de máquinas se asocian con personas como un sabueso que se asocia con su
entrenador; el sentido del olfato del perro puede ser muchas veces más fuerte que el de su amo, pero sin ser dirigido
cuidadosamente, el perro puede terminar persiguiendo su cola.
Para entender mejor las aplicaciones del mundo real del aprendizaje de máquinas, vamos a considerar ahora algunos
casos en los que se ha utilizado con éxito, algunos lugares en los que todavía tiene espacio para mejorar, y algunas
situaciones en las que puede hacer más daño que bien.
Aunque es imposible enumerar todos los casos de uso de la máquina de aprendizaje, una encuesta de casos de éxito
recientes incluye varias aplicaciones prominentes:
Al final de este libro, comprenderá los algoritmos básicos de aprendizaje de máquinas que se emplean para enseñar
a las computadoras a realizar estas tareas. Por ahora, basta decir que no importa cuál sea el contexto, el proceso de
aprendizaje automático es el mismo. Independientemente de la tarea, un algoritmo toma datos e identifica patrones
que forman la base para acciones posteriores.
Sin una vida entera de experiencias pasadas sobre las que construirse, las computadoras también están limitadas en
su habilidad para hacer inferencias de sentido común simples sobre los próximos pasos lógicos. Tomemos, por
ejemplo, los banners publicitarios vistos en muchos sitios web. Estos pueden ser servidos, basados en los patrones
aprendidos por la minería de datos del historial de navegación de millones de usuarios. Según estos datos, alguien
que ve los sitios web que venden zapatos debe ver anuncios de zapatos, y los que ven sitios web para colchones
deben ver anuncios de colchones. El problema es que esto se convierte en un ciclo interminable en el que se sirven
anuncios adicionales de zapatos o colchones en lugar de anuncios para cordones de zapatos y abrillantadores, o
sábanas de cama y mantas.
Muchos están familiarizados con las deficiencias de la capacidad del aprendizaje automático para entender o
traducir el lenguaje o para reconocer el habla y la escritura a mano. Tal vez el primer ejemplo de este tipo de fracaso
se encuentra en un episodio del programa de televisión The Simpsons de 1994, que mostró una parodia de la tableta
Apple Newton. Por su época, el Newton era conocido por su avanzado reconocimiento de escritura a mano.
Desafortunadamente para Apple, ocasionalmente fallaría a gran efecto. El episodio de televisión ilustró esto a través
de una secuencia en la que la nota de un matón a Beat up Martin fue malinterpretada por el Newton como "Come a
Martha", como se muestra en las siguientes capturas de pantalla:
La capacidad de las máquinas para entender el lenguaje ha mejorado lo suficiente desde 1994, de modo que Google,
Apple y Microsoft tienen la confianza suficiente para ofrecer servicios de conserjería virtual operados a través del
reconocimiento de voz. Sin embargo, incluso estos servicios rutinariamente tienen dificultades para responder
preguntas relativamente simples. Aún más, los servicios de traducción en línea a veces malinterpretan oraciones que
un niño pequeño entendería fácilmente. La característica de texto predictivo en muchos dispositivos también ha
llevado a una serie de sitios humorísticos autocorregidos fallidos que ilustran la capacidad de la computadora para
entender el lenguaje básico, pero completamente malinterpretar el contexto.
Algunos de estos errores son de esperar, con seguridad. El lenguaje se complica con múltiples capas de texto y
subtexto e incluso los seres humanos, a veces, entienden el contexto incorrectamente. Dicho esto, estos tipos de
fallas en las máquinas ilustran el importante hecho de que el aprendizaje de las máquinas es tan bueno como los
datos de los que se aprende. Si el contexto no está implícito directamente en los datos de entrada, entonces, al igual
que un humano, la computadora tendrá que hacer su mejor suposición.
Debido a la relativa juventud del aprendizaje automático como disciplina y a la velocidad a la que está progresando,
los temas legales asociados y las normas sociales son a menudo bastante inciertos y constantemente cambiantes. Se
debe tener cuidado al obtener o analizar los datos con el fin de evitar infringir las leyes, violar los términos del
servicio o los acuerdos de uso de datos y abusar de la confianza o violar la privacidad de los clientes o del público.
Consejo
El lema corporativo informal de Google, una organización que recopila quizás más datos sobre individuos que
cualquier otra, es "no seas malvado". Aunque esto parece bastante claro, puede que no sea suficiente. Un
mejor enfoque puede ser seguir el Juramento Hipocrático, un principio médico que dice "sobre todo, no hacer
daño".
Los minoristas utilizan habitualmente el aprendizaje automático para publicidad, promociones específicas, gestión
de inventario o el diseño de los artículos en la tienda. Muchos incluso han equipado los canales de pago con
dispositivos que imprimen cupones para promociones basadas en el historial de compras del cliente. A cambio de un
poco de datos personales, el cliente recibe descuentos en los productos específicos que desea comprar. Al principio,
esto parece relativamente inofensivo. Pero considere lo que sucede cuando esta práctica se lleva un poco más lejos.
Un cuento posiblemente apócrifo se refiere a un gran minorista en los EE. UU. que empleaba una máquina que
aprendía a identificar a las mujeres embarazadas para el envío de cupones. El minorista esperaba que si estas futuras
madres recibían descuentos sustanciales, se convertirían en clientes leales, quienes más tarde comprarían artículos
rentables como pañales, preparados para bebés y juguetes.
Equipado con métodos de aprendizaje automático, el minorista identificó artículos en el historial de compra del
cliente que podían ser utilizados para predecir con un alto grado de certeza, no sólo si una mujer estaba
embarazada, sino también el momento aproximado en que el bebé debía nacer.
Después de que el minorista utilizó estos datos para un correo promocional, un hombre enojado se puso en contacto
con la cadena y exigió saber por qué su hija adolescente recibió cupones para artículos de maternidad. ¡Estaba
furioso de que el minorista pareciera estar alentando el embarazo adolescente! Según cuenta la historia, cuando el
gerente de la cadena de tiendas minoristas llamó para ofrecer una disculpa, ¡fue el padre quien finalmente se
disculpó porque, después de enfrentarse a su hija, descubrió que ella estaba embarazada!
Sea completamente cierto o no, la lección aprendida del cuento anterior es que el sentido común debe aplicarse
antes de aplicar ciegamente los resultados de un análisis de aprendizaje automático. Esto es especialmente cierto en
los casos en que se trata de información sensible, como los datos sanitarios. Con un poco más de cuidado, el
minorista podría haber previsto este escenario, y utilizado mayor discreción al elegir cómo revelar el patrón que
había descubierto su análisis de aprendizaje de la máquina.
Ciertas jurisdicciones pueden impedirle el uso de datos raciales, étnicos, religiosos u otros datos de clase protegidos
por razones comerciales. Tenga en cuenta que excluir estos datos de su análisis puede no ser suficiente, ya que los
algoritmos de aprendizaje automático pueden aprender esta información de forma independiente. Por ejemplo, si
un determinado segmento de personas vive generalmente en una determinada región, compra un determinado
producto o se comporta de una manera que los identifica como un grupo, algunos algoritmos de aprendizaje
automático pueden inferir la información protegida de estos otros factores. En tales casos, es posible que necesite
"desidentificar" completamente a estas personas excluyendo cualquier dato potencialmente identificable además de
la información protegida.
Aparte de las consecuencias legales, el uso inapropiado de los datos puede perjudicar los resultados finales. Los
clientes pueden sentirse incómodos o asustados si los aspectos de sus vidas que consideran privados se hacen
públicos. En los últimos años, varias aplicaciones web de alto perfil han experimentado un éxodo masivo de usuarios
que se sentían explotados cuando las condiciones de los acuerdos de servicio de las aplicaciones cambiaron, y sus
datos se utilizaron para fines que van más allá de lo que los usuarios habían acordado originalmente. El hecho de
que las expectativas de privacidad difieran según el contexto, la edad y el lugar de residencia, añade complejidad a la
decisión sobre el uso apropiado de los datos personales. Sería prudente considerar las implicaciones culturales de su
trabajo antes de comenzar su proyecto.
Consejo
El hecho de que se puedan utilizar los datos para un fin determinado no siempre significa que se deba.
Mientras que los cerebros humanos son naturalmente capaces de aprender desde el nacimiento, las condiciones
necesarias para que las computadoras aprendan deben hacerse explícitas. Por esta razón, aunque no es
estrictamente necesario entender la base teórica del aprendizaje, esta base ayuda a entender, distinguir e
implementar algoritmos de aprendizaje automático.
Consejo
Al comparar el aprendizaje automático con el aprendizaje humano, es posible que se descubra a sí mismo
examinando su propia mente bajo una luz diferente.
Independientemente de que el alumno sea humano o mecánico, el proceso de aprendizaje básico es similar. Puede
dividirse en cuatro componentes interrelacionados:
El almacenamiento de datos utiliza la observación, la memoria y la recuperación para proporcionar una base
fáctica para un razonamiento adicional.
La abstracción implica la traducción de los datos almacenados en representaciones y conceptos más amplios.
La generalización utiliza datos abstractos para crear conocimientos e inferencias que impulsan la acción en
nuevos contextos.
La evaluación proporciona un mecanismo de retroalimentación para medir la utilidad de los conocimientos
aprendidos e informar las posibles mejoras.
Tenga en cuenta que aunque el proceso de aprendizaje ha sido conceptualizado como cuatro componentes distintos,
están simplemente organizados de esta manera con fines ilustrativos. En realidad, todo el proceso de aprendizaje
está inextricablemente unido. En los seres humanos, el proceso ocurre subconscientemente. Recordamos,
deducimos, inducimos e intuimos con los confines del ojo de nuestra mente, y debido a que este proceso está
oculto, cualquier diferencia de persona a persona se atribuye a una vaga noción de subjetividad. En contraste, con
las computadoras estos procesos son explícitos, y debido a que todo el proceso es transparente, los conocimientos
aprendidos pueden ser examinados, transferidos y utilizados para acciones futuras.
Almacenamiento de datos
Todo aprendizaje debe comenzar con datos. Los seres humanos y los ordenadores por igual utilizan el
almacenamiento de datos como base para un razonamiento más avanzado. En un ser humano, esto consiste en un
cerebro que utiliza señales electroquímicas en una red de células biológicas para almacenar y procesar
observaciones para su recuperación futura a corto y largo plazo. Las computadoras tienen capacidades similares de
recuperación a corto y largo plazo utilizando unidades de disco duro, memoria flash y memoria de acceso aleatorio
(RAM) en combinación con una unidad central de procesamiento (CPU).
Puede parecer obvio decirlo, pero la capacidad de almacenar y recuperar datos por sí sola no es suficiente para el
aprendizaje. Sin un nivel superior de comprensión, el conocimiento se limita exclusivamente a recordar, es decir, lo
que se ve antes y nada más. Los datos son meramente unos y ceros en un disco. Son memorias almacenadas sin un
significado más amplio.
Para comprender mejor los matices de esta idea, puede ser útil pensar en la última vez que estudiaste para un
examen difícil, tal vez para un examen final universitario o una certificación de carrera. ¿Desea una memoria
fotográfica? Si es así, usted puede estar decepcionado al enterarse de que es poco probable que el recuerdo
perfecto sea de mucha ayuda. Incluso si usted puede memorizar el material perfectamente, su aprendizaje de
memoria no tiene ninguna utilidad, a menos que sepa de antemano las preguntas exactas y las respuestas que
aparecerán en el examen. De lo contrario, usted estaría atascado en un intento de memorizar las respuestas a cada
pregunta que posiblemente podría hacerse. Obviamente, esta es una estrategia insostenible.
En cambio, un mejor enfoque es pasar tiempo de manera selectiva, memorizando un pequeño conjunto de ideas
representativas mientras se desarrollan estrategias sobre cómo se relacionan las ideas y cómo usar la información
almacenada. De esta manera, las ideas grandes pueden ser entendidas sin necesidad de memorizarlas de forma
rutinaria.
Abstracción
Este trabajo de asignación de significado a los datos almacenados se produce durante el proceso de abstracción, en
el que los datos crudos llegan a tener un significado más abstracto. Este tipo de conexión, por ejemplo, entre un
objeto y su representación, se ejemplifica en el famoso cuadro de René Magritte La traición de las imágenes:
La pintura representa una pipa de tabaco con la leyenda Ceci n' est pas une pipe ("esto no es una pipa"). El punto
que Magritte estaba ilustrando es que una representación de un tubo no es realmente un tubo. Sin embargo, a pesar
de que la pipa no es real, cualquiera que vea la pintura puede reconocerla fácilmente como una pipa. Esto sugiere
que la mente del observador es capaz de conectar la imagen de una pipa con la idea de una pipa, con la memoria de
una pipa física que podría sostenerse en la mano. Conexiones abstractas como estas son la base de la representación
del conocimiento, la formación de estructuras lógicas que ayudan a convertir la información sensorial cruda en una
visión significativa.
Durante el proceso de representación del conocimiento de una máquina, la computadora resume los datos crudos
almacenados usando un modelo, una descripción explícita de los patrones dentro de los datos. Al igual que la pipa
de Magritte, la representación del modelo toma una vida más allá de los datos brutos. Representa una idea mayor
que la suma de sus partes.
Hay muchos tipos diferentes de modelos. Puede que ya estés familiarizado con algunos. Los ejemplos incluyen:
Ecuaciones matemáticas
Diagramas relacionales como árboles y gráficos
Reglas lógicas if/else
Agrupaciones de datos conocidas como clusters
La elección del modelo no se deja normalmente en manos de la máquina. En su lugar, la tarea de aprendizaje y los
datos disponibles informan la selección del modelo. Más adelante en este capítulo, discutiremos los métodos para
elegir el tipo de modelo con más detalle.
El proceso de adaptación de un modelo a un conjunto de datos se conoce como entrenamiento. Cuando el modelo
ha sido entrenado, los datos se transforman en una forma abstracta que resume la información original.
Consejo
Usted podría preguntarse por qué este paso se llama entrenamiento en lugar de aprendizaje. En primer lugar,
tenga en cuenta que el proceso de aprendizaje no termina con la abstracción de datos; el alumno debe
generalizar y evaluar su capacitación. En segundo lugar, la palabra entrenamiento connota mejor el hecho de
que el profesor humano entrena al estudiante de la máquina para que entienda los datos de una manera
específica.
Es importante señalar que un modelo aprendido no proporciona por sí mismo nuevos datos, pero sí da lugar a
nuevos conocimientos. ¿Cómo puede ser esto? La respuesta es que la imposición de una estructura supuesta sobre
los datos subyacentes da una visión de lo invisible al suponer un concepto sobre cómo se relacionan los elementos
de datos. Tomemos por ejemplo el descubrimiento de la gravedad. Al ajustar las ecuaciones a los datos
observacionales, Sir Isaac Newton infirió el concepto de gravedad. Pero la fuerza que ahora conocemos como
gravedad siempre estuvo presente. Simplemente no fue reconocido hasta que Newton lo reconoció como un
concepto abstracto que relaciona algunos datos con otros -específicamente, convirtiéndose en el término g en un
modelo que explica observaciones de objetos que caen.
La mayoría de los modelos pueden no dar lugar al desarrollo de teorías que sacudan el pensamiento científico
durante siglos. Aun así, su modelo podría resultar en el descubrimiento de relaciones no vistas previamente entre los
datos. Un modelo entrenado en datos genómicos podría encontrar varios genes que, cuando se combinan, son
responsables del inicio de la diabetes; los bancos podrían descubrir un tipo de transacción aparentemente inocua
que aparece sistemáticamente antes de la actividad fraudulenta; y los psicólogos podrían identificar una
combinación de características de personalidad que indiquen un nuevo trastorno. Estos patrones subyacentes
siempre estuvieron presentes, pero simplemente presentando la información en un formato diferente, se
conceptualiza una nueva idea.
Generalización
El proceso de aprendizaje no se completa hasta que el alumno es capaz de utilizar sus conocimientos abstractos para
acciones futuras. Sin embargo, entre los innumerables patrones subyacentes que podrían identificarse durante el
proceso de abstracción y las innumerables maneras de modelar estos patrones, algunos serán más útiles que otros.
A menos que la producción de abstracciones sea limitada, el estudiante no podrá proceder. Estaría atascado donde
comenzó, con una gran cantidad de información, pero sin una perspectiva que pudiera ser accionada.
El término generalización describe el proceso de convertir el conocimiento abstracto en una forma que puede ser
utilizada para acciones futuras, en tareas similares, pero no idénticas, a las que ha visto antes. La generalización es
un proceso algo impreciso y difícil de describir. Tradicionalmente, se ha imaginado como una búsqueda a través de
todo el conjunto de modelos (es decir, teorías o inferencias) que podrían ser abstractas durante el entrenamiento.
En otras palabras, si se puede imaginar un conjunto hipotético que contenga todas las posibles teorías que se
puedan establecer a partir de los datos, la generalización implica la reducción de este conjunto en un número
manejable de hallazgos importantes.
En general, el alumno tiene la tarea de limitar los patrones que descubre a aquellos que serán más relevantes para
sus tareas futuras. En general, no es factible reducir el número de patrones examinándolos uno por uno y
clasificándolos por utilidad futura. En cambio, los algoritmos de aprendizaje automático generalmente emplean
atajos que reducen el espacio de búsqueda más rápidamente. Hacia este fin, el algoritmo empleará heurística, que
son conjeturas educadas sobre dónde encontrar las inferencias más útiles.
Consejo
Debido a que la heurística utiliza aproximaciones y otras reglas generales, no garantizan encontrar el mejor
modelo. Sin embargo, sin tomar estos atajos, encontrar información útil en un conjunto de datos grande sería
inviable.
La heurística es utilizada rutinariamente por los seres humanos para generalizar rápidamente la experiencia a nuevos
escenarios. Si alguna vez ha utilizado su instinto intuitivo para tomar una decisión rápida antes de evaluar
completamente sus circunstancias, estaba usando intuitivamente la heurística mental.
La increíble habilidad humana para tomar decisiones rápidas a menudo no se basa en la lógica de la computadora,
sino en la heurística guiada por las emociones. A veces, esto puede resultar en conclusiones ilógicas. Por ejemplo,
más personas expresan temor a los viajes de las aerolíneas versus los viajes en automóvil, a pesar de que los
automóviles son estadísticamente más peligrosos. Esto puede explicarse por la disponibilidad heurística, que es la
tendencia de las personas a estimar la probabilidad de un evento por la facilidad con que se pueden recordar sus
ejemplos. Los accidentes que implican el transporte aéreo son altamente publicitados. Los accidentes
automovilísticos, por tratarse de acontecimientos traumáticos, pueden ser recordados con mucha facilidad, mientras
que los accidentes automovilísticos apenas merecen una mención en el periódico.
La locura de la heurística mal aplicada no se limita a los seres humanos. La heurística empleada por los algoritmos de
aprendizaje automático también a veces resulta en conclusiones erróneas. Se dice que el algoritmo tiene un sesgo si
las conclusiones son sistemáticamente erróneas o incorrectas de manera predecible.
Por ejemplo, supongamos que un algoritmo de aprendizaje automático aprende a identificar rostros encontrando
dos círculos oscuros que representan los ojos, colocados por encima de una línea recta que indica una boca. El
algoritmo podría entonces tener problemas con, o estar sesgado en contra de, las caras que no se ajustan a su
modelo. Es posible que el algoritmo no detecte rostros con lentes, girados en ángulo, mirando de lado o con varios
tonos de piel. De manera similar, podría estar sesgada hacia los rostros con ciertos tonos de piel, formas de cara u
otras características que no se ajustan a su comprensión del mundo.
En el uso moderno, la palabra sesgo ha llegado a tener connotaciones bastante negativas. Diversas formas de
medios de comunicación suelen afirmar que están libres de prejuicios y afirman informar sobre los hechos de
manera objetiva, sin ser manchados por la emoción. No obstante, considere por un momento la posibilidad de que
un pequeño sesgo podría ser útil. Sin un poco de arbitrariedad, ¿podría ser un poco difícil decidir entre varias
opciones que compiten entre sí, cada una con fortalezas y debilidades distintas? De hecho, algunos estudios
recientes en el campo de la psicología han sugerido que los individuos nacidos con daño a porciones del cerebro
responsables de la emoción son ineficaces en la toma de decisiones, y podrían pasar horas debatiendo decisiones
sencillas como qué color de camisa usar o dónde comer el almuerzo. Paradójicamente, el sesgo es lo que nos ciega
de cierta información y al mismo tiempo nos permite utilizar otra información para la acción. Es la forma en que los
algoritmos de aprendizaje automático eligen entre las innumerables maneras de entender un conjunto de datos.
Evaluación
El sesgo es un mal necesario asociado a los procesos de abstracción y generalización inherentes a cualquier tarea de
aprendizaje. Para impulsar la acción frente a una posibilidad ilimitada, cada alumno debe estar predispuesto de una
manera particular. En consecuencia, cada alumno tiene sus debilidades y no existe un algoritmo de aprendizaje único
que lo regule todo. Por lo tanto, el paso final en el proceso de generalización es evaluar o medir el éxito del
estudiante a pesar de sus sesgos y usar esta información para informar la capacitación adicional si es necesario.
Consejo
Una vez que haya tenido éxito con una técnica de aprendizaje de máquina, es posible que tenga la tentación de
aplicarla a todo. Es importante resistir esta tentación, ya que ningún enfoque de aprendizaje automático es el
mejor para cada circunstancia. Este hecho es descrito por el teorema de No Free Lunch, presentado por David
Wolpert en 1996. Para más información, visite: [Link]
En general, la evaluación se realiza después de que un modelo ha sido entrenado en un conjunto de datos de
entrenamiento inicial. A continuación, el modelo se evalúa en un nuevo conjunto de datos de prueba para
determinar si su caracterización de los datos de formación se generaliza a nuevos datos no vistos. Vale la pena notar
que es extremadamente raro que un modelo se generalice perfectamente a cada caso imprevisto.
En partes, los modelos no logran generalizar perfectamente debido al problema del ruido, un término que describe
variaciones inexplicables o imprecisas en los datos. Los datos ruidosos son causados por eventos aparentemente
aleatorios, como:
Error de medición debido a sensores imprecisos que a veces añaden o restan un poco de las lecturas
Cuestiones relacionadas con los sujetos humanos, como los encuestados que informan respuestas aleatorias
a las preguntas de la encuesta, con el fin de terminar más rápidamente
Problemas de calidad de datos, incluyendo valores faltantes, nulos, truncados, incorrectamente codificados
o corrompidos
Fenómenos tan complejos o tan poco comprendidos que afectan a los datos de manera que parecen ser
poco sistemáticos
Tratar de modelar el ruido es la base de un problema llamado overfitting. Debido a que la mayoría de los datos
ruidosos son inexplicables por definición, intentar explicar el ruido resultará en conclusiones erróneas que no se
generalizan bien a los casos nuevos. Los esfuerzos para explicar el ruido también resultarán típicamente en modelos
más complejos que no tendrán en cuenta el verdadero patrón que el estudiante trata de identificar. Se dice que un
modelo que parece funcionar bien durante el entrenamiento, pero no lo hace bien durante la evaluación, se adapta
al conjunto de datos del entrenamiento, ya que no se generaliza bien al conjunto de datos de la prueba.
Las soluciones al problema del overfitting son específicas para los enfoques particulares de aprendizaje de máquinas.
Por ahora, lo importante es que seamos conscientes del problema. La capacidad de los modelos para manejar datos
ruidosos es una importante fuente de distinción entre ellos.
1. Recolección de datos: El paso de recolección de datos implica recolectar el material de aprendizaje que un
algoritmo usará para generar conocimiento procesable. En la mayoría de los casos, los datos necesitarán
combinarse en una sola fuente como un archivo de texto, una hoja de cálculo o una base de datos.
2. Exploración y preparación de datos: La calidad de cualquier proyecto de aprendizaje de máquinas se basa en
gran medida en la calidad de sus datos de entrada. Por lo tanto, es importante aprender más sobre los datos
y sus matices durante una práctica llamada exploración de datos. Se requiere trabajo adicional para preparar
los datos para el proceso de aprendizaje. Esto implica arreglar o limpiar los llamados datos "desordenados",
eliminar datos innecesarios y recodificar los datos para que se ajusten a las entradas esperadas del alumno.
3. Formación del modelo: Cuando los datos se han preparado para el análisis, es probable que tenga una idea
de lo que es capaz de aprender de los datos. La tarea específica de aprendizaje de la máquina elegida
informará la selección de un algoritmo apropiado, y el algoritmo representará los datos en forma de modelo.
4. Evaluación del modelo: Debido a que cada modelo de aprendizaje de la máquina resulta en una solución
sesgada al problema de aprendizaje, es importante evaluar qué tan bien el algoritmo aprende de su
experiencia. Dependiendo del tipo de modelo utilizado, es posible que pueda evaluar la precisión del modelo
utilizando un conjunto de datos de prueba o que necesite desarrollar medidas de rendimiento específicas
para la aplicación deseada.
5. Mejora del modelo: Si se necesita un mejor rendimiento, es necesario utilizar estrategias más avanzadas
para aumentar el rendimiento del modelo. A veces, puede ser necesario cambiar a un tipo de modelo
diferente. Es posible que necesite complementar sus datos con datos adicionales o realizar un trabajo
preparatorio adicional como en el paso dos de este proceso.
Después de completar estos pasos, si el modelo parece estar funcionando bien, puede desplegarse para la tarea
prevista. En su caso, podría utilizar su modelo para proporcionar datos de puntuación para las predicciones
(posiblemente en tiempo real), para proyecciones de datos financieros, para generar información útil para el
marketing o la investigación, o para automatizar tareas como la distribución de correo o el vuelo de aviones. Los
éxitos y fracasos del modelo implementado podrían incluso proporcionar datos adicionales para entrenar a su
estudiante de próxima generación.
La frase unidad de observación se utiliza para describir la entidad más pequeña con propiedades de interés medidas
para un estudio. Comúnmente, la unidad de observación consiste en personas, objetos o cosas, transacciones,
puntos de tiempo, regiones geográficas o mediciones. A veces, las unidades de observación se combinan para formar
unidades como los años-persona, que denotan casos en los que una misma persona es objeto de seguimiento
durante varios años; cada año-persona comprende los datos de una persona durante un año.
Consejo
La unidad de observación está relacionada, pero no es idéntica, con la unidad de análisis, que es la unidad más
pequeña de la que se hace la inferencia. Aunque a menudo es el caso, las unidades observadas y analizadas no
siempre son las mismas. Por ejemplo, los datos observados de las personas podrían utilizarse para analizar las
tendencias entre países.
Los conjuntos de datos que almacenan las unidades de observación y sus propiedades pueden ser imaginados como
colecciones de datos que consisten en:
Ejemplos: instancias de la unidad de observación para las que se han registrado propiedades
Características: Propiedades grabadas o atributos de ejemplos que pueden ser útiles para el aprendizaje
Es más fácil entender características y ejemplos a través de casos reales. Para construir un algoritmo de aprendizaje
para identificar el correo electrónico no deseado, la unidad de observación podría ser mensajes de correo
electrónico, los ejemplos serían mensajes específicos y las características podrían consistir en las palabras utilizadas
en los mensajes. Para un algoritmo de detección del cáncer, la unidad de observación podría ser los pacientes, los
ejemplos podrían incluir una muestra aleatoria de pacientes con cáncer, y las características pueden ser los
marcadores genómicos de las células biopsiadas, así como las características del paciente como el peso, la altura o la
presión arterial.
Aunque los ejemplos y las características no tienen que ser recopilados en ninguna forma específica, se suelen
agrupar en formato matricial, lo que significa que cada ejemplo tiene exactamente las mismas características.
La siguiente hoja de cálculo muestra un conjunto de datos en formato matricial. En los datos de matriz, cada fila de
la hoja de cálculo es un ejemplo y cada columna es una característica. Aquí, las filas indican ejemplos de
automóviles, mientras que las columnas registran varias características de cada automóvil, tales como precio,
kilometraje, color y tipo de transmisión. Los datos en formato matricial son, con mucho, la forma más comúnmente
utilizada en el aprendizaje automático. Sin embargo, como verán en los capítulos posteriores, otras formas se usan
ocasionalmente en casos especializados:
Las características también vienen en varias formas. Si una característica representa una característica medida en
números, no es sorprendente que se llame numérica. Alternativamente, si una característica es un atributo que
consiste en un conjunto de categorías, la característica se denomina categórica o nominal. Un caso especial de
variables categóricas se llama ordinal, que designa una variable nominal con categorías que caen en una lista
ordenada. Algunos ejemplos de variables ordinales incluyen tallas de ropa tales como pequeñas, medianas y
grandes; o una medida de la satisfacción del cliente en una escala que va desde "no feliz" hasta "muy feliz". Es
importante tener en cuenta lo que representan las características, ya que el tipo y el número de características de su
conjunto de datos le ayudarán a determinar un algoritmo de aprendizaje de máquina apropiado para su tarea.
Se utiliza un modelo predictivo para las tareas que implican, como el nombre lo indica, la predicción de un valor
utilizando otros valores del conjunto de datos. El algoritmo de aprendizaje intenta descubrir y modelar la relación
entre la característica objetivo (la característica que se vaticina) y las otras características. A pesar del uso común de
la palabra "predicción" para implicar pronóstico, los modelos predictivos no necesariamente tienen que prever
eventos en el futuro. Por ejemplo, un modelo predictivo podría usarse para predecir eventos pasados, como la fecha
de la concepción de un bebé usando los niveles hormonales actuales de la madre. Los modelos predictivos también
se pueden utilizar en tiempo real para controlar los semáforos durante las horas punta.
Debido a que los modelos predictivos reciben instrucciones claras sobre lo que necesitan aprender y cómo se
pretende que aprendan, el proceso de capacitación de un modelo predictivo se conoce como aprendizaje
supervisado. La supervisión no se refiere a la participación humana, sino más bien al hecho de que los valores
objetivo proporcionan una manera para que el estudiante sepa cuán bien ha aprendido la tarea deseada. Dicho de
manera más formal, dado un conjunto de datos, un algoritmo de aprendizaje supervisado intenta optimizar una
función (el modelo) para encontrar la combinación de valores de característica que resultan en la salida objetivo.
La tarea de aprendizaje automático supervisado utilizada a menudo para predecir a qué categoría pertenece un
ejemplo se conoce como clasificación. Es fácil pensar en los usos potenciales para un clasificador. Por ejemplo,
podrías predecir si:
En la clasificación, la característica objetivo que se va a predecir es una característica categórica conocida como
clase, y se divide en categorías llamadas niveles. Una clase puede tener dos o más niveles, y los niveles pueden o no
ser ordinales. Debido a que la clasificación es tan ampliamente utilizada en el aprendizaje automático, existen
muchos tipos de algoritmos de clasificación, con fortalezas y debilidades adecuadas para diferentes tipos de datos de
entrada. Veremos ejemplos de estos más adelante en este capítulo y a lo largo de este libro.
Los estudiantes supervisados también pueden ser utilizados para predecir datos numéricos tales como ingresos,
valores de laboratorio, puntajes de exámenes o conteos de artículos. Para predecir tales valores numéricos, una
forma común de predicción numérica ajusta los modelos de regresión lineal a los datos de entrada. Aunque los
modelos de regresión no son el único tipo de modelos numéricos, son, con mucho, los más utilizados. Los métodos
de regresión son ampliamente utilizados para la predicción, ya que cuantifican en términos exactos la asociación
entre los insumos y el objetivo, incluyendo tanto la magnitud como la incertidumbre de la relación.
Consejo
Puesto que es fácil convertir los números en categorías (por ejemplo, las edades de 13 a 19 años son
adolescentes) y las categorías en números (por ejemplo, asignar 1 a todos los hombres, 0 a todas las mujeres),
la frontera entre los modelos de clasificación y los modelos de predicción numérica no es necesariamente
segura.
Se utiliza un modelo descriptivo para las tareas que se beneficiarían de la perspicacia obtenida al resumir los datos
de maneras nuevas e interesantes. A diferencia de los modelos predictivos que predicen un objetivo de interés, en
un modelo descriptivo, ninguna característica individual es más importante que cualquier otra. De hecho, debido a
que no hay un objetivo para aprender, el proceso de capacitación de un modelo descriptivo se llama aprendizaje no
supervisado. Aunque puede ser más difícil pensar en aplicaciones para modelos descriptivos -después de todo, ¿para
qué sirve un estudiante que no está aprendiendo nada en particular?
Por ejemplo, la tarea de modelado descriptivo llamada descubrimiento de patrones se utiliza para identificar
asociaciones útiles dentro de los datos. El descubrimiento de patrones se utiliza a menudo para el análisis de la cesta
de la compra en los datos de las transacciones de los minoristas. Aquí, el objetivo es identificar los artículos que se
compran con frecuencia de forma conjunta, de manera que la información aprendida pueda ser utilizada para refinar
las tácticas de marketing. Por ejemplo, si un minorista se entera de que los baúles de baño se compran comúnmente
al mismo tiempo que las gafas de sol, el minorista podría reposicionar los artículos más de cerca en la tienda o
ejecutar una promoción a los clientes "up-sell" en artículos asociados.
Consejo
Originalmente utilizado sólo en contextos minoristas, el descubrimiento de patrones está empezando a ser
utilizado de maneras bastante innovadoras. Por ejemplo, se puede utilizar para detectar patrones de conducta
fraudulenta, detectar defectos genéticos o identificar puntos críticos para actividades criminales.
La tarea de modelado descriptivo de dividir un conjunto de datos en grupos homogéneos se denomina clustering.
Esto se utiliza a veces para el análisis de segmentación que identifica grupos de individuos con comportamiento
similar o información demográfica, de modo que las campañas publicitarias podrían ser adaptadas para audiencias
particulares. Aunque la máquina es capaz de identificar los clusters, se requiere la intervención humana para
interpretarlos. Por ejemplo, dado que en una tienda de comestibles hay cinco grupos de compradores diferentes, el
equipo de mercadeo necesitará entender las diferencias entre los grupos para crear una promoción que se adapte
mejor a cada grupo.
Por último, una clase de algoritmos de aprendizaje automático conocida como meta-aprendizaje no está ligada a una
tarea de aprendizaje específica, sino que se centra más bien en aprender a cómo lograr un aprendizaje más eficaz.
Un algoritmo de meta-aprendizaje utiliza el resultado de algunos aprendizajes para informar el aprendizaje adicional.
Esto puede ser beneficioso para problemas muy difíciles o cuando el rendimiento de un algoritmo predictivo
necesita ser lo más preciso posible.
Meta-Learning Algorithms
Para comenzar a aplicar el aprendizaje automático a un proyecto del mundo real, necesitará determinar cuál de las
cuatro tareas de aprendizaje representa su proyecto: clasificación, predicción numérica, detección de patrones o
clustering. La tarea conducirá la elección del algoritmo. Por ejemplo, si usted está realizando una detección de
patrones, es probable que emplee reglas de asociación. De manera similar, un problema de clustering
probablemente utilizará el algoritmo k-means, y la predicción numérica utilizará el análisis de regresión o árboles de
regresión.
Para la clasificación, se necesita más reflexión para que un problema de aprendizaje coincida con un clasificador
apropiado. En estos casos, es útil considerar varias distinciones entre algoritmos-distinciones que sólo serán
aparentes estudiando cada uno de los clasificadores en profundidad. Por ejemplo, dentro de los problemas de
clasificación, los árboles de decisión dan lugar a modelos que se entienden fácilmente, mientras que los modelos de
redes neuronales son notoriamente difíciles de interpretar. Si usted estaba diseñando un modelo de calificación
crediticia, esto podría ser una distinción importante porque la ley a menudo requiere que se le notifique al
solicitante las razones por las cuales fue rechazado para el préstamo. Incluso si la red neuronal es mejor para
predecir los incumplimientos de préstamos, si sus predicciones no pueden ser explicadas, entonces es inútil para
esta aplicación.
Para ayudar con la selección de algoritmos, en cada capítulo se enumeran las fortalezas y debilidades clave de cada
algoritmo de aprendizaje. Aunque a veces se puede encontrar que estas características excluyen ciertos modelos de
la consideración, en muchos casos, la elección del algoritmo es arbitraria. Cuando esto sea cierto, siéntase libre de
usar el algoritmo con el que se sienta más cómodo. Otras veces, cuando la precisión predictiva es primaria, es
posible que necesite probar varios algoritmos y elegir el que mejor se adapte, o usar un algoritmo de meta-
aprendizaje que combine a varios estudiantes diferentes para utilizar las fortalezas de cada uno.
Una colección de funciones R que pueden ser compartidas entre usuarios se llama "paquete". Existen paquetes
gratuitos para cada uno de los algoritmos de aprendizaje automático cubiertos en este libro. De hecho, este libro
sólo cubre una pequeña parte de todos los paquetes de aprendizaje de máquinas de R.
Si usted está interesado en la amplitud de los paquetes R, puede ver una lista en la Red de Archivos Completos R
(CRAN), una colección de sitios web y FTP ubicados en todo el mundo para proporcionar las versiones más
actualizadas de software y paquetes R. Si usted obtuvo el software R a través de la descarga, lo más probable es que
lo obtuviera de CRAN en [Link]
Consejo
Si aún no dispone de R, el sitio web de CRAN también proporciona instrucciones de instalación e información
sobre dónde encontrar ayuda si tiene problemas.
El enlace Paquetes situado en el lado izquierdo de la página le llevará a una página en la que podrá examinar los
paquetes por orden alfabético o por fecha de publicación. En el momento de escribir esto, un total de 6.779
paquetes estaban disponibles - un salto de más del 60% en el tiempo desde la primera edición fue escrito, y esta
tendencia no muestra signos de ralentización!
El enlace Vistas de tareas en el lado izquierdo de la página de CRAN proporciona una lista curada de paquetes según
el área temática. La vista de tareas para el aprendizaje automático, que enumera los paquetes cubiertos en este libro
(y muchos más), está disponible en [Link]
Instalación de paquetes R
A pesar del amplio conjunto de complementos R disponibles, el formato del paquete hace que la instalación y el uso
de un proceso virtualmente sin esfuerzo. Para demostrar el uso de los paquetes, instalaremos y cargaremos el
paquete RWeka, que fue desarrollado por Kurt Hornik, Christian Buchta y Achim Zeileis (vea Aprendizaje de Máquina
de Código Abierto: R Meets Weka en Estadísticas Computacionales 24:225-232 para más información). El paquete
RWeka proporciona un conjunto de funciones que permiten a R acceder a los algoritmos de aprendizaje de la
máquina en el paquete de software Weka basado en Java de Ian H. Witten y Eibe Frank. Más información sobre
Weka está disponible en [Link]
Consejo
Para usar el paquete RWeka, necesitará tener instalado Java (muchos ordenadores vienen con Java
preinstalado). Java es un conjunto de herramientas de programación gratuitas que permiten el uso de
aplicaciones multiplataforma como Weka. Para obtener más información, y para descargar Java en su sistema,
puede visitar [Link]
La forma más directa de instalar un paquete es a través de la función install. packages (). Para instalar el paquete
RWeka, en la línea de comandos R, simplemente escriba:
> [Link]("RWeka")
R se conectará a CRAN y descargará el paquete en el formato correcto para su sistema operativo. Algunos paquetes,
como RWeka, requieren que se instalen paquetes adicionales antes de poder utilizarlos (denominados
dependencias). De forma predeterminada, el instalador descargará e instalará automáticamente cualquier
dependencia.
Consejo
La primera vez que instale un paquete, R puede pedirle que elija un servidor de réplica CRAN. Si esto sucede,
elija el servidor de réplica que reside en un lugar cercano a usted. Esto generalmente proporcionará la velocidad
de descarga más rápida.
Las opciones de instalación predeterminadas son apropiadas para la mayoría de los sistemas. Sin embargo, en
algunos casos, es posible que desee instalar un paquete en otra ubicación. Por ejemplo, si no tiene privilegios de
administrador o root en su sistema, es posible que deba especificar una ruta de instalación alternativa. Esto se puede
lograr usando la opción lib, como sigue:
La función de instalación también proporciona opciones adicionales para la instalación desde un archivo local,
instalación desde el origen o usando versiones experimentales. Puede leer sobre estas opciones en el archivo de
ayuda, usando el siguiente comando:
> ?[Link]
De manera más general, el operador de interrogación se puede utilizar para obtener ayuda en cualquier función R.
Simplemente escriba “?” antes del nombre de la función.
Consejo
El nombre de esta función lleva a algunas personas a utilizar incorrectamente los términos librería y paquete
indistintamente. Sin embargo, para ser exactos, una biblioteca se refiere a la ubicación donde se instalan los
paquetes y nunca a un paquete en sí mismo.
Para cargar el paquete RWeka que instalamos previamente, puede escribir lo siguiente:
> library(RWeka)
Aparte de RWeka, hay varios otros paquetes R que se utilizarán en los capítulos posteriores. Las instrucciones de
instalación se proporcionarán a medida que se utilicen paquetes adicionales.
Para descargar un paquete R, utilice la función detach(). Por ejemplo, para descargar el paquete de RWeka mostrado
anteriormente use el siguiente comando:
R proporciona apoyo para el aprendizaje automático en forma de paquetes creados por la comunidad. Estas
poderosas herramientas son gratuitas para descargar, pero necesitan ser instaladas antes de que puedan ser usadas.
Cada capítulo de este libro presentará los paquetes que sean necesarios.
En el siguiente capítulo, presentaremos más adelante los comandos R básicos que se utilizan para gestionar y
preparar los datos para el aprendizaje de la máquina. Aunque usted puede ser tentado a saltarse este paso y saltar
directamente en el fondo de las cosas, una regla general común sugiere que el 80 por ciento o más del tiempo
pasado en proyectos típicos de aprendizaje de máquinas se dedica a este paso. Como resultado, la inversión en este
trabajo inicial dará sus frutos más adelante.
Cualquier algoritmo de aprendizaje es tan bueno como sus datos de entrada, y en muchos casos, los datos de
entrada son complejos, desordenados y se extienden a través de múltiples fuentes y formatos. Debido a esta
complejidad, a menudo la mayor parte del esfuerzo invertido en proyectos de aprendizaje de máquinas se dedica a
la preparación y exploración de datos.
Este capítulo aborda estos temas de tres maneras. La primera sección discute las estructuras de datos básicas que R
utiliza para almacenar datos. Usted se familiarizará con estas estructuras a medida que cree y manipule conjuntos de
datos. La segunda sección es práctica, ya que cubre varias funciones que son útiles para obtener datos dentro y fuera
de R. En la tercera sección, los métodos para entender los datos se ilustran mientras se explora un conjunto de datos
del mundo real.
Cómo utilizar las estructuras de datos básicas de R para almacenar y extraer datos
Funciones sencillas para obtener datos en R desde formatos de fuente comunes
Métodos típicos para entender y visualizar datos complejos
Dado que la forma en que R piensa acerca de los datos definirá la forma en que usted trabaja con los datos, es útil
conocer las estructuras de datos de R antes de saltar directamente a la preparación de datos. Sin embargo, si usted
ya está familiarizado con la programación R, no dude en pasar a la sección de preprocesamiento de datos.
R estructuras de datos
Existen numerosos tipos de estructuras de datos a través de lenguajes de programación, cada uno con fortalezas y
debilidades adaptadas a tareas particulares. Dado que R es un lenguaje de programación ampliamente utilizado para
el análisis de datos estadísticos, las estructuras de datos que utiliza fueron diseñadas teniendo en cuenta este tipo de
trabajo.
Las estructuras de datos R utilizadas con más frecuencia en el aprendizaje automático son vectores, factores, listas,
matrices y marcos de datos. Cada uno de ellos se adapta a una tarea específica de gestión de datos, lo que hace que
sea importante entender cómo interactuarán en su proyecto de R. En las secciones que siguen, revisaremos sus
similitudes y diferencias.
Vectores
La estructura de datos R fundamental es el vector, que almacena un conjunto ordenado de valores llamado
elementos. Un vector puede contener cualquier número de elementos, pero todos los elementos deben ser del
mismo tipo de valores. Por ejemplo, un vector no puede contener números y texto. Para determinar el tipo de vector
v, utilice el comando typeof(v).
Varios tipos de vectores son comúnmente utilizados en el aprendizaje automático: enteros (números sin decimales),
dobles (números con decimales), caracteres (datos de texto) y lógicos (valores REALES o FALSOS). También hay dos
valores especiales: NULL, que se utiliza para indicar la ausencia de cualquier valor, y NA, que indica un valor que
falta.
Consejo
Algunas funciones R reportarán tanto vectores enteros como dobles como numéricos, mientras que otras
distinguirán entre los dos. Como resultado, aunque todos los vectores dobles son numéricos, no todos los
vectores numéricos son de tipo doble.
Es tedioso introducir grandes cantidades de datos manualmente, pero se pueden crear pequeños vectores usando la
función de combinación c(). El vector también puede recibir un nombre usando el operador <- flecha, que es la
manera de R de asignar valores, al igual que el operador = asignación es usado en muchos otros lenguajes de
programación.
Por ejemplo, construyamos varios vectores para almacenar los datos diagnósticos de tres pacientes médicos. Vamos
a crear un vector de caracteres llamado subject_name para almacenar los tres nombres de los pacientes, un vector
doble llamado temperature para almacenar la temperatura corporal de cada paciente, y un vector lógico llamado
flu_status para almacenar el diagnóstico de cada paciente (TRUE si él o ella tiene influenza, FALSE otherwise).
Veamos el siguiente código para crear estos tres vectores:
Debido a que los vectores R están intrínsecamente ordenados, se puede acceder a los registros contando el número
del elemento en el conjunto, comenzando por uno, y rodeando este número con corchetes cuadrados (es decir,[ y]
después del nombre del vector. Por ejemplo, para obtener la temperatura corporal del paciente Jane Doe (el
segundo elemento en el vector de temperatura) simplemente escriba:
> temperature[2]
[1] 98.6
R ofrece una variedad de métodos convenientes para extraer datos de vectores. Se puede obtener un rango de
valores utilizando el (:) dos puntos. Por ejemplo, para obtener la temperatura corporal de Jane Doe y Steve Graves,
escriba:
> temperature[2:3]
[1] 98.6 101.4
Los elementos se pueden excluir especificando un número de posición negativo. Para excluir los datos de
temperatura de la Jane Doe, escriba:
> temperature[-2]
[1] 98.1 101.4
Por último, a veces también es útil especificar un vector lógico que indique si se debe incluir cada elemento. Por
ejemplo, para incluir las dos primeras lecturas de temperatura, pero excluir la tercera, escriba:
Como verán en breve, el vector proporciona la base para muchas otras estructuras de datos R. Por lo tanto, el
conocimiento de las diversas operaciones vectoriales es crucial para trabajar con datos en R.
Consejo
Descarga del código de ejemplo
Puede descargar los archivos de código de ejemplo para todos los libros Packt que haya comprado en su cuenta
en [Link] Si compró este libro en otra parte, puede visitar
[Link] y registrarse para recibir los archivos directamente por correo electrónico.
Nuevo en la segunda edición de este libro, el código de ejemplo también está disponible a través de GitHub en
[Link] Consulta aquí el código R más actualizado, así como el seguimiento
de incidencias y un wiki público. Por favor únase a la comunidad!
Factores
Si recuerda el capítulo 1, Introducción al aprendizaje automático, las características que representan una
característica con categorías de valores se conocen como nominales. Aunque es posible utilizar un vector de
caracteres para almacenar datos nominales, R proporciona una estructura de datos específica para este propósito.
Un factor es un caso especial de vector que se utiliza únicamente para representar variables categóricas u ordinales.
En el conjunto de datos médicos que estamos construyendo, podríamos usar un factor para representar el género,
porque usa dos categorías: MASCULINO y FEMENINO.
¿Por qué no usar vectores de caracteres? Una ventaja de los factores es que las etiquetas de categoría se almacenan
sólo una vez. Por ejemplo, en lugar de almacenar MASCULINO, HOMBRE, HEMBRA, el ordenador puede almacenar
1,1,2, lo que reduce el tamaño de la memoria necesaria para almacenar la misma información. Además, muchos
algoritmos de aprendizaje automático tratan los datos nominales y numéricos de forma diferente. La codificación
como factores a menudo es necesaria para informar a una función R para tratar los datos categóricos
apropiadamente.
Consejo
No debe utilizarse un factor para los vectores de caracteres que no son verdaderamente categóricos. Si un
vector almacena mayormente valores únicos como nombres o cadenas de identificación, guárdelo como un
vector de caracteres.
Para crear un factor a partir de un vector de caracteres, simplemente aplique la función factor(). Por ejemplo:
Note que cuando se mostraron los datos de género para John Doe y Jane Doe, R imprimió información adicional
sobre el factor de género. La variable de niveles comprende el conjunto de posibles categorías que podría tener el
factor, en este caso: MASCULINO o FEMENINO.
Cuando creamos factores, podemos añadir niveles adicionales que pueden no aparecer en los datos. Supongamos
que añadimos otro factor para el grupo sanguíneo, como se muestra en el siguiente ejemplo:
Note que cuando definimos el factor blood para los tres pacientes, especificamos un vector adicional de cuatro
posibles grupos sanguíneos usando el parámetro de niveles. Como resultado, aunque nuestros datos incluyeron sólo
los tipos O, AB y A, los cuatro tipos se almacenan con el factor sanguíneo indicado por el resultado. El
almacenamiento del nivel adicional permite la posibilidad de añadir datos con los otros grupos sanguíneos en el
futuro. También asegura que si creáramos una tabla de tipos sanguíneos, sabríamos que el tipo B existe, a pesar de
que no está registrado en nuestros datos.
La estructura de datos factoriales también nos permite incluir información sobre el orden de las categorías de una
variable nominal, lo que proporciona una forma conveniente de almacenar los datos ordinales. Por ejemplo,
supongamos que tenemos datos sobre la gravedad de los síntomas de un paciente codificados en un nivel creciente
de gravedad de leve a moderado, a severo. Indicamos la presencia de datos ordinales proporcionando los levels del
factor en el orden deseado, listados en orden ascendente de menor a mayor, y fijando el parámetro ordered en
TRUE, como se muestra a continuación.
El factor de síntomas resultante ahora incluye información sobre el pedido solicitado. A diferencia de nuestros
factores anteriores, los niveles de este factor están separados por símbolos <, para indicar la presencia de un orden
secuencial de leve a severo:
> symptoms
[1] SEVERE MILD MODERATE
Levels: MILD < MODERATE < SEVERE
Una característica útil de los factores ordenados es que las pruebas lógicas funcionan como usted espera. Por
ejemplo, podemos comprobar si los síntomas de cada paciente son mayores que moderados:
Los algoritmos de aprendizaje automático capaces de modelar datos ordinales esperarán los factores ordenados, así
que asegúrese de codificar sus datos en consecuencia.
Listas
Una lista es una estructura de datos, muy parecida a un vector, en la que se utiliza para almacenar un conjunto
ordenado de elementos. Sin embargo, cuando un vector requiere que todos sus elementos sean del mismo tipo, una
lista permite que se recojan diferentes tipos de elementos. Debido a esta flexibilidad, las listas se utilizan a menudo
para almacenar varios tipos de datos de entrada y salida, así como conjuntos de parámetros de configuración para
modelos de aprendizaje de máquinas.
Para ilustrar las listas, considere el conjunto de datos de pacientes médicos que hemos estado construyendo con los
datos de tres pacientes almacenados en seis vectores. Si queremos mostrar todos los datos de Juan Nadie (tema 1),
necesitaríamos introducir cinco comandos R:
> subject_name[1]
[1] "John Doe"
> temperature[1]
[1] 98.1
> flu_status[1]
[1] FALSE
> gender[1]
[1] MALE
Levels: FEMALE MALE
> blood[1]
[1] O
Levels: A B AB O
> symptoms[1]
[1] SEVERE
Levels: MILD < MODERATE < SEVERE
Esto parece mucho trabajo para mostrar los datos médicos de un paciente. La estructura de la lista nos permite
agrupar todos los datos del paciente en un objeto que podemos utilizar repetidamente.
Similar a la creación de un vector con c(), se crea una lista utilizando la función list(), como se muestra en el siguiente
ejemplo. Una diferencia notable es que cuando se construye una lista, a cada componente de la secuencia casi
siempre se le da un nombre. Los nombres no son técnicamente obligatorios, pero permiten acceder a los valores de
la lista más adelante por nombre y no por posición numerada. Para crear una lista con los componentes nombrados
para todos los datos del primer paciente, escriba lo siguiente:
> subject1
$fullname
[1] "John Doe"
$temperature
[1] 98.1
$flu_status
[1] FALSE
$gender
[1] MALE
Levels: FEMALE MALE
$blood
[1] O
Levels: A B AB O
$symptoms
[1] SEVERE
Levels: MILD < MODERATE < SEVERE
Tenga en cuenta que los valores están etiquetados con los nombres que especificamos en el comando anterior. Sin
embargo, todavía se puede acceder a una lista usando métodos similares a un vector. Para acceder al valor de
temperatura, utilice el siguiente comando:
> subject1[2]
$temperature
[1] 98.1
El resultado de utilizar operadores vectoriales en un objeto de lista es otro objeto de lista, que es un subconjunto de
la lista original. Por ejemplo, el código anterior devuelve una lista con un solo componente de temperatura. Por
ejemplo, lo siguiente devuelve un vector numérico de longitud uno:
> subject1[[2]]
[1] 98.1
Para mayor claridad, a menudo es más fácil acceder directamente a los componentes de la lista, añadiendo un $ y el
nombre del valor al nombre del componente de la lista, como sigue:
> subject1$temperature
[1] 98.1
Al igual que la notación de doble corchete, devuelve el componente de lista en su tipo de datos nativo (en este caso,
un vector numérico de longitud uno).
Consejo
El acceso al valor por nombre también garantiza que se recupere la posición correcta, incluso si el orden de los
elementos de la lista se modifica posteriormente.
Es posible obtener varios elementos en una lista especificando un vector de nombres. A continuación se muestra un
subconjunto de la lista subject1, que contiene sólo los componentes temperature y flu_status:
$flu_status
[1] FALSE
Se podrían construir conjuntos de datos enteros utilizando listas y listas de listas. Por ejemplo, podría considerar la
posibilidad de crear una lista subject2 y subject3, y combinarlas en un solo objeto de lista llamado pt_data. Sin
embargo, la construcción de un conjunto de datos de esta manera es lo suficientemente común como para que R
proporcione una estructura de datos especializada específicamente para esta tarea.
Marcos de datos
Con mucho, la estructura de datos R más importante utilizada en el aprendizaje automático es el marco de datos,
una estructura análoga a una hoja de cálculo o base de datos, ya que tiene filas y columnas de datos. En términos de
R, un marco de datos puede entenderse como una lista de vectores o factores, cada uno de los cuales tiene
exactamente el mismo número de valores. Debido a que el marco de datos es literalmente una lista de objetos de
tipo vectorial, combina aspectos de vectores y listas.
Vamos a crear un marco de datos para nuestro conjunto de datos de pacientes. Usando los vectores de datos del
paciente que creamos previamente, la función [Link] () los combina en un marco de datos:
Es posible que note algo nuevo en el código anterior. Incluimos un parámetro adicional: stringsAsFactors = FALSE. Si
no especificamos esta opción, R convertirá automáticamente cada vector de carácter a un factor.
Esta característica es ocasionalmente útil, pero también a veces injustificada. Aquí, por ejemplo, el campo
subject_name definitivamente no es un dato categórico, ya que los nombres no son categorías de valores. Por lo
tanto, al establecer la opción stringsAsFactors en FALSE, nos permite convertir los vectores de caracteres a factores
sólo cuando tenga sentido para el proyecto.
Cuando mostramos el marco de datos pt_data, vemos que la estructura es muy diferente de las estructuras de datos
con las que trabajamos anteriormente:
> pt_data
subject_name temperature flu_status gender blood symptoms
1 John Doe 98.1 FALSE MALE O SEVERE
2 Jane Doe 98.6 FALSE FEMALE AB MILD
3 Steve Graves 101.4 TRUE MALE A MODERATE
En comparación con los vectores, factores y listas unidimensionales, un marco de datos tiene dos dimensiones y se
muestra en formato de matriz. Este marco de datos en particular tiene una columna para cada vector de datos del
paciente y una fila para cada paciente. En términos de aprendizaje automático, las columnas del marco de datos son
las características o atributos y las filas son los ejemplos.
Para extraer columnas (vectores) enteras de datos, podemos aprovechar el hecho de que un marco de datos es
simplemente una lista de vectores. Al igual que las listas, la forma más directa de extraer un solo elemento es
referirse a él por su nombre. Por ejemplo, para obtener el vector subject_name, escriba:
> pt_data$subject_name
[1] "John Doe" "Jane Doe" "Steve Graves"
También similar a las listas, un vector de nombres puede ser usado para extraer varias columnas de un marco de
datos:
Cuando accedemos al marco de datos de esta manera, el resultado es un marco de datos que contiene todas las filas
de datos para todas las columnas solicitadas. Alternativamente, el comando pt_data[2:3] extraerá también las
columnas temperature y flu_status. Sin embargo, solicitar las columnas por nombre resulta en un código R claro y
fácil de mantener que no se romperá si el marco de datos se reestructura en el futuro.
Para extraer valores en el marco de datos, se utilizan métodos como los utilizados para acceder a valores en
vectores. Sin embargo, hay una excepción importante. Debido a que el marco de datos es bidimensional, se deben
especificar tanto las filas como las columnas deseadas que se van a extraer. Las filas se especifican primero, seguidas
por una coma y luego las columnas en un formato como éste:[líneas, columnas]. Al igual que con los vectores, las
filas y columnas se cuentan a partir de uno.
Por ejemplo, para extraer el valor de la primera fila y la segunda columna del cuadro de datos del paciente (el valor
de temperatura para John Doe), utilice el siguiente comando:
> pt_data[1, 2]
[1] 98.1
Si desea más de una sola fila o columna de datos, especifique vectores para las filas y columnas deseadas. El
siguiente comando extraerá datos de la primera y tercera filas y de las columnas segunda y cuarta:
Para extraer todas las filas o columnas, simplemente deje en blanco la parte de fila o columna. Por ejemplo, para
extraer todas las filas de la primera columna:
> pt_data[, 1]
[1] "John Doe" "Jane Doe" "Steve Graves"
Para extraer todas las columnas de la primera fila, utilice el siguiente comando:
> pt_data[1, ]
subject_name temperature flu_status gender blood symptoms
1 John Doe 98.1 FALSE MALE O SEVERE
> pt_data[ , ]
subject_name temperature flu_status gender blood symptoms
1 John Doe 98.1 FALSE MALE O SEVERE
2 Jane Doe 98.6 FALSE FEMALE AB MILD
3 Steve Graves 101.4 TRUE MALE A MODERATE
Otros métodos para acceder a los valores de las listas y vectores también se pueden utilizar para recuperar filas y
columnas de marcos de datos. Por ejemplo, se puede acceder a las columnas por nombre en lugar de por posición, y
se pueden utilizar signos negativos para excluir filas o columnas de datos. Por lo tanto, el siguiente comando:
Es equivalente a:
Para familiarizarse más con los marcos de datos, intente practicar operaciones similares con el conjunto de datos del
paciente o, mejor aún, utilice datos de uno de sus propios proyectos. Estos tipos de operaciones son cruciales para
gran parte del trabajo que haremos en los próximos capítulos.
Matrices y arrays
Además de marcos de datos, R proporciona otras estructuras que almacenan valores en forma de tabla. Una matriz
es una estructura de datos que representa una tabla bidimensional con filas y columnas de datos. Al igual que los
vectores, las matrices R pueden contener cualquier tipo de datos, aunque se utilizan con mayor frecuencia para
operaciones matemáticas y, por lo tanto, normalmente sólo almacenan datos numéricos.
Para crear una matriz, simplemente suministre un vector de datos a la función matrix() junto con un parámetro que
especifique el número de filas (nrow) o el número de columnas (ncol). Por ejemplo, para crear una matriz de 2 x 2
que almacene los números del uno al cuatro, podemos usar el parámetro de filas para solicitar que los datos se
dividan en dos filas:
Notará que R cargó la primera columna de la matriz primero antes de cargar la segunda columna. Esto se llama
orden mayor de columna, y es el método por defecto de R para cargar matrices.
Consejo
Para sustituir esta configuración predeterminada y cargar una matriz por filas, fije el parámetro byrow = TRUE al
crear la matriz.
Para ilustrar esto más adelante, veamos qué sucede si añadimos más valores a la matriz.
Con seis valores, solicitando dos filas se crea una matriz con tres columnas:
Al igual que con los marcos de datos, los valores en las matrices se pueden extraer utilizando la notación[fila,
columna]". Por ejemplo, m[1,1] devolverá el valor 1 y m[3,2] extraerá 6 de la matriz m. Además, se pueden solicitar
filas o columnas enteras:
> m[1, ]
[1] 1 4
> m[, 1]
[1] 1 2 3
Estrechamente relacionado con la estructura de la matriz está el array, que es una tabla multidimensional de datos.
Cuando una matriz tiene filas y columnas de valores, una matriz tiene filas, columnas y cualquier número de capas de
valores adicionales. Aunque ocasionalmente usaremos matrices en los próximos capítulos, el uso de matrices está
fuera del alcance de este libro.
Suponga que tiene tres objetos llamados x, y, z que le gustaría guardar en un archivo permanente.
Independientemente de si son vectores, factores, listas o marcos de datos, podríamos guardarlos en un archivo
llamado [Link] usando el siguiente comando:
El comando load() puede recrear cualquier estructura de datos que se haya guardado en un [Link]. Para
cargar el archivo [Link] guardado en el código anterior, simplemente escriba:
> load("[Link]")
¡Tenga cuidado con lo que está cargando! Todas las estructuras de datos almacenadas en el archivo que está
importando con el comando load () se añadirán a su espacio de trabajo, incluso si sobrescriben algo más en lo que
está trabajando.
Si necesita terminar su sesión de R con prisa, el comando [Link]() escribirá su sesión entera en un archivo
llamado [Link]. De forma predeterminada, R buscará este archivo la próxima vez que inicie R, y su
sesión se recreará tal como la había dejado.
Después de trabajar en una sesión R durante algún tiempo, es posible que haya acumulado varias estructuras de
datos. La función ls() devuelve un vector de todas las estructuras de datos que se encuentran en la memoria. Por
ejemplo, si ha estado siguiendo el código de este capítulo, la función ls() devuelve lo siguiente:
> ls()
[1] "blood" "flu_status" "gender" "m"
[5] "pt_data" "subject_name" "subject1" "symptoms"
[9] "temperature"
R los eliminará automáticamente de su memoria al salir de la sesión, pero en el caso de las grandes estructuras de
datos, es posible que desee liberar la memoria antes. La función de eliminación rm() puede utilizarse para este fin.
Por ejemplo, para eliminar los objetos m y subject1, simplemente escriba:
La función rm() también se puede suministrar con un vector de caracteres de los nombres de los objetos a eliminar.
Funciona con la función ls() para borrar toda la sesión R:
> rm(list=ls())
¡Tenga mucho cuidado al ejecutar el comando anterior, ya que no se le pedirá que lo haga antes de quitar sus
objetos!
Un archivo de datos tabular (como en "tabla") está estructurado en forma de matriz, de manera que cada línea de
texto refleja un ejemplo, y cada ejemplo tiene el mismo número de características. Los valores de característica de
cada línea están separados por un símbolo predefinido, conocido como delimitador. A menudo, la primera línea de
un archivo de datos tabular enumera los nombres de las columnas de datos. Esto se denomina línea de cabecera.
Tal vez el formato de archivo de texto tabular más común es el archivo CSV (Comma-Separated Values), que como el
nombre sugiere, usa la coma como delimitador. Los archivos CSV se pueden importar y exportar desde muchas
aplicaciones comunes. Un archivo CSV que representa el conjunto de datos médicos construido previamente podría
ser almacenado como:
subject_name,temperature,flu_status,gender,blood_type
John Doe,98.1,FALSE,MALE,O
Jane Doe,98.6,FALSE,FEMALE,AB
Steve Graves,101.4,TRUE,MALE,A
Dado un archivo de datos del paciente llamado pt_data.csv ubicado en el directorio de trabajo R, la función
[Link]() puede ser usada como sigue para cargar el archivo en R:
> pt_data <- [Link]("pt_data.csv", stringsAsFactors = FALSE)
Esto leerá el archivo CSV en un marco de datos titulado pt_data. Al igual que lo hicimos anteriormente durante la
construcción de un marco de datos, necesitamos usar el parámetro stringsAsFactors = FALSE para evitar que R
convierta todas las variables de texto en factores. Este paso es mejor dejárselo a usted, no a R, para que lo realice.
Consejo
Si su conjunto de datos se encuentra fuera del directorio de trabajo R, la ruta completa al archivo CSV (por
ejemplo, /path/to/mydata. csv) se puede utilizar al llamar a la función read. csv ().
Por defecto, R asume que el archivo CSV incluye una línea de encabezado que enumera los nombres de las
características en el conjunto de datos. Si un archivo CSV no tiene encabezado, especifique la opcion header = FALSE,
como se muestra en el siguiente comando, y R asignará los nombres de las características predeterminadas en los
formularios V1 y V2 y así sucesivamente.
La función [Link] () es un caso especial de la función [Link] (), que puede leer datos tabulares en muchas
formas diferentes, incluyendo otros formatos delimitados como Tab-Separated Values (TSV). Para obtener
información más detallada sobre la familia de funciones [Link] (), consulte la página de ayuda R usando el
comando ? [Link].
Para guardar un marco de datos en un archivo CSV, utilice la función [Link] (). Si su marco de datos se llama
pt_data, simplemente introduzca:
Esto escribirá un archivo CSV con el nombre pt_data.csv en la carpeta de trabajo R. El parámetro [Link] anula la
configuración predeterminada de R, que es dar nombre a las filas en el archivo CSV. A menos que se hayan agregado
nombres de fila a un marco de datos, este resultado es innecesario y simplemente inflará el tamaño del archivo
resultante.