Qué es el control de versiones?
Completado100 XP
5 minutos
Un sistema de control de versiones (VCS) es un programa o conjunto de
programas que realiza un seguimiento de los cambios en una colección de
archivos. Uno de los objetivos de un VCS es recuperar fácilmente versiones
anteriores de archivos individuales o de todo el proyecto. Otro objetivo es
permitir que varios miembros de un equipo trabajen en un proyecto, incluso en
los mismos archivos, al mismo tiempo sin que eso afecte al trabajo de los
demás.
Otro nombre para un VCS es un sistema de administración de configuración de
software (SCM). Los dos términos suelen usarse indistintamente; de hecho, la
documentación oficial de Git se encuentra en [Link]. Técnicamente, el
control de versiones es solo uno de los procedimientos que implica el SCM. Un
VCS se puede usar para otros proyectos además de los de software, incluidos
libros y tutoriales en línea.
Con un VCS, puede:
Ver todos los cambios realizados en el proyecto, cuándo se hicieron
los cambios y quién los efectuó.
Incluir un mensaje con cada cambio para explicar los motivos.
Recuperar versiones anteriores del proyecto completo o de archivos
individuales.
Crear ramas, donde los cambios se pueden hacer
experimentalmente. Esta característica permite que se trabaje en
varios conjuntos de cambios diferentes (por ejemplo, características
o correcciones de errores) al mismo tiempo, posiblemente personas
distintas, sin que ello afecte a la rama principal. Más adelante se
pueden combinar los cambios que se quieren mantener en la rama
principal.
Adjuntar una etiqueta a una versión, por ejemplo, para marcar una
nueva versión.
Git es un VCS de código abierto rápido, versátil, muy escalable y gratuito. Su
autor principal es Linux Torvalds, creador de Linux.
Control de versiones distribuido
Las instancias anteriores de los VCS, como CVS, Subversion (SVN) y Perforce,
usaban un servidor centralizado para almacenar el historial de un proyecto. Esta
centralización significaba que un solo servidor también era un único punto de
error en potencia.
Git es un sistema distribuido, lo que significa que el historial completo de un
proyecto se almacena en el cliente y en el servidor. Se pueden editar archivos
sin conexión de red, protegerlos localmente y sincronizarlos con el servidor
cuando una conexión esté disponible. Si un servidor deja de funcionar, todavía
tendrá una copia local del proyecto. Técnicamente, ni siquiera es necesario
tener un servidor. Los cambios pueden pasarse por correo electrónico o
compartirse mediante medios extraíbles, pero, en la práctica, nadie usa Git así.
Terminología de Git
Para entender Git, debe comprender la terminología. Esta es una breve lista de
los términos que los usuarios de Git emplean con frecuencia. De momento no
se preocupe por los detalles; todos estos términos le irán resultando familiares a
medida que avanza por los ejercicios de este módulo.
Árbol de trabajo: conjunto de directorios y archivos anidados que
contienen el proyecto en el que se trabaja.
Repositorio (repo): directorio, situado en el nivel superior de un
árbol de trabajo, donde Git mantiene todo el historial y los
metadatos de un proyecto. A veces se hace referencia a los
repositorios como repos. Un repositorio vacío es aquel que no forma
parte de un árbol de trabajo; se usa para compartir o realizar copias
de seguridad. Un repositorio vacío suele ser un directorio con un
nombre que acaba en .git, por ejemplo, [Link].
Hash: número generado por una función hash que representa el
contenido de un archivo u otro objeto como un número de dígitos
fijo. Git usa hashes de 160 bits de longitud. Una ventaja de usar
códigos hash es que Git puede indicar si un archivo ha cambiado
aplicando un algoritmo hash a su contenido y comparando el
resultado con el hash anterior. Si se cambia la marca de fecha y
hora del archivo, pero el hash del archivo no, Git sabe que el
contenido del archivo no se ha modificado.
Objeto: un repositorio de Git contiene cuatro tipos de objetos, cada
uno identificado de forma única por un hash SHA-1. Un
objeto blob contiene un archivo normal. Un objeto árbol representa
un directorio, y contiene nombres, valores hash y permisos. Un
objeto de confirmación representa una versión específica del árbol
de trabajo. Una etiqueta es un nombre asociado a una confirmación.
Confirmación: cuando se usa como verbo, confirmar significa crear
un objeto de confirmación. Esta acción toma su nombre de las
confirmaciones en una base de datos. Significa que se confirman los
cambios realizados para que otros usuarios también puedan verlos.
Rama: serie con nombre de confirmaciones vinculadas. La
confirmación más reciente en una rama se denomina nivel superior.
La rama predeterminada, que se crea al inicializar un repositorio, se
denomina main, y suele tener el nombre master en Git. El nivel
superior de la rama actual se denomina HEAD. Las ramas son una
característica increíblemente útil de Git porque permiten a los
desarrolladores trabajar de forma independiente (o conjunta) en
ramas y luego combinar los cambios en la rama predeterminada.
Remoto: referencia con nombre a otro repositorio de Git. Cuando
se crea un repositorio, Git crea un remoto denominado origin, que
es el remoto predeterminado para las operaciones de envío e
incorporación de cambios.
Comandos, subcomandos y opciones: las operaciones de Git se
realizan mediante comandos como git push y git pull. git es el
comando, mientras que push o pull es el subcomando. El
subcomando especifica la operación que quiere que Git realice. Los
comandos suelen ir acompañados de opciones, que usan guiones
(-) o guiones dobles (--). Por ejemplo, git reset --hard.
Estos términos y otros, como push e pull, tendrán más sentido en breve. Pero
tiene que empezar por algún lado, y puede que le resulte útil volver y revisar
este glosario de términos después de terminar este módulo.
Herramientas de línea de comandos de Git
Hay varias GUI diferentes disponibles para Git, incluido GitHub Desktop.
Muchos editores de programación, como Visual Studio Code de Microsoft,
también tienen una interfaz para Git. Todos funcionan de manera diferente y
tienen distintas limitaciones. Ninguno de ellos implementa toda la funcionalidad
de Git.
En los ejercicios de este módulo se usa la línea de comandos de Git, en concreto
los comandos de Git que se ejecutan en Azure Cloud Shell. Pero la interfaz de la
línea de comandos de Git funciona lo mismo independientemente del sistema
operativo que se use. Además, la línea de comandos le permite
aprovechar toda la capacidad de Git. Los desarrolladores que ven Git solo por
medio de una GUI a veces reciben mensajes de error que no pueden resolver,
por lo que tienen que recurrir a la línea de comandos para empezar de nuevo.
Git y GitHub
Cuando trabaje con Git se preguntará sobre las diferencias entre las
características que ofrece y las incluidas en GitHub.
Como se ha mencionado anteriormente, Git es un sistema de control de
versiones distribuido (DVCS) que varios desarrolladores y otros colaboradores
pueden usar para trabajar en un proyecto. Proporciona una manera de trabajar
con una o varias ramas locales y luego insertarlas en un repositorio remoto.
GitHub es una plataforma en la nube que usa Git como tecnología principal.
Simplifica el proceso de colaboración en proyectos y proporciona un sitio web,
más herramientas de línea de comandos y un flujo integral que los
desarrolladores y usuarios pueden usar para trabajar juntos. GitHub actúa como
el repositorio remoto mencionado anteriormente.
Entre las características clave que ofrece GitHub se incluyen las siguientes:
Issues
Debates
Solicitudes de incorporación de cambios
Notificaciones
Etiquetas
Acciones
Horquillas
Proyectos
Ejercicio: Prueba de Git
Completado100 XP
5 minutos
Microsoft Learn necesita su permiso para crear recursos de Azure.
Para obtener más información, consulte la página con la guía de solución de
problemas.
Revisar permisos
Para poder crear el primer repositorio, debe asegurarse de que Git está
instalado y configurado. Git está preinstalado en Azure Cloud Shell, por lo que
podemos usar Git en Cloud Shell, a la derecha.
Configuración de Git
1. En Cloud Shell, para comprobar que Git está instalado, escriba git
--version:
BashCopiar
git --version
Sugerencia
Puede usar el botón Copiar para copiar los comandos en el
Portapapeles. Para pegarlos, haga clic con el botón derecho en una
nueva línea en el terminal de Cloud Shell y seleccione Pegar, o bien
use el método abreviado de teclado Mayús+Insert (⌘+V en
macOS).
2. Debería ver una salida similar a la de este ejemplo:
ResultadoCopiar
git version 2.7.4
3. Para configurar Git, debe definir algunas variables
globales: [Link] y [Link]. Ambas son necesarias para realizar
confirmaciones.
4. Establezca su nombre en Cloud Shell con el siguiente comando.
Reemplace <USER_NAME> por el nombre de usuario que quiere usar.
BashCopiar
git config --global [Link] "<USER_NAME>"
5. Ahora, use este comando para crear una variable de
configuración [Link]; para ello, reemplace <USER_EMAIL> por su
dirección de correo electrónico:
BashCopiar
git config --global [Link] "<USER_EMAIL>"
6. Ejecute el siguiente comando para comprobar que los cambios han
funcionado:
BashCopiar
git config --list
7. Confirme que la salida incluye dos líneas similares al siguiente
ejemplo. El nombre y la dirección de correo electrónico serán
distintos a los que se muestran en el ejemplo.
ResultadoCopiar
[Link]=User Name
[Link]=user-name@[Link]
Configuración del repositorio de Git
Git funciona buscando cambios en los archivos dentro de una determinada
carpeta. Vamos a crear una carpeta que actúe como árbol de trabajo (directorio
del proyecto) y a permitir que Git sepa sobre ella para que pueda comenzar a
seguir los cambios. Se indica a Git que empiece a realizar el seguimiento de los
cambios mediante la inicialización de un repositorio de Git en esa carpeta.
Empiece por crear una carpeta vacía para el proyecto y luego inicialice un
repositorio de Git dentro de ella.
1. Cree una carpeta con el nombre Cats. Esta carpeta va a ser el
directorio del proyecto, también denominado árbol de trabajo. El
directorio del proyecto es donde se almacenan todos los archivos
relacionados con el proyecto. En este ejercicio, es donde se
almacenan el sitio web y los archivos que crean el sitio web y su
contenido.
BashCopiar
mkdir Cats
2. Vaya al directorio del proyecto mediante el comando cd:
BashCopiar
cd Cats
3. Ahora, inicialice el nuevo repositorio y establezca el nombre de la
rama predeterminada en main:
Si está ejecutando la versión 2.28.0 o una posterior de Git, use los
comandos siguientes:
BashCopiar
git init --initial-branch=main
git init -b main
En versiones anteriores de Git, use estos comandos:
BashCopiar
git init
git checkout -b main
Después de ejecutar el comando de inicialización, debería ver una
salida similar a la de este ejemplo:
ResultadoCopiar
Initialized empty Git repository in /home/<user>/Cats/.git/
Switched to a new branch 'main'
4. Ahora, use un comando git status para mostrar el estado del árbol
de trabajo:
BashCopiar
git status
Git responde con esta salida, que indica que master es la rama
actual. (De hecho, también es la única rama). Por ahora todo está
claro.
ResultadoCopiar
On branch master
No commits yet
nothing to commit (create/copy files and use "git add" to track)
5. Use un comando ls para mostrar el estado del árbol de trabajo:
BashCopiar
ls -a
Confirme que el directorio contiene un subdirectorio
denominado .git. (El uso de la opción -a con ls es importante, ya
que Linux normalmente oculta los nombres de archivos y
directorios que comienzan con un punto). Esta carpeta es
el repositorio de Git: el directorio en el que Git almacena los
metadatos y el historial del árbol de trabajo.
Normalmente no se hace nada directamente con el directorio .git.
Git actualiza los metadatos a medida que el estado del árbol de
trabajo cambia para mantener un seguimiento de lo que ha
cambiado en sus archivos. Este directorio es práctico para usted,
pero es increíblemente importante para Git.
Ayuda desde Git
Git, al igual que la mayoría de las herramientas de línea de comandos, tiene una
función de ayuda integrada que se puede usar para buscar comandos y
palabras clave.
1. Escriba el comando siguiente para obtener ayuda sobre lo que
puede hacer con Git:
BashCopiar
git --help
2. El comando muestra la salida siguiente:
ResultadoCopiar
usage: git [--version] [--help] [-C <path>] [-c name=value]
[--exec-path[=<path>]] [--html-path] [--man-path] [--info-
path]
[-p | --paginate | --no-pager] [--no-replace-objects] [--
bare]
[--git-dir=<path>] [--work-tree=<path>] [--
namespace=<name>]
<command> [<args>]
These are common Git commands used in various situations:
start a working area (see also: git help tutorial)
clone Clone a repository into a new directory
init Create an empty Git repository or reinitialize an
existing one
work on the current change (see also: git help everyday)
add Add file contents to the index
mv Move or rename a file, a directory, or a symlink
reset Reset current HEAD to the specified state
rm Remove files from the working tree and from the
index
examine the history and state (see also: git help revisions)
bisect Use binary search to find the commit that
introduced a bug
grep Print lines matching a pattern
log Show commit logs
show Show various types of objects
status Show the working tree status
grow, mark and tweak your common history
branch List, create, or delete branches
checkout Switch branches or restore working tree files
commit Record changes to the repository
diff Show changes between commits, commit and working
tree, etc
merge Join two or more development histories together
rebase Forward-port local commits to the updated upstream
head
tag Create, list, delete or verify a tag object signed
with GPG
collaborate (see also: git help workflows)
fetch Download objects and refs from another repository
pull Fetch from and integrate with another repository or
a local branch
push Update remote refs along with associated objects
'git help -a' and 'git help -g' list available subcommands and
some
concept guides. See 'git help <command>' or 'git help <concept>'
to read about a specific subcommand or concept.
Lea las distintas opciones disponibles con Git y observe que cada comando
incluye su propia página de ayuda, para cuando empiece a profundizar más. No
todos estos comandos tendrán sentido todavía, pero es posible que algunos le
resulten familiares si tiene experiencia con un VCS.
En la lección siguiente va a obtener más información sobre los comandos que
acaba de probar y los aspectos básicos de Git.
Comandos básicos de Git
Completado100 XP
10 minutos
Git recuerda los cambios efectuados en los archivos como si tomara
instantáneas del sistema de archivos.
Vamos a hablar de algunos comandos básicos para iniciar el seguimiento de los
archivos del repositorio. Luego va a guardar la primera "instantánea" con la que
Git va a comparar.
git status
El primer comando de Git, y el que se usa con más frecuencia, es git status. Ya
lo ha usado una vez en el ejercicio anterior para ver que había inicializado
correctamente el repositorio de Git.
git status muestra el estado del árbol de trabajo (y del área de
almacenamiento provisional, de la que pronto hablaremos más). Permite ver los
cambios que Git está siguiendo en ese momento para poder decidir si quiere
pedir a Git que tome otra instantánea.
git add
git add es
el comando que se usa para indicar a Git que empiece a realizar un
seguimiento de los cambios en determinados archivos.
El término técnico es almacenamiento provisional de estos cambios. Va a
usar git add para almacenar provisionalmente los cambios a fin de prepararse
para una confirmación. Todos los cambios en los archivos que se han agregado
pero que aún no se han confirmado se almacenan en el área de
almacenamiento provisional.
git commit
Después de haber almacenado provisionalmente algunos cambios para su
confirmación, puede guardar el trabajo en una instantánea si invoca al
comando git commit.
Confirmar (o "commit") es un verbo y un sustantivo. Básicamente tiene el mismo
significado que cuando se confirma en un plan o se confirma un cambio en una
base de datos. Como verbo, la confirmación de cambios significa que se coloca
una copia (del archivo, el directorio u otra "cosa") en el repositorio como una
nueva versión. Como sustantivo, una confirmación es el pequeño fragmento de
datos que asigna una identidad única a los cambios que se confirman. Los datos
que se guardan en una confirmación incluyen el nombre del autor y la dirección
de correo electrónico, la fecha, los comentarios sobre lo que se ha hecho (y por
qué), una firma digital opcional y el identificador único de la confirmación
anterior.
git log
El comando git log permite ver información sobre las confirmaciones
anteriores. Cada confirmación tiene un mensaje adjunto (un mensaje de
confirmación), y el comando git log permite imprimir información sobre las
confirmaciones más recientes, como su marca de tiempo, el autor y un mensaje
de confirmación. Este comando ayuda a realizar un seguimiento de lo que ha
estado haciendo y de los cambios que se han guardado.
git help
Ya ha probado el comando git help, pero vale la pena recordar ciertas cosas.
Use este comando para obtener información fácilmente sobre todos los
comandos que conoce hasta ahora y más.
Recuerde que cada comando incluye también su propia página de ayuda. Para
encontrar estas páginas de ayuda, escriba git <command> --help. Por
ejemplo, git commit --help muestra una página que proporciona más
información sobre el comando git commit y cómo usarlo.
¿Qué es GitHub?
Completado100 XP
8 minutos
Aquí se describen las principales características de GitHub que se usan a diario
para administrar y contribuir a proyectos de software.
El flujo de GitHub
Además de ser una plataforma de desarrollo de software colaborativo, GitHub
ofrece también un flujo de trabajo diseñado para optimizar el uso de sus
diversas características. Aunque esta unidad ofrece una visión general de los
componentes importantes de la plataforma, se recomienda que primero
revise Descripción del flujo de GitHub.
Git y GitHub
Cuando trabaje con Git y GitHub, es posible que se pregunte en qué se
diferencian.
Git es un sistema de control de versiones distribuido (DVCS) que permite que
varios desarrolladores u otros colaboradores trabajen en un proyecto.
Proporciona una manera de trabajar con una o varias ramas locales e insertarlas
en un repositorio remoto. Git es responsable de todo lo que sucede localmente
en el equipo relacionado con GitHub. Entre las características clave que ofrece
Git se incluyen las siguientes:
Está instalado y se usa en el equipo local.
Se ocupa del control de versiones.
Admite la creación de ramas.
Para obtener más información sobre Git, consulte Uso de comandos comunes
de Git.
GitHub es una plataforma en la nube que usa Git como tecnología principal.
Simplifica el proceso de colaborar en proyectos y proporciona un sitio web,
herramientas de línea de comandos y un flujo global que permite a los
desarrolladores y usuarios trabajar juntos. GitHub actúa como el "repositorio
remoto" mencionado anteriormente en la sección Git.
Entre las características clave que ofrece GitHub se incluyen las siguientes:
Issues
Debates
Solicitudes de incorporación de cambios
Notificaciones
Etiquetas
Acciones
Horquillas
Proyectos
Para obtener más información sobre GitHub, consulte Introducción a GitHub.
Incidencias
Las incidencias son el elemento en el que se produce la mayor parte de la
comunicación entre los consumidores y el equipo de desarrollo de un proyecto.
Se puede crear una incidencia para analizar una amplia variedad de temas,
como informes de errores, solicitudes de características, aclaraciones sobre la
documentación, etc. Una vez que se ha creado una incidencia, se puede asignar
a propietarios, etiquetas, proyectos e hitos. Las incidencias también se pueden
asociar con solicitudes de incorporación de cambios y otros elementos de
GitHub para proporcionar rastreabilidad en el futuro.
Para obtener más información sobre las incidencias de GitHub, vea Dominio de
las incidencias.
Notificaciones
Como plataforma colaborativa, GitHub ofrece notificaciones para
prácticamente todos los eventos que se producen en un flujo de trabajo
determinado. Estas notificaciones se pueden adaptar en función de las
preferencias. Por ejemplo, puede suscribirse a todas las creaciones y ediciones
de incidencias de un proyecto, o bien recibir notificaciones únicamente de las
incidencias en las que se le mencione. También puede decidir si recibirá
notificaciones por correo electrónico, por web y dispositivo móvil, o ambos.
Para llevar un seguimiento de todas las notificaciones en distintos proyectos,
use el panel de notificaciones de GitHub.
Para obtener más información sobre las notificaciones de GitHub,
vea Configuración de notificaciones.
Ramas
Las ramas son la manera preferida de crear cambios en el flujo de GitHub.
Proporcionan aislamiento para que varias personas puedan trabajar
simultáneamente en el mismo código de manera controlada. Este modelo
garantiza la estabilidad entre las ramas críticas, como main, a la vez que da
libertad a los desarrolladores para confirmar los cambios que necesiten para
alcanzar sus objetivos. Una vez que el código de una rama está listo para formar
parte de la rama main, puede combinarse mediante una solicitud de
incorporación de cambios.
Para obtener más información sobre las ramas de GitHub, vea Acerca de las
ramas.
Confirmaciones
Una confirmación es un cambio en uno o varios archivos de una rama. Cada
vez que se crea una confirmación, se le asigna un identificador único y se realiza
un seguimiento de ella, junto con la hora y el colaborador. Esto proporciona un
registro de auditoría claro para todas las personas que revisen el historial de un
archivo o un elemento vinculado, como una incidencia o una solicitud de
incorporación de cambios.
Para obtener más información sobre las confirmaciones de GitHub,
vea Confirmación y revisión de cambios en el proyecto.
Solicitudes de incorporación de cambios
Una solicitud de incorporación de cambios es un mecanismo que sirve para
indicar que las confirmaciones de una rama están listas para combinarse en
otra. El desarrollador que envíe la solicitud de incorporación de
cambios normalmente solicitará a uno o varios revisores que comprueben el
código y aprueben la combinación. Estos revisores podrán comentar los
cambios, agregar otros o usar la solicitud de incorporación de cambios para
realizar un análisis más exhaustivo. Una vez que los cambios se hayan aprobado
(en caso de que se requiera aprobación), la rama de origen de la solicitud de
incorporación de cambios (la rama de comparación) se podrá combinar con la
rama base.
Para obtener más información sobre las solicitudes de incorporación de
cambios de GitHub, vea Acerca de las solicitudes de incorporación de cambios.
Etiquetas
Las etiquetas proporcionan una manera de categorizar y organizar
las incidencias y las solicitudes de incorporación de cambios en un
repositorio. A medida que cree un repositorio de GitHub, se agregarán
automáticamente varias etiquetas y también se pueden crear otras nuevas.
Estos son algunos ejemplos de etiquetas:
error
en línea
duplicar
help-wanted
mejora
question
Para obtener más información sobre las etiquetas de GitHub, vea Acerca de las
etiquetas.
Acciones
Las acciones de GitHub proporcionan funcionalidad de flujo de trabajo y
automatización de tareas en un repositorio. Las acciones se pueden usar para
simplificar los procesos del ciclo de vida de desarrollo de software e
implementar la integración y la implementación continuas (CI/CD).
Acciones de GitHub se compone de lo siguiente:
Flujos de trabajo: procesos automatizados que se han agregado al
repositorio.
Eventos: actividades que desencadenan un flujo de trabajo.
Trabajos: conjunto de pasos que se ejecutan en un ejecutor.
Pasos: tarea que puede ejecutar uno o varios comandos (acciones).
Acciones: comandos independientes que se pueden combinar en
pasos. Se pueden combinar varios pasos para crear un trabajo.
Ejecutores: servidor que tiene instalada la aplicación de ejecutor de
Acciones de GitHub.
Para obtener más información sobre las acciones de GitHub,
consulte Introducción a Acciones de GitHub.
Clonación y bifurcación
GitHub proporciona varias maneras de copiar un repositorio para poder trabajar
en él.
Clonar un repositorio: al clonar un repositorio, se realizará una
copia del repositorio y de su historial en el equipo local. Si tiene
acceso de escritura al repositorio, puede enviar los cambios de la
máquina local al repositorio remoto (denominado origen) a medida
que se completan. Para clonar un repositorio, puede usar el
comando git clone [url] o el comando gh repo clone [url] de la CLI de
GitHub.
Bifurcación de un repositorio: al bifurcar un repositorio, se realiza
una copia del repositorio en la cuenta de GitHub. El repositorio
principal se denomina ascendente, mientras que la copia bifurcada
se conoce como origen. Una vez que haya bifurcado un repositorio
en la cuenta de GitHub, puede clonarlo en el equipo local. La
bifurcación permite realizar cambios libremente en un proyecto sin
afectar al repositorio ascendente original. Para contribuir con
cambios en el repositorio ascendente, cree una solicitud de
incorporación de cambios desde el repositorio bifurcado. También
puede ejecutar comandos git para asegurarse de que la copia local
permanezca sincronizada con el repositorio ascendente.
¿Cuándo debería clonar un repositorio en lugar de bifurcarlo? Si está trabajando
con un repositorio y tiene acceso de escritura, puede clonarlo en el equipo local.
Desde allí, puede realizar modificaciones e introducir los cambios directamente
en el repositorio de origen.
Si necesita trabajar con un repositorio creado por otro propietario,
como github/example, y no tiene acceso de escritura, puede bifurcar el
repositorio en su cuenta de GitHub y, luego, clonar la bifurcación en el equipo
local. Para representarlo visualmente, supongamos que su cuenta de GitHub se
denomina githubtraining. A través del sitio web de GitHub, puede
bifurcar github/example o cualquier otro repositorio en su cuenta. Desde allí,
puede clonar la versión bifurcada del repositorio en el equipo local. Estos pasos
se muestran en la imagen siguiente.
Se pueden realizar cambios en la copia local de githubtraining/example y, luego,
volver a insertarlos en el repositorio de origen remoto (githubtraining/example).
Posteriormente, los cambios se pueden enviar al
repositorio github/exampleascendente mediante una solicitud de
incorporación de cambios, como se muestra a continuación.
Para obtener más información, consulte bifurcar un repositorio.
GitHub Pages
GitHub Pages es un motor de hospedaje que está integrado directamente en la
cuenta de GitHub. Si sigue una serie de convenciones y habilita la característica,
puede crear su propio sitio estático generado a partir de código HTML y
Markdown extraído directamente del repositorio.
Ejercicio: Paseo guiado por GitHub
Completado100 XP
58 minutos
En este ejercicio se comprueban sus conocimientos sobre las características
clave de GitHub, incluida la confirmación de una rama, la confirmación de un
archivo, la apertura de una solicitud de incorporación de cambios y la
combinación de una solicitud de incorporación de cambios.
Introducción
Al hacer clic en el botón Iniciar el ejercicio en GitHub siguiente, se le
redireccionará a un repositorio de plantillas de GitHub público que le pedirá
que complete una serie de pequeños desafíos. Antes de comenzar el ejercicio,
realice las siguientes tareas:
Seleccione el botón Iniciar curso o la característica Usar esta
plantilla en el repositorio de plantillas. Al hacerlo, se le pedirá que
cree un repositorio nuevo. Se recomienda crear un repositorio
público, ya que los repositorios privados usarán minutos de
Acciones. Después de crear su propio repositorio a partir de la
plantilla, espere unos 20 segundos y actualice.
Siga las instrucciones del archivo Léame del repositorio para
comprender cómo funciona el ejercicio, los objetivos de aprendizaje
y cómo completar correctamente el ejercicio.
Cuando haya terminado el ejercicio en GitHub, vuelva aquí para lo siguiente:
Pruebade conocimientos breve
Resumen de lo que ha aprendido
Distintivo por completar este módulo
Nota
No es necesario modificar los archivos del flujo de trabajo para completar este
ejercicio. La modificación del contenido de este flujo de trabajo puede
interrumpir la capacidaddel ejercicio para validar las acciones, realizar
comentarios o calificar los resultados.
Validación de la versión e instalación
de Python
Completado100 XP
5 minutos
Elija su sistema operativo
Linux Mac Windows
Antes de empezar a escribir código de Python, deberá instalar algunas
herramientas en su equipo local. Necesitará el intérprete de Python que compila
y ejecuta el código y un editor de código con características que pueden
ayudarlo a escribir código de Python. En este módulo, instalará y configurará las
herramientas necesarias.
Versiones de Python
En este módulo, nos hemos esforzado por distinguir entre la versión 2 y la
versión 3 de Python. Hacemos esta distinción porque el desarrollo
de Python 2 se interrumpió en 2020. La idea clave es que, a partir de ahora,
deberá usar Python 3.
Nota
¿Por qué es importante resaltar la necesidad de usar Python 3? Algunos
sistemas podrían tener preinstalado Python 2, por lo que deberá realizar pasos
adicionales para instalar Python 3.
¿Cómo puedo saber si ya tengo instalado Python 3 en mi equipo?
Es posible que el equipo ya tenga instalado Python 3. A veces, hay aplicaciones
que instalan Python 3 sin que lo sepa.
En la parte superior de esta página, seleccione la pestaña que corresponda a su
sistema operativo.
Windows
Para determinar si su equipo Windows ya tiene instalado Python 3:
1. Para abrir la aplicación del símbolo del sistema, vaya a Inicio en la
barra de tareas de Windows.
2. Escriba cmd en el cuadro de búsqueda de Windows y seleccione la
aplicación Símbolo del sistema en la sección Mejor
coincidencia de los resultados.
3. Escriba el comando siguiente y presione Entrar:
ConsolaCopiar
python --version
or
ConsolaCopiar
py --version
Nota
La ejecución de python --version o py --version puede no devolver
un valor, o bien puede devolver un mensaje de error que
indica "py" is not recognized as an internal or external command,
operable program or batch file ("py" no se reconoce como un
comando interno o externo, un programa ejecutable o un archivo
por lotes). Esto indica que Python no está instalado en el sistema
Windows.
Si se muestra la palabra Python seguida de un conjunto de números
separados por puntos (.), significa que tiene instalada una versión
de Python. Este es un ejemplo de la salida que podría obtener:
ResultadoCopiar
Python 3.10.0
Si el primer número es 3, Python 3 está instalado en el equipo. Aunque no
disponga de la versión más actualizada, podrá seguir todos los módulos de
Python para principiantes en Microsoft Learn.
Si el primer número es 2 o ha recibido un mensaje de error, deberá instalar
Python 3. En la siguiente unidad, le guiaremos por la instalación de Python 3.
Resumen
Las principales conclusiones de esta unidad son:
Ya no se debe usar la versión 2 de Python. Todo el código nuevo debe
escribirse con la versión 3 de Python.
Use la marca --version de Python para asegurarse de que sabe con qué
versión está trabajando.
Instalación de Python 3
Completado100 XP
5 minutos
Elija su sistema operativo
Linux Mac Windows
En la unidad anterior, ejecutó un comando para determinar si ya tenía instalado
Python 3. Si necesita instalar Python 3, elija su sistema operativo en la parte
superior de esta página y, luego, siga las instrucciones.
Una vez que se ha asegurado que tiene instalado Python 3, puede desplazarse
hasta la parte inferior de esta página y seleccionar Continuar.
Cuando se escribió este módulo, Python 3.11 era la versión más reciente
disponible de Python, por lo que haremos referencia a esa versión en las
siguientes instrucciones. Instale la última versión de Python que esté disponible
para su sistema operativo. Si instala una versión diferente, las etiquetas de los
botones y los nombres de los archivos pueden diferir ligeramente de los de las
instrucciones de instalación.
Nota
Estas instrucciones son específicas para Windows 10 y Windows 11. Para
obtener más información sobre las instrucciones de instalación en diferentes
versiones de Windows, consulte la página oficial de descargas de Python.
Instalación de Python en Windows desde
Microsoft Store
1. Para abrir Microsoft Store, seleccione Inicio y, luego, escriba iniciar
Microsoft Store.
2. Una vez abierto, busque Python.
Se le presentará una lista de varias opciones.
3. Seleccione la versión más reciente de Python.
4. En la pestaña Inicio, seleccione Obtener o instalar.
Nota
Si no puede usar el instalador porque no tiene privilegios de
administrador, descargue el paquete insertable (archivo ZIP) de
Python desde el sitio web de Python y, luego, extráigalo en una
carpeta local, como C:\Python311.
Python se instala en segundo plano. La instalación puede tardar un
par de minutos en función de la velocidad del sistema.
5. Después de instalar Python, vuelva al símbolo del sistema.
6. Escriba el comando python --version siguiente y
presione Entrar para ver la versión de Python:
ConsolaCopiar
python --version
Ahora ha instalado correctamente Python en el sistema local.
Instalar Visual Studio Code
Completado100 XP
5 minutos
Elija su sistema operativo
Linux Mac Windows
Con Python instalado en el sistema, puede volver su atención a una herramienta
para escribir código de Python. Como se mencionó en la introducción a este
módulo, aunque puede usar un editor de texto sin formato para crear o editar
aplicaciones de Python, un editor de código, como Visual Studio Code,
proporciona un mayor nivel de compatibilidad.
Vamos a explorar el kit de herramientas disponible en Visual Studio Code y
cómo instalarlo.
Herramientas para escribir código de Python
Normalmente se escribe la sintaxis de Python en un archivo de texto y se
guarda en el disco duro local.
Puede escribir código con un editor de archivos de texto sencillo, como el Bloc
de notas de Windows. El Bloc de notas edita texto ASCII, un formato de archivo
de texto estándar simple.
Le interesará evitar el uso de editores de texto que incluyan opciones de
formato, como negrita, subrayado o cursiva, o de cualquier otro programa con
características de procesamiento de texto. Por lo tanto, no se debe escribir
código en Microsoft Word ni en TextEdit en macOS. Estos programas
incorporan instrucciones de formato adicionales que el compilador de Python
no puede entender.
Le interesará usar una herramienta que se adapte mejor a los desafíos únicos de
la escritura de código. Hay muchas opciones para elegir, pero muchos
desarrolladores confían en Visual Studio Code o VS Code. Es gratis y está
disponible en Windows, macOS y Linux. Una que tenga muchas características
que permitan navegar fácilmente por el código y compilarlo, y que sirva para
todos los lenguajes de programación.
Microsoft proporciona una extensión de Python para Visual Studio Code. Esta
extensión ofrece características como el resaltado de sintaxis, la navegación por
el código, la compatibilidad con el formato del código, etc. Hay una
característica en concreto, llamada IntelliSense, que es muy útil al principio.
IntelliSense proporciona la característica de autocompletar y ayuda contextual
mientras escribe. La instalará en la siguiente unidad.
Instalación de Visual Studio Code en Windows
En esta sección, aprenderá a descargar el instalador de Visual Studio Code
desde el sitio web de Visual Studio Code.
1. En el explorador, vaya a la página de descarga de Visual Studio
Code.
La página web muestra los logotipos de Windows, Linux y Mac.
2. Seleccione y descargue el instalador de Visual Studio Code para
Windows. La mayoría de los exploradores ofrecen la opción de
guardar el archivo en el equipo local (normalmente en la carpeta
Descargas) o de ejecutar inmediatamente el archivo del instalador.
Nota
Después de descargar el instalador, es posible que tenga que abrir
Explorador de archivos e ir a la ubicación en la que lo instaló el
explorador web. La ubicación más común es la carpeta Descargas.
3. Haga doble clic en el archivo del instalador para iniciar el proceso
de instalación y ejecutar el programa de instalación.
Una vez completada la instalación, Visual Studio Code se inicia
automáticamente.
Instalación de la extensión de Python
Completado100 XP
5 minutos
Elija su sistema operativo
Linux Mac Windows
Cuando Visual Studio Code esté instalado, puede instalar la extensión de Python
y, opcionalmente, configurar otras herramientas y opciones.
Instalación de la extensión de Python para
Visual Studio Code
Visual Studio Code es un poderoso editor de código y un entorno de desarrollo
integrado (IDE) ligero de uso general con una amplia variedad de extensiones
disponibles que proporcionan funcionalidad para varios lenguajes de
programación. La extensión de Python para Visual Studio Code proporciona
indicaciones visuales, como código por colores y la función autocompletar,
junto con herramientas de depuración que le ayudarán a escribir código de
Python mejor y más rápido. En este ejercicio se instala la extensión de Python en
la aplicación de VS Code existente.
1. En Visual Studio Code, en la barra de menús,
seleccione Ver>Extensiones para abrir la vista Extensiones.
En la vista Extensiones de Visual Studio Code se enumeran las
extensiones instaladas y las extensiones recomendadas más
populares en Marketplace.
2. Para filtrar la lista de extensiones, escriba python en el cuadro de
búsqueda situado en la parte superior de la vista Extensiones.
3. Seleccione la extensión Python publicada por Microsoft, descrita
como IntelliSense (Pylance), y normalmente la primera de la lista.
Los detalles sobre esa extensión aparecen en un panel con pestañas
a la derecha.
4. En el panel Extensiones o en el panel principal, seleccione Instalar.
Cuando finaliza la instalación, el botón Instalar cambia a un icono
de Configuración ⚙️ en la vista Extensiones o a dos
botones, Deshabilitar y Desinstalar, en el panel principal. Este
mensaje le permite saber que ha instalado correctamente la
extensión de Python para Windows.
Resumen
Ha instalado correctamente la extensión de Python para Visual Studio Code.
Vamos a crear nuestra primera aplicación de Python.
Creación de la primera aplicación
Python
Completado100 XP
5 minutos
Elija su sistema operativo
Linux Mac Windows
Con Python y las herramientas de Python instalados, ahora puede crear su
primera aplicación de Python. En este ejercicio, creará una carpeta vacía, la
abrirá en Visual Studio Code y, luego, creará la primera aplicación.
Paso 1: Inicio de VS Code en una carpeta del
proyecto
Muchos proyectos comienzan con una carpeta vacía, y es así como comenzará
el suyo.
1. Con un símbolo del sistema o terminal, cree una carpeta vacía
denominada "hello-world", vaya a ella y abra VS Code (código) en
esa carpeta (.) con los siguientes comandos:
1. Cree una carpeta denominada hello-world:
BashCopiar
md hello-world
2. Vaya a la carpeta hello-world:
BashCopiar
cd hello-world
3. Abra Visual Studio Code en esa carpeta:
BashCopiar
code .
2. Sugerencia
3. Abra el símbolo del sistema o el terminal como administrador para
ejecutar code .
4. Como alternativa, puede ejecutar VS Code mediante la interfaz de
usuario del sistema operativo y, luego, usar Archivo > Abrir carpeta
para abrir la carpeta del proyecto.
Paso 2: Crear un nuevo archivo de Python y
agregar código
Con Visual Studio Code abierto en la carpeta vacía, ahora creará un archivo de
Python para mostrar el mensaje Hola, mundo.
1. En la vista del Explorador, en el panel HELLO_WORLD, mantenga
el puntero sobre la barra de título y, luego, seleccione Nuevo
archivo.
2. Asigne el nombre [Link] al nuevo archivo; para ello, escríbalo en el
nuevo cuadro de texto y presione Entrar.
Al usar la extensión de archivo .py, se indica a VS Code que
interprete este archivo como un programa de Python, de modo que
evalúe el contenido con la extensión de Python.
3. Escriba el siguiente código de Python en el panel del editor. Este
comando usa la función print para mostrar el texto Hola
mundo cuando se ejecuta la aplicación.
PythonCopiar
print('Hello, World!')
4. Guarde el archivo, seleccione Archivo y Guardar (o Ctrl+S).
Paso 3: Ejecutar la aplicación
Dado que es un programa de una sola línea, puede ejecutar la aplicación desde
dentro de Visual Studio Code.
1. Abra el terminal integrado en Visual Studio Code:
seleccione Ver y Terminal.
2. En la nueva ventana del terminal, ejecute el siguiente comando para
ejecutar el código de Python.
BashCopiar
python [Link]
Hola mundo. aparece en la ventana de terminal. Felicidades. Ha
creado una aplicación de Python.
Introducción
Completado100 XP
1 minuto
Una tarea común es desarrollar programas que no solo puedan mostrar
información en una pantalla o consola, sino que también puedan obtener
entradas de los usuarios o incluso de otros programas. En este módulo,
compilará su primer programa en Python para aprender a administrar la entrada
y salida en la consola. También aprenderá conceptos de programación de
Python como variables y conversión entre tipos de datos.
Escenario: Un programador junior compila sus
primeras aplicaciones
En este escenario, suponga que llega a ser un cadete espacial de una nave
espacial en un futuro. Su misión es buscar y explorar nuevos sistemas solares.
Está entrenado como ingeniero y está buscando desarrollar una serie de
programas de utilidad para el personal más sénior contratado.
¿Qué aprenderá?
En este módulo, aprenderá a:
Usará funciones para administrar la entrada y salida en la consola.
Creará variables para almacenar datos.
Distinguirá entre tipos de datos.
Usará la conversión de tipos para convertir entre tipos de datos.
¿Cuál es el objetivo principal?
Usar elementos de programación básicos para crear sus primeros programas en
Python.
Prerrequisitos
Se familiarizará con el concepto de programación.
No tendrá que instalar Python para completar este módulo. Usará un espacio
aislado interactivo para completar los ejercicios.
Si desea probar el código en las explicaciones, es posible que quiera trabajar
primero con Introducción a Python en Visual Studio Code, si aún no lo ha
hecho. Este módulo le ayudará a preparar un entorno de Python.
Trabajo con salidas
Completado100 XP
6 minutos
Cuando empiece a aprender cualquier lenguaje de programación, primero
pruebe algunas instrucciones de código en un bucle read-evaluate-print loop
(REPL). Sin embargo, no tardará en tener que evolucionar a una fase de
desarrollo más importante. Esto supone aprender más sobre el lenguaje, cómo
estructurar un programa y mucho más.
Un programa de Python
Para crear un programa en Python, debe almacenarlo en un archivo. El archivo
debe tener la extensión .py.
La idea de un programa es hacer algo o llevar a cabo una tarea. Para conseguir
que el programa haga algo, usted deberá agregar las instrucciones necesarias
para que realice la tarea. Por ejemplo, una instrucción podría imprimir texto o
calcular algo. Un programa de ejemplo como [Link] puede tener un aspecto
parecido al siguiente:
PythonCopiar
# [Link]
sum = 1 + 2
print(sum)
Ejecutar un programa
Suponga que ha creado un programa que consta de varias instrucciones. Para
ejecutarlo, inicie el programa ejecutable de Python en una consola. Una consola
es una aplicación de línea de comandos que le permite interactuar con el
sistema operativo. Para ejecutar un programa, escriba el nombre del programa
ejecutable de Python, seguido del nombre del programa. Este es un ejemplo de
una ejecución de este tipo:
ConsolaCopiar
python3 [Link]
La ejecución de este tipo de programa mostraría el siguiente resultado en la
consola:
ResultadoCopiar
3
Función print()
Una de las primeras cosas que es probable que haga es imprimir en una
consola. En la consola, puede ejecutar comandos y programas. También puede
escribir información y mostrarla como texto en la pantalla.
Para escribir información en la consola, puede usar la función print() e
implementarla como una función principal. Como se trata de una función
principal, tendrá acceso a ella si Python está instalado. Para usarlo print() en el
programa, asígnele un argumento:
PythonCopiar
print("show this in the console")
La ejecución del programa mostraría el siguiente resultado en la consola:
ResultadoCopiar
show this in the console
Observe cómo el comando anterior llama a print() mediante el uso de
paréntesis. Así es como se ejecuta una función. Si ha usado corchetes ( []) en
lugar de paréntesis, no funcionará, ya que observará si ejecuta el programa de
nuevo con este código:
PythonCopiar
print["show this in the console"]
Esta es la salida:
ResultadoCopiar
Traceback (most recent call last):
File "/<path>/[Link]", line 1, in <module>
print["show this in the console"]
TypeError: 'builtin_function_or_method' object is not subscriptable
Otro aspecto que hay que tener en cuenta es el uso de comillas dobles ( ""). Así
es como se declara un literal de cadena, con un valor como el que se va a
imprimir: "mostrar esto en la consola".
Variables
Para llegar a cualquier lugar con la codificación, debe comprender que está
trabajando con datos. Como el programa funciona con datos, es posible que
tenga que recordar un valor determinado durante la ejecución del programa.
Para ello, se usan variables.
En el ejemplo siguiente se realiza un cálculo que se almacena en variables:
PythonCopiar
sum = 1 + 2 # 3
product = sum * 2
print(product)
Tipos de datos
Una variable asume un tipo de datos. En el programa anterior, sum obtiene el
tipo int. Sin embargo, hay muchos más tipos de datos. Probablemente pueda
encontrar algunos de los siguientes:
Tipo Descripción Por ejemplo
Tipo numérico Número, con o sin decimales int, float, complex, no =
Tipo de texto Cadena de caracteres str = "a literal string"
Tipo booleano Boolean continue = True
Hay tipos más complejos, pero vamos a empezar por estos.
Este es un fragmento de código que muestra algunos de los tipos anteriores:
PythonCopiar
planets_in_solar_system = 8 # int, pluto used to be the 9th planet, but is
too small
distance_to_alpha_centauri = 4.367 # float, lightyears
can_liftoff = True
shuttle_landed_on_the_moon = "Apollo 11" #string
¿Cómo saber qué tipo tiene algo? Si ve que los datos se asignan a la variable
como se muestra en el código siguiente, puede detectarlo:
PythonCopiar
distance_to_alpha_centauri = 4.367 # looks like a float
La otra manera es usar la función type():
PythonCopiar
type(distance_to_alpha_centauri) ## <class 'float'>
Operadores
Los operadores permiten realizar varias operaciones en las variables y sus
valores. La idea general es que hay un lado izquierdo, un lado derecho y un
operador en el medio:
PythonCopiar
<left side> <operator> <right side>
Este es el aspecto que tendría un ejemplo real del código de marcador de
posición anterior:
PythonCopiar
left_side = 10
right_side = 5
left_side / right_side # 2
En este ejemplo se usa una barra diagonal (/) para dividir el valor left_side por
el valor right_side.
Hay muchos más operadores. En esta unidad se describen algunos aspectos
importantes que es probable que encuentre.
Python usa dos tipos de operadores: aritmético y asignación.
Operadores aritméticos
Con los operadores aritméticos, se hacen cálculos como suma, resta, división y
multiplicación. Este es un subconjunto de operadores aritméticos que puede
usar:
Tipo Descripción
+ Operador de suma que agrega dos valores juntos
- Operador de resta que quita el valor del lado derecho del lado izquierdo
/ Operador de división que divide el lado izquierdo tantas veces como el lado derecho especifica
* Operador de multiplicación
Operadores de asignación
Puede usar operadores de asignaciónpara asignar valores a una variable a lo
largo del ciclo de vida de la variable. Estos son algunos operadores de
asignación que es probable que encuentre a medida que aprende a compilar
programas:
Operador Ejemplo
= x = 2
x ahora contiene 2.
+= x += 2
x incrementado en 2. Si contenía 2 antes, ahora tiene un valor de 4.
-= x -= 2
x reducido en 2. Si contenía 2 antes, ahora tiene un valor de 0.
/= x /= 2
x dividido por 2. Si contenía 2 antes, ahora tiene un valor de 1.
*= x *= 2
Operador Ejemplo
x multiplicado por 2. Si contenía 2 antes, ahora tiene un valor de 4.
Fechas
Al compilar programas, es probable que interactúe con fechas. Una fecha en un
programa suele indicar tanto la fecha del calendario como la hora.
Puede usar una fecha en varias aplicaciones, como en estos ejemplos:
Archivo de copia de seguridad: El uso de una fecha como parte del
nombre de un archivo de copia de seguridad es una buena manera de
indicar cuándo se realizó una copia de seguridad y cuándo es necesario
realizarla de nuevo.
Condición: Es posible que quiera llevar una lógica específica cuando haya
una fecha determinada.
Métrica: Las fechas se usan para comprobar el rendimiento del código
para, por ejemplo, medir el tiempo necesario para ejecutar una función.
Para trabajar con una fecha, debe importar el módulo date:
PythonCopiar
from datetime import date
A continuación, puede llamar a las funciones con las que quiere trabajar. Para
obtener la fecha de hoy, puede llamar a la función today():
PythonCopiar
[Link]()
Para mostrar la fecha en la consola, puede usar la función print(). La
función print() adopta muchos tipos de datos como entrada. Aquí se muestra
cómo puede mostrar la fecha de hoy:
PythonCopiar
print([Link]())
Conversión de tipos de datos
Quiere usar una fecha con algo, normalmente una cadena. Si, por ejemplo,
desea mostrar la fecha de hoy en la consola, podría experimentar algún
problema:
PythonCopiar
print("Today's date is: " + [Link]())
Lo que se obtiene es un error:
ResultadoCopiar
Traceback (most recent call last):
File "/<path>/[Link]", line 4, in <module>
print("Today's date" + [Link]())
TypeError: can only concatenate str (not "[Link]") to str
La última fila del mensaje le indica cuál es el problema. Está intentando usar el
operador + y combinar dos tipos de datos diferentes, una cadena y una fecha.
Para que este código funcione, debe convertir la fecha en una cadena. Para
realizar esta conversión, use la función de utilidad str():
PythonCopiar
print("Today's date is: " + str([Link]()))
La salida es similar a esta:
ResultadoCopiar
Today's date is: <date>
Ejercicio: Trabajar con datos
Completado100 XP
8 minutos
Espacio aislado activado. Tiempo restante:
1 h 1 min
Usó 1 de 10 espacios aislados por hoy. Mañana habrá disponibles más espacios
aislados.
Las sugerencias de enlaces de teclado de la barra de herramientas están ahora
ocultas
RuntimeArchivoEditarVista
Ejecutar todo
Kernel
Proceso no conectado
Your first program
You will use a Jupyter notebook to create your first program. Your senior officer
wants you to create code to perform a couple of utilities. You will start by
displaying today's date. Then you will add code to convert parsecs to lightyears.
This exercise is broken into a series of steps. For each step you will be presented
with the goal for the step, followed by an empty cell. Enter your Python into the
cell and run it. The solution for each step will follow each cell.
Display today's date
In the cell below, add the code to display today's date. Remember you can use
the date object from the datetime library to access calendar information.
[ ]
# Add the code below
Presione Mayús + Entrar para ejecutar
Your code should look like the following:
from datetime import date
print([Link]())
Build a unit converter
Now it's time to turn your attention to the second utility, converting parsecs to
lightyears. One parsec is 3.26 lightyears, so you will multiply parsecs by that
value to determine lightyears.
Create a variable named parsecs and set it to 11. Then add the code to perform
the appropriate calculation and store the result in a variable named lightyears.
Finally print the result on the screen with so it displays a message which
resembles the following:
11 parsecs is ___ lightyears
Remember to you can use str to convert numbers to strings
[ ]
# Enter code below
Presione Mayús + Entrar para ejecutar
Your code should resemble the following:
parsecs = 11
lightyears = parsecs * 3.26
print(str(parsecs) + " parsecs is " + str(lightyears) + " lightyears")
Desired output
When you run the notebook you should see the following result:
11 parsecs is 35.86 lightyears
CódigoMarkdown
learn-notebooks-d5f4915c-13f4-4d98-83d8-9289ed46d353
Proceso no conectado
Visualización
Kernel no conectado
Recopilación de entradas
Completado100 XP
2 minutos
Hasta ahora, ha aprendido varias construcciones del lenguaje de programación
Python. También ha escrito un par de programas. Sin embargo, los programas
funcionan con datos, y los datos proceden de algún lugar. En esta unidad,
echará un vistazo más de cerca a cómo puede recopilar entradas tanto a partir
de la línea de comandos como a partir de la entrada del usuario.
Entrada de la línea de comandos
Al iniciar un programa mediante python3, se le asigna el nombre del archivo que
se va a iniciar. También puede asignarle un conjunto de argumentos: datos a los
que el programa tendrá acceso al ejecutarse. Este es el aspecto que puede
tener:
BashCopiar
python3 [Link] 2023-01-01
En el código anterior, la cadena "2023-01-01" se puede usar como instrucción
para que el programa [Link] inicie una copia de seguridad a partir de esa
fecha. Lo que se consigue mediante el uso de argumentos de la línea de
comandos es flexibilidad. El programa puede comportarse de forma diferente
en función de su entrada externa.
Argumentos de la línea de comandos
¿Cómo se capturan estos comandos desde la perspectiva de la codificación?
Mediante el módulo sys, puede recuperar los argumentos de la línea de
comandos y usarlos en el programa. Observe el código siguiente:
PythonCopiar
import sys
print([Link])
print([Link][0]) # program name
print([Link][1]) # first arg
[Link] esuna matriz o estructura de datos que contiene muchos elementos.
La primera posición, que se indica como 0 en la matriz, contiene el nombre del
programa. La segunda posición, 1, contiene el primer argumento. Supongamos
que el programa [Link] contiene el código de ejemplo y lo ejecuta de la
siguiente manera:
ConsolaCopiar
python3 [Link] 2023-01-01
A continuación, el programa genera el siguiente resultado:
ResultadoCopiar
['[Link]', '2023-01-01']
[Link]
2023-01-01
Entrada de usuario
Otra manera de pasar datos al programa es hacer que el usuario escriba los
datos. Puede codificarlo para que el programa indique al usuario que escriba
información. Guarde los datos especificados en el programa y, a continuación,
trabaje con ellos.
Para capturar información del usuario, use la función input(). Este es un
ejemplo:
PythonCopiar
print("Welcome to the greeter program")
name = input("Enter your name: ")
print("Greetings " + name)
Supongamos que el programa [Link] contiene el mismo código y lo ejecuta
de la siguiente manera:
ConsolaCopiar
python3 [Link]
Al ejecutar el programa, se le invita a escribir su nombre, por ejemplo:
ResultadoCopiar
Welcome to the greeter program
Enter your name:
Después de escribir un valor y presionar Enter (Entrar), se devuelve el saludo:
ResultadoCopiar
Welcome to the greeter program
Enter your name: Picard
Greetings Picard
Trabajo con números
La función input() almacena un resultado como una cadena, por lo que es
posible que el código siguiente no haga lo que quiera:
PythonCopiar
print("calculator program")
first_number = input("first number: ")
second_number = input("second number: ")
print(first_number + second_number)
La ejecución de este programa le invita a escribir el primer número,
supongamos:3
ResultadoCopiar
calculator program
first number: 3
Después de presionar Enter (Entrar), puede escribir el segundo número,
supongamos:4
ResultadoCopiar
calculator program
first number: 3
second number: 4
Al presionar Enter (Entrar), haga clic en el siguiente resultado:
ResultadoCopiar
calculator program
first number: 3
second number: 4
34
Probablemente ha pensado en que este programa le responda con 7 lugar
de 34. ¿Qué ha fallado?
La explicación es que first_number y second_number son cadenas. Para que el
cálculo funcione correctamente, debe cambiar esas cadenas a números
mediante la función int(). Al modificar la última línea del programa para
usar int(), puede resolver el problema:
PythonCopiar
print(int(first_number) + int(second_number))
Volver a ejecutar el programa con los mismos valores ahora devuelve 7 como
respuesta:
ResultadoCopiar
calculator program
first number: 3
second number: 4
7
Ejercicio: Recopilación de entradas
Completado100 XP
8 minutos
Espacio aislado activado. Tiempo restante:
1h
Usó 1 de 10 espacios aislados por hoy. Mañana habrá disponibles más espacios
aislados.
Las sugerencias de enlaces de teclado de la barra de herramientas están ahora
ocultas
RuntimeArchivoEditarVista
Ejecutar todo
Kernel
Proceso no conectado
Creating reusable applications
Having a program with hard-coded values limits its flexibility. Your first officer
likes the program you built to convert parsecs to lightyears, but wants the ability
to specify a value for parsecs. She wants you to create a program which can
accept user input.
This exercise is broken into a series of steps. For each step you will be presented
with the goal for the step, followed by an empty cell. Enter your Python into the
cell and run it. The solution for each step will follow each cell.
Accepting user input
In the prior exercise you created code to convert parsecs to lightyears and
display the results, which looked like the following:
parsecs = 11
lightyears = parsecs * 3.26
print(str(parsecs) + " parsecs is " + str(lightyears) + " lightyears")
Using this code as a foundation, update how parsecs is set. Start by creating a
variable named parsecs_input and setting it to the result of input, which
should prompt the user to enter the number of parsecs. Then
convert parsecs_input to an integer by using int and storing it in parsecs.
Finish by performing the calculation and displaying the result.
[ ]
# Enter code below
Presione Mayús + Entrar para ejecutar
Your code should look something like the following:
parsecs_input = input("Input number of parsecs:")
parsecs = int(parsecs_input)
lightyears = 3.26156 * parsecs
print(parsecs_input + " parsecs is " + str(lightyears) + " lightyears")
CódigoMarkdown
learn-notebooks-d5f4915c-13f4-4d98-83d8-9289ed46d353
Proceso no conectado
Visualización
Kernel no conectado
Escritura de instrucciones "if"
Completado100 XP
4 minutos
Para expresar la lógica condicional en Python, se usan instrucciones if. Al
escribir una instrucción if, se basa en otro concepto que se describe en este
módulo, el de los operadores matemáticos. Python admite los operadores
lógicos comunes de matemáticas: igual, no igual, menor que, menor o igual
que, mayor que y mayor o igual que. Probablemente esté acostumbrado a ver
que estos operadores se muestran mediante símbolos, que también es la forma
en que se representan en Python.
Es igual que: a == b
No es igual a: a != b
Menor que: a < b
Menor o igual que: a <= b
Mayor que: a > b
Mayor o igual que: a >= b
Expresiones de prueba
Debe usar una instrucción if para ejecutar código solo si se cumple una
condición concreta. Lo primero que hace al escribir una instrucción if es
comprobar la condición mediante una expresión de prueba. Después, se
determina si la instrucción se evalúa como True o False. Si es True, se ejecuta el
siguiente bloque de código con sangría:
PythonCopiar
a = 97
b = 55
# test expression
if a < b:
# statement to be run
print(b)
En este ejemplo, a < b es la expresión de prueba. El programa evalúa la
expresión de prueba y, después, ejecuta el código dentro de la
instrucción if solo si la expresión de prueba es True. Si evalúa la expresión, sabe
que es False, por lo que no se ejecutará ningún código que escriba en la
instrucción if.
Nota
En Python, None y 0 también se interpretan como False.
Escritura de instrucciones if
Use una instrucción if si quiere ejecutar código solo si se cumple una condición
concreta. La sintaxis de una instrucción if siempre es la siguiente:
PythonCopiar
if test_expression:
# statement(s) to be run
Por ejemplo:
PythonCopiar
a = 93
b = 27
if a >= b:
print(a)
En Python, se debe aplicar sangría al cuerpo de una instrucción if. Siempre se
ejecutará cualquier código que siga a una expresión de prueba que no tenga
sangría:
PythonCopiar
a = 24
b = 44
if a <= 0:
print(a)
print(b)
Salida: 44
En este ejemplo, la salida es 44 ya que la expresión de prueba es False y la
instrucción print(b) no tiene sangría en el mismo nivel que la instrucción if.
¿Qué son las instrucciones "else" y
"elif"?
Completado100 XP
4 minutos
¿Qué ocurre si también quiere que el programa ejecute un fragmento de código
cuando la expresión de prueba es False? ¿O bien, qué ocurre si quiere incluir
otra expresión de prueba? Python tiene otras palabras clave que puede usar
para crear instrucciones if más complejas, else y elif. Al usar if, else y elif de
forma conjunta, puede escribir programas complejos con varias expresiones de
prueba e instrucciones para ejecutar.
Uso de else
Sabe que cuando se usa una instrucción if, el cuerpo del programa solo se
ejecutará si la expresión de prueba es True. Para agregar más código que se
ejecute cuando la expresión de prueba sea False, debe agregar una
instrucción else.
Ahora se volverá al ejemplo de la sección anterior:
PythonCopiar
a = 93
b = 27
if a >= b:
print(a)
En este ejemplo, si a no es mayor o igual que b, no ocurre nada. Imagine que en
su lugar quiere imprimir b si la expresión de prueba es False:
PythonCopiar
a = 93
b = 27
if a >= b:
print(a)
else:
print(b)
Si la expresión de prueba es False, se omite el código del cuerpo de la
instrucción if y el programa continúa ejecutándose desde la instrucción else. La
sintaxis de una instrucción if/else siempre es la siguiente:
PythonCopiar
if test_expression:
# statement(s) to be run
else:
# statement(s) to be run
Uso de elif
En Python, la palabra clave elif es la abreviatura de else if. El uso de
instrucciones elif permite agregar varias expresiones de prueba al programa.
Estas instrucciones se ejecutan en el orden en que se escriben, por lo que el
programa escribirá una instrucción elif solo si la primera
instrucción if es False. Por ejemplo:
PythonCopiar
a = 93
b = 27
if a >= b:
print("a is greater than or equal to b")
elif a == b:
print("a is equal to b")
La instrucción elif de este bloque de código no se ejecutará, porque la
instrucción if es True.
La sintaxis de una instrucción if/elif siempre es la siguiente:
PythonCopiar
if test_expression:
# statement(s) to be run
elif test_expression:
# statement(s) to be run
Combinación de instrucciones if, elif y else
Puede combinar instrucciones if, elif y else para crear programas con lógica
condicional compleja. Recuerde que una instrucción elif solo se ejecuta cuando
la condición if es false. Tenga en cuenta también que un bloque if solo puede
tener un bloque else, pero puede tener varios bloques elif.
Ahora se volverá a examinar el ejemplo con una instrucción elif agregada:
PythonCopiar
a = 93
b = 27
if a > b:
print("a is greater than b")
elif a < b:
print("a is less than b")
else:
print ("a is equal to b")
Un bloque de código que usa los tres tipos de instrucciones tiene la sintaxis
siguiente:
PythonCopiar
if test_expression:
# statement(s) to be run
elif test_expression:
# statement(s) to be run
elif test_expression:
# statement(s) to be run
else:
# statement(s) to be run
Uso de lógica condicional anidada
Python también admite la lógica condicional anidada, lo que significa que
puede anidar instrucciones if, elif y else para crear programas aún más
complejos. Para anidar condiciones, aplique sangría a las condiciones internas y
todo lo que esté en el mismo nivel de sangría se ejecutará en el mismo bloque
de código:
PythonCopiar
a = 16
b = 25
c = 27
if a > b:
if b > c:
print ("a is greater than b and b is greater than c")
else:
print ("a is greater than b and less than c")
elif a == b:
print ("a is equal to b")
else:
print ("a is less than b")
Este fragmento de código genera la salida a is less than b.
La lógica condicional anidada sigue las mismas reglas que la lógica condicional
convencional dentro de cada bloque de código. Este es un ejemplo de la
sintaxis:
PythonCopiar
if test_expression:
# statement(s) to be run
if test_expression:
# statement(s) to be run
else:
# statement(s) to be run
elif test_expression:
# statement(s) to be run
if test_expression:
# statement(s) to be run
else:
# statement(s) to be run
else:
# statement(s) to be run
Ejercicio: Escritura de instrucciones
"if"
Completado100 XP
8 minutos
Espacio aislado activado. Tiempo restante:
1 h 1 min
Usó 2 de 10 espacios aislados por hoy. Mañana habrá disponibles más espacios
aislados.
Las sugerencias de enlaces de teclado de la barra de herramientas están ahora
ocultas
RuntimeArchivoEditarVista
Ejecutar todo
Kernel
Proceso no conectado
Exercise: Use logic to examine an object's size
You will start your project by creating the code to determine if a piece of space
debris is of a dangerous size. For this exercise we will use an arbitrary size of 5
meters cubed (5m3); anything larger is a potentially dangerous object.
For this step you will be presented with the goal for the exercise, followed by an
empty cell. Enter your Python into the cell and run it. The solution is at the
bottom of the exercise.
In the cell below, add a variable named object_size and set it to 10 to
represent 10m3. Then add an if statement to test if object_size is greater
than 5. If it is, display a message saying We need to keep an eye on this
object. If it's less than 5, display a message saying Object poses no threat.
CódigoMarkdown
[ ]
# Enter code below
Presione Mayús + Entrar para ejecutar
Your code could look like the following:
object_size = 10
if object_size > 5:
print('We need to keep an eye on this object')
else:
print('Object poses no threat.')
Desired output
When you run the notebook you should see the following result:
We need to keep an eye on this object
learn-notebooks-2c93fe51-7f9d-4201-828e-57c5cbc6ee8b
Proceso no conectado
Visualización
Kernel no conectado
¿Qué son los operadores "and" y
"or"?
Completado100 XP
4 minutos
En ocasiones, es posible que quiera combinar expresiones de prueba para
evaluar varias condiciones en una instrucción if, elif o else. En este caso, usaría
los operadores booleanos and y or.
El operador or
Puede conectar dos expresiones booleanas, o de prueba, mediante el operador
booleano or. Para que toda la expresión se evalúe como True, al menos una de
las subexpresiones debe ser true. Si ninguna de las subexpresiones es true, toda
la expresión se evalúa como False. Por ejemplo, en la expresión siguiente, toda
la expresión de prueba se evalúa como True, porque se ha cumplido una de las
condiciones de las subexpresiones:
PythonCopiar
a = 23
b = 34
if a == 34 or b == 34:
print(a + b)
Si las dos subexpresiones son true, toda la expresión de prueba también se
evalúa como True.
Una expresión booleana que usa or tiene la sintaxis siguiente:
PythonCopiar
sub-expression1 or sub-expression2
El operador and
También puede conectar dos expresiones de prueba mediante el operador
booleano and. Las dos condiciones de la expresión de prueba deben cumplirse
para que toda la expresión de prueba se evalúe como True. En cualquier otro
caso, la expresión de prueba es False. En el ejemplo siguiente, toda la expresión
de prueba se evalúa como False, porque solo una de las condiciones de las
subexpresiones es true:
PythonCopiar
a = 23
b = 34
if a == 34 and b == 34:
print (a + b)
Una expresión booleana que usa and tiene la sintaxis siguiente:
PythonCopiar
sub-expression1 and sub-expression2
Diferencia entre and y or
Para resaltar la diferencia entre los dos operadores booleanos, puede usar
una tabla de verdad. Una tabla de verdad muestra cómo se evalúa toda la
expresión de prueba en función de las dos subexpresiones.
Esta es la tabla de verdad para and:
subexpression1 Operador subexpression2 R
True and True T
True and False F
False and True F
False and False F
Esta es la tabla de verdad para or:
subexpression1 Operador subexpression2 R
True or True T
True or False T
False or True T
False or False F
Siguiente unidad: Ejercicio: Uso de los operadores
"and" y "or"
Ejercicio: Uso de los operadores
"and" y "or"
Completado100 XP
8 minutos
Espacio aislado activado. Tiempo restante:
1h
Usó 2 de 10 espacios aislados por hoy. Mañana habrá disponibles más espacios
aislados.
Las sugerencias de enlaces de teclado de la barra de herramientas están ahora
ocultas
RuntimeArchivoEditarVista
Ejecutar todo
Kernel
Proceso no conectado
Exercise: Use complex logic to determine possible
evasive maneuvers
In the previous exercise you created code to test the size of the object. Now you
will test both the object's size and proximity. You will use the same threshold for
size of 5m3. If the object is both larger than the threshold and within 1000km of
the ship evasive maneuvers will be required.
For this step you will be presented with the goal for the exercise, followed by an
empty cell. Enter your Python into the cell and run it. The solution is at the
bottom of the exercise.
Add the code to the cell below to create two
variables: object_size and proximity. Set object_size to 10 to represent
10m3. Set proximity to 9000.
Then add the code to display a message saying Evasive maneuvers required if
both object_size is greater than 5 and proximity is less than 1000. Otherwise
display a message saying Object poses no threat.
CódigoMarkdown
[ ]
# Add code below
Presione Mayús + Entrar para ejecutar
Your code should look something like this:
object_size = 10
proximity = 9000
if object_size > 5 and proximity < 1000:
print('Evasive maneuvers required')
else:
print('Object poses no threat')
Desired output
When you run the notebook, you should see the following result displayed:
Object poses no threat
learn-notebooks-2c93fe51-7f9d-4201-828e-57c5cbc6ee8b
Proceso no conectado
Visualización
Kernel no conectado
Aspectos básicos de las cadenas en
Python
Completado100 XP
3 minutos
Aunque las cadenas en Python parecen ser sencillas, hay cierta complejidad en
las reglas de las cadenas que es importante comprender. El conocimiento de las
reglas ayuda a evitar que le sorprenda el comportamiento de las cadenas al
modificar valores o dar formato al texto.
Inmutabilidad de las cadenas
En Python, las cadenas son inmutables. Es decir, no pueden cambiar. Esta
propiedad del tipo de cadena puede ser sorprendente, ya que Python no
proporciona errores al modificar cadenas.
En el ejemplo de este módulo, tiene un único hecho sobre la Luna que está
asignado a una variable y debe agregarle otro hecho (una oración). Parece que
agregar el segundo hecho podría modificar la variable, tal como en el ejemplo
siguiente:
PythonCopiar
>>> fact = "The Moon has no atmosphere."
>>> fact + "No sound can be heard on the Moon."
'The Moon has no [Link] sound can be heard on the Moon.'
Aunque podría parecer que se ha modificado la variable fact, una
comprobación rápida del valor revela que el valor original no ha cambiado:
PythonCopiar
>>> fact
'The Moon has no atmosphere.'
Aquí el truco es que se debe usar un valor devuelto. Al agregar cadenas, Python
no modifica ninguna, sino que devuelve una cadena nueva como resultado. Para
mantener este resultado nuevo, asígnelo a una nueva variable:
PythonCopiar
>>> two_facts = fact + "No sound can be heard on the Moon."
>>> two_facts
'The Moon has no [Link] sound can be heard on the Moon.'
Las operaciones en las cadenas siempre generan cadenas nuevas como
resultado.
Acerca del uso de comillas
Puede incluir las cadenas de Python entre comillas simples, dobles o triples.
Aunque se pueden usar indistintamente, es mejor utilizar un tipo de forma
coherente dentro de un proyecto. Por ejemplo, en la cadena siguiente se usan
comillas dobles:
PythonCopiar
moon_radius = "The Moon has a radius of 1,080 miles"
Pero cuando una cadena contiene palabras, números o caracteres especiales
(una subcadena) que también se incluyen entre comillas, debe usar otro estilo.
Por ejemplo, si en una subcadena se usan comillas dobles, incluya toda la
cadena entre comillas simples, como se muestra aquí:
PythonCopiar
'The "near side" is the part of the Moon that faces the Earth'
Del mismo modo, si en alguna parte de la cadena hay comillas simples (o un
apóstrofo, como en Moon's en el ejemplo siguiente), incluya toda la cadena
entre comillas dobles:
PythonCopiar
"We only see about 60% of the Moon's surface"
Si no se alternan las comillas simples y dobles, el intérprete de Python puede
generar un error de sintaxis, como se muestra aquí:
PythonCopiar
>>> 'We only see about 60% of the Moon's surface'
File "<stdin>", line 1
'We only see about 60% of the Moon's surface'
^
SyntaxError: invalid syntax
Cuando el texto tiene una combinación de comillas simples y dobles, puede
usar comillas triples para evitar problemas con el intérprete:
PythonCopiar
"""We only see about 60% of the Moon's surface, this is known as the "near
side"."""
Texto multilínea
Hay diferentes maneras de definir varias líneas de texto como una sola variable.
Las más comunes son las siguientes:
Usar un carácter de nueva línea (\n).
Usar comillas triples (""").
Los caracteres de nueva línea separan el texto en varias líneas al imprimir la
salida:
PythonCopiar
>>> multiline = "Facts about the Moon:\n There is no atmosphere.\n There is
no sound."
>>> print(multiline)
Facts about the Moon:
There is no atmosphere.
There is no sound.
Puede lograr el mismo resultado con las comillas triples:
PythonCopiar
>>> multiline = """Facts about the Moon:
... There is no atmosphere.
... There is no sound."""
>>> print(multiline)
Facts about the Moon:
There is no atmosphere.
There is no sound
Métodos de cadena en Python
Completado100 XP
3 minutos
Los métodos de cadena son uno de los tipos de método más comunes en
Python. A menudo tendrá que manipular cadenas para extraer información o
ajustarse a un formato concreto. Python incluye varios métodos de cadena
diseñados para realizar las transformaciones más comunes y útiles.
Los métodos de cadena forman parte del tipo str. Esto significa que los
métodos existen como variables de cadena o directamente como parte de la
cadena. Por ejemplo, el método .title() se puede usar directamente con una
cadena:
PythonCopiar
>>> "temperatures and facts about the moon".title()
'Temperatures And Facts About The Moon'
Y el mismo comportamiento y utilización se produce en una variable:
PythonCopiar
>>> heading = "temperatures and facts about the moon"
>>> [Link]()
'Temperatures And Facts About The Moon'
División de una cadena
Un método de cadena común es .split(). Sin argumentos, el método separará
la cadena en cada espacio. Esto crearía una lista de todas las palabras o
números separados por un espacio:
PythonCopiar
>>> temperatures = """Daylight: 260 F
... Nighttime: -280 F"""
>>> temperatures .split()
['Daylight:', '260', 'F', 'Nighttime:', '-280', 'F']
En este ejemplo, trabaja con varias líneas, por lo que el carácter de nueva línea
(implícito) se puede usar para dividir la cadena al final de cada línea, y crear
líneas únicas:
PythonCopiar
>>> temperatures .split('\n')
['Daylight: 260 F', 'Nighttime: -280 F']
Este tipo de división resulta útil cuando se necesita un bucle para procesar o
extraer información, o bien cuando se cargan datos desde un archivo de texto.
Búsqueda de una cadena
Algunos métodos de cadena pueden buscar contenido antes del
procesamiento, sin necesidad de usar un bucle. Imagine que tiene dos oraciones
que analizan las temperaturas de varios planetas y lunas, pero solo le interesan
las temperaturas relacionadas con la Luna. Es decir, si las oraciones no se
refieren a la Luna, no se deben procesar para extraer información.
La manera más sencilla de detectar si existe una palabra, un carácter o un grupo
de caracteres determinados en una cadena es usar el operador in:
PythonCopiar
>>> "Moon" in "This text will describe facts and challenges with space
travel"
False
>>> "Moon" in "This text will describe facts about the Moon"
True
Un enfoque para buscar la posición de una palabra específica en una cadena
consiste en usar el método .find():
PythonCopiar
>>> temperatures = """Saturn has a daytime temperature of -170 degrees
Celsius,
... while Mars has -28 Celsius."""
>>> [Link]("Moon")
-1
El método .find() devuelve -1 cuando no se encuentra la palabra, o bien
devuelve el índice (el número que representa la posición en la cadena). Así es
como se comportaría si busca la palabra Mars:
PythonCopiar
>>> [Link]("Mars")
65
65 es la posición donde "Mars" aparece en la cadena.
Otra manera de buscar contenido consiste en usar el método .count(), que
devuelve el número total de repeticiones de una palabra determinada en una
cadena:
PythonCopiar
>>> [Link]("Mars")
1
>>> [Link]("Moon")
0
Las cadenas en Python distinguen mayúsculas de minúsculas, lo que significa
que Luna y luna se consideran palabras diferentes. Para realizar una
comparación sin distinguir mayúsculas de minúsculas, puede convertir una
cadena en letras minúsculas mediante el método .lower():
PythonCopiar
>>> "The Moon And The Earth".lower()
'the moon and the earth'
Como sucede con el método .lower(), las cadenas tienen un
método .upper() que hace lo contrario y convierte todos los caracteres en
mayúsculas:
PythonCopiar
>>> "The Moon And The Earth".upper()
'THE MOON AND THE EARTH'
Sugerencia
Al buscar y comprobar contenido, un enfoque más sólido consiste es convertir
en minúsculas una cadena para que el uso de mayúsculas y minúsculas no
impida una coincidencia. Por ejemplo, si va a contar el número de veces que
aparece la palabra the, el método no contaría las veces en las que aparece The,
aunque las dos sean la misma palabra. Puede usar el método .lower() para
cambiar todos los caracteres a minúsculas.
Comprobación del contenido
Hay ocasiones en las que procesará texto para extraer información con una
presentación irregular. Por ejemplo, la cadena siguiente es más fácil de procesar
que un párrafo no estructurado:
PythonCopiar
>>> temperatures = "Mars Average Temperature: -60 C"
Para extraer la temperatura media en Marte, puede hacerlo con los métodos
siguientes:
PythonCopiar
>>> parts = [Link](':')
>>> parts
['Mars average temperature', ' -60 C']
>>> parts[-1]
' -60 C'
El código anterior confía en que todo lo que hay después de los dos puntos ( :)
es una temperatura. La cadena se divide en :, lo que genera una lista de dos
elementos. El uso de [-1] en la lista devuelve el último elemento que, en este
ejemplo, es la temperatura.
Si el texto es irregular, no puede usar los mismos métodos de división para
obtener el valor. Debe recorrer en bucle los elementos y comprobar si los
valores son de un tipo determinado. Python tiene métodos que ayudan a
comprobar el tipo de cadena:
PythonCopiar
>>> mars_temperature = "The highest temperature on Mars is about 30 C"
>>> for item in mars_temperature.split():
... if [Link]():
... print(item)
...
30
Como sucede con el método .isnumeric(), .isdecimal() puede buscar cadenas
que parezcan decimales.
Importante
Le sorprenderá saber que "-70".isnumeric() devolverá False. Esto se debe a que
todos los caracteres de la cadena tendrían que ser numéricos y el guión ( -) no lo
es. Si tiene que comprobar números negativos en una cadena, el
método .isnumeric() no funcionará.
Hay validaciones adicionales que puede aplicar en las cadenas para comprobar
si hay valores. En el caso de los números negativos, el guion se agrega como
prefijo al número y se puede detectar con el método .startswith():
PythonCopiar
>>> "-60".startswith('-')
True
De forma similar, el método .endswith() ayuda a comprobar el último carácter
de una cadena:
PythonCopiar
>>> if "30 C".endswith("C"):
print("This temperature is in Celsius")
'This temperature is in Celsius'
Transformar texto
Hay otros métodos que ayudan en situaciones en las que el texto se debe
transformar en algo distinto. Hasta ahora, ha visto cadenas que pueden
usar C para Celsius y F para Fahrenheit. Puede usar el método .replace() para
buscar y reemplazar repeticiones de un carácter o grupo de caracteres:
PythonCopiar
>>> "Saturn has a daytime temperature of -170 degrees Celsius, while Mars has
-28 Celsius.".replace("Celsius", "C")
'Saturn has a daytime temperature of -170 degrees C, while Mars has -28 C.'
Como se ha mencionado antes, .lower() es una buena manera de normalizar el
texto para realizar una búsqueda sin distinguir mayúsculas de minúsculas. Ahora
se comprobará rápidamente si algún texto analiza las temperaturas:
PythonCopiar
>>> text = "Temperatures on the Moon can vary wildly."
>>> "temperatures" in text
False
>>> "temperatures" in [Link]()
True
Es posible que no tenga que realizar la comprobación sin distinguir mayúsculas
de minúsculas todo el tiempo, pero convertir en minúsculas todas las letras es
un buen enfoque cuando en el texto se usa una mezcla de mayúsculas y
minúsculas.
Después de dividir el texto y realizar las transformaciones, es posible que tenga
que volver a ensamblar todas las piezas. Al igual que el método .split() puede
separar caracteres, el método .join() puede volver a agruparlos.
El método .join() necesita un elemento iterable (como una lista de Python)
como argumento, por lo que su uso es diferente al de otros métodos de
cadena:
PythonCopiar
>>> moon_facts = ["The Moon is drifting away from the Earth.", "On average,
the Moon is moving about 4cm every year"]
>>> '\n'.join(moon_facts)
'The Moon is drifting away from the Earth.\nOn average, the Moon is moving
about 4cm every year'
En este ejemplo, se usa el carácter de nueva línea '\n' para unir todos los
elementos de la lista.
Exercise: Transform strings
There are several operations you can perform on strings when you manipulate
them. In this exercise, you'll use string methods to modify text with facts about
the Moon and then extract information to create a short summary.
This exercise is broken into a series of steps. For each step you will be presented
with the goal for the step, followed by an empty cell. Enter your Python into the
cell and run it. The solution for each step will follow each cell.
Parsing interesting facts about the moon
Start by storing the following paragraph in a variable named text:
Interesting facts about the Moon. The Moon is Earth's only satellite. There are
several interesting facts about the Moon and how it affects life here on Earth.
On average, the Moon moves 4cm away from the Earth every year. This yearly drift
is not significant enough to cause immediate effects on Earth. The highest
daylight temperature of the Moon is 127 C.
[4]
# Enter code below
Your code should resemble the following:
text = """Interesting facts about the Moon. The Moon is Earth's only satellite.
There are several interesting facts about the Moon and how it affects life here
on Earth. On average, the Moon moves 4cm away from the Earth every year. This
yearly drift is not significant enough to cause immediate effects on Earth. The
highest daylight temperature of the Moon is 127 C."""
Separate the paragraph into sentences
In English each sentence ends with a period. You will use this to break the
paragraph into difference sentences. Using the split method to split the text
into sentences by looking for the string . (a period followed by a space). Store
the result in a variable named sentences. Print the result.
[3]
# Enter code below
['Interesting facts about the Moon', "The Moon is Earth's only
satellite", 'There are several interesting facts about the Moon and
how it affects life here on Earth', '\nOn average, the Moon moves 4cm
away from the Earth every year', 'This yearly drift is not significant
enough to cause immediate effects on Earth', 'The highest daylight
temperature of the Moon is 127 C.']
Your code should resemble the following:
sentences = [Link]('. ')
print(sentences)
Desired output
When you run the cell you should see the following result:
['Interesting facts about the Moon', "The Moon is Earth's only satellite", 'There
are several interesting facts about the Moon and how it affects life here on
Earth', '\nOn average, the Moon moves 4cm away from the Earth every year', 'This
yearly drift is not significant enough to cause immediate effects on Earth', 'The
highest daylight temperature of the Moon is 127 C.']
Find keywords
You will finish your program by adding the code to find any sentences which
mention temperature. Add code to loop through the sentences variable. For
each sentence, search for the word temperature. If the word is found, print the
sentence.
[ ]
# Enter code below:
Presione Mayús + Entrar para ejecutar
Your code should resemble the following:
for sentence in sentences:
if 'temperature' in sentence:
print(sentence)
Desired output
When run, the output should look like the following:
The highest daylight temperature of the Moon is 127 C.
CódigoMarkdown
learn-notebooks-74e4b04b-fca5-466f-be31-0b1d5158c740
Proceso no conectado
Visualización
Kernel no conectado
Exercise: Formatting strings
Knowing how to format strings is essential when you're presenting information
from a program. There are a few different ways to accomplish this in Python. In
this exercise, you use variables that hold key facts about gravity on various
moons and then use them to format and print the information.
This exercise is broken into a series of steps. For each step you will be presented
with the goal for the step, followed by an empty cell. Enter your Python into the
cell and run it. The solution for each step will follow each cell.
Create the variables
Start by creating three variables, name, gravity, and planet, and set them to
the following values:
name: Ganymede
planet: Mars
gravity: 1.43
CódigoMarkdown
[ ]
# Enter code below
Presione Mayús + Entrar para ejecutar
Your code should look like the following:
name = 'Ganymede'
planet = 'Mars'
gravity = '1.43'
Create the template
Now you will create the template to display the information about the moon.
You want the output to look like the following:
Gravity Facts about {name}
--------------------------
Planet Name: {planet}
Gravity on {name}: {gravity} m/s2
Create a variable named template, and set it to the template you create.
[ ]
# Enter code below
Presione Mayús + Entrar para ejecutar
Your code should look like the following:
template = """Gravity Facts about {name}
----------------------------------------
Planet Name: {planet}
Gravity on {name}: {gravity} m/s2"""
Use the template
With the template created, it's time to use it to display information about the
moon! Use the format function on template to use the template and print the
information. Set name, planet, and gravity to the appropriate values.
[ ]
# Enter code below
Presione Mayús + Entrar para ejecutar
Your code should look like the following:
print([Link](name=name, planet=planet, gravity=gravity))
Desired output
When run, the result should look like the following:
Gravity Facts about Ganymede
--------------------------
Planet Name: Mars
Gravity on Ganymede: 1.43 m/s2
learn-notebooks-74e4b04b-fca5-466f-be31-0b1d5158c740
Proceso no conectado
Visualización
Kernel no conectado
¿Cuáles son los operadores en
Python?
Completado100 XP
3 minutos
Por lo general, las matemáticas implican unas cuatro operaciones principales:
suma, resta, multiplicación y división. Python admite estos cuatro operadores y
algunos otros. Vamos a explorar los operadores más comunes que usará en los
programas.
Suma
Python usa para + indicar la suma. Usar + entre dos números los suma y
proporciona el total.
PythonCopiar
answer = 30 + 12
print(answer)
# Output: 42
Nota
Los operadores se comportan igual cuando se usan números literales (como 42)
o variables.
Resta
De manera similar, Python utiliza - para la resta. Usar - entre dos números los
resta y proporciona la diferencia.
PythonCopiar
difference = 30 - 12
print(difference)
# Output: 18
Multiplicación
En Python, * es el operador de multiplicación. Proporciona el producto de dos
números:
PythonCopiar
product = 30 * 12
print(product)
# Output: 360
División
Por último, / se usa para la división. Proporciona el cociente de dos números:
PythonCopiar
quotient = 30 / 12
print(quotient)
# Output: 2.5
Uso de la división
Imagine que debe convertir un número de segundos en minutos y segundos
para su visualización.
PythonCopiar
seconds = 1042
El primer paso consiste en determinar el número de minutos que hay
en 1042 segundos. Con 60 segundos en un minuto, puede dividir por 60 y
obtener una respuesta de 17.3666667. El número que le interesa simplemente
es 17. Se recomienda redondear hacia abajo, usando lo que se conoce
como división de múltiplo inferior. Para realizar una división de este tipo en
Python, debe utilizar //.
PythonCopiar
seconds = 1042
display_minutes = 1042 // 60
print(display_minutes)
# Output: 17
El paso siguiente es determinar el número de segundos. Este número es el resto
de 1042 si divide entre 60. Para encontrar el resto, use el operador módulo, que
en Python es %. El resto de 1042 / 60 es 22, que es el valor que el operador
módulo proporcionará.
PythonCopiar
seconds = 1042
display_minutes = 1042 // 60
display_seconds = 1042 % 60
print(display_minutes)
print(display_seconds)
# Output:
# 17
# 22
Orden de las operaciones
Python respeta el orden de las operaciones en matemáticas. El orden de las
operaciones determina que las expresiones se deben evaluar en este orden:
1. Paréntesis
2. Exponentes
3. Multiplicación y división
4. Suma y resta
Observe que se evalúan los paréntesis antes que cualquier otra operación. Usar
paréntesis le permite asegurarse de que el código se ejecute de una manera
predecible y el código resulta más fácil de leer y mantener. Como resultado, el
procedimiento recomendado es usar paréntesis aunque el orden de las
operaciones se evalúe de la misma manera sin ellos. En las dos líneas de código
siguientes, la segunda es más comprensible porque el paréntesis indica
claramente qué operación se realizará primero.
PythonCopiar
result_1 = 1032 + 26 * 2
result_2 = 1032 + (26 * 2)
# The answer is the same in both cases - 1084
Operadores aritméticos en Python
Python proporciona operadores aritméticos comunes para que pueda realizar
operaciones matemáticas en su código. Estos incluyen las cuatro operaciones
básicas de suma, resta, multiplicación y división.
Exploremos cómo podemos crear un programa que pueda calcular la distancia
entre dos planetas. Empezaremos usando dos distancias planetarias: la Tierra
(149 597 870 km) y Júpiter (778 547 200 km).
Este ejercicio se divide en una serie de pasos. Para cada paso, se le presentará el
objetivo del paso, seguido de una celda vacía. Ingrese su Python en la celda y
ejecútelo. La solución para cada paso seguirá a cada celda.
Nota: elimine las comas cuando utilice los valores.
Crear variables para almacenar las distancias
Comience creando dos variables
llamadas first_planety second_planet. Ajuste first_planetla distancia del
sol a la Tierra y second_planetla distancia del sol a Júpiter.
[ ]
# Introduce el código abajo
Presione Mayús + Entrar para ejecutar
Su código debe parecerse al siguiente:
first_planet = 149597870
second_planet = 778547200
Mostrar la distancia entre los planetas
Tienes dos variables que almacenan la distancia entre cada planeta y un punto
común: el sol. Puedes restar estos dos valores para determinar la distancia entre
los planetas.
Comience agregando el código para
restar first_planety second_planetalmacene el resultado en una variable
llamada distance_km. Muestra el valor en la pantalla.
Luego agregue el código para convertir distance_kma millas dividiéndolo por
1.609344 (la diferencia aproximada entre millas y kilómetros) y almacene el
resultado en una variable llamada distance_mi. Muestra el valor en la pantalla.
[ ]
# Introduce el código abajo
Presione Mayús + Entrar para ejecutar
Su código debe parecerse al siguiente:
distance_km = second_planet - first_planet
print(distance_km)
distance_mi = distance_km / 1.609344
print(distance_mi)
Salida deseada
El resultado final que se muestra cuando ejecuta el cuaderno debe ser el
siguiente:
628949330
390810995.0389724
Uso de números en Python
Completado100 EXP
4 minutos
Más allá de la aritmética básica, puede usar otras operaciones en los números.
Es posible que tenga que realizar un redondeo o convertir cadenas en números.
En el escenario de este módulo, quiere aceptar la entrada de un usuario. La
entrada será una cadena en lugar de un número, por lo que deberá convertirla
en un número. Además, es posible que el usuario escriba valores que le den una
respuesta negativa que no querrá mostrar. Puede que tenga que convertir la
respuesta en el valor absoluto. Afortunadamente, Python proporciona utilidades
para estas operaciones.
Conversión de cadenas en números
Python admite dos tipos principales de números: números enteros (o int) y
número de punto flotante (o float). La diferencia clave entre ambos es la
existencia de un separador decimal; los enteros son números enteros, mientras
que los números de punto flotante contienen un valor decimal.
Al convertir cadenas en números, debe indicar el tipo de número que desea
crear. Tiene que decidir si necesita un separador decimal. Se usa int para
realizar la conversión en un número entero y float para hacerlo en un número
de punto flotante.
PitónCopiar
demo_int = int('215')
print(demo_int)
demo_float = float('215.3')
print(demo_float)
# Output:
# 215
# 215.3
Importante
Si usa un valor no válido para int o float, recibirá un error.
Valores absolutos
En matemáticas, un valor absoluto es el número no negativo sin su signo. El uso
de un valor absoluto puede ser útil en situaciones varias, incluido el ejemplo de
búsqueda para determinar la distancia entre dos planetas. Considere los
cálculos siguientes:
PitónCopiar
39 - 16
16 - 39
Observe que la diferencia entre las dos ecuaciones es que los números se
invierten. Las respuestas son 23 y -23, respectivamente. Al determinar la
distancia entre dos planetas, no importa el orden en el que se escriben los
números, ya que la respuesta absoluta es la misma.
Use abs para convertir el valor negativo en su valor absoluto. Si hace la misma
operación mediante abs (e imprime las respuestas), verá que muestra 23 para
ambas ecuaciones.
PitónCopiar
print(abs(39 - 16))
print(abs(16 - 39))
# Output
# 23
# 23
Redondeo
También es útil la función integrada de Python denominada round. Úsela para
redondear hacia arriba al entero más cercano si el valor decimal es .5 o mayor,
o bien hacia abajo si es menor que .5.
PitónCopiar
print(round(14.5))
# Output: 15
Biblioteca matemática
Python tiene bibliotecas para proporcionar operaciones y cálculos más
avanzados. Una de las más comunes es la biblioteca math. math permite hacer el
redondeo con floor y ceil, proporcionar el valor de pi y muchas otras
operaciones. Veamos cómo usar esta biblioteca para redondear hacia arriba o
hacia abajo.
El redondeo de números permite quitar la parte decimal de un número de
punto flotante. Puede optar por redondear siempre hacia arriba al número
entero más cercano si usa ceil, o hacia abajo si usa floor.
PitónCopiar
from math import ceil, floor
round_up = ceil(12.5)
print(round_up)
round_down = floor(12.5)
print(round_down)
# Output
# 13
# 12
Cree una aplicación para trabajar con números y
entrada del usuario
Con frecuencia necesitará convertir valores de cadena en números para realizar
correctamente diferentes operaciones o determinar el valor absoluto de un
número. En este ejercicio, creará un proyecto para calcular la distancia entre dos
planetas según la entrada del usuario.
Este ejercicio se divide en una serie de pasos. Para cada paso, se le presentará el
objetivo del paso, seguido de una celda vacía. Ingrese su Python en la celda y
ejecútelo. La solución para cada paso seguirá a cada celda.
Leer los valores del usuario
Para crear nuestra aplicación, queremos leer la distancia desde el sol para dos
planetas y luego mostrar la distancia entre los planetas. Haremos esto
usando inputpara leer los valores, intconvertirlos a enteros y
luego absconvertir el resultado a su valor absoluto.
Comience agregando el código para solicitar al usuario la distancia entre el sol y
el primer planeta, y luego el segundo. Almacene cada resultado en variables
denominadas first_planet_inputy second_planet_input.
CódigoMarkdown
[1]
# Enter code below
Su código debe parecerse al siguiente
first_planet_input = input('Enter the distance from the sun for the first planet
in KM')
second_planet_input = input('Enter the distance from the sun for the second
planet in KM')
Convertir a número
Debido a inputque devuelve valores de cadena, necesitamos convertirlos en
números. Agregue el código para convertir cada entrada en un número entero
usando int. Almacene los valores
en first_planety second_planetrespectivamente.
[2]
# Enter code below
Su código debe parecerse al siguiente:
first_planet = int(first_planet_input)
second_planet = int(second_planet_input)
Realizar el cálculo y convertir a valor absoluto
Con sus valores almacenados como números, ahora puede agregar el código
para realizar el cálculo, restando el primer planeta del segundo. Debido a que el
segundo planeta puede ser un número mayor, lo usará abspara convertirlo a un
valor absoluto.
Resta y convierte first_planetel second_planetresultado a su valor absoluto
usando abs. Almacene el resultado en una variable llamada distance_km. Luego
muestre el resultado en la pantalla.
[]
# Enter code below
Presione Mayús + Entrar para ejecutar
Your code should resemble the following:
distance_km = second_planet - first_planet
print(abs(distance_km))
Test your application
To test your project, run the notebook. You'll be prompted in a dialog to
provide the distances. You can use the ones from the following table:
Planet Distance from sun
Mercury 57900000
Venus 108200000
Earth 149600000
Mars 227900000
Jupiter 778600000
Saturn 1433500000
Uranus 2872500000
Neptune 4495100000
aprender-cuadernos-7b47cd1c-41fb-4382-b545-a9f36dcd13f7
Proceso no conectado
Visualización
Kernel no conectado
Introducción
Completado100 XP
1 minuto
Como desarrollador, trabajará con frecuencia con conjuntos de datos. Es posible
que tenga que administrar varios nombres, edades o direcciones. Almacenar
cada valor en una variable individual hace que el código sea más difícil de leer y
escribir. Para almacenar varios valores, puede usar una lista de Python.
Escenario: Trabajar en una aplicación de
planetario
Imagine es un desarrollador que quiere crear una aplicación para trabajar con
una lista de planetas. Quiere preguntar al usuario el nombre de un planeta y
mostrar los planetas más cercanos al sol y los más alejados de él.
En este módulo, descubrirá cómo usar listas de Python y algunas de las
operaciones más comunes.
¿Qué descubriré?
Después de completar este módulo, podrá:
Identificar cuándo se debe usar una lista.
Crea una lista.
Acceder a un elemento determinado de una lista mediante índices.
Insertar elementos al final de una lista.
Ordenar y segmentar una lista.
¿Cuál es el objetivo principal?
Al final de este módulo, comprenderá cuándo usar una estructura de lista y
cómo puede ayudar a organizar los datos.
Presentación de listas
Completado100 XP
1 minuto
Python tiene muchos tipos integrados, como cadenas y enteros. También tiene
un tipo para almacenar una colección de valores: la lista.
Crear una lista
Para crear una lista, asigne una secuencia de valores a una variable. Cada valor
está separado por una coma y están entre corchetes ( []). En el ejemplo
siguiente se almacena la lista de todos los planetas de la variable planets:
PythonCopiar
planets = ["Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn",
"Uranus", "Neptune"]
Acceso a elementos de lista por índice
Puede acceder a cualquier elemento de una lista colocando el índice entre
corchetes [] después del nombre de la variable de lista. Los índices comienzan a
partir de 0, por lo que en el código siguiente, planets[0] es el primer elemento
de la lista planets:
PythonCopiar
print("The first planet is", planets[0])
print("The second planet is", planets[1])
print("The third planet is", planets[2])
# Output
# The first planet is Mercury
# The second planet is Venus
# The third planet is Earth
Nota
Dado que todos los índices empiezan por 0, [1] es el segundo elemento, [2] es
el tercero, etc.
También puede modificar valores de una lista mediante un índice. Para ello,
asigne un nuevo valor, de la misma manera que asignaría un valor de variable.
Por ejemplo, podría cambiar el nombre de Marte en la lista para usar su alias:
PythonCopiar
planets[3] = "Red Planet"
print("Mars is also known as", planets[3])
# Output
# Mars is also known as Red Planet
Determinación de la longitud de una lista
Para obtener la longitud de una lista, use la función integrada len(). El código
siguiente crea una variable, number_of_planets. El código asigna esa variable con
el número de elementos de la lista planets (8).
PythonCopiar
number_of_planets = len(planets)
print("There are", number_of_planets, "planets in the solar system.")
# Output:
# There are 8 planets in the solar system
Incorporación de valores a listas
Las listas de Python son dinámicas: puede agregar y quitar elementos después
de crearlas. Para agregar un elemento a una lista, use el método .append(value).
Por ejemplo, el código siguiente agrega la cadena "Pluto" al final de la
lista planets:
PythonCopiar
[Link]("Pluto")
number_of_planets = len(planets)
print("There are actually", number_of_planets, "planets in the solar
system.")
# Output:
# There are actually 9 planets in the solar system.
Eliminación de valores de listas
Puede quitar el último elemento de una lista llamando al método .pop() en la
variable de lista:
PythonCopiar
[Link]() # Goodbye, Pluto
number_of_planets = len(planets)
print("No, there are definitely", number_of_planets, "planets in the solar
system.")
Uso de índices negativos
Ha visto cómo usar índices para capturar un elemento individual en una lista:
PythonCopiar
print("The first planet is", planets[0])
# Output:
# The first planet is Mercury
Los índices comienzan en cero y van en aumento. Los índices negativos
comienzan al final de la lista y van hacia atrás.
En el ejemplo siguiente, un índice de -1 devuelve el último elemento de una
lista. Un índice de -2 devuelve el penúltimo.
PythonCopiar
print("The last planet is", planets[-1])
print("The penultimate planet is", planets[-2])
# Output
# The last planet is Neptune
# The penultimate planet is Uranus
Si quisiera devolver el antepenúltimo, usaría un índice de -3 (y así
sucesivamente).
Búsqueda de un valor en una lista
Para determinar dónde se almacena un valor en una lista, use el
método index de la lista. Este método busca el valor y devuelve el índice de ese
elemento en la lista. Si no encuentra ninguna coincidencia, devuelve -1.
En el ejemplo siguiente se muestra el uso de "Jupiter" como el valor del índice:
PythonCopiar
jupiter_index = [Link]("Jupiter")
print("Jupiter is the", jupiter_index + 1, "planet from the sun")
# Output
# Jupiter is the 5 planet from the sun
Nota
Dado que la indexación comienza por 0, debe agregar 1 para mostrar el número
adecuado.
Exercise: Use lists to store planet names
Lists allow you to store multiple values in a single variable. In this notebook
you'll create a project to display information about the planets.
This exercise is broken into a series of steps. For each step you will be presented
with the goal for the step, followed by an empty cell. Enter your Python into the
cell and run it. The solution for each step will follow each cell.
Add all planets to a list
First, create a variable named planets. Add the eight planets (without Pluto) to
the list. The planets are:
Mercury
Venus
Earth
Mars
Jupiter
Saturn
Uranus
Neptune
Finish by using print to display the list of planets.
CódigoMarkdown
[ ]
# Enter your code below:
Presione Mayús + Entrar para ejecutar
Your code should look something like this:
planets = ["Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranus",
"Neptune"]
print(planets)
Display the number of planets
Next, display the total number of planets by using len and print.
[ ]
# Enter your code below:
Presione Mayús + Entrar para ejecutar
Your code should look something like this:
print("There are", len(planets), "planets")
Add a planet to the list
Finally, add Pluto to the list that you created. Then display both the number of
planets and the last planet in the list.
[ ]
# Enter your code below:
Presione Mayús + Entrar para ejecutar
Your code should look like this:
[Link]("Pluto")
print("Actually, there are", len(planets), "planets")
print(planets[-1], "is the last planet")
Sin proceso
Proceso no conectado
Visualización
Kernel no conectado
Trabajo con números en listas
Completado100 XP
1 minuto
Hasta ahora, ha estado usando nombres de planetas en una lista. Es posible que
se pregunte si trabaja con otros tipos de datos, como números.
¿Sabía que la gravedad en otros planetas es más fuerte o más débil en función
de la masa o el tamaño del planeta? La gravedad a menudo se mide en G,
donde la gravedad en la Tierra es 1 y otros planetas se miden en relación con la
Tierra.
La gravedad en la Luna es de 0,166 G, por este motivo los astronautas pueden
saltar tan alto sobre la Luna. La gravedad en Neptuno es de 1,12 G, por lo que
saltar es más difícil. Incluso los grandes atletas tendrían dificultades para saltar
más de 2 metros en Neptuno.
Almacenamiento de números en listas
Para almacenar números con decimales en Python, se debe usar el tipo float.
Para crear un valor float, escriba el número con la posición decimal y asígnelo a
una variable:
PythonCopiar
gravity_on_earth = 1.0
gravity_on_the_moon = 0.166
El código siguiente crea una lista en la que se muestran las fuerzas de los ocho
planetas del sistema solar, en G:
PythonCopiar
gravity_on_planets = [0.378, 0.907, 1, 0.377, 2.36, 0.916, 0.889, 1.12]
En esta lista, gravity_on_planets[0] es la gravedad en Mercurio
(0,378 G), gravity_on_planets[1] es la gravedad en Venus (0,907 G), y así
sucesivamente.
En la Tierra, un autobús de dos pisos pesa 12 650 kilogramos (kg), es decir,
12,65 toneladas. En Mercurio, donde la gravedad es de 0,378 G, el mismo
autobús pesa 12,65 toneladas multiplicado por 0,378. En Python, para
multiplicar dos valores, se usa el símbolo *.
En el ejemplo siguiente, puede averiguar el peso de un autobús de dos pisos en
diferentes planetas obteniendo el valor de la lista:
PythonCopiar
bus_weight = 12650 # in kilograms, on Earth
print("On Earth, a double-decker bus weighs", bus_weight, "kg")
print("On Mercury, a double-decker bus weighs", bus_weight *
gravity_on_planets[0], "kg")
# Output
# On Earth, a double-decker bus weighs 12650 kg
# On Mercury, a double-decker bus weighs 4781.7 kg
Uso de min() y max() con listas
Python tiene funciones integradas para calcular los números más grandes y más
pequeños de una lista. La función max() devuelve el número más grande
y min() devuelve el más pequeño. Por lo
tanto, min(gravity_on_planets) devuelve el número más pequeño de la
lista gravity_on_planets, que es 0,377 (Marte).
El código siguiente calcula los pesos mínimo y máximo en el sistema solar
mediante esas funciones:
PythonCopiar
bus_weight = 12650 # in kilograms, on Earth
print("On Earth, a double-decker bus weighs", bus_weight, "kg")
print("The lightest a bus would be in the solar system is", bus_weight *
min(gravity_on_planets), "kg")
print("The heaviest a bus would be in the solar system is", bus_weight *
max(gravity_on_planets), "kg")
# Output
# On Earth, a double-decker bus weighs 12650 kg
# The lightest a bus would be in the solar system is 4769.05 kg
# The heaviest a bus would be in the solar system is 29854 kg
Manipulación de datos de la lista
Completado100 XP
1 minuto
Es posible que tenga que trabajar con distintas partes de una lista. Por ejemplo,
suponga que tiene una lista con cantidades de precipitaciones durante varios
meses. Para analizar correctamente este tipo de datos, es posible que tenga que
buscar las precipitaciones en otoño o en un periodo de tres meses. También
puede que quiera ordenar la lista de mayor a menor cantidad de
precipitaciones.
Python proporciona una compatibilidad sólida para trabajar con los datos de las
listas. Esta compatibilidad incluye la segmentación de datos (examinando solo
una parte) y la ordenación.
Segmentación de listas
Puede recuperar una parte de una lista mediante una segmentación. Una
segmentación usa corchetes, pero en lugar de un solo elemento, tiene los
índices inicial y final. Cuando se usa una segmentación, se crea una lista que
comienza en el índice inicial y termina antes del índice final (y no lo incluye).
La lista de planetas tiene ocho elementos. La Tierra es el tercero de la lista. Para
mostrar los planetas que hay antes de la Tierra, use una segmentación a fin de
obtener los elementos que empiezan en 0 y terminan en 2:
PythonCopiar
planets = ["Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn",
"Uranus", "Neptune"]
planets_before_earth = planets[0:2]
print(planets_before_earth)
# Output: ['Mercury', 'Venus']
Observe cómo la Tierra no está incluida en la lista. El motivo es que el índice
finaliza antes del índice final.
Para obtener todos los planetas después de la Tierra, comience en el tercero y
vaya hasta el octavo:
PythonCopiar
planets_after_earth = planets[3:8]
print(planets_after_earth)
# Output
# ['Mars', 'Jupiter', 'Saturn', 'Uranus', 'Neptune']
En este ejemplo, se muestra Neptuno. La razón es que el índice de Neptuno
es 7, porque la indexación comienza en 0. Dado que el índice final era 8, incluye
el último valor. Si no coloca el índice de detención en la segmentación, Python
asume que quiere ir al final de la lista:
PythonCopiar
planets_after_earth = planets[3:]
print(planets_after_earth)
# Output
# ['Mars', 'Jupiter', 'Saturn', 'Uranus', 'Neptune']
Importante
Una segmentación crea una lista nueva. No modifica la lista actual.
Combinación de listas
Ha visto cómo puede usar segmentaciones para dividir listas, pero ¿qué sucede
con unirlas de nuevo?
Para unir dos listas, debe usar el otro operador ( +) con dos listas para devolver
una nueva.
Hay 79 lunas conocidas de Júpiter. Las cuatro más grandes son Ío, Europa,
Ganímedes y Calisto. Estas lunas se denominan lunas galileanas, ya que Galileo
Galilei las descubrió con su telescopio en 1610. El grupo de Amaltea está más
cerca de Júpiter que el grupo galileano. Consta de las lunas Metis, Adrastea,
Amaltea y Tebe.
Cree dos listas. Rellene la primera lista con las cuatro lunas de Amaltea y la
segunda lista con las cuatro lunas galileanas. Únalas mediante + para crear una
lista:
PythonCopiar
amalthea_group = ["Metis", "Adrastea", "Amalthea", "Thebe"]
galilean_moons = ["Io", "Europa", "Ganymede", "Callisto"]
regular_satellite_moons = amalthea_group + galilean_moons
print("The regular satellite moons of Jupiter are", regular_satellite_moons)
# Output
# The regular satellite moons of Jupiter are ['Metis', 'Adrastea',
'Amalthea', 'Thebe', 'Io', 'Europa', 'Ganymede', 'Callisto']
Importante
La unión de listas crean una lista nueva. No modifica la lista actual.
Ordenación de listas
Para ordenar una lista, use el método .sort() de la lista. Python ordenará una
lista de cadenas en orden alfabético y una lista de números en orden numérico:
PythonCopiar
regular_satellite_moons.sort()
print("The regular satellite moons of Jupiter are", regular_satellite_moons)
# Output
# The regular satellite moons of Jupiter are ['Adrastea', 'Amalthea',
'Callisto', 'Europa', 'Ganymede', 'Io', 'Metis', 'Thebe']
Para ordenar una lista en orden inverso, llame a .sort(reverse=True) en la lista:
PythonCopiar
regular_satellite_moons.sort(reverse=True)
print("The regular satellite moons of Jupiter are", regular_satellite_moons)
# Output
# The regular satellite moons of Jupiter are ['Thebe', 'Metis', 'Io',
'Ganymede', 'Europa', 'Callisto', 'Amalthea', 'Adrastea']
Importante
El uso de sort modifica la lista actual.
Use slices to retrieve portions of a list
You might need to work different sections of a list. In this notebook, you will
create a project to display planets closer to and farther away from the sun than
a planet that the user enters.
This exercise is broken into a series of steps. For each step you will be presented
with the goal for the step, followed by an empty cell. Enter your Python into the
cell and run it. The solution for each step will follow each cell.
Create the list of planets
First, create a variable named planets. Add the eight planets (without Pluto) to
the list. The planets are:
Mercury
Venus
Earth
Mars
Jupiter
Saturn
Uranus
Neptune
CódigoMarkdown
[ ]
# Enter your code below
Presione Mayús + Entrar para ejecutar
Your code should look like this:
planets = ["Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranus",
"Neptune"]
Prompt the user for the reference planet
Next you will add the code to prompt the user for the name of a planet. You will
do this by using input. Because strings are case sensitive in Python, ask the user
to use a capital letter to start the name of the planet.
[ ]
# Enter code below
Presione Mayús + Entrar para ejecutar
Your code should look like this:
user_planet = input("Please enter the name of the planet (with a capital letter
to start)")
Find the location of the selected planet
Now it's time to determine which planets are closer than the one that the user
entered. To do this, you need to find where he planet is in the list. You can use
the index method to perform this operation. Add the code to find the index of
the planet, and store it in a variable named planet_index.
[ ]
# Enter code below
Presione Mayús + Entrar para ejecutar
Your code should look like this:
planet_index = [Link](user_planet)
Display planets closer to the sun
With the index determined, you can now add the code to display planets closer
to the sun than the one selected. Use the slicing abilities of a list to display all
planets up to the one selected.
[ ]
# Enter code below
Presione Mayús + Entrar para ejecutar
Your code should look like this:
print("Here are the planets closer than " + user_planet)
print(planets[0:planet_index])
Display planets further
You can use the same index to display planets farther from the sun. However,
remember that the starting index is included when you're using a slice. As a
result, you'll have to add 1 to the value. Add the code to display the planets
farther from the sun.
[ ]
# Enter code below
Presione Mayús + Entrar para ejecutar
Your code should look like this:
print("Here are the planets further than " + user_planet)
print(planets[planet_index + 1:])
Sin proceso
Proceso no conectado
Visualización
Kernel no conectado
Introducción
Completado100 XP
1 minuto
Con frecuencia tendrá que trabajar con datos más complejos que cadenas y
valores booleanos. En este módulo se proporcionan las herramientas para
hacerlo. Ahora se acotará el tema mediante el análisis de un escenario.
Escenario: Análisis de un sistema solar
Imagine que va a crear un programa para analizar el número de lunas en
diferentes planetas del sistema solar. Quiere mostrar información al usuario y
poder calcular valores diferentes, como el número total de lunas en el sistema
solar. Sería tedioso hacer este cálculo con variables, que solo pueden almacenar
una cadena o un número.
En este módulo, creará un programa que puede realizar estos tipos de
operaciones. Usará diccionarios de Python para modelar los datos. Al final del
módulo, podrá usar diccionarios de Python para almacenar datos complejos.
¿Qué aprenderé?
En este módulo, podrá hacer lo siguiente:
Identificar cuándo se debe usar un diccionario.
Crear y modificar datos dentro de un diccionario.
Usar métodos de diccionario para acceder a los datos del
diccionario.
¿Cuál es el objetivo principal?
Use una estructura de diccionario dentro de la aplicación para almacenar datos
en un formato que facilite la búsqueda de valores.
Introducción a los diccionarios de
Python
Completado100 XP
1 minuto
Las variables de Python pueden almacenar varios tipos de datos. Anteriormente,
ha aprendido que puede almacenar cadenas y números:
PythonCopiar
name = 'Earth'
moons = 1
Aunque este método funciona para cantidades más pequeñas de datos, puede
ser cada vez más complejo cuando se trabaja con datos relacionados. Imagine
que quiere almacenar información sobre las lunas de la Tierra y la Luna.
PythonCopiar
earth_name = 'Earth'
earth_moons = 1
jupiter_name = 'Jupiter'
jupiter_moons = 79
Observe cómo se duplican las variables con prefijos diferentes. Esta duplicación
puede resultar difícil de manejar. Como con frecuencia tendrá que trabajar con
conjuntos de datos relacionados, como el promedio de precipitaciones durante
varios meses en distintas ciudades, almacenar estas variables como valores
individuales no es una opción viable. Alternativamente, puede usar diccionarios
de Python.
Los diccionarios de Python permiten trabajar con conjuntos de datos
relacionados. Un diccionario es una colección de pares clave-valor. Piense que
es como un grupo de variables dentro de un contenedor, donde la clave es el
nombre de la variable y el valor es el valor almacenado en su interior.
Creación de un diccionario
Python usa llaves ({ }) y dos puntos (:) para indicar un diccionario. Puede crear
un diccionario vacío y agregar valores más adelante, o bien rellenarlo en el
momento de la creación. Cada clave o valor está separado por dos puntos y el
nombre de cada clave se incluye entre comillas como un literal de cadena.
Como la clave es un literal de cadena, puede usar el nombre que sea adecuado
para describir el valor.
Ahora se creará un diccionario para almacenar el nombre del planeta Tierra y el
número de lunas que tiene:
PythonCopiar
planet = {
'name': 'Earth',
'moons': 1
}
Tiene dos claves, 'name' y 'moons'. Cada clave se comporta igual que una
variable: tienen un nombre único y almacenan un valor. Pero se incluyen dentro
de una única variable más grande, denominada planet.
Como sucede con las variables convencionales, debe asegurarse de que usa los
tipos de datos correctos. En el valor moons de 1 en el ejemplo anterior, no se han
incluido comillas alrededor del número, porque se quiere usar un entero. Si
hubiera usado '1', Python vería esta variable como una cadena, lo que afectaría
a la capacidad de realizar cálculos.
A diferencia de las variables convencionales, los nombres de clave no necesitan
seguir las reglas de nomenclatura estándar para Python. Puede usar nombre
clave para que sea más descriptivo en el código.
Lectura de valores de diccionario
Puede leer valores dentro de un diccionario. Los objetos de diccionario tienen
un método get que puede usar para acceder a un valor mediante su clave. Si
quiere imprimir name, puede usar el código siguiente:
PythonCopiar
print([Link]('name'))
# Displays Earth
Como podría sospechar, el acceso a los valores de un diccionario es una
operación común. Afortunadamente, hay un acceso directo. También puede
pasar la clave entre corchetes ([ ]). Este método usa menos código que get y la
mayoría de los programadores utilizan esta sintaxis en su lugar. Puede volver a
escribir el ejemplo anterior mediante lo siguiente:
PythonCopiar
# planet['name'] is identical to using [Link]('name')
print(planet['name'])
# Displays Earth
Aunque el comportamiento de get y los corchetes ([ ]) suele ser el mismo para
recuperar elementos, hay una diferencia principal. Si una clave no está
disponible, get devuelve None y [ ] genera un error KeyError.
PythonCopiar
wibble = [Link]('wibble') # Returns None
wibble = planet['wibble'] # Throws KeyError
Modificación de valores de diccionario
También puede modificar valores dentro de un objeto de diccionario, con el
método update. Este método acepta un diccionario como parámetro y actualiza
los valores existentes con los nuevos que proporcione. Si quiere
cambiar name para el diccionario planet, puede usar lo siguiente, por ejemplo:
PythonCopiar
[Link]({'name': 'Makemake'})
# name is now set to Makemake
Al igual que se usa el acceso directo de corchetes ([ ]) para leer valores, se
puede utilizar para modificar valores. La principal diferencia en la sintaxis es que
se usa = (a veces denominado operador de asignación) para proporcionar un
nuevo valor. Para volver a escribir el ejemplo anterior y cambiar el nombre,
puede usar lo siguiente:
PythonCopiar
planet['name'] = 'Makemake'
# name is now set to Makemake
La principal ventaja de usar update es la capacidad de modificar varios valores en
una operación. Los dos ejemplos siguientes son lógicamente los mismos, pero
la sintaxis es diferente. Puede usar la sintaxis que crea más adecuada. La
mayoría de los desarrolladores eligen corchetes para actualizar valores
individuales.
En el ejemplo siguiente se hacen las mismas modificaciones en la
variable planet y se actualizan el nombre y las lunas. Tenga en cuenta que al
usar update realiza una sola llamada a la función, mientras que el uso de
corchetes implica dos llamadas.
PythonCopiar
# Using update
[Link]({
'name': 'Jupiter',
'moons': 79
})
# Using square brackets
planet['name'] = 'Jupiter'
planet['moons'] = 79
Adición y eliminación de claves
No es necesario crear todas las claves al inicializar un diccionario. De hecho, no
es necesario crear ninguna. Siempre que quiera crear una clave, asígnela como
haría con una existente.
Imagine que quiere actualizar planet para incluir el período orbital en días:
PythonCopiar
planet['orbital period'] = 4333
# planet dictionary now contains: {
# name: 'jupiter'
# moons: 79
# orbital period: 4333
# }
Importante
Los nombres de clave, como todo lo demás en Python, distinguen mayúsculas
de minúsculas. Como resultado, 'name' y 'Name' se consideran dos claves
independientes en un diccionario de Python.
Para quitar una clave, use pop. pop devuelve el valor y quita la clave del
diccionario. Para quitar orbital period, puede usar el código siguiente:
PythonCopiar
[Link]('orbital period')
# planet dictionary now contains: {
# name: 'jupiter'
# moons: 79
# }
Tipos de data complejos
Los diccionarios pueden almacenar cualquier tipo de valor, incluidos otros
diccionarios. Esto le permite modelar datos complejos según sea necesario.
Imagine que tiene que almacenar el diámetro de planet, que se podría medir
alrededor de su ecuador o los polos. Puede crear otro diccionario dentro
de planet para almacenar esta información:
PythonCopiar
# Add address
planet['diameter (km)'] = {
'polar': 133709,
'equatorial': 142984
}
# planet dictionary now contains: {
# name: 'Jupiter'
# moons: 79
# diameter (km): {
# polar: 133709
# equatorial: 142984
# }
# }
Para recuperar valores en un diccionario anidado, debe encadenar corchetes o
llamadas a get.
PythonCopiar
print(f'{planet["name"]} polar diameter: {planet["diameter (km)"]["polar"]}')
# Output: Jupiter polar diameter: 133709
Siguiente
Exercise: Create and modify a Python dictionary
Python dictionaries allow you to model more complex data. Dictionaries are a
collection of key/value pairs, and are very common in Python programs. Their
flexibility allows you to dynamically work with related values without having to
create classes or objects.
This exercise is broken into a series of steps. For each step you will be presented
with the goal for the step, followed by an empty cell. Enter your Python into the
cell and run it. The solution for each step will follow each cell.
Managing planet data
You want to create a program which will store and display information about
planets. To start you will use one planet. Create a variable named planet. Store
the following values as a dictionary:
name: Mars
moons: 2
[ ]
# Enter code below
Presione Mayús + Entrar para ejecutar
Your code should look like the following:
planet = {
'name': 'Mars',
'moons': 2
}
Display planet data
With the variable created, you will now display information. You can retrieve
information by either using get or square brackets ([ ]) and the key name. Add
the code to display the planet information in the following format:
has moon(s)
If you were working with Earth, the output would be Earth has 1 moon(s)
Note: You can use whatever string formatting option you like
[ ]
# Enter code below
Presione Mayús + Entrar para ejecutar
Your code should look like the following:
print(f'{planet["name"]} has {planet["moons"]} moon(s)')
Desired output
When you run the cell you should see the following result:
Mars has 2 moon(s)
Add circumference information
You can update existing keys or create new ones by either using
the update method or using square brackets ([ ]). When you're using update,
you pass in a new dictionary object with the updated or new values. When using
square brackets, you specify the key name and assign a new value.
Add a new value to planet with a key of 'circumference (km)'. This new
value should store a dictionary with the planet's two circumferences:
polar: 6752
equatorial: 6792
Finally, add the code to print the polar circumference of the planet. You can use
whatever sentence formatting you wish.
[ ]
# Enter code below
Presione Mayús + Entrar para ejecutar
Your code should look like the following:
planet['circumference (km)'] = {
'polar': 6752,
'equatorial': 6792
}
print(f'{planet["name"]} has a polar circumference of {planet["circumference
(km)"]["polar"]}')
Desired output
When you run the cell you should see the following result:
Mars has a polar circumference of 6752
CódigoMarkdown
Sin proceso
Proceso no conectado
Visualización
Kernel no conectado
Programación dinámica con
diccionarios
Completado100 XP
1 minuto
En el programa, quiere realizar varios cálculos, como el del número total de
lunas. Además, a medida que progrese en programación más avanzada, es
posible que compruebe que carga este tipo de información desde archivos o
una base de datos, en lugar de programar directamente en Python.
Para ayudar a admitir estos escenarios, Python le permite tratar las claves y los
valores dentro de un diccionario como una lista. Puede determinar de manera
dinámica las claves y los valores, y realizar varios cálculos.
Imagine un diccionario en el que se almacenan cantidades mensuales de
precipitaciones. Es probable que tenga claves para cada mes y las
precipitaciones asociadas. Quiere sumar el total de precipitaciones y escribir el
código para realizar la operación mediante cada clave individual sería bastante
tedioso.
Recuperación de todas las claves y valores
El método keys() devuelve un objeto de lista que contiene todas las claves.
Puede usar este método para iterar por todos los elementos del diccionario.
Imagine que tiene el siguiente diccionario, en el que se almacenan los últimos
tres meses de precipitaciones.
PythonCopiar
rainfall = {
'october': 3.5,
'november': 4.2,
'december': 2.1
}
Imagine que quiere mostrar la lista de todas las precipitaciones. Puede escribir
el nombre de cada mes, pero resultará tedioso.
PythonCopiar
for key in [Link]():
print(f'{key}: {rainfall[key]}cm')
# Output:
# october: 3.5cm
# november: 4.2cm
# december: 2.1cm
Nota
Todavía puede usar corchetes ([ ]) con un nombre de variable, en lugar del
literal de cadena codificado de forma rígida.
Determinación de la existencia de una clave en un
diccionario
Al actualizar un valor en un diccionario, Python sobrescribirá el valor existente o
creará uno, si la clave no existe. Si quiere agregar a un valor en lugar de
sobrescribirlo, puede comprobar si la clave existe mediante in. Por ejemplo, si
quiere agregar un valor a diciembre o crear uno si no existe, puede usar lo
siguiente:
PythonCopiar
if 'december' in rainfall:
rainfall['december'] = rainfall['december'] + 1
else:
rainfall['december'] = 1
# Because december exists, the value will be 3.1
Recuperación de todos los valores
De forma similar a keys(), values() devuelve la lista de todos los valores de un
diccionario sin sus claves correspondientes. values() puede resultar útil cuando
se usa la clave con fines de etiquetado, como en el ejemplo anterior, en el que
las claves son el nombre del mes. Puede usar para values() determinar el
importe total de las precipitaciones:
PythonCopiar
total_rainfall = 0
for value in [Link]():
total_rainfall = total_rainfall + value
print(f'There was {total_rainfall}cm in the last quarter')
# Output:
# There was 10.8cm in the last quarter
Siguiente unidad: Ejercicio: Programación
dinámica con diccionarios
Ejercicio: Programación dinámica con
diccionarios
Completado100 XP
1 minuto
Este módulo requiere un espacio aislado para completarse. Usó 4 de 10
espacios aislados por hoy. Mañana habrá disponibles más espacios aislados.
Activar espacio aislado
Las sugerencias de enlaces de teclado de la barra de herramientas están ahora
ocultas
RuntimeArchivoEditarVista
Ejecutar todo
Kernel
Proceso no conectado
Calculating values
In this scenario, you will calculate both the total number of moons in the solar
system and the average number of moons a planet has. You will do this by
using a dictionary object.
This exercise is broken into a series of steps. For each step you will be presented
with the goal for the step, followed by an empty cell. Enter your Python into the
cell and run it. The solution for each step will follow each cell.
Start by creating a variable named planet_moons as a dictionary with the
following key/values:
mercury: 0,
venus: 0,
earth: 1,
mars: 2,
jupiter: 79,
saturn: 82,
uranus: 27,
neptune: 14,
pluto: 5,
haumea: 2,
makemake: 1,
eris: 1
[ ]
# Enter the code below
Presione Mayús + Entrar para ejecutar
Your code should look like the following:
planet_moons = {
'mercury': 0,
'venus': 0,
'earth': 1,
'mars': 2,
'jupiter': 79,
'saturn': 82,
'uranus': 27,
'neptune': 14,
'pluto': 5,
'haumea': 2,
'makemake': 1,
'eris': 1
}
Obtain a list of moons and number of planets
Python dictionaries allow you to retrieve all the values and keys by using
the values and keys methods, respectively. Each method returns a list
containing the data, which can then be used like a regular Python list. You can
determine the number of items by using len, and iterate through it by
using for loops. In the dictionary you created, the planet names are keys and
the number of moons are the values.
Start by retrieving a list with the number of moons, and store this in a variable
named moons. Then obtain the total number of planets and store that value in a
variable named total_planets.
[ ]
# Enter code below
Presione Mayús + Entrar para ejecutar
Your code should look like the following:
moons = planet_moons.values()
total_planets = len(planet_moons.keys())
Determine the average number of moons
You will finish this exercise by determining the average number of moons. Start
by creating a variable named total_moons; this will be your counter for the total
number of moons. Then add a for loop to loop through the list of moons,
adding each value to total_moons. Finally, calculate the average by
dividing total_moons by total_planets and displaying the value.
[ ]
# Enter code below
Presione Mayús + Entrar para ejecutar
Your code should look like the following:
total_moons = 0
for moon in moons:
total_moons = total_moons + moon
average = total_moons / total_planets
print(f'Each planet has an average of {average} moons')
Desired output
When you run the notebook you should see the following result:
Each planet has an average of 17.833333333333332 moons
CódigoMarkdown
Sin proceso
Proceso no conectado
Visualización
Kernel no conectad
Introducción
Completado100 XP
1 minuto
El uso de una función de Python es el primer paso para codificar después de las
estructuras de datos y los condicionales básicos. Las funciones permiten la
reutilización, lo que evita la duplicación de código. Cuando los proyectos
reutilizan código con funciones, se vuelven más legibles y fáciles de mantener.
Escenario: Organización de datos sobre un cohete
Imagine va a crear un programa para construir información precisa sobre un
cohete espacial. Las funciones reutilizables le permitirán no solo calcular
información, sino también crear valores combinando entradas y salidas de otras
funciones.
¿Qué descubriré?
En este módulo, aprenderá a:
Usar entradas predeterminadas, obligatorias y de carácter comodín.
Hacer que el código sea reutilizable extrayendo patrones comunes
en funciones independientes.
Devolver valores, estructuras de datos o resultados calculados.
¿Cuál es el objetivo principal?
Al final de este módulo, comprenderá algunas de las reglas y el
comportamiento asociado a las funciones, incluida la forma de controlar las
entradas y salidas.
Aspectos básicos de las funciones de
Python
Completado100 XP
1 minuto
Las funciones son el siguiente paso después de haber aprendido los conceptos
básicos de programación de Python. En su forma más sencilla, una función
contiene código que siempre devuelve un valor (o valores). En algunos casos,
una función también tiene entradas opcionales u obligatorias.
Al empezar a escribir código que duplica otras partes del programa, se
convierte en una oportunidad perfecta para extraer el código en una función.
Aunque compartir código común mediante funciones es útil, también se puede
limitar el tamaño del código extrayendo partes en funciones más pequeñas (y
legibles).
Los programas que evitan la duplicación y evitan funciones de gran tamaño
mediante funciones más pequeñas son más legibles y fáciles de mantener.
También son más fáciles de depurar cuando las cosas no funcionan
correctamente.
Hay varias reglas sobre las entradas de funciones que son fundamentales para
aprovechar al máximo todo lo que las funciones tienen que ofrecer.
Importante
Aunque se usa el término entrada para describir las funciones que se aceptan,
estos elementos normalmente se denominan argumentos o parámetros. Para
mantener la coherencia en este módulo, a las entradas las
denominaremos argumentos.
Funciones sin argumentos
Para crear una función, use la palabra clave def, seguida de un nombre,
paréntesis y, después, del cuerpo con el código de función:
PythonCopiar
def rocket_parts():
print("payload, propellant, structure")
En este caso, rocket_parts es el nombre de la función. Ese nombre va seguido
de paréntesis vacíos, que indican que no se necesitan argumentos. El último es
el código, con sangría de cuatro espacios. Para usar la función, debe llamarla
por su nombre usando paréntesis:
PythonCopiar
>>> rocket_parts()
'payload, propellant, structure'
La función rocket_parts() no toma ningún argumento e imprime una
instrucción sobre la gravedad. Si necesita usar un valor que devuelve una
función, puede asignar la salida de la función a una variable:
PythonCopiar
>>> output = rocket_parts()
payload, propellant, structure
>>> output is None
True
Puede parecer sorprendente que el valor de la variable output sea None. Esto se
debe a que la función rocket_parts() no ha devuelto explícitamente un valor. En
Python, si una función no devuelve explícitamente un valor,
devuelve implícitamenteNone. Actualizar la función para devolver la cadena en
lugar de imprimirla hace que la variable output tenga un valor distinto:
PythonCopiar
>>> def rocket_parts():
... return "payload, propellant, structure"
...
>>> output = rocket_parts()
>>> output
'payload, propellant, structure'
Si necesita usar el valor de una función, esa función debe devolver
explícitamente. De lo contrario; se devolverá None.
Nota
No es necesario asignar siempre la devolución de una función. En la mayoría de
los casos en los que una función no devuelve un valor (o valores)
explícitamente, significa que no es necesario asignar ni usar el valor
implícito None que se devuelve.
Argumentos opcionales y requeridos
En Python, varias funciones integradas requieren argumentos. Algunas
funciones integradas hacen que los argumentos sean opcionales. Las funciones
integradas están disponibles de inmediato, por lo que no es necesario
importarlas explícitamente.
Un ejemplo de una función integrada que requiere un argumento es any(). Esta
función toma un objeto iterable (por ejemplo, una lista) y devuelve True si algún
elemento del objeto iterable es True. De lo contrario, devuelve False.
PythonCopiar
>>> any([True, False, False])
True
>>> any([False, False, False])
False
Si llama a any() sin ningún argumento, se genera una excepción útil. El mensaje
de error explica que necesita al menos un argumento:
PythonCopiar
>>> any()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: any() takes exactly one argument (0 given)
Puede comprobar que algunas funciones permiten el uso de argumentos
opcionales mediante otra función integrada denominada str(). Esta función
crea una cadena a partir de un argumento. Si no se pasa ningún argumento,
devuelve una cadena vacía:
PythonCopiar
>>> str()
''
>>> str(15)
'15'
Uso de argumentos de función en
Python
Completado100 XP
1 minuto
Ahora que sabe cómo crear una función sin entradas, el paso siguiente es crear
funciones que requieran un argumento. El uso de argumentos hace que las
funciones sean más flexibles, ya que pueden hacer más y condicionalizar lo que
hacen.
Exigencia de un argumento
Si va a pilotar un cohete, una función sin entradas obligatorias es como un
equipo con un botón que le indique la hora. Si presiona el botón, una voz
computarizada le indicará la hora. Pero una entrada necesaria puede ser un
destino para calcular la distancia del viaje. Las entradas obligatorias se
denominan argumentos para la función.
Para requerir un argumento, póngalo entre paréntesis:
PythonCopiar
def distance_from_earth(destination):
if destination == "Moon":
return "238,855"
else:
return "Unable to compute to that destination"
Intente llamar a la función distance_from_earth() sin ningún argumento:
PythonCopiar
>>> distance_from_earth()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: distance_from_earth() missing 1 required positional argument:
'destination'
Python genera TypeError con un mensaje de error que indica que la función
requiere un argumento denominado destination. Si se pide al equipo del cohete
que calcule la distancia del viaje con un destino, debe solicitar que un destino es
un requisito. El código de ejemplo tiene dos rutas de acceso para una respuesta,
una para la Luna y la otra para cualquier otra cosa. Use la Luna como entrada
para obtener una respuesta:
PythonCopiar
>>> distance_from_earth("Moon")
'238,855'
Dado que hay una condición catch-all, intente usar cualquier otra cadena como
destino para comprobar ese comportamiento:
PythonCopiar
>>> distance_from_earth("Saturn")
'Unable to compute to that destination'
Varios argumentos necesarios
Para usar varios argumentos, debe separarlos con una coma. Vamos a crear una
función que pueda calcular cuántos días se tardarán en llegar a un destino,
dadas la distancia y una velocidad constante:
PythonCopiar
def days_to_complete(distance, speed):
hours = distance/speed
return hours/24
Ahora use la distancia entre la Tierra y la Luna para calcular cuántos días tardaría
en llegar a la Luna con un límite de velocidad común de 120 kilómetros por
hora:
PythonCopiar
>>> days_to_complete(238855, 75)
132.69722222222222
Funciones como argumentos
Puede usar el valor de la función days_to_complete() y asignarlo a una variable y,
después, pasarlo a round() (una función integrada que redondea al número
entero más cercano) para obtener un número entero:
PythonCopiar
>>> total_days = days_to_complete(238855, 75)
>>> round(total_days)
133
Pero un patrón útil es pasar funciones a otras funciones en lugar de asignar el
valor devuelto:
PythonCopiar
>>> round(days_to_complete(238855, 75))
133
Sugerencia
Aunque pasar funciones directamente a otras funciones como entrada es útil,
existe la posibilidad de que se reduzca la legibilidad. Este patrón es
especialmente problemático cuando las funciones requieren muchos
argumentos.
Exercise: Work with arguments in functions
Required arguments in functions are used when functions need those
arguments to work properly. In this exercise, you'll construct a fuel report that
requires information from several fuel locations throughout the rocket ship.
This exercise is broken into a series of steps. For each step you will be presented
with the goal for the step, followed by an empty cell. Enter your Python into the
cell and run it. The solution for each step will follow each cell.
Create a report generation function
Your spaceship has three tanks: Main, External and Hydrogen. You want to
create an app to display the amount of fuel in each tank, and the average
amount of fuel between the three tanks. Because you wish to reuse this code in
other projects, you want to create a function with the logic.
Create a function named generate_report. The function will take three
parameters named main_tank, external_tank and hydrogen_tank. When run,
the function will display output which resembles the following:
Fuel report:
Main tank: ##
External tank: ##
Hydrogen tank: ##
CódigoMarkdown
[ ]
# Enter code below
Presione Mayús + Entrar para ejecutar
Your code should resemble the following. Note there are numerous ways to
generate the string.
def generate_report(main_tank, external_tank, hydrogen_tank):
output = f"""Fuel Report:
Main tank: {main_tank}
External tank: {external_tank}
Hydrogen tank: {hydrogen_tank}
"""
print(output)
Run the function
With the function created, add the code to run the function with the following
values:
Main tank: 80
External tank: 70
Hydrogen tank: 75
[ ]
# Enter code below:
Presione Mayús + Entrar para ejecutar
Your code should look like the following:
generate_report(80, 70, 75)
Desired output
The output when run should look like this:
Fuel Report:
Main tank: 80
External tank: 70
Hydrogen tank: 75
Sin proceso
Proceso no conectado
Visualización
Kernel no conectado
Siguiente unidad: Uso de argumentos de palabra
clave en Python
Uso de argumentos de palabra clave
en Python
Completado100 XP
1 minuto
Los argumentos opcionales requieren un valor predeterminado asignado a ellos.
Estos argumentos con nombre se denominan argumentos de palabra clave. Los
valores del argumento de palabra clave deben definirse en las propias
funciones. Cuando se llama a una función definida con argumentos de palabra
clave, no es necesario usarlos en absoluto.
La misión Apolo 11 tardó unas 51 horas en llegar a la Luna. Vamos a crear una
función que devuelva la hora estimada de llegada usando el mismo valor que la
misión Apolo 11 como valor predeterminado:
PythonCopiar
from datetime import timedelta, datetime
def arrival_time(hours=51):
now = [Link]()
arrival = now + timedelta(hours=hours)
return [Link]("Arrival: %A %H:%M")
La función usa el módulo datetime para definir la hora actual. Usa timedelta para
permitir la operación de suma que da como resultado un objeto de hora nuevo.
Después de calcular ese resultado, devuelve la estimación arrival con formato
de cadena. Intente llamarla sin ningún argumento:
PythonCopiar
>>> arrival_time()
'Arrival: Saturday 16:42'
Aunque la función define un argumento de palabra clave, no permite pasar uno
cuando se llama a una función. En este caso, la variable hours tiene como valor
predeterminado 51. Para comprobar que la fecha actual es correcta, use 0 como
valor para hours:
PythonCopiar
>>> arrival_time(hours=0)
'Arrival: Thursday 13:42'
Combinación de argumentos y argumentos de
palabra clave
A veces, una función necesita una combinación de argumentos de palabra clave
y argumentos. En Python, esta combinación sigue un orden específico. Los
argumentos siempre se declaran primero, seguidos de argumentos de palabra
clave.
Actualice la función arrival_time() para que tome un argumento necesario, que
es el nombre del destino:
PythonCopiar
from datetime import timedelta, datetime
def arrival_time(destination, hours=51):
now = [Link]()
arrival = now + timedelta(hours=hours)
return [Link](f"{destination} Arrival: %A %H:%M")
Dado que ha agregado un argumento necesario, ya no es posible llamar a la
función sin ningún argumento:
PythonCopiar
>>> arrival_time()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: arrival_time() missing 1 required positional argument:
'destination'
Use "Moon" como valor para destination a fin de evitar el error:
PythonCopiar
>>> arrival_time("Moon")
'Moon Arrival: Saturday 16:54'
También puede pasar más de dos valores, pero debe separarlos con una coma.
Se tarda aproximadamente 8 minutos (0,13 horas) en entrar en órbita, así que
utilice eso como argumento:
PythonCopiar
>>> arrival_time("Orbit", hours=0.13)
'Orbit Arrival: Thursday 14:11'
Uso de argumentos de variable en
Python
Completado100 XP
1 minuto
En Python, puede usar cualquier número de argumentos de palabra clave y
argumentos sin necesidad de declarar cada uno de ellos. Esta capacidad es útil
cuando una función puede obtener un número desconocido de entradas.
Argumentos de variable
Los argumentos en las funciones son necesarios. Pero cuando se usan
argumentos de variable, la función permite pasar cualquier número de
argumentos (incluido 0). La sintaxis para usar argumentos de variable es agregar
un asterisco único como prefijo (*) antes del nombre del argumento.
La función siguiente imprime los argumentos recibidos:
PythonCopiar
def variable_length(*args):
print(args)
Nota
No es necesario denominar a los argumentos de variable args. Puede usar
cualquier nombre de variable válido. Aunque es habitual ver *args o *a, debe
intentar usar la misma convención en un proyecto.
En este caso, *args indica a la función que acepte cualquier número de
argumentos (incluido 0). En la función, args ahora está disponible como la
variable que contiene todos los argumentos como una tupla. Pruebe la función
pasando cualquier número o tipo de argumentos:
PythonCopiar
>>> variable_length()
()
>>> variable_length("one", "two")
('one', 'two')
>>> variable_length(None)
(None,)
Como puede ver, no hay ninguna restricción en el número o tipo de
argumentos que se pasan.
Un cohete realiza varios pasos antes de un lanzamiento. En función de las tareas
o retrasos, estos pasos pueden tardar más de lo previsto. Vamos a crear una
función de longitud variable que pueda calcular cuántos minutos quedan hasta
el inicio, dado el tiempo que va a tardar cada paso:
PythonCopiar
def sequence_time(*args):
total_minutes = sum(args)
if total_minutes < 60:
return f"Total time to launch is {total_minutes} minutes"
else:
return f"Total time to launch is {total_minutes/60} hours"
Pruebe la función pasando cualquier número de minutos:
PythonCopiar
>>> sequence_time(4, 14, 18)
'Total time to launch is 36 minutes'
>>> sequence_time(4, 14, 48)
'Total time to launch is 1.1 hours'
Nota
Cuando se usan argumentos de variable, a cada valor ya no se le asigna un
nombre de variable. Todos los valores ahora forman parte del nombre de
variable catch-all que usa el asterisco (en estos ejemplos, args).
Argumentos de palabra clave variable
Para que una función acepte cualquier número de argumentos de palabra clave,
debe usar una sintaxis similar. En este caso, se requiere un asterisco doble:
PythonCopiar
def variable_length(**kwargs):
print(kwargs)
Pruebe la función de ejemplo, que imprime los nombres y valores pasados
como kwargs:
PythonCopiar
>>> variable_length(tanks=1, day="Wednesday", pilots=3)
{'tanks': 1, 'day': 'Wednesday', 'pilots': 3}
Si ya conoce bien los diccionarios de Python, observará que los argumentos de
palabra clave de longitud variable se asignan como un diccionario. Para
interactuar con las variables y los valores, use las mismas operaciones que un
diccionario.
Nota
Al igual que con los argumentos de variable, no es necesario usar kwargs cuando
se usan argumentos de palabra clave variable. Puede usar cualquier nombre de
variable válido. Aunque es habitual ver **kwargs o **kw, debe intentar usar la
misma convención en un proyecto.
En esta función, vamos a usar argumentos de palabra clave variable para
notificar los astronautas asignados a la misión. Dado que esta función permite
cualquier número de argumentos de palabra clave, se puede reutilizar
independientemente del número de astronautas asignados:
PythonCopiar
def crew_members(**kwargs):
print(f"{len(kwargs)} astronauts assigned for this mission:")
for title, name in [Link]():
print(f"{title}: {name}")
Pruébalo con la tripulación del Apolo 11:
PythonCopiar
>>> crew_members(captain="Neil Armstrong", pilot="Buzz Aldrin",
command_pilot="Michael Collins")
3 astronauts assigned for this mission:
captain: Neil Armstrong
pilot: Buzz Aldrin
command_pilot: Michael Collins
Dado que puede pasar cualquier combinación de argumentos de palabra clave,
asegúrese de evitar palabras clave repetidas. Las palabras clave repetidas
producirán un error:
PythonCopiar
>>> crew_members(captain="Neil Armstrong", pilot="Buzz Aldrin",
pilot="Michael Collins")
File "<stdin>", line 1
SyntaxError: keyword argument repeated: pilot
Ejercicio: Trabajo con argumentos de
palabra clave
100 XP
1 minuto
Este módulo requiere un espacio aislado para completarse. Usó 4 de 10
espacios aislados por hoy. Mañana habrá disponibles más espacios aislados.
Activar espacio aislado
Las sugerencias de enlaces de teclado de la barra de herramientas están ahora
ocultas
RuntimeArchivoEditarVista
Ejecutar todo
Kernel
Proceso no conectado
Exercise: Work with keyword arguments in
functions
In the prior exercise you created a report for a ship with three fuel tanks. What
happens if the ship has multiple tanks? Keyword arguments can be a perfect
solution for this type of a situation. With keyword arguments a caller can
provide multiple values which your code can interact with.
This exercise is broken into a series of steps. For each step you will be presented
with the goal for the step, followed by an empty cell. Enter your Python into the
cell and run it. The solution for each step will follow each cell.
Create an updated fuel report function
Create a new function named fuel_report. The function will accept a keyword
arguments parameter named fuel_tanks. Add the code to loop through the
entries provided to generate the following output, where name is the name of
the keyword argument and value is the value:
name: value
name: value
[ ]
# Enter code below
Presione Mayús + Entrar para ejecutar
Your code should look like the following. Note that there are numerous ways to
concatenate strings, so yours may vary.
def fuel_report(**fuel_tanks):
for name, value in fuel_tanks.items():
print(f'{name}: {value}')
Call the function
With the function created, it's time to call it! Pass in the following values for the
keyword arguments:
main = 50
external = 100
emergency = 60
[ ]
# Enter code below
Presione Mayús + Entrar para ejecutar
Your code should look like the following:
fuel_report(main=50, external=100, emergency=60)
Desired output
When run, the result should look like the following:
main: 50
external: 100
emergency: 60
Introducción
Completado100 XP
3 minutos
El lenguaje SQL
SQL es un acrónimo de Lenguaje de consulta estructurado (en inglés, Structured
Query Language). SQL se utiliza para comunicarse con bases de datos
relacionales. Las instrucciones SQL se usan para realizar tareas como actualizar o
recuperar datos de una base de datos. Por ejemplo, la instrucción SELECT de
SQL se usa para consultar la base de datos y devolver un conjunto de filas de
datos. Algunos sistemas de administración de bases de datos relacionales
habituales que utilizan SQL incluyen Microsoft SQL Server, MySQL, PostgreSQL,
MariaDB y Oracle.
Hay un estándar del lenguaje SQL definido por el American National Standards
Institute (ANSI). Cada proveedor agrega sus propias variaciones y extensiones.
En este módulo, aprenderá a lo siguiente:
Comprender qué es SQL y cómo se usa
Identificar objetos de base de datos en esquemas
Identificar tipos de instrucción SQL
Usar la instrucción SELECT para consultar tablas en una base de
datos
Trabajo con tipos de datos
Controlar valores NULL
Transact-SQL
Las instrucciones SQL básicas, como SELECT,INSERT,UPDATE y DELETE están
disponibles independientemente del sistema de base de datos relacional con el
que trabaje. Aunque estas instrucciones SQL son parte del estándar SQL de
ANSI, muchos sistemas de administración de bases de datos también tienen sus
propias extensiones. Estas extensiones proporcionan una funcionalidad que no
se incluye en el estándar de SQL y contienen áreas como la administración de la
seguridad y la capacidad de programación. Los sistemas de base de datos de
Microsoft, como SQL Server, Azure SQL Database, Azure Synapse Analytics y
otros, usan un dialecto de SQL denominado Transact-SQL o T-SQL. T-SQL
incluye extensiones de lenguaje para escribir procedimientos almacenados y
funciones, que son código de aplicación almacenado en la base de datos, y
administrar cuentas de usuario.
SQL es un lenguaje declarativo
Los lenguajes de programación se pueden clasificar como de
procedimientos o declarativos. Los lenguajes de procedimientos permiten definir
una secuencia de instrucciones que el equipo sigue para realizar una tarea. Los
lenguajes declarativos le permiten describir la salida que desea y dejan los
detalles de los pasos necesarios para entregar la salida al motor de ejecución.
SQL admite cierta sintaxis de procedimientos, pero la consulta de datos con SQL
suele seguir la semántica declarativa. SQL se usa para describir los resultados
que desea y el procesador de consultas del motor de base de datos desarrolla
un plan de consulta para recuperarlos. El procesador de consultas usa
estadísticas sobre los datos de la base de datos y los índices que se definen en
las tablas para elaborar un buen plan de consulta.
Datos relacionales
SQL se suele usar (aunque no siempre) para consultar datos de bases de
datos relacionales. Una base de datos relacional es aquella en la que los datos
se han organizado en varias tablas (denominadas técnicamente relaciones ),
cada una de las cuales representa un tipo determinado de entidad (por ejemplo,
un cliente, un producto o un pedido de ventas). Los atributos de estas entidades
(por ejemplo, el nombre de un cliente, el precio de un producto o la fecha de
pedido de un encargo de ventas) se definen como columnas, o atributos, de la
tabla y cada fila de la tabla representa una instancia del tipo de entidad (por
ejemplo, un cliente, producto o pedido de ventas específico).
Las tablas de la base de datos están relacionadas entre sí mediante columnas
de clave que identifican de forma única la entidad determinada representada. Se
define una clave principal para cada tabla y una referencia a esta clave se define
como una clave externa en cualquier tabla relacionada. Esto es más fácil de
entender con un ejemplo:
El diagrama muestra una base de datos relacional que contiene cuatro tablas:
Cliente
SalesOrderHeader
SalesOrderDetail
Producto
Cada cliente se identifica mediante un campo CustomerID único: este campo es
la clave principal de la tabla Customer. La tabla SalesOrderHeader tiene una
clave principal denominada OrderID para identificar cada pedido y también
incluye una clave externa CustomerID que hace referencia a la clave principal
de la tabla Customer, por lo que identifica qué cliente está asociado a cada
pedido. Los datos sobre los elementos individuales de un pedido se almacenan
en la tabla SalesOrderDetail, que tiene una clave principal compuesta que
combina OrderID en la tabla SalesOrderHeader con un valor LineItemNo. La
combinación de estos valores identifica de forma única un elemento de línea. El
campo OrderID también se usa como clave externa para indicar a qué pedido
pertenece el elemento de línea, se usa un campo ProductID como clave externa
para la clave principal ProductID de la tabla Product para indicar qué producto
se encargó.
Procesamiento basado en conjuntos
La teoría de conjuntos es una de las bases matemáticas del modelo relacional
de administración de datos y es fundamental para trabajar con bases de datos
relacionales. Aunque es posible que pudiera escribir consultas en T-SQL sin un
conocimiento exhaustivo de los conjuntos, es posible que tenga dificultades
para escribir algunos de los tipos más complejos de instrucciones que pueden
ser necesarios para un rendimiento óptimo.
Sin entrar en las matemáticas de la teoría de conjuntos, puede considerar un
conjunto como "una colección de objetos definidos y distintos que se
consideran como un todo". En términos aplicados a bases de datos de
SQL Server, puede considerar un conjunto como una colección de objetos
distintos que contienen cero o más miembros del mismo tipo. Por ejemplo, la
tabla Customer representa un conjunto: en concreto, el conjunto de todos los
clientes. Verá que los resultados de una instrucción SELECT también forman un
conjunto.
A medida que adquiera conocimientos sobre las instrucciones de consulta de T-
SQL, será importante pensar siempre en todo el conjunto más que en los
miembros individuales. Esta mentalidad le preparará mejor para escribir código
basado en conjuntos, en lugar de pensar en una fila en cada momento. Trabajar
con conjuntos requiere pensar en términos de operaciones que se producen
"todas a la vez" en lugar de una en una.
Una característica importante que se debe tener en cuenta sobre la teoría de
conjuntos es que no hay ninguna especificación con respecto a ninguna
ordenación de los miembros de un conjunto. Esta falta de orden se aplica a las
tablas de las bases de datos relacionales. No hay ningún concepto
de primera fila, segunda fila o última fila. Se puede acceder a los elementos (y
recuperarlos) en cualquier orden. Si necesita devolver resultados en un orden
determinado, debe especificarlo explícitamente mediante una cláusula ORDER
BY en la consulta SELECT.
Siguiente unidad: Trabajo con esquemas
Trabajo con esquemas
Completado100 XP
3 minutos
En sistemas de base de datos de SQL Server, las tablas se definen dentro
de esquemas para crear espacios de nombres lógicos en la base de datos. Por
ejemplo, una tabla Customer podría definirse en un esquema Sales, mientras
que una tabla Product se define en un esquema Production. La base de datos
puede realizar un seguimiento de los detalles de los pedidos que los clientes
han realizado en una tabla Order en el esquema Sales. A continuación, es
posible que también tenga que realizar un seguimiento de los pedidos de los
proveedores para los componentes del producto en una tabla Order en el
esquema Production.
Los sistemas de base, como SQL Server, usan un sistema de nomenclatura
jerárquico. Esta nomenclatura de varios niveles ayuda a eliminar la ambigüedad
de las tablas con el mismo nombre en esquemas diferentes. El nombre
completo de un objeto incluye el nombre de una instancia del servidor de bases
de datos en la que se almacena la base de datos, el nombre de la base de datos,
el nombre del esquema y el nombre de la tabla. Por
ejemplo: [Link].
Cuando se trabaja con tablas en el contexto de una base de datos única, es
habitual hacer referencia a tablas (y otros objetos) incluyendo el nombre del
esquema. Por ejemplo, [Link].
Exploración de la estructura de las
instrucciones SQL
Completado100 XP
3 minutos
En cualquier dialecto de SQL, las instrucciones SQL se agrupan en varios tipos
diferentes de instrucciones. Estos distintos tipos son:
Lenguaje de manipulación de datos (DML), que es el conjunto de
instrucciones SQL que se centra en consultar y modificar datos. Las
instrucciones DML incluyen SELECT, el punto central de este
entrenamiento, y las instrucciones de modificación como INSERT,
UPDATE y DELETE.
Lenguaje de definición de datos (DDL), que es el conjunto de
instrucciones SQL que controla la definición y el ciclo de vida de los
objetos de base de datos, como tablas, vistas y procedimientos.
DDL incluye instrucciones como CREATE, ALTER y DROP.
Lenguaje de control de datos (DCL), que es el conjunto de
instrucciones SQL que se usan para administrar permisos de
seguridad para usuarios y objetos. DCL incluye instrucciones como
GRANT, REVOKE y DENY.
A veces también puede ver TCL como un tipo de instrucción para hacer
referencia al lenguaje de control de transacciones. Además, algunas listas
pueden volver a definir DML como lenguaje de modificación de datos, que no
incluiría instrucciones SELECT, pero luego agregan DQL como lenguaje de
consulta de datos para instrucciones SELECT.
En este módulo, nos centraremos en las instrucciones DML. Normalmente, los
analistas de datos usan estas instrucciones para recuperar datos para informes y
análisis. Los desarrolladores de aplicaciones también usan instrucciones DML
para realizar operaciones "CRUD" para crear, leer, actualizar o eliminar datos de
aplicaciones.
Examen de la instrucción SELECT
Completado100 XP
3 minutos
Transact-SQL o T-SQL es un dialecto del lenguaje SQL estándar de ANSI que
usan los productos y servicios de Microsoft SQL. Es similar a SQL estándar. La
mayor parte de nuestro enfoque se centrará en la instrucción SELECT, que, con
diferencia, es la instrucción DML que tiene mayor número de opciones y
variaciones.
Para empezar, echemos un vistazo de alto nivel a cómo se procesa una
instrucción SELECT. El orden en el que se escribe una instrucción SELECT no es el
orden en que el motor de base de datos de SQL Server la evalúa y procesa.
Considere la consulta siguiente:
SQLCopiar
SELECT OrderDate, COUNT(OrderID) AS Orders
FROM [Link]
WHERE Status = 'Shipped'
GROUP BY OrderDate
HAVING COUNT(OrderID) > 1
ORDER BY OrderDate DESC;
La consulta consta de una instrucción SELECT, que se compone de
varias cláusulas, cada una de las cuales define una operación específica que se
debe aplicar a los datos que se recuperan. Antes de examinar el orden de las
operaciones en tiempo de ejecución, echemos un vistazo brevemente a lo que
hace esta consulta, aunque los detalles de las diferentes cláusulas no se tratarán
en este módulo.
La cláusula SELECT devuelve la columna OrderDate y el recuento de
valores OrderID, a los que se asigna el nombre (o alias) Orders:
SQLCopiar
SELECT OrderDate, COUNT(OrderID) AS Orders
La cláusula FROM identifica qué tabla es el origen de las filas de la consulta; en
este caso, es la tabla [Link]:
SQLCopiar
FROM [Link]
La cláusula WHERE filtra las filas de los resultados, manteniendo solo las filas
que cumplen la condición especificada; en este caso, los pedidos que tienen el
estado "enviado":
SQLCopiar
WHERE Status = 'Shipped'
La cláusula GROUP BY toma las filas que cumplen la condición del filtro y las
agrupa por OrderDate, de modo que todas las filas con el mismo
valor OrderDate se consideren como un único grupo y se devuelva una fila para
cada grupo:
SQLCopiar
GROUP BY OrderDate
Una vez formados los grupos, la cláusula HAVING filtra los grupos en función de
su propio predicado. Solo las fechas con más de un pedido se incluirán en los
resultados:
SQLCopiar
HAVING COUNT(OrderID) > 1
Para obtener una vista previa de esta consulta, la cláusula final es ORDER BY,
que ordena la salida en orden descendente de OrderDate:
SQLCopiar
ORDER BY OrderDate DESC;
Ahora que ha visto lo que hace cada cláusula, echemos un vistazo al orden en
que SQL Server las evalúa realmente:
1. La cláusula FROM se evalúa primero para proporcionar las filas de
origen para el resto de la instrucción. Se crea una tabla virtual y se
pasa al paso siguiente.
2. La cláusula WHERE es la siguiente en evaluarse, filtrando las filas de
la tabla de origen que coinciden con un predicado. La tabla virtual
filtrada se pasa al paso siguiente.
3. GROUP BY es la siguiente, que organiza las filas de la tabla virtual
según los valores únicos que se encuentran en la lista GROUP BY. Se
crea una nueva tabla virtual que contiene la lista de grupos y se
pasa al paso siguiente. A partir de este punto del flujo de
operaciones, otros elementos solo pueden hacer referencia a las
columnas de la lista GROUP BY o a las funciones de agregado.
4. Después se avalúa la cláusula HAVING, que filtra grupos completos
en función de su predicado. La tabla virtual creada en el paso 3 se
filtra y se pasa al paso siguiente.
5. Por último, se ejecuta la cláusula SELECT, que determina qué
columnas aparecerán en los resultados de la consulta. Dado que la
cláusula SELECT se evalúa después de los otros pasos, los alias de
columna (en nuestro ejemplo, Orders)creados allí no se pueden
usar en las cláusulas GROUP BY o HAVING.
6. La cláusula ORDER BY es la última en ejecutarse, que ordena las filas
según lo determinado por su lista de columnas.
Para aplicar este conocimiento a nuestra consulta de ejemplo, este es el orden
lógico en tiempo de ejecución de la instrucción SELECT anterior:
SQLCopiar
FROM [Link]
WHERE Status = 'Shipped'
GROUP BY OrderDate
HAVING COUNT(OrderID) > 1
SELECT OrderDate, COUNT(OrderID) AS Orders
ORDER BY OrderDate DESC;
No todas las cláusulas posibles son necesarias en todas las instrucciones SELECT
que escriba. La única cláusula necesaria es la cláusula SELECT, que se puede usar
por sí misma en algunos casos. Normalmente, también se incluye una cláusula
FROM para identificar la tabla que se está consultando. Además, Transact-SQL
tiene otras cláusulas que se pueden agregar.
Como ha visto, no se escriben consultas T-SQL en el mismo orden en que se
evalúan lógicamente. El orden de evaluación en tiempo de ejecución determina
qué datos están disponibles para qué cláusulas, ya que una cláusula solo tiene
acceso a la información ya disponible desde una cláusula ya procesada. Por esta
razón, es importante comprender el verdadero orden de procesamiento lógico a
la hora de escribir consultas.
Selección de todas las columnas
A menudo se hace referencia a la cláusula SELECT como la listaSELECT, ya que
enumera los valores que se devolverán en los resultados de la consulta.
La forma más sencilla de una cláusula SELECT es el uso del carácter de asterisco
(*) para devolver todas las columnas. Cuando se usa en consultas de T-SQL, se
denomina estrella. Aunque SELECT * es adecuado para una prueba rápida, debe
evitar usarlo en el trabajo de producción por los siguientes motivos:
Los cambios en la tabla que agregan o reorganizan columnas se
reflejarán en los resultados de la consulta, lo que puede dar lugar a
una salida inesperada para las aplicaciones o informes que usan la
consulta.
La devolución de datos que no son necesarios puede ralentizar las
consultas y provocar problemas de rendimiento si la tabla de origen
contiene un gran número de filas.
Por ejemplo, en el ejemplo siguiente se recuperan todas las columnas de la
tabla (hipotética) [Link].
SQLCopiar
SELECT * FROM [Link];
El resultado de esta consulta es un conjunto de filas que contiene todas las
columnas de todas las filas de la tabla, que podrían tener un aspecto parecido al
siguiente:
ProductID
Nombre
ProductNum
Color
StandardCost
ListPrice
Tamaño
Peso
ProductCatID
680
HL Road Frame - Black, 58
FR-R92B-58
Negro
1059,31
1431,5
58
1016,04
18
706
HL Road Frame - Red, 58
FR-R92R-58
Rojo
1059,31
1431,5
58
1016,04
18
707
Sport-100 Helmet, Red
HL-U509-R
Rojo
13,0863
34,99
35
708
Sport-100 Helmet, Black
HL-U509
Negro
13,0863
34,99
35
...
...
...
...
...
...
...
...
...
Selección de columnas específicas
Una lista de columnas explícita le permite tener control sobre exactamente qué
columnas se devuelven y en qué orden. Cada columna del resultado tendrá el
nombre de la columna como encabezado.
Por ejemplo, considere la siguiente consulta, que usa de nuevo la hipotética
tabla [Link].
SQLCopiar
SELECT ProductID, Name, ListPrice, StandardCost
FROM [Link];
Esta vez, los resultados incluyen solo las columnas especificadas:
ProductID
Nombre
ListPrice
StandardCost
680
HL Road Frame - Black, 58
1431,5
1059,31
706
HL Road Frame - Red, 58
1431,5
1059,31
707
Sport-100 Helmet, Red
34,99
13,0863
708
Sport-100 Helmet, Black
34,99
13,0863
...
...
...
...
Selección de expresiones
Además de recuperar columnas almacenadas en la tabla especificada, una
cláusula SELECT puede realizar cálculos y manipulaciones, que usan operadores
para combinar columnas y valores o varias columnas. El resultado del cálculo o
la manipulación debe ser un resultado de un solo valor (escalar) que aparecerá
en el resultado como una columna independiente.
Por ejemplo, la consulta siguiente incluye dos expresiones:
SQLCopiar
SELECT ProductID,
Name + '(' + ProductNumber + ')',
ListPrice - StandardCost
FROM [Link];
Los resultados de esta consulta podrían tener un aspecto parecido al siguiente:
ProductID
680
HL Road Frame - Black, 58(FR-R92B-58)
372,19
706
HL Road Frame - Red, 58(FR-R92R-58)
372,19
707
Sport-100 Helmet, Red(HL-U509-R)
21,9037
708
Sport-100 Helmet, Black(HL-U509)
21,9037
...
...
...
Hay un par de puntos interesantes sobre estos resultados que se deben resaltar:
Las columnas devueltas por las dos expresiones no tienen nombres
de columna. En función de la herramienta que use para enviar la
consulta, un nombre de columna que falta podría indicarse
mediante un encabezado de columna en blanco, un indicador
literal "sin nombre de columna" o un nombre predeterminado
como column1. Más adelante en esta sección veremos cómo
especificar un alias para el nombre de columna en la consulta.
La primera expresión usa el operador + para concatenar valores de
cadena (basados en caracteres), mientras que la segunda expresión
usa el operador - para restar un valor numérico a otro. Cuando se
usa con valores numéricos, el operador + realiza la suma. Por tanto,
está claro que es importante comprender los tipos de datos de las
columnas que se incluyen en las expresiones. En la sección siguiente
se tratarán los tipos de datos.
Especificación de alias de columna
Puede especificar un alias para cada columna que la consulta SELECT devuelve,
ya sea como alternativa al nombre de la columna de origen o para asignar un
nombre a la salida de una expresión.
Por ejemplo, esta es la misma consulta que antes, pero con alias especificados
para cada una de las columnas:
SQLCopiar
SELECT ProductID AS ID,
Name + '(' + ProductNumber + ')' AS ProductName,
ListPrice - StandardCost AS Markup
FROM [Link];
Los resultados de esta consulta incluyen los nombres de columna especificados:
ID
ProductName
marcado
680
HL Road Frame - Black, 58(FR-R92B-58)
372,19
706
HL Road Frame - Red, 58(FR-R92R-58)
372,19
707
Sport-100 Helmet, Red(HL-U509-R)
21,9037
708
Sport-100 Helmet, Black(HL-U509)
21,9037
...
...
...
Nota
La palabra clave AS es opcional cuando se especifica un alias, pero es una buena
práctica incluirla por motivos de esclarecimiento.
Formateo de consultas
Puede observar en los ejemplos de esta sección que tiene cierta flexibilidad a la
hora de formatear el código de consulta. Por ejemplo, puede escribir cada
cláusula (o la consulta completa) en una sola línea o dividirla en varias líneas. En
la mayoría de los sistemas de base de datos, el código no distingue entre
mayúsculas y minúsculas, y algunos elementos del lenguaje T-SQL son
opcionales (incluida la palabra clave AS como se mencionó anteriormente e
incluso el punto y coma al final de una instrucción).
Tenga en cuenta las siguientes pautas para que el código de T-SQL sea fácil de
leer (y, por tanto, ¡más fácil de entender y depurar!):
Ponga en mayúsculas las palabras clave de T-SQL, como SELECT,
FROM, AS, etc. La utilización de mayúsculas para las palabras clave
es una convención de uso frecuente que facilita la búsqueda de
cada cláusula de una instrucción compleja.
Inicie una nueva línea para cada cláusula principal de una
instrucción.
Si la lista SELECT contiene más de unas pocas columnas,
expresiones o alias, considere la posibilidad de enumerar cada
columna en su propia línea.
Aplicar sangría a las líneas que contienen subcláusulas o columnas
para dejar claro qué código pertenece a cada cláusula principal.
Trabajo con tipos de datos
Completado100 XP
3 minutos
Las columnas y variables usadas en Transact-SQL tienen un tipo de datos. El
comportamiento de los valores de las expresiones depende del tipo de datos de
la columna o variable a la que se hace referencia. Por ejemplo, como vimos
anteriormente, puede usar el operador + para concatenar dos valores de
cadena o para agregar dos valores numéricos.
En la tabla siguiente se muestran los tipos de datos comunes admitidos en una
base de datos de SQL Server.
Valor numérico exacto
Valor numérico aproximado
Carácter
Fecha y hora
Binary
Otros
TINYINT
FLOAT
char
fecha
binary
cursor
SMALLINT
real
varchar
time
varbinary
hierarchyid
int
text
datetime
imagen
sql_variant
bigint
NCHAR
datetime2
table
bit
NVARCHAR
smalldatetime
timestamp
decimal/numérico
ntext
datetimeoffset
UNIQUEIDENTIFIER
NUMERIC
Xml
money
geography
SMALLMONEY
geometry
Nota
Para obtener más información sobre los distintos tipos de datos y sus atributos,
visite la documentación de referencia de Transact-SQL.
Conversión de tipo de datos
Los valores de tipos de datos compatibles se pueden convertir implícitamente
según sea necesario. Por ejemplo, supongamos que puede usar el
operador + para agregar un número + a un número decimal o para concatenar
un valor char de longitud fija y un valor varchar de longitud variable. Sin
embargo, en algunos casos es posible que tenga que convertir explícitamente
valores de un tipo de datos a otro; por ejemplo, intentar usar + para concatenar
un valor varchar y un valor decimal producirá un error a menos que primero
convierta el valor numérico en un tipo de datos de cadena compatible.
Nota
Las conversiones implícitas y explícitas se aplican a determinados tipos de datos
y algunas conversiones no son posibles. Utilice el gráfico documentación de
referencia de Transact-SQL para obtener más información.
T-SQL incluye funciones que le ayudan a convertir
explícitamente entre tipos de datos
CAST y TRY_CAST
La función CAST convierte un valor en un tipo de datos especificado si dicho
valor es compatible con el tipo de datos de destino. Se devolverá un error si no
es compatible.
Por ejemplo, la consulta siguiente usa CAST para convertir los valores integer de
la columna ProductID en valores varchar (con un máximo de 4 caracteres) para
concatenarlos con otro valor basado en caracteres:
SQLCopiar
SELECT CAST(ProductID AS varchar(4)) + ': ' + Name AS ProductName
FROM [Link];
Los resultados posibles de esta consulta podrían tener un aspecto parecido al
siguiente:
ProductName
680: HL Road Frame - Black, 58
706: HL Road Frame - Red, 58
707: Sport-100 Helmet, Red
708: Sport-100 Helmet, Black
...
Sin embargo, supongamos que la columna Size de la
tabla [Link] es una columna nvarchar (longitud variable, datos de
texto Unicode) que contiene algunos tamaños numéricos (como 58) y algunos
tamaños basados en texto (como "S", "M" o "L"). La consulta siguiente intenta
convertir valores de esta columna en un tipo de datos integer:
SQLCopiar
SELECT CAST(Size AS integer) As NumericSize
FROM [Link];
Esta consulta produce el siguiente error:
Error: Error de conversión al convertir el valor nvarchar "M" al tipo de datos int.
Dado que al menos algunos de los valores de la columna son numéricos, es
posible que quiera convertir esos valores y pasar por alto los demás. Puede usar
la función TRY_CAST para convertir tipos de datos.
SQLCopiar
SELECT TRY_CAST(Size AS integer) As NumericSize
FROM [Link];
Los resultados esta vez podrían ser similares a los siguientes:
NumericSize
58
58
NULL
NULL
...
Los valores que se pueden convertir en un tipo de datos numérico se devuelven
como valores decimales y los valores incompatibles se devuelven como NULL,
que se usa para indicar que un valor es desconocido.
Nota
Exploraremos las consideraciones para controlar los valores NULL más adelante
en esta unidad.
CONVERT y TRY_CONVERT
CAST es la función de SQL del estándar ANSI para convertir entre tipos de datos
y se usa en muchos sistemas de base de datos. En Transact-SQL, también puede
usar la función CONVERT, como se muestra aquí:
SQLCopiar
SELECT CONVERT(varchar(4), ProductID) + ': ' + Name AS ProductName
FROM [Link];
Una vez más, esta consulta devuelve el valor convertido al tipo de datos
especificado de la siguiente forma:
ProductName
680: HL Road Frame - Black, 58
706: HL Road Frame - Red, 58
707: Sport-100 Helmet, Red
708: Sport-100 Helmet, Black
...
Al igual que CAST, CONVERT tiene una variante TRY_CONVERT que
devuelve NULL para valores incompatibles.
Otra ventaja de usar CONVERT sobre CAST es que CONVERT también incluye un
parámetro que permite especificar un estilo de formato al convertir valores
numéricos y de fecha en cadenas. Por ejemplo, considere la siguiente consulta:
SQLCopiar
SELECT SellStartDate,
CONVERT(varchar(20), SellStartDate) AS StartDate,
CONVERT(varchar(10), SellStartDate, 101) AS FormattedStartDate
FROM [Link];
Los resultados de esta consulta podrían tener un aspecto parecido al siguiente:
SellStartDate
StartDate
FormattedStartDate
2002-06-01T[Link]
1 de junio de 2002 12:00 a. m.
1/6/2002
2002-06-01T[Link]
1 de junio de 2002 12:00 a. m.
1/6/2002
2005-07-01T[Link]
1 de julio de 2005 12:00 a. m.
01/07/2005
2005-07-01T[Link]
1 de julio de 2005 12:00 a. m.
01/07/2005
...
...
...
Nota
Para obtener más información sobre los códigos de formato de estilo que
puede usar con CONVERT, consulte la documentación de referencia de
Transact-SQL.
PARSE y TRY_PARSE
La función PARSE está diseñada para convertir cadenas con formato que
representan valores numéricos o de fecha y hora. Por ejemplo, considere la
siguiente consulta (que usa valores literales en lugar de valores de columnas de
una tabla):
SQLCopiar
SELECT PARSE('01/01/2021' AS date) AS DateValue,
PARSE('$199.99' AS money) AS MoneyValue;
Los resultados de esta consulta son similares a los siguientes:
DateValue
MoneyValue
2021-01-01T[Link]
199,99
De forma similar a CAST y CONVERT, PARSE tiene una variante TRY_PARSE que
devuelve valores incompatibles como NULL.
Nota
Al trabajar con tipos de datos decimales o numéricos, es posible que tenga que
redondear a un número entero o establecer el separador decimal, que se puede
lograr a través de la precisión y la escala. Para comprender mejor este concepto
de precisión y escala, consulte la documentación de referencia de Transact-
SQL.
STR
La función STR convierte un valor numérico en varchar.
Por ejemplo:
SQLCopiar
SELECT ProductID, '$' + STR(ListPrice) AS Price
FROM [Link];
Los resultados deberían ser parecidos a esto:
ProductID
Precio
680
$1432.00
706
$1432.00
707
35 USD
...
...
Controlar valores NULL
Completado100 XP
3 minutos
Un valor NULL significa que no hay ningún valor o es desconocido. No significa
cero ni en blanco, ni siquiera una cadena vacía. Esos valores no son
desconocidos. Se puede usar un valor NULL para los valores que aún no se han
proporcionado, por ejemplo, cuando un cliente aún no ha proporcionado una
dirección de correo electrónico. Como ha visto anteriormente, algunas
funciones de conversión también pueden devolver un valor NULL si un valor no
es compatible con el tipo de datos de destino.
A menudo, deberá realizar pasos especiales para tratar con los valores NULL.
NULL es realmente un valor sin valor. Es desconocido. No es igual a nada y no
es desigual a nada. NULL no es mayor ni menor que nada. No podemos decir
nada sobre lo que es, pero a veces es necesario trabajar con valores NULL.
Afortunadamente, T-SQL proporciona funciones para la conversión o sustitución
de valores NULL.
ISNULL
La función ISNULL toma dos argumentos. El primero es una expresión que
estamos probando. Si el valor de ese primer argumento es NULL, la función
devuelve el segundo argumento. Si la primera expresión no es NULL, se
devuelve sin cambios.
Por ejemplo, supongamos que la tabla [Link] de una base de datos
incluye una columna MiddleName que permite valores NULL. Al consultar esta
tabla, en lugar de devolver NULL en el resultado, puede optar por devolver un
valor específico, como "None".
SQLCopiar
SELECT FirstName,
ISNULL(MiddleName, 'None') AS MiddleIfAny,
LastName
FROM [Link];
Los resultados de esta consulta podrían tener un aspecto parecido al siguiente:
FirstName
MiddleIfAny
LastName
Orlando
Hora
Gee
Keith
Ninguno
Howard
Donna
F.
Gonzales
...
...
...
Nota
El valor sustituido por NULL debe ser el mismo tipo de datos que la expresión
que se está evaluando. En el ejemplo anterior, MiddleName es varchar, por lo
que el valor de reemplazo no podría ser numérico. Además, deberá elegir un
valor que no aparecerá en los datos como un valor normal. A veces puede ser
difícil encontrar un valor que nunca aparecerá en los datos.
El ejemplo anterior se ha controlado un valor NULL en la tabla de origen, pero
se puede usar ISNULL con cualquier expresión que pueda devolver un valor
NULL, incluido el anidamiento de una función TRY_CONVERT dentro de una
función ISNULL.
COALESCE
La función ISNULL no es estándar de ANSI, por lo que puede que desee usar la
función COALESCE en su lugar. COALESCE es un poco más flexible, ya que
puede tomar un número variable de argumentos, cada uno de los cuales es una
expresión. Devolverá la primera expresión de la lista que no sea NULL.
Si solo hay dos argumentos, COALESCE se comporta como ISNULL. Sin
embargo, con más de dos argumentos, COALESCE se puede usar como
alternativa a una expresión CASE de varias partes mediante ISNULL.
Si todos los argumentos son NULL, COALESCE devuelve NULL. Todas las
expresiones deben devolver tipos de datos iguales o compatibles.
La sintaxis es la siguiente:
SQLCopiar
SELECT COALESCE ( expression1, expression2, [ ,...n ] )
En el ejemplo siguiente se usa una tabla ficticia denominada [Link], que
incluye tres columnas que contienen información sobre las ganancias semanales
de los empleados: la tarifa por hora, el salario semanal y una comisión por
unidad vendida. No obstante, un empleado recibe solo un tipo de sueldo. Para
cada empleado, una de esas tres columnas tendrá un valor y las otras dos serán
NULL. Para determinar el importe total pagado a cada empleado, puede usar
COALESCE para devolver solo el valor distinto de NULL que se encuentra en
esas tres columnas.
SQLCopiar
SELECT EmployeeID,
COALESCE(HourlyRate * 40,
WeeklySalary,
Commission * SalesQty) AS WeeklyEarnings
FROM [Link];
El resultado podría ser similar al siguiente:
EmployeeID (Id. de empleado)
WeeklyEarnings
899,76
1001,00
3
1298,77
...
...
NULLIF
La función NULLIF permite devolver NULL en determinadas condiciones. Esta
función tiene aplicaciones útiles en áreas como la limpieza de datos, cuando
desea reemplazar los caracteres en blanco o de marcador de posición por NULL.
NULLIF toma dos argumentos y devuelve NULL si son equivalentes. Si no son
iguales, NULLIF devuelve el primer argumento.
En este ejemplo, NULLIF reemplaza un descuento de 0 por un valor NULL.
Devuelve el valor de descuento si no es 0:
SQLCopiar
SELECT SalesOrderID,
ProductID,
UnitPrice,
NULLIF(UnitPriceDiscount, 0) AS Discount
FROM [Link];
El resultado podría ser similar al siguiente:
[Link]
ProductID
UnitPrice
Descuento
71774
836
356,898
NULL
71780
988
112,998
0,4
71781
748
818,7
NULL
71781
985
112,998
0,4
...
...
...
...
Ejercicio: Trabajar con instrucciones
SELECT
Completado100 XP
30 minutos
Esta unidad incluye un laboratorio para completar.
Use los recursos gratuitos que se proporcionan en el laboratorio para completar
los ejercicios de esta unidad. No se le cobrará.
Microsoft ofrece esta experiencia de laboratorio y el contenido relacionado con
fines educativos. Toda la información presentada es propiedad de Microsoft y
está destinada únicamente a brindar información sobre los productos y servicios
abordados en este módulo de Microsoft Learn.
Iniciar laboratorio
Nota
Se proporciona una máquina virtual que contiene las herramientas cliente que
necesita, junto con las instrucciones del ejercicio. Use el botón anterior para
iniciar la máquina virtual. Hay un número limitado de sesiones simultáneas
disponibles; si el entorno hospedado no está disponible, inténtelo de nuevo
más adelante. Como alternativa, puede usar estas instrucciones de
configuración para crear su propio entorno de laboratorio y seguir
estas instrucciones del ejercicio.
Cuando termine el ejercicio, finalice el laboratorio para cerrar la máquina virtual.
No olvide volver y completar la prueba de conocimientos para ganar puntos por
completar este módulo.
Limitación de los resultados
ordenados
Completado100 XP
3 minutos
La cláusula TOP es una extensión propiedad de Microsoft de la cláusula SELECT.
La cláusula TOP le permitirá especificar cuántas filas se van a devolver, ya sea
como un entero positivo o como un porcentaje de todas las filas calificadas. El
número de filas se puede especificar como una constante o como una
expresión. La cláusula TOP se usa con más frecuencia con ORDER BY, pero se
puede usar con datos no ordenados.
Usar la cláusula TOP
La sintaxis simplificada de la cláusula TOP, que se usa con ORDER BY, es la
siguiente:
SQLCopiar
SELECT TOP (N) <column_list>
FROM <table_source>
WHERE <search_condition>
ORDER BY <order list> [ASC|DESC];
Por ejemplo, para recuperar solo los 10 productos más costosos de la
tabla [Link], use la consulta siguiente:
SQLCopiar
SELECT TOP 10 Name, ListPrice
FROM [Link]
ORDER BY ListPrice DESC;
El resultado podría ser similar al siguiente:
Nombre
ListPrice
Road-150 Red, 62
3578,27
Road-150 Red, 44
3578,27
Road-150 Red, 48
3578,27
Road-150 Red, 52
3578,27
Road-150 Red, 56
3578,27
Mountain-100 Silver, 38
3399,99
Mountain-100 Silver, 42
3399,99
Mountain-100 Silver, 44
3399,99
Mountain-100 Silver, 48
3399,99
Mountain-100 Black, 38
3374,99
El operador TOP depende de una cláusula ORDER BY para proporcionar una
prioridad significativa a las filas seleccionadas. TOP se puede usar sin ORDER BY
pero, en ese caso, no hay ninguna manera de predecir qué filas se devolverán.
En este ejemplo, se podrían devolver 10 pedidos cualesquiera si no hubiese una
cláusula ORDER BY.
Uso de WITH TIES
Además de especificar un número fijo de filas que se van a devolver, la palabra
clave TOP también acepta la opción WITH TIES, que recuperará las filas con
valores que puedan encontrarse en las primeras N filas seleccionadas.
En el ejemplo anterior, la consulta devolvió los 10 primeros productos en orden
descendente de precio. Sin embargo, al agregar la opción WITH TIES a la
cláusula TOP, verá que hay más filas que se pueden incluir en los 10 productos
más caros:
SQLCopiar
SELECT TOP 10 WITH TIES Name, ListPrice
FROM [Link]
ORDER BY ListPrice DESC;
Esta consulta modificada devuelve los resultados siguientes:
Nombre
ListPrice
Road-150 Red, 62
3578,27
Road-150 Red, 44
3578,27
Road-150 Red, 48
3578,27
Road-150 Red, 52
3578,27
Road-150 Red, 56
3578,27
Mountain-100 Silver, 38
3399,99
Mountain-100 Silver, 42
3399,99
Mountain-100 Silver, 44
3399,99
Mountain-100 Silver, 48
3399,99
Mountain-100 Black, 38
3374,99
Mountain-100 Black, 42
3374,99
Mountain-100 Black, 44
3374,99
Mountain-100 Black, 48
3374,99
La decisión de incluir WITH TIES dependerá de cuánto conozca los datos de
origen, su potencial para valores únicos y los requisitos de la consulta que
escribe.
Uso de PERCENT
Para devolver un porcentaje de las filas aptas, use la opción PERCENT con TOP
en lugar de un número fijo.
SQLCopiar
SELECT TOP 10 PERCENT Name, ListPrice
FROM [Link]
ORDER BY ListPrice DESC;
La opción PERCENT también se puede usar con la opción WITH TIES.
Nota
Para el recuento de filas, TOP (N) PERCENT se redondeará hacia arriba al entero
más cercano.
La opción TOP la usan muchos profesionales de SQL Server como método para
recuperar solo un determinado intervalo de filas. Sin embargo, tenga en cuenta
estos hechos al usar TOP:
TOP es propiedad de T-SQL.
TOP por sí solo no admite la omisión de filas.
Como TOP depende de una cláusula ORDER BY, no se puede usar
un criterio de ordenación para establecer las filas filtradas por TOP y
otra para determinar el orden de salida.
Siguiente unidad: Resultados de la página
Resultados de la página
Completado100 XP
3 minutos
Una extensión de la cláusula ORDER BY denominada OFFSET-FETCH permite
devolver solo un intervalo de las filas seleccionadas por la consulta. Agrega la
capacidad de proporcionar un punto inicial (un desplazamiento) y un valor para
especificar cuántas filas desea devolver (un valor de captura). Esta extensión
proporciona una técnica práctica para paginar los resultados.
Si desea devolver filas una "página" a la vez (con el número que elija para una
página), deberá tener en cuenta que cada consulta con una cláusula OFFSET-
FETCH se ejecuta independientemente de cualquier otra consulta. No se
mantiene ningún estado del lado servidor y deberá realizar un seguimiento de
su posición mediante un conjunto de resultados a través del código del lado
cliente.
Sintaxis de OFFSET-FETCH
La sintaxis de la cláusula OFFSET-FETCH, que técnicamente forma parte de la
cláusula ORDER BY, es la siguiente:
SQLCopiar
OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS }
[FETCH { FIRST | NEXT } {integer_constant | fetch_row_count_expression }
{ ROW | ROWS } ONLY]
Uso de OFFSET-FETCH
Para usar OFFSET-FETCH, debe proporcionar un valor OFFSET inicial, que puede
ser cero, y un número opcional de filas que se devolverán, como en el ejemplo
siguiente:
En este ejemplo se devolverán las 10 primeras filas y, luego, se devolverán las
10 filas siguientes de datos de producto en función de ListPrice:
SQLCopiar
SELECT ProductID, ProductName, ListPrice
FROM [Link]
ORDER BY ListPrice DESC
OFFSET 0 ROWS --Skip zero rows
FETCH NEXT 10 ROWS ONLY; --Get the next 10
Para recuperar la página siguiente de datos del producto, use la cláusula OFFSET
para especificar el número de filas que se van a omitir:
SQLCopiar
SELECT ProductID, ProductName, ListPrice
FROM [Link]
ORDER BY ListPrice DESC
OFFSET 10 ROWS --Skip 10 rows
FETCH NEXT 10 ROWS ONLY; --Get the next 10
En la definición de sintaxis puede ver que la cláusula OFFSET es obligatoria, pero
la cláusula FETCH no lo es. Si se omite la cláusula FETCH, se devolverán todas las
filas siguientes a OFFSET. También encontrará que las palabras clave ROW y
ROWS son intercambiables, al igual que FIRST y NEXT, lo que permite una
sintaxis más natural.
Para garantizar la precisión de los resultados, especialmente cuando se mueve
de página a página de datos, es importante construir una cláusula ORDER BY
que proporcione una ordenación única y un resultado determinista. Debido a la
forma en que funciona el optimizador de consultas de SQL Server, es
técnicamente posible que una fila aparezca en más de una página, a menos que
el intervalo de filas sea determinista.
Eliminación de duplicados
Completado100 XP
3 minutos
Aunque las filas de una tabla siempre deben ser únicas, al seleccionar solo un
subconjunto de las columnas, es posible que las filas de resultados no sean
únicas aunque las filas originales sí lo sean. Por ejemplo, puede tener una tabla
de proveedores con un requisito de que la ciudad y el estado (o provincia) sean
únicos para que nunca haya más de un proveedor en una ciudad. Sin embargo,
si solo quiere ver las ciudades y los países o regiones donde se encuentran los
proveedores, es posible que los resultados devueltos no sean únicos.
Supongamos que escribe la consulta siguiente:
SQLCopiar
SELECT City, CountryRegion
FROM [Link]
ORDER BY CountryRegion, City;
Esta consulta puede devolver resultados similares a los siguientes:
City
CountryRegion
Aurora
Canadá
Barrie
Canadá
Brampton
Canadá
Brossard
Canadá
Brossard
Canadá
Burnaby
Canadá
Burnaby
Canadá
Burnaby
Canadá
Calgary
Canadá
Calgary
Canadá
...
...
De manera predeterminada, la cláusula SELECT incluye una palabra clave ALL
implícita que da como resultado este comportamiento:
SQLCopiar
SELECT ALL City, CountryRegion
FROM [Link]
ORDER BY CountryRegion, City;
T-SQL también admite una alternativa a la palabra clave DISTINCT, que quita las
filas de resultados duplicadas:
SQLCopiar
SELECT DISTINCT City, CountryRegion
FROM [Link]
ORDER BY CountryRegion, City;
Cuando se usa DISTINCT, el ejemplo devuelve solo una de cada combinación
única de valores de la lista SELECT:
City
CountryRegion
Aurora
Canadá
Barrie
Canadá
Brampton
Canadá
Brossard
Canadá
Burnaby
Canadá
Calgary
Canadá
...
...
Siguiente unidad: Filtrado de los datos con
predicados
Filtrado de los datos con predicados
Completado100 XP
3 minutos
Las instrucciones SELECT más simples con solo las cláusulas SELECT y FROM
evaluarán cada fila de una tabla. Con el uso de una cláusula WHERE, se definen
condiciones que determinan qué filas se procesarán y potencialmente reducirán
el conjunto de resultados.
La estructura de la cláusula WHERE
La cláusula WHERE está compuesta de una o varias condiciones de búsqueda,
cada una de las cuales debe evaluarse como TRUE, FALSE o “unknown” para
cada fila de la tabla. Solo se devolverán las filas cuando la cláusula WHERE se
evalúe como TRUE. Las condiciones individuales actúan como filtros en los
datos y se conocen como “predicados”. Cada predicado incluye una condición
que se prueba, por lo general mediante los operadores básicos de comparación:
= (es igual a)
<> (no es igual a)
> (mayor que)
>= (mayor o igual que)
< (menor que)
<= (menor o igual que)
Por ejemplo, la consulta siguiente devuelve todos los productos con un
valor ProductCategoryID de 2:
SQLCopiar
SELECT ProductCategoryID AS Category, ProductName
FROM [Link]
WHERE ProductCategoryID = 2;
De manera similar, la consulta siguiente devuelve todos los productos con un
valor ListPrice menor que 10,00:
SQLCopiar
SELECT ProductCategoryID AS Category, ProductName
FROM [Link]
WHERE ListPrice < 10.00;
IS NULL/IS NOT NULL
También puede filtrar fácilmente para permitir o excluir los valores “unknown” o
NULL mediante IS NULL o IS NOT NULL.
SQLCopiar
SELECT ProductCategoryID AS Category, ProductName
FROM [Link]
WHERE ProductName IS NOT NULL;
Varias condiciones
Se pueden combinar varios predicados con los operadores AND y OR, y con
paréntesis. Sin embargo, SQL Server solo procesará dos condiciones a la vez.
Todas las condiciones deben ser TRUE al conectar varias condiciones con el
operador AND. Cuando se usa el operador OR para conectar dos condiciones,
una o ambas pueden ser TRUE para el conjunto de resultados.
Por ejemplo, la consulta siguiente devuelve un producto de la categoría 2 que
cuesta menos de 10,00:
SQLCopiar
SELECT ProductCategoryID AS Category, ProductName
FROM [Link]
WHERE ProductCategoryID = 2
AND ListPrice < 10.00;
Los operadores AND se procesan antes que los operadores OR, a menos que se
utilicen paréntesis. Para el procedimiento recomendado, use paréntesis al usar
más de dos predicados. La siguiente consulta devuelve productos de la
categoría 2 OR (O) 3 AND (Y) cuesta menos de 10,00:
SQLCopiar
SELECT ProductCategoryID AS Category, ProductName
FROM [Link]
WHERE (ProductCategoryID = 2 OR ProductCategoryID = 3)
AND (ListPrice < 10.00);
Operadores de comparación
Transact-SQL incluye operadores de comparación adicionales que pueden
ayudar a simplificar la cláusula WHERE.
IN
El operador IN es un acceso directo para varias condiciones de igualdad para la
misma columna conectada con OR. No hay ningún problema con el uso de
varias condiciones OR en una consulta, como en el ejemplo siguiente:
SQLCopiar
SELECT ProductCategoryID AS Category, ProductName
FROM [Link]
WHERE ProductCategoryID = 2
OR ProductCategoryID = 3
OR ProductCategoryID = 4;
Sin embargo, el uso de IN es claro y conciso, y el rendimiento de la consulta no
se verá afectado.
SQLCopiar
SELECT ProductCategoryID AS Category, ProductName
FROM [Link]
WHERE ProductCategoryID IN (2, 3, 4);
BETWEEN
BETWEEN es otro acceso directo que se puede usar al filtrar para un límite
superior e inferior del valor, en lugar de usar dos condiciones con el operador
AND. Las dos consultas siguientes son equivalentes:
SQLCopiar
SELECT ProductCategoryID AS Category, ProductName
FROM [Link]
WHERE ListPrice >= 1.00
AND ListPrice <= 10.00;
SQLCopiar
SELECT ProductCategoryID AS Category, ProductName
FROM [Link]
WHERE ListPrice BETWEEN 1.00 AND 10.00;
El operador BETWEEN usa valores de límite inclusivos. Los productos con un
precio de 1,00 o 10,00 se incluirán en los resultados. BETWEEN también es útil al
consultar campos de fecha. Por ejemplo, la siguiente consulta incluirá todos los
nombres de producto modificados entre el 1 de enero de 2012 y el 31 de
diciembre de 2012:
SQLCopiar
SELECT ProductName, ModifiedDate
FROM [Link]
WHERE ModifiedDate BETWEEN '2012-01-01' AND '2012-12-31';
ProductName
ModifiedDate
Mountain Bike Socks, M
2012-01-01 [Link].000
HL Mountain Frame - Silver, 42
2012-03-05 [Link].000
HL Mountain Frame - Silver, 38
2012-08-29 [Link].000
Mountain-100 Silver, 38
2012-12-31 [Link].000
Sin embargo, dado que no se especifica un intervalo de tiempo, no se devuelve
ningún resultado después de 2012-12-31 [Link].000. Para incluir con
precisión la fecha y hora, es necesario incluir la hora en el predicado:
SQLCopiar
SELECT ProductName, ListPrice, ModifiedDate
FROM [Link]
WHERE ModifiedDate BETWEEN '2012-01-01 [Link].000' AND '2012-12-31
[Link].999';
Los operadores de comparación básicos, como Greater Than (>) y Equals (=)
también son precisos cuando solo se filtran por fecha:
SQLCopiar
SELECT ProductName, ListPrice, ModifiedDate
FROM [Link]
WHERE ModifiedDate >= '2012-01-01'
AND ModifiedDate < '2013-01-01';
LIKE
El operador de comparación final solo se puede usar para los datos de
caracteres y nos permite usar caracteres comodín y patrones de expresiones
regulares. Los caracteres comodín nos permiten especificar cadenas parciales.
Por ejemplo, podría usar la consulta siguiente para devolver todos los
productos con nombres que contengan la palabra "mountain":
SQLCopiar
SELECT Name, ListPrice
FROM [Link]
WHERE Name LIKE '%mountain%';
El carácter comodín % representa cualquier cadena de 0 caracteres o más, por
lo que los resultados incluyen productos con la palabra "mountain" en cualquier
parte del nombre, como se muestra a continuación:
Nombre
ListPrice
Mountain Bike Socks, M
9,50
Mountain Bike Socks, L
9,50
HL Mountain Frame - Silver, 42
1364,0
HL Mountain Frame - Black, 42
1349,60
HL Mountain Frame - Silver, 38
1364,50
Mountain-100 Silver, 38
3399,99
Puede usar el carácter comodín _ (guión bajo) para representar un carácter
único, como este:
SQLCopiar
SELECT ProductName, ListPrice
FROM [Link]
WHERE ProductName LIKE 'Mountain Bike Socks, _';
Los siguientes resultados solo incluyen productos que comienzan por
“Mountain Bike Socks”, y un solo carácter después de:
ProductName
ListPrice
Mountain Bike Socks, M
9,50
Mountain Bike Socks, L
9,50
También puede definir patrones complejos para las cadenas que desea buscar.
Por ejemplo, la siguiente consulta busca productos con un nombre que
comience por “Mountain-”, seguido de:
tres caracteres entre 0 y 9
un espacio
cualquier cadena
una coma
un espacio
dos caracteres entre 0 y 9
SQLCopiar
SELECT ProductName, ListPrice
FROM [Link]
WHERE ProductName LIKE 'Mountain-[0-9][0-9][0-9] %, [0-9][0-9]';
Los resultados de esta consulta podrían tener un aspecto parecido al siguiente:
ProductName
ListPrice
Mountain-100 Silver, 38
3399,99
Mountain-100 Silver, 42
3399,99
Mountain-100 Black, 38
3399,99
Mountain-100 Black, 42
3399,99
Mountain-200 Silver, 38
2319,99
Mountain-200 Silver, 42
2319,99
Mountain-200 Black, 38
2319,99
Mountain-200 Black, 42
2319,99
Siguiente unidad: Ejercicio: Ordenar y filtrar los
resultados de una consulta
Ejercicio: Ordenar y filtrar los
resultados de una consulta
Completado100 XP
30 minutos
Esta unidad incluye un laboratorio para completar.
Use los recursos gratuitos que se proporcionan en el laboratorio para completar
los ejercicios de esta unidad. No se le cobrará.
Microsoft ofrece esta experiencia de laboratorio y el contenido relacionado con
fines educativos. Toda la información presentada es propiedad de Microsoft y
está destinada únicamente a brindar información sobre los productos y servicios
abordados en este módulo de Microsoft Learn.
Iniciar laboratorio
Nota
Se proporciona una máquina virtual que contiene las herramientas cliente que
necesita, junto con las instrucciones del ejercicio. Use el botón anterior para
iniciar la máquina virtual. Hay un número limitado de sesiones simultáneas
disponibles; si el entorno hospedado no está disponible, inténtelo de nuevo
más adelante. Como alternativa, puede usar estas instrucciones de
configuración para crear su propio entorno de laboratorio y seguir
estas instrucciones del ejercicio.
Cuando termine el ejercicio, finalice el laboratorio para cerrar la máquina virtual.
No olvide volver y completar la prueba de conocimientos para ganar puntos por
completar este módulo.
Ordenación de los resultados
Completado100 XP
4 minutos
En el orden lógico del procesamiento de consultas, ORDER BY es la última fase
de una instrucción SELECT que se va a ejecutar. ORDER BY permite controlar la
ordenación de las filas a medida que se devuelven de SQL Server a la aplicación
cliente. SQL Server no garantiza el orden físico de las filas de una tabla y la única
manera de controlar el orden en que se devolverán las filas al cliente es con una
cláusula ORDER BY. Este comportamiento es coherente con la teoría relacional.
Uso de la cláusula ORDER BY
Para indicarle a SQL Server que devuelva los resultados de la consulta en un
orden determinado, agregue una cláusula ORDER BY con este formato:
SQLCopiar
SELECT<select_list>
FROM <table_source>
ORDER BY <order_by_list> [ASC|DESC];
ORDER BY puede tomar varios tipos de elementos en su lista:
Columnas por nombre. Puede especificar los nombres de las
columnas en función de las cuales se deben ordenar los resultados.
Los resultados se devuelven según el orden de la primera columna
y, luego, se ordenan por cada columna adicional.
Alias de columna. Como ORDER BY se procesa después de la
cláusula SELECT, tiene acceso a los alias definidos en la lista SELECT.
Columnas por posición ordinal en la lista SELECT. No se
recomienda usar la posición en las aplicaciones, debido a la
disminución de la legibilidad y al cuidado adicional que se necesita
para mantener actualizada la lista ORDER BY. Sin embargo, para las
expresiones complejas de la lista SELECT, el uso del número de la
posición puede ser útil durante la solución de problemas.
Las columnas no se incluyen en la lista SELECT, pero están
disponibles en las tablas enumeradas de la cláusula FROM. Si la
consulta usa una opción DISTINCT, las columnas de la lista ORDER
BY deben incluirse en la lista SELECT.
Dirección de la ordenación
Además de especificar qué columnas se deben usar para determinar el criterio
de ordenación, también puede controlar la dirección de la ordenación. Puede
usar ASC para una ordenación ascendente (A-Z, 0-9) o DESC para una
descendente (Z-A, 9-0). El valor predeterminado son las ordenaciones
ascendentes. Cada columna puede tener especificada su propia dirección, como
en el ejemplo siguiente:
SQLCopiar
SELECT ProductCategoryID AS Category, ProductName
FROM [Link]
ORDER BY Category ASC, Price DESC;
Siguiente unidad: Limitación de los resultados
ordenados
Limitación de los resultados
ordenados
Completado100 XP
3 minutos
La cláusula TOP es una extensión propiedad de Microsoft de la cláusula SELECT.
La cláusula TOP le permitirá especificar cuántas filas se van a devolver, ya sea
como un entero positivo o como un porcentaje de todas las filas calificadas. El
número de filas se puede especificar como una constante o como una
expresión. La cláusula TOP se usa con más frecuencia con ORDER BY, pero se
puede usar con datos no ordenados.
Usar la cláusula TOP
La sintaxis simplificada de la cláusula TOP, que se usa con ORDER BY, es la
siguiente:
SQLCopiar
SELECT TOP (N) <column_list>
FROM <table_source>
WHERE <search_condition>
ORDER BY <order list> [ASC|DESC];
Por ejemplo, para recuperar solo los 10 productos más costosos de la
tabla [Link], use la consulta siguiente:
SQLCopiar
SELECT TOP 10 Name, ListPrice
FROM [Link]
ORDER BY ListPrice DESC;
El resultado podría ser similar al siguiente:
Nombre
ListPrice
Road-150 Red, 62
3578,27
Road-150 Red, 44
3578,27
Road-150 Red, 48
3578,27
Road-150 Red, 52
3578,27
Road-150 Red, 56
3578,27
Mountain-100 Silver, 38
3399,99
Mountain-100 Silver, 42
3399,99
Mountain-100 Silver, 44
3399,99
Mountain-100 Silver, 48
3399,99
Mountain-100 Black, 38
3374,99
El operador TOP depende de una cláusula ORDER BY para proporcionar una
prioridad significativa a las filas seleccionadas. TOP se puede usar sin ORDER BY
pero, en ese caso, no hay ninguna manera de predecir qué filas se devolverán.
En este ejemplo, se podrían devolver 10 pedidos cualesquiera si no hubiese una
cláusula ORDER BY.
Uso de WITH TIES
Además de especificar un número fijo de filas que se van a devolver, la palabra
clave TOP también acepta la opción WITH TIES, que recuperará las filas con
valores que puedan encontrarse en las primeras N filas seleccionadas.
En el ejemplo anterior, la consulta devolvió los 10 primeros productos en orden
descendente de precio. Sin embargo, al agregar la opción WITH TIES a la
cláusula TOP, verá que hay más filas que se pueden incluir en los 10 productos
más caros:
SQLCopiar
SELECT TOP 10 WITH TIES Name, ListPrice
FROM [Link]
ORDER BY ListPrice DESC;
Esta consulta modificada devuelve los resultados siguientes:
Nombre
ListPrice
Road-150 Red, 62
3578,27
Road-150 Red, 44
3578,27
Road-150 Red, 48
3578,27
Road-150 Red, 52
3578,27
Road-150 Red, 56
3578,27
Mountain-100 Silver, 38
3399,99
Mountain-100 Silver, 42
3399,99
Mountain-100 Silver, 44
3399,99
Mountain-100 Silver, 48
3399,99
Mountain-100 Black, 38
3374,99
Mountain-100 Black, 42
3374,99
Mountain-100 Black, 44
3374,99
Mountain-100 Black, 48
3374,99
La decisión de incluir WITH TIES dependerá de cuánto conozca los datos de
origen, su potencial para valores únicos y los requisitos de la consulta que
escribe.
Uso de PERCENT
Para devolver un porcentaje de las filas aptas, use la opción PERCENT con TOP
en lugar de un número fijo.
SQLCopiar
SELECT TOP 10 PERCENT Name, ListPrice
FROM [Link]
ORDER BY ListPrice DESC;
La opción PERCENT también se puede usar con la opción WITH TIES.
Nota
Para el recuento de filas, TOP (N) PERCENT se redondeará hacia arriba al entero
más cercano.
La opción TOP la usan muchos profesionales de SQL Server como método para
recuperar solo un determinado intervalo de filas. Sin embargo, tenga en cuenta
estos hechos al usar TOP:
TOP es propiedad de T-SQL.
TOP por sí solo no admite la omisión de filas.
Como TOP depende de una cláusula ORDER BY, no se puede usar
un criterio de ordenación para establecer las filas filtradas por TOP y
otra para determinar el orden de salida.
Siguiente unidad: Resultados de la página
Continuar
Resultados de la página
Completado100 XP
3 minutos
Una extensión de la cláusula ORDER BY denominada OFFSET-FETCH permite
devolver solo un intervalo de las filas seleccionadas por la consulta. Agrega la
capacidad de proporcionar un punto inicial (un desplazamiento) y un valor para
especificar cuántas filas desea devolver (un valor de captura). Esta extensión
proporciona una técnica práctica para paginar los resultados.
Si desea devolver filas una "página" a la vez (con el número que elija para una
página), deberá tener en cuenta que cada consulta con una cláusula OFFSET-
FETCH se ejecuta independientemente de cualquier otra consulta. No se
mantiene ningún estado del lado servidor y deberá realizar un seguimiento de
su posición mediante un conjunto de resultados a través del código del lado
cliente.
Sintaxis de OFFSET-FETCH
La sintaxis de la cláusula OFFSET-FETCH, que técnicamente forma parte de la
cláusula ORDER BY, es la siguiente:
SQLCopiar
OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS }
[FETCH { FIRST | NEXT } {integer_constant | fetch_row_count_expression }
{ ROW | ROWS } ONLY]
Uso de OFFSET-FETCH
Para usar OFFSET-FETCH, debe proporcionar un valor OFFSET inicial, que puede
ser cero, y un número opcional de filas que se devolverán, como en el ejemplo
siguiente:
En este ejemplo se devolverán las 10 primeras filas y, luego, se devolverán las
10 filas siguientes de datos de producto en función de ListPrice:
SQLCopiar
SELECT ProductID, ProductName, ListPrice
FROM [Link]
ORDER BY ListPrice DESC
OFFSET 0 ROWS --Skip zero rows
FETCH NEXT 10 ROWS ONLY; --Get the next 10
Para recuperar la página siguiente de datos del producto, use la cláusula OFFSET
para especificar el número de filas que se van a omitir:
SQLCopiar
SELECT ProductID, ProductName, ListPrice
FROM [Link]
ORDER BY ListPrice DESC
OFFSET 10 ROWS --Skip 10 rows
FETCH NEXT 10 ROWS ONLY; --Get the next 10
En la definición de sintaxis puede ver que la cláusula OFFSET es obligatoria, pero
la cláusula FETCH no lo es. Si se omite la cláusula FETCH, se devolverán todas las
filas siguientes a OFFSET. También encontrará que las palabras clave ROW y
ROWS son intercambiables, al igual que FIRST y NEXT, lo que permite una
sintaxis más natural.
Para garantizar la precisión de los resultados, especialmente cuando se mueve
de página a página de datos, es importante construir una cláusula ORDER BY
que proporcione una ordenación única y un resultado determinista. Debido a la
forma en que funciona el optimizador de consultas de SQL Server, es
técnicamente posible que una fila aparezca en más de una página, a menos que
el intervalo de filas sea determinista.
Siguiente unidad: Eliminación de duplicados
Eliminación de duplicados
Completado100 XP
3 minutos
Aunque las filas de una tabla siempre deben ser únicas, al seleccionar solo un
subconjunto de las columnas, es posible que las filas de resultados no sean
únicas aunque las filas originales sí lo sean. Por ejemplo, puede tener una tabla
de proveedores con un requisito de que la ciudad y el estado (o provincia) sean
únicos para que nunca haya más de un proveedor en una ciudad. Sin embargo,
si solo quiere ver las ciudades y los países o regiones donde se encuentran los
proveedores, es posible que los resultados devueltos no sean únicos.
Supongamos que escribe la consulta siguiente:
SQLCopiar
SELECT City, CountryRegion
FROM [Link]
ORDER BY CountryRegion, City;
Esta consulta puede devolver resultados similares a los siguientes:
City
CountryRegion
Aurora
Canadá
Barrie
Canadá
Brampton
Canadá
Brossard
Canadá
Brossard
Canadá
Burnaby
Canadá
Burnaby
Canadá
Burnaby
Canadá
Calgary
Canadá
Calgary
Canadá
...
...
De manera predeterminada, la cláusula SELECT incluye una palabra clave ALL
implícita que da como resultado este comportamiento:
SQLCopiar
SELECT ALL City, CountryRegion
FROM [Link]
ORDER BY CountryRegion, City;
T-SQL también admite una alternativa a la palabra clave DISTINCT, que quita las
filas de resultados duplicadas:
SQLCopiar
SELECT DISTINCT City, CountryRegion
FROM [Link]
ORDER BY CountryRegion, City;
Cuando se usa DISTINCT, el ejemplo devuelve solo una de cada combinación
única de valores de la lista SELECT:
City
CountryRegion
Aurora
Canadá
Barrie
Canadá
Brampton
Canadá
Brossard
Canadá
Burnaby
Canadá
Calgary
Canadá
...
...
Siguiente unidad: Filtrado de los datos con
predicados
Filtrado de los datos con predicados
Completado100 XP
3 minutos
Las instrucciones SELECT más simples con solo las cláusulas SELECT y FROM
evaluarán cada fila de una tabla. Con el uso de una cláusula WHERE, se definen
condiciones que determinan qué filas se procesarán y potencialmente reducirán
el conjunto de resultados.
La estructura de la cláusula WHERE
La cláusula WHERE está compuesta de una o varias condiciones de búsqueda,
cada una de las cuales debe evaluarse como TRUE, FALSE o “unknown” para
cada fila de la tabla. Solo se devolverán las filas cuando la cláusula WHERE se
evalúe como TRUE. Las condiciones individuales actúan como filtros en los
datos y se conocen como “predicados”. Cada predicado incluye una condición
que se prueba, por lo general mediante los operadores básicos de comparación:
= (es igual a)
<> (no es igual a)
> (mayor que)
>= (mayor o igual que)
< (menor que)
<= (menor o igual que)
Por ejemplo, la consulta siguiente devuelve todos los productos con un
valor ProductCategoryID de 2:
SQLCopiar
SELECT ProductCategoryID AS Category, ProductName
FROM [Link]
WHERE ProductCategoryID = 2;
De manera similar, la consulta siguiente devuelve todos los productos con un
valor ListPrice menor que 10,00:
SQLCopiar
SELECT ProductCategoryID AS Category, ProductName
FROM [Link]
WHERE ListPrice < 10.00;
IS NULL/IS NOT NULL
También puede filtrar fácilmente para permitir o excluir los valores “unknown” o
NULL mediante IS NULL o IS NOT NULL.
SQLCopiar
SELECT ProductCategoryID AS Category, ProductName
FROM [Link]
WHERE ProductName IS NOT NULL;
Varias condiciones
Se pueden combinar varios predicados con los operadores AND y OR, y con
paréntesis. Sin embargo, SQL Server solo procesará dos condiciones a la vez.
Todas las condiciones deben ser TRUE al conectar varias condiciones con el
operador AND. Cuando se usa el operador OR para conectar dos condiciones,
una o ambas pueden ser TRUE para el conjunto de resultados.
Por ejemplo, la consulta siguiente devuelve un producto de la categoría 2 que
cuesta menos de 10,00:
SQLCopiar
SELECT ProductCategoryID AS Category, ProductName
FROM [Link]
WHERE ProductCategoryID = 2
AND ListPrice < 10.00;
Los operadores AND se procesan antes que los operadores OR, a menos que se
utilicen paréntesis. Para el procedimiento recomendado, use paréntesis al usar
más de dos predicados. La siguiente consulta devuelve productos de la
categoría 2 OR (O) 3 AND (Y) cuesta menos de 10,00:
SQLCopiar
SELECT ProductCategoryID AS Category, ProductName
FROM [Link]
WHERE (ProductCategoryID = 2 OR ProductCategoryID = 3)
AND (ListPrice < 10.00);
Operadores de comparación
Transact-SQL incluye operadores de comparación adicionales que pueden
ayudar a simplificar la cláusula WHERE.
IN
El operador IN es un acceso directo para varias condiciones de igualdad para la
misma columna conectada con OR. No hay ningún problema con el uso de
varias condiciones OR en una consulta, como en el ejemplo siguiente:
SQLCopiar
SELECT ProductCategoryID AS Category, ProductName
FROM [Link]
WHERE ProductCategoryID = 2
OR ProductCategoryID = 3
OR ProductCategoryID = 4;
Sin embargo, el uso de IN es claro y conciso, y el rendimiento de la consulta no
se verá afectado.
SQLCopiar
SELECT ProductCategoryID AS Category, ProductName
FROM [Link]
WHERE ProductCategoryID IN (2, 3, 4);
BETWEEN
BETWEEN es otro acceso directo que se puede usar al filtrar para un límite
superior e inferior del valor, en lugar de usar dos condiciones con el operador
AND. Las dos consultas siguientes son equivalentes:
SQLCopiar
SELECT ProductCategoryID AS Category, ProductName
FROM [Link]
WHERE ListPrice >= 1.00
AND ListPrice <= 10.00;
SQLCopiar
SELECT ProductCategoryID AS Category, ProductName
FROM [Link]
WHERE ListPrice BETWEEN 1.00 AND 10.00;
El operador BETWEEN usa valores de límite inclusivos. Los productos con un
precio de 1,00 o 10,00 se incluirán en los resultados. BETWEEN también es útil al
consultar campos de fecha. Por ejemplo, la siguiente consulta incluirá todos los
nombres de producto modificados entre el 1 de enero de 2012 y el 31 de
diciembre de 2012:
SQLCopiar
SELECT ProductName, ModifiedDate
FROM [Link]
WHERE ModifiedDate BETWEEN '2012-01-01' AND '2012-12-31';
ProductName
ModifiedDate
Mountain Bike Socks, M
2012-01-01 [Link].000
HL Mountain Frame - Silver, 42
2012-03-05 [Link].000
HL Mountain Frame - Silver, 38
2012-08-29 [Link].000
Mountain-100 Silver, 38
2012-12-31 [Link].000
Sin embargo, dado que no se especifica un intervalo de tiempo, no se devuelve
ningún resultado después de 2012-12-31 [Link].000. Para incluir con
precisión la fecha y hora, es necesario incluir la hora en el predicado:
SQLCopiar
SELECT ProductName, ListPrice, ModifiedDate
FROM [Link]
WHERE ModifiedDate BETWEEN '2012-01-01 [Link].000' AND '2012-12-31
[Link].999';
Los operadores de comparación básicos, como Greater Than (>) y Equals (=)
también son precisos cuando solo se filtran por fecha:
SQLCopiar
SELECT ProductName, ListPrice, ModifiedDate
FROM [Link]
WHERE ModifiedDate >= '2012-01-01'
AND ModifiedDate < '2013-01-01';
LIKE
El operador de comparación final solo se puede usar para los datos de
caracteres y nos permite usar caracteres comodín y patrones de expresiones
regulares. Los caracteres comodín nos permiten especificar cadenas parciales.
Por ejemplo, podría usar la consulta siguiente para devolver todos los
productos con nombres que contengan la palabra "mountain":
SQLCopiar
SELECT Name, ListPrice
FROM [Link]
WHERE Name LIKE '%mountain%';
El carácter comodín % representa cualquier cadena de 0 caracteres o más, por
lo que los resultados incluyen productos con la palabra "mountain" en cualquier
parte del nombre, como se muestra a continuación:
Nombre
ListPrice
Mountain Bike Socks, M
9,50
Mountain Bike Socks, L
9,50
HL Mountain Frame - Silver, 42
1364,0
HL Mountain Frame - Black, 42
1349,60
HL Mountain Frame - Silver, 38
1364,50
Mountain-100 Silver, 38
3399,99
Puede usar el carácter comodín _ (guión bajo) para representar un carácter
único, como este:
SQLCopiar
SELECT ProductName, ListPrice
FROM [Link]
WHERE ProductName LIKE 'Mountain Bike Socks, _';
Los siguientes resultados solo incluyen productos que comienzan por
“Mountain Bike Socks”, y un solo carácter después de:
ProductName
ListPrice
Mountain Bike Socks, M
9,50
Mountain Bike Socks, L
9,50
También puede definir patrones complejos para las cadenas que desea buscar.
Por ejemplo, la siguiente consulta busca productos con un nombre que
comience por “Mountain-”, seguido de:
tres caracteres entre 0 y 9
un espacio
cualquier cadena
una coma
un espacio
dos caracteres entre 0 y 9
SQLCopiar
SELECT ProductName, ListPrice
FROM [Link]
WHERE ProductName LIKE 'Mountain-[0-9][0-9][0-9] %, [0-9][0-9]';
Los resultados de esta consulta podrían tener un aspecto parecido al siguiente:
ProductName
ListPrice
Mountain-100 Silver, 38
3399,99
Mountain-100 Silver, 42
3399,99
Mountain-100 Black, 38
3399,99
Mountain-100 Black, 42
3399,99
Mountain-200 Silver, 38
2319,99
Mountain-200 Silver, 42
2319,99
Mountain-200 Black, 38
2319,99
Mountain-200 Black, 42
2319,99
Siguiente unidad: Ejercicio: Ordenar y filtrar los
result
Ejercicio: Ordenar y filtrar los
resultados de una consulta
Completado100 XP
30 minutos
Esta unidad incluye un laboratorio para completar.
Use los recursos gratuitos que se proporcionan en el laboratorio para completar
los ejercicios de esta unidad. No se le cobrará.
Microsoft ofrece esta experiencia de laboratorio y el contenido relacionado con
fines educativos. Toda la información presentada es propiedad de Microsoft y
está destinada únicamente a brindar información sobre los productos y servicios
abordados en este módulo de Microsoft Learn.
Iniciar laboratorio
Nota
Se proporciona una máquina virtual que contiene las herramientas cliente que
necesita, junto con las instrucciones del ejercicio. Use el botón anterior para
iniciar la máquina virtual. Hay un número limitado de sesiones simultáneas
disponibles; si el entorno hospedado no está disponible, inténtelo de nuevo
más adelante. Como alternativa, puede usar estas instrucciones de
configuración para crear su propio entorno de laboratorio y seguir
estas instrucciones del ejercicio.
Cuando termine el ejercicio, finalice el laboratorio para cerrar la máquina virtual.
No olvide volver y completar la prueba de conocimientos para ganar puntos por
completar este módulo.
Introducción
Completado100 XP
3 minutos
Las bases de datos relacionales normalmente contienen varias tablas vinculadas
por campos de clave comunes. Este diseño normalizado minimiza la duplicación
de datos, pero significa que a menudo tendrá que escribir consultas para
recuperar datos relacionados de dos o más tablas.
En este módulo aprenderá a:
Entender los conceptos y la sintaxis de las combinaciones
Escribir consultas que usan combinaciones internas
Escribir consultas que usan combinaciones externas
Escritura de consultas que usan combinaciones cruzadas
Escribir consultas que usan autocombinaciones
Siguiente unidad: Descripción de los conceptos y
la sintaxis de las combinaciones
Descripción de los conceptos y la
sintaxis de las combinaciones
Completado100 XP
3 minutos
El método más fundamental y común para combinar datos de varias tablas
consiste en usar una operación JOIN. Algunas usuarios creen que JOIN es una
cláusula independiente en una instrucción SELECT, pero otros la consideran
parte de la cláusula FROM. En este módulo, se considerará principalmente parte
de la cláusula FROM. En este módulo, se describirá cómo la cláusula FROM de
una instrucción SELECT de T-SQL crea tablas virtuales intermedias que se
consumirán en fases posteriores de la consulta.
La cláusula FROM y las tablas virtuales
Si conoce el orden lógico de las operaciones que se realizan cuando SQL Server
procesa una consulta, sabe que la cláusula FROM de una instrucción SELECT es
la primera que se procesa. Esta cláusula determina qué tabla o tablas serán el
origen de las filas de la consulta. FROM puede hacer referencia a una sola tabla
o reunir varias tablas como origen de datos para la consulta. Puede pensar en la
cláusula FROM como lo que crea y rellena una tabla virtual. Esta tabla virtual
contendrá la salida de la cláusula FROM y la usarán las cláusulas de la
instrucción SELECT que se apliquen más adelante, como la cláusula WHERE. A
medida que agrega funcionalidad adicional a una cláusula FROM, como
operadores de combinación, será útil pensar que los elementos de la cláusula
FROM agregan o quitan filas de la tabla virtual.
La tabla virtual creada por una cláusula FROM es solo una entidad lógica. En
SQL Server, no se crea ninguna tabla física, ni persistente ni temporal, para
contener los resultados de la cláusula FROM, ya que se pasa a la cláusula
WHERE u otros elementos de la consulta.
La tabla virtual creada por la cláusula FROM contiene datos de todas las tablas
combinadas. Puede ser útil pensar en los resultados como conjuntos y
conceptualizar los resultados de la combinación como un diagrama de Venn.
A lo largo de su historia, el lenguaje T-SQL se ha expandido para reflejar los
cambios en los estándares del American National Standards Institute (ANSI)
para el lenguaje SQL. Uno de los puntos más importantes donde se aprecian
estos cambios es en la sintaxis de las combinaciones de una cláusula FROM. En
el estándar ANSI SQL-89, las combinaciones se especifican mediante la inclusión
de varias tablas en la cláusula FROM en una lista separada por comas. Cualquier
filtrado para determinar qué filas se incluyen se realiza en la cláusula WHERE, de
la siguiente manera:
SQLCopiar
SELECT [Link], [Link] AS Model, [Link] AS Product
FROM [Link] AS p, [Link] AS m
WHERE [Link] = [Link];
Esta sintaxis sigue siendo compatible con SQL Server, pero debido a la
complejidad de representar los filtros para combinaciones complejas, no se
recomienda. Además, si se omite accidentalmente una cláusula WHERE, las
combinaciones de estilo ANSI SQL-89 pueden convertirse fácilmente en
productos cartesianos y devolver un número excesivo de filas de resultados, lo
que genera problemas de rendimiento y posiblemente resultados incorrectos.
Al aprender a escribir consultas de varias tablas en T-SQL, es importante
comprender el concepto de productos cartesianos. En matemáticas, un
producto cartesiano es el producto de dos conjuntos. El producto de un
conjunto de dos elementos y otro de seis es un conjunto de 12 elementos
(6 x 2). Cada uno de los elementos de un conjunto se combina con los del otro.
En el ejemplo siguiente, hay un conjunto de nombres con dos elementos y un
conjunto de productos con tres. El producto cartesiano combina cada nombre
con cada producto, lo que genera seis elementos.
En las bases de datos, un producto cartesiano es el resultado de combinar cada
una de las fila de una tabla con las de otra. El producto de una tabla con 10 filas
y otra con 100 es un conjunto de resultados con 1000 filas. El resultado
subyacente de una operación JOIN es un producto cartesiano, pero para la
mayoría de las consultas de T-SQL, un producto cartesiano no es el resultado
deseado. En T-SQL, un producto cartesiano se produce cuando dos tablas de
entrada se combinan sin tener en cuenta ninguna relación entre ellas. Sin
información sobre las relaciones, el procesador de consultas de SQL Server
devolverá todas las combinaciones de filas posibles. Aunque este resultado
puede tener algunas aplicaciones prácticas, como la generación de datos de
prueba, no suele ser útil y puede tener graves implicaciones en el rendimiento.
Con la aparición del estándar ANSI SQL-92, se ha agregado compatibilidad con
las palabras clave JOIN y ON. T-SQL también admite esta sintaxis. Las
combinaciones se representan en la cláusula FROM mediante el operador JOIN
adecuado. La relación lógica entre las tablas, que se convierte en un predicado
de filtro, se especifica en la cláusula ON.
En el ejemplo siguiente se vuelve a formular la consulta anterior con la sintaxis
más reciente:
SQLCopiar
SELECT [Link], [Link] AS Model, [Link] AS Product
FROM [Link] AS p
JOIN [Link] AS m
ON [Link] = [Link];
Nota
La sintaxis de ANSI SQL-92 dificulta la creación de productos cartesianos
accidentales. Una vez que se ha agregado la palabra clave JOIN, se producirá un
error de sintaxis si falta una cláusula ON, a menos que JOIN se especifique
como CROSS JOIN.
Siguiente unidad: Uso de combinaciones internas
Uso de combinaciones internas
Completado100 XP
6 minutos
El tipo más frecuente de operación JOIN en las consultas T-SQL es INNER JOIN.
Las combinaciones internas se usan para resolver muchos problemas
empresariales comunes, especialmente en entornos de base de datos muy
normalizados. Para recuperar datos que se han almacenado en varias tablas, a
menudo tendrá que combinarlos mediante consultas INNER JOIN. INNER JOIN
comienza su fase de procesamiento lógico como un producto cartesiano y
después se filtra para quitar las filas que no coinciden con el predicado.
Procesamiento de INNER JOIN
Ahora se examinarán los pasos por los que SQL Server procesará lógicamente
una consulta JOIN. En el ejemplo hipotético siguiente se agregan números de
línea para mayor claridad:
SQLCopiar
1) SELECT [Link], [Link]
2) FROM [Link] AS emp
3) JOIN [Link] AS ord
4) ON [Link] = [Link];
Como debería saber, la cláusula FROM se procesará antes que la cláusula
SELECT. Se realizará el seguimiento del procesamiento, empezando por la
línea 2:
La cláusula FROM especifica [Link] como una de las tablas
de entrada, y le asigna el alias emp.
El operador JOIN de la línea 3 refleja el uso de INNER JOIN (el tipo
predeterminado en T-SQL) y especifica [Link] como la
otra tabla de entrada, que tiene un alias de ord.
SQL Server realizará una combinación cartesiana lógica en estas
tablas y pasará los resultados como una tabla virtual al paso
siguiente. (Es posible que el procesamiento físico de la consulta no
realice realmente la operación del producto cartesiano, en función
de las decisiones del optimizador. Pero puede resultar útil imaginar
el producto cartesiano que se está creando).
Con la cláusula ON, SQL Server filtrará la tabla virtual y solo
mantendrá aquellas filas en las que un valor EmployeeID de la
tabla emp coincida con un valor EmployeeID de la tabla ord.
Las filas restantes se dejan en la tabla virtual y se entregan al paso
siguiente en la instrucción SELECT. En este ejemplo, la tabla virtual
se procesa a continuación mediante la cláusula SELECT y las
dos columnas especificadas se devuelven a la aplicación cliente.
El resultado de la consulta completada es una lista de empleados y las
cantidades de sus pedidos. Los empleados que no tienen ningún pedido
asociado se han filtrado por la cláusula ON, al igual que los pedidos que tienen
un valor EmployeeID que no se corresponde con una entrada en la
tabla [Link].
Sintaxis de INNER JOIN
INNER JOIN es el tipo predeterminado de operación JOIN y la palabra clave
INNER opcional está implícita en la cláusula JOIN. Al mezclar tipos de
combinación, puede ser útil especificar el tipo de combinación de forma
explícita, como se muestra en este ejemplo hipotético:
SQLCopiar
SELECT [Link], [Link]
FROM [Link] AS emp
INNER JOIN [Link] AS ord
ON [Link] = [Link];
Al escribir consultas mediante combinaciones internas, tenga en cuenta las
instrucciones siguientes:
Se prefieren alias de tabla, no solo para la lista SELECT, sino también
para escribir la cláusula ON.
Las combinaciones internas se pueden realizar en una sola columna
coincidente, como OrderID, o bien en varios atributos coincidentes,
como la combinación de OrderID y ProductID. Las combinaciones
que especifican varias columnas coincidentes se denominan
combinaciones compuestas.
El orden de enumeración de las tablas en la cláusula FROM de una
operación INNER JOIN no es importante para el optimizador de
SQL Server. Conceptualmente, las combinaciones se evaluarán de
izquierda a derecha.
Use la palabra clave JOIN una vez para cada par de tablas
combinadas de la lista FROM. Para una consulta de dos tablas,
especifique una combinación. Para una consulta de tres tablas,
usará JOIN dos veces; una vez entre las dos primeras tablas y una
segunda entre la salida de JOIN entre las dos primeras tablas y la
tercera.
Ejemplos de INNER JOIN
En el ejemplo hipotético siguiente se realiza una combinación en una sola
columna coincidente, lo que relaciona ProductModelID de la
tabla [Link] con ProductModelID de la
tabla [Link]:
SQLCopiar
SELECT [Link], [Link] AS Model, [Link] AS Product
FROM [Link] AS p
INNER JOIN [Link] AS m
ON [Link] = [Link]
ORDER BY [Link];
En el ejemplo siguiente se muestra cómo se puede extender una combinación
interna para incluir más de dos tablas. La tabla [Link] se une a
la salida de JOIN entre [Link] y [Link]. Cada
instancia de JOIN/ON realiza sus propias operaciones de rellenado y filtrado de
la tabla de salida virtual. El optimizador de consultas de SQL Server determina el
orden en el que se realizarán las combinaciones y el filtrado.
SQLCopiar
SELECT [Link], [Link] AS Model, [Link] AS ProductName, [Link]
FROM [Link] AS p
INNER JOIN [Link] AS m
ON [Link] = [Link]
INNER JOIN [Link] AS od
ON [Link] = [Link]
ORDER BY [Link];
Siguiente unidad: Uso de combinaciones externas
Uso de combinaciones externas
Completado100 XP
6 minutos
Aunque no es tan común como las combinaciones internas, el uso de
combinaciones externas en una consulta de varias tablas puede proporcionar
una vista alternativa de los datos empresariales. Como sucede con las
combinaciones internas, expresará una relación lógica entre las tablas. Pero no
solo recuperará las filas con atributos coincidentes, sino también todas las filas
presentes en una tablas o las dos, independientemente de si hay o no una
coincidencia en la otra tabla.
Anteriormente, ha aprendido a usar INNER JOIN para buscar filas coincidentes
entre dos tablas. Como ha visto, el procesador de consultas genera los
resultados de una consulta INNER JOIN filtrando las filas que no cumplen las
condiciones expresadas en el predicado de la cláusula ON. El resultado es que
solo se devuelven las filas con una fila coincidente en la otra tabla. Con OUTER
JOIN, puede optar por mostrar todas las filas que tienen filas coincidentes entre
las tablas, además de todas las filas que no tienen ninguna coincidencia en la
otra tabla. Ahora se verá un ejemplo y, después, se examinará el proceso.
En primer lugar, examine la consulta siguiente, escrita con INNER JOIN:
SQLCopiar
SELECT [Link], [Link]
FROM [Link] AS emp
INNER JOIN [Link] AS ord
ON [Link] = [Link];
Estas filas representan una coincidencia
entre [Link] y [Link]. En los resultados solo aparecerán los
valores EmployeeID que están en ambas tablas.
Ahora, se examinará la siguiente consulta, escrita como LEFT OUTER JOIN:
SQLCopiar
SELECT [Link], [Link]
FROM [Link] AS emp
LEFT OUTER JOIN [Link] AS ord
ON [Link] = [Link];
En este ejemplo se usa un operador LEFT OUTER JOIN, que indica al procesador
de consultas que conserve todas las filas de la tabla de la izquierda
([Link]) y muestre los valores Amount para las filas coincidentes en
[Link]. Pero se devuelven todos los empleados, independientemente
de si han realizado o no un pedido de ventas. En lugar del valor Amount, la
consulta devolverá NULL para los empleados sin pedidos de ventas
correspondientes.
Sintaxis de OUTER JOIN
Las combinaciones externas se expresan mediante las palabras clave LEFT,
RIGHT o FULL, que se colocan por delante de OUTER JOIN. El propósito de la
palabra clave es indicar qué tabla (en qué lado de la palabra clave JOIN) se debe
conservar y mostrar todas sus filas, haya coincidencias o no.
Al usar LEFT, RIGHT o FULL para definir una combinación, puede omitir la
palabra clave OUTER como se muestra aquí:
SQLCopiar
SELECT [Link], [Link]
FROM [Link] AS emp
LEFT JOIN [Link] AS ord
ON [Link] = [Link];
Pero como sucede con la palabra clave INNER, a menudo resulta útil escribir
código que indique de forma explícita el tipo de combinación que se usa.
Al escribir consultas mediante OUTER JOIN, tenga en cuenta las instrucciones
siguientes:
Como ha visto, se prefieren alias de tabla, no solo para la lista
SELECT, sino también para la cláusula ON.
Como sucede con INNER JOIN, se puede realizar una operación
OUTER JOIN en una sola columna coincidente o en varios atributos
coincidentes.
A diferencia de INNER JOIN, el orden en el que las tablas se
enumeran y se unen en la cláusula FROM sí importa con OUTER
JOIN, ya que determinará si elige LEFT o RIGHT para la
combinación.
Las combinaciones de varias tablas son más complejas cuando se
usa OUTER JOIN. La presencia de valores NULL en los resultados de
OUTER JOIN puede provocar problemas si los resultados
intermedios se combinan a una tercera tabla. El predicado de la
segunda combinación puede filtrar las filas con valores NULL.
Para mostrar solo las filas en las que no existe ninguna coincidencia,
agregue una prueba de NULL en una cláusula WHERE después de
un predicado OUTER JOIN.
FULL OUTER JOIN rara vez se usa. Devuelve todas las filas
coincidentes entre las dos tablas, más todas las filas de la primera
tabla sin coincidencia en la segunda, además de todas las filas de la
segunda sin coincidencia en la primera.
No hay ninguna manera de predecir el orden en que se devolverán
las filas sin una cláusula ORDER BY. No hay ninguna manera de
saber si primero se devolverán las filas coincidentes o las no
coincidentes.
Uso de combinaciones cruzadas
Completado100 XP
3 minutos
Una combinación cruzada es simplemente un producto cartesiano de las dos
tablas. Con la sintaxis ANSI SQL-89, puede excluir el filtro que conecta las dos
tablas para crear una combinación cruzada. Con la sintaxis ANSI-92, es un poco
más difícil, lo que es positivo porque, en general, una combinación cruzada no
es algo que normalmente le interesará. Con la sintaxis ANSI-92, es muy poco
probable que termine con una combinación cruzada accidentalmente.
Para crear de forma explícita un producto cartesiano, use el operador CROSS
JOIN.
Esta operación crea un conjunto de resultados con todas las combinaciones
posibles de las filas de entrada:
SQLCopiar
SELECT <select_list>
FROM table1 AS t1
CROSS JOIN table2 AS t2;
Aunque este resultado no suele ser una salida deseada, hay algunas
aplicaciones prácticas para escribir una operación CROSS JOIN explícita:
Crear una tabla de números, con una fila para cada valor posible de
un intervalo.
Generar grandes volúmenes de datos para pruebas. Cuando se le
aplica una combinación cruzada a sí misma, una tabla con tan
solo 100 filas puede generar fácilmente 10 000 filas de salida.
Sintaxis de CROSS JOIN
Al escribir consultas mediante CROSS JOIN, tenga en cuenta las instrucciones
siguientes:
No se realiza ninguna coincidencia de filas, por lo que no se usa
ninguna cláusula ON. (Es un error usar una cláusula ON con CROSS
JOIN).
Para usar la sintaxis ANSI SQL-92, separe los nombres de tabla de
entrada con el operador CROSS JOIN.
La consulta siguiente es un ejemplo del uso de CROSS JOIN para crear todas las
combinaciones de empleados y productos:
SQLCopiar
SELECT [Link], [Link]
FROM [Link] AS emp
CROSS JOIN [Link] AS prd;
Siguiente unidad: Uso de autocombinaciones
Uso de autocombinaciones
Completado100 XP
3 minutos
Hasta ahora, en las combinaciones que se han usado participaban tablas
diferentes. Es posible que haya escenarios en los que tenga que recuperar y
comparar filas de una tabla con otras filas de la misma tabla. Por ejemplo, en
una aplicación de recursos humanos, una tabla Employee podría incluir
información sobre el jefe de cada empleado y almacenar el identificador del jefe
en la propia fila del empleado. Cada jefe también aparece como empleado.
EmployeeID (Id. de empleado)
FirstName
ManagerID
Dan
NULL
2
Aisha
Rosie
Naomi
Para recuperar la información de los empleados y hacerla coincidir con el jefe
relacionado, puede usar la tabla dos veces en la consulta, y combinarla con sí
misma para los fines de la consulta.
SQLCopiar
SELECT [Link] AS Employee,
[Link] AS Manager
FROM [Link] AS emp
LEFT OUTER JOIN [Link] AS mgr
ON [Link] = [Link];
Los resultados de esta consulta incluyen una fila para cada empleado con el
nombre de su jefe. El director general de la empresa no tiene ningún jefe. Para
incluir al director general en los resultados, se usa una combinación externa y el
nombre del jefe se devuelve como NULL para las filas en las que el
campo ManagerID no tiene ningún campo EmployeeID coincidente.
Empleado
Manager
Dan
NULL
Aisha
Dan
Rosie
Dan
Naomi
Rosie
Hay otros escenarios en los que querrá comparar filas de una tabla con otras
filas de la misma tabla. Como ha visto, es bastante fácil comparar columnas de
la misma fila mediante T-SQL, pero el método para comparar valores de filas
diferentes (como una fila que almacena una hora de inicio y otra de la misma
tabla que almacena una hora de finalización correspondiente) es menos obvio.
Las autocombinaciones son una técnica útil para estos tipos de consultas.
Para realizar tareas como esta, debe tener en cuenta las instrucciones siguientes:
Defina dos instancias de la misma tabla en la cláusula FROM y
combínelas según sea necesario, mediante combinaciones internas
o externas.
Use alias de tabla para diferenciar las dos instancias de la misma
tabla.
Use la cláusula ON para proporcionar un filtro que compare las
columnas de una instancia de la tabla con las columnas de la otra
instancia.
Siguiente unidad: Ejercicio: Consulta de varias
tablas con combinaciones
Continuar
Ejercicio: Consulta de varias tablas
con combinaciones
Completado100 XP
30 minutos
Esta unidad incluye un laboratorio para completar.
Use los recursos gratuitos que se proporcionan en el laboratorio para completar
los ejercicios de esta unidad. No se le cobrará.
Microsoft ofrece esta experiencia de laboratorio y el contenido relacionado con
fines educativos. Toda la información presentada es propiedad de Microsoft y
está destinada únicamente a brindar información sobre los productos y servicios
abordados en este módulo de Microsoft Learn.
Iniciar laboratorio
Nota
Se proporciona una máquina virtual que contiene las herramientas cliente que
necesita, junto con las instrucciones del ejercicio. Use el botón anterior para
iniciar la máquina virtual. Hay un número limitado de sesiones simultáneas
disponibles; si el entorno hospedado no está disponible, inténtelo de nuevo
más adelante. Como alternativa, puede usar estas instrucciones de
configuración para crear su propio entorno de laboratorio y seguir
estas instrucciones del ejercicio.
Cuando termine el ejercicio, finalice el laboratorio para cerrar la máquina virtual.
No olvide volver y completar la prueba de conocimientos para ganar puntos por
completar este módulo.
Siguiente unidad: Comprobación de conocimiento
Comprender las subconsultas
Completado100 XP
3 minutos
Una subconsulta es una instrucción SELECT anidada dentro de otra consulta. La
posibilidad de anidar una consulta dentro de otra mejorará su capacidad de
crear consultas eficaces en T-SQL. En general, las subconsultas se evalúan una
vez y proporcionan sus resultados a la consulta externa.
Trabajar con subconsultas
Una subconsulta es una instrucción SELECT anidada o incrustada en otra
consulta. La consulta anidada, que es la subconsulta, se conoce como consulta
interna. La consulta que contiene la consulta anidada es la consulta externa.
El propósito de una subconsulta es devolver resultados a la consulta externa. La
forma de los resultados determinará si la subconsulta es una subconsulta
escalar o multivalor:
Las subconsultas escalares devuelven un solo valor. Las consultas
externas deben procesar un único resultado.
Las subconsultas multivalor devuelven un resultado muy similar a
una tabla de una sola columna. Las consultas externas deben poder
procesar varios valores.
Además de la elección entre subconsultas escalares y multivalor, las
subconsultas pueden ser independientes o pueden correlacionarse con la
consulta externa:
Las subconsultas independientes se pueden escribir como consultas
independientes, sin dependencias de la consulta externa. Una
subconsulta independiente se procesa una vez, cuando la consulta
externa se ejecuta y pasa sus resultados a esa consulta externa.
Las subconsultas correlacionadas hacen referencia a una o varias
columnas de la consulta externa y, por tanto, dependen de ella. Las
subconsultas correlacionadas no se pueden ejecutar por separado
desde la consulta externa.
Usar subconsultas escalares o
multivalor
Completado100 XP
3 minutos
Una subconsulta escalar es una instrucción SELECT interna dentro de una
consulta externa, escrita para devolver un solo valor. Las subconsultas escalares
se pueden usar en cualquier lugar de una instrucción T-SQL externa en la que se
permita una expresión de un solo valor, como en una cláusula SELECT, una
cláusula WHERE, una cláusula HAVING o incluso una cláusula FROM. También se
pueden usar en instrucciones de modificación de datos, como UPDATE o
DELETE.
Las subconsultas multivalor, como sugiere el nombre, pueden devolver más de
una fila. Sin embargo, todavía devuelven una sola columna.
Subconsultas escalares
Imaginemos que desea recuperar los detalles del último pedido que se ha
realizado, suponiendo que es el que tiene el valor SalesOrderID más alto.
Para buscar el valor SalesOrderID más alto, puede usar la consulta siguiente:
SQLCopiar
SELECT MAX(SalesOrderID)
FROM [Link]
Esta consulta devuelve un valor único que indica el valor más alto
de OrderID en la tabla SalesOrderHeader.
Para obtener los detalles de este pedido, es posible que tenga que filtrar la
tabla SalesOrderDetails en función del valor devuelto por la consulta anterior.
Puede realizar esta tarea anidando la consulta para recuperar el valor máximo
de SalesOrderID dentro de la cláusula WHERE de una consulta que recupera los
detalles del pedido.
SQLCopiar
SELECT SalesOrderID, ProductID, OrderQty
FROM [Link]
WHERE SalesOrderID =
(SELECT MAX(SalesOrderID)
FROM [Link]);
Para escribir una subconsulta escalar, tenga en cuenta las siguientes directrices:
Para indicar una consulta como subconsulta, escríbala entre
paréntesis.
Se admiten varios niveles de subconsultas en Transact-SQL. En este
módulo, solo se considerarán las consultas de dos niveles (una
consulta interna dentro de una consulta externa), pero se admiten
hasta 32 niveles.
Si la subconsulta no devuelve filas (un conjunto vacío), el resultado
de la subconsulta es NULL. Si es posible en su escenario que no se
devuelva ninguna fila, debe asegurarse de que la consulta externa
puede controlar correctamente un valor NULL, además de otros
resultados esperados.
Por lo general, la consulta interna debe devolver una sola columna.
La selección de varias columnas en una subconsulta casi siempre es
un error. La única excepción es si la subconsulta se indica con la
palabra clave EXISTS.
Una subconsulta escalar se puede usar en cualquier lugar de una consulta
donde se espera un valor, incluida la lista SELECT. Por ejemplo, podríamos
ampliar la consulta que recuperó los detalles del pedido más reciente para
incluir la cantidad media de elementos que se pide, de modo que podamos
comparar la cantidad pedida en el pedido más reciente con la media de todos
los pedidos.
SQLCopiar
SELECT SalesOrderID, ProductID, OrderQty,
(SELECT AVG(OrderQty)
FROM [Link]) AS AvgQty
FROM [Link]
WHERE SalesOrderID =
(SELECT MAX(SalesOrderID)
FROM [Link]);
Subconsultas multivalor
Una subconsulta multivalor es adecuada para devolver resultados mediante el
operador IN. En el ejemplo hipotético siguiente se devuelven los
valores CustomerID y SalesOrderID de todos los pedidos realizados por los
clientes de Canadá.
SQLCopiar
SELECT CustomerID, SalesOrderID
FROM [Link]
WHERE CustomerID IN (
SELECT CustomerID
FROM [Link]
WHERE CountryRegion = 'Canada');
En este ejemplo, si ejecutara solo la consulta interna, se devolvería una columna
de valores CustomerID, con una fila para cada cliente de Canadá.
En muchos casos, las subconsultas multivalor se pueden escribir fácilmente
mediante combinaciones. Por ejemplo, esta es una consulta que usa una
combinación para devolver los mismos resultados del ejemplo anterior:
SQLCopiar
SELECT [Link], [Link]
FROM [Link] AS c
JOIN [Link] AS o
ON [Link] = [Link]
WHERE c. CountryRegion = 'Canada';
¿Cómo se decide si se escribe una consulta que implica varias tablas como JOIN
o con una subconsulta? A veces, solo depende de con qué se siente más
cómodo. La mayoría de las consultas anidadas que se convierten fácilmente en
JOIN realmente se convertirán en JOIN de forma interna. En el caso de estas
consultas, no hay ninguna diferencia real al escribir la consulta de una manera
frente a otra.
Una restricción que debe tener en cuenta es que cuando se usa una consulta
anidada, los resultados devueltos al cliente solo pueden incluir columnas de la
consulta externa. Por lo tanto, si tiene que devolver columnas de ambas tablas,
debe escribir la consulta mediante JOIN.
Por último, hay situaciones en las que la consulta interna necesita realizar
operaciones mucho más complicadas que las recuperaciones simples de
nuestros ejemplos. La reescritura de subconsultas complejas mediante JOIN
puede ser difícil. Para muchos desarrolladores de SQL, las subconsultas
funcionan mejor para un procesamiento complicado, ya que le permite dividir el
procesamiento en pasos más pequeños.
Siguiente unidad: Usar subconsultas
independientes o correlacionadas
Usar subconsultas independientes o
correlacionadas
Completado100 XP
3 minutos
Anteriormente, examinamos las subconsultas independientes en las que la
consulta interna es independiente de la consulta externa, se ejecuta una vez y
devuelve sus resultados a la consulta externa. T-SQL también admite las
subconsultas correlacionadas, en las que la consulta interna hace referencia a la
columna de la consulta externa y conceptualmente se ejecuta una vez por fila.
Trabajar con subconsultas correlacionadas
Al igual que las subconsultas independientes, las subconsultas correlacionadas
son instrucciones SELECT anidadas dentro de una consulta externa. Las
subconsultas correlacionadas también pueden ser subconsultas escalares o
multivalor. Normalmente se usan cuando la consulta interna necesita hacer
referencia a un valor en la consulta externa.
Sin embargo, a diferencia de las subconsultas independientes, hay algunas
consideraciones especiales cuando se usan subconsultas correlacionadas:
Las subconsultas correlacionadas no se pueden ejecutar por separado
desde la consulta externa. Esta restricción complica las pruebas y la
depuración.
A diferencia de las subconsultas independientes, que se procesan una vez,
las subconsultas correlacionadas se ejecutarán varias veces. Lógicamente,
la consulta externa se ejecuta primero y, para cada fila devuelta, se
procesa la consulta interna.
En el ejemplo siguiente se usa una subconsulta correlacionada para devolver el
pedido más reciente de cada cliente. La subconsulta hace referencia a la
consulta externa y hace referencia a su valor CustomerID en su cláusula
WHERE. Para cada fila de la consulta externa, la subconsulta busca el
identificador de pedido máximo del cliente al que se hace referencia en esa fila
y la consulta externa comprueba si la fila que se está analizando es la fila con
ese identificador de pedido.
SQLCopiar
SELECT SalesOrderID, CustomerID, OrderDate
FROM [Link] AS o1
WHERE SalesOrderID =
(SELECT MAX(SalesOrderID)
FROM [Link] AS o2
WHERE [Link] = [Link])
ORDER BY CustomerID, OrderDate;
Escritura de subconsultas correlacionadas
Para escribir subconsultas correlacionadas, tenga en cuenta las siguientes
directrices:
Escriba la consulta externa para aceptar el resultado devuelto adecuado
de la consulta interna. Si la consulta interna es escalar, puede usar
operadores de igualdad y comparación, como =, <, > y <>, en la cláusula
WHERE. Si la consulta interna puede devolver varios valores, use un
predicado IN. Cree un plan para controlar los resultados NULL.
Identifique la columna de la consulta externa a la que hará referencia la
subconsulta correlacionada. Declare un alias para la tabla que es el origen
de la columna en la consulta externa.
Identifique la columna de la tabla interna que se comparará con la
columna de la tabla externa. Cree un alias para la tabla de origen, como
hizo para la consulta externa.
Escriba la consulta interna para recuperar valores de su origen, en función
del valor de entrada de la consulta externa. Por ejemplo, use la columna
externa en la cláusula WHERE de la consulta interna.
La correlación entre las consultas interna y externa se produce cuando la
consulta interna hace referencia al valor externo para su comparación. Es esta
correlación la que proporciona a la subconsulta su nombre.
Trabajar con EXISTS
Además de recuperar valores de una subconsulta, T-SQL proporciona un
mecanismo para comprobar si se devolverían resultados de una consulta. El
predicado EXISTS determina si existen filas que cumplan una condición
especificada, pero en lugar de devolverlas, devuelve TRUE o FALSE. Esta técnica
es útil para validar los datos sin incurrir en la sobrecarga de recuperar y procesar
los resultados.
Cuando una subconsulta está relacionada con la consulta externa mediante el
predicado EXISTS, SQL Server controla los resultados de la subconsulta de una
manera especial. En lugar de recuperar un valor escalar o una lista multivalor de
la subconsulta, EXISTS simplemente comprueba si hay filas en el resultado.
Conceptualmente, un predicado EXISTS es equivalente a la recuperación de los
resultados, el recuento de las filas devueltas y la comparación del recuento con
cero. Compare las consultas siguientes, que devolverán detalles sobre los
clientes que han realizado pedidos:
La primera consulta de ejemplo usa COUNT en una subconsulta:
SQLCopiar
SELECT CustomerID, CompanyName, EmailAddress
FROM [Link] AS c
WHERE
(SELECT COUNT(*)
FROM [Link] AS o
WHERE [Link] = [Link]) > 0;
La segunda consulta, que devuelve los mismos resultados, usa EXISTS:
SQLCopiar
SELECT CustomerID, CompanyName, EmailAddress
FROM [Link] AS c
WHERE EXISTS
(SELECT *
FROM [Link] AS o
WHERE [Link] = [Link]);
En el primer ejemplo, la subconsulta debe contar todas las repeticiones de
cada custid que se encuentre en la tabla [Link] y comparar
los resultados del recuento con cero, simplemente para indicar que el cliente ha
realizado pedidos.
En la segunda consulta, EXISTS devolverá TRUE para un custid en cuanto se
haya encontrado un pedido pertinente en la tabla [Link]. No
es necesario realizar una contabilidad de cuentas completa de cada repetición.
Tenga en cuenta también que, con el formulario EXISTS, la subconsulta no está
restringida a la devolución de una sola columna. Aquí, aparece SELECT *. Las
columnas devueltas son irrelevantes porque solo estamos comprobando si se
devuelve alguna fila, no qué valores hay en esas filas.
Desde la perspectiva del procesamiento lógico, los dos formularios de consulta
son equivalentes. Desde una perspectiva de rendimiento, el motor de base de
datos puede tratar las consultas de forma diferente a medida que las optimiza
para su ejecución. Considere la posibilidad de probar cada una de ellos para su
propio uso.
Nota
Si va a convertir una subconsulta mediante COUNT(*) en una con EXISTS,
asegúrese de que la subconsulta usa SELECT * y no SELECT COUNT(*). SELECT
COUNT(*) siempre devuelve una fila, de modo que EXISTS siempre
devolverá TRUE.
Otra aplicación útil de EXISTS es la negación de la subconsulta con NOT, como
en el ejemplo siguiente, que devolverá cualquier cliente que nunca haya
realizado un pedido:
SQLCopiar
SELECT CustomerID, CompanyName, EmailAddress
FROM [Link] AS c
WHERE NOT EXISTS
(SELECT *
FROM [Link] AS o
WHERE [Link] = [Link]);
SQL Server tendrá que devolver datos sobre los pedidos relacionados para los
clientes que hayan realizado pedidos. Si se encuentra un custid en la
tabla [Link], NOT EXISTS se evalúa como FALSE y la
evaluación se completa rápidamente.
Para escribir consultas que usan EXISTS con subconsultas, tenga en cuenta las
siguientes directrices:
La palabra clave EXISTS sigue directamente a WHERE. Ningún nombre de
columna (u otra expresión) la precede, a menos que también se utilice
NOT.
En la subconsulta, use SELECT *. La subconsulta no devuelve ninguna fila,
por lo que no es necesario especificar ninguna columna.
Siguiente unidad: Ejercicio: Uso de subconsultas
Ejercicio: Uso de subconsultas
Completado100 XP
30 minutos
Esta unidad incluye un laboratorio para completar.
Use los recursos gratuitos que se proporcionan en el laboratorio para completar
los ejercicios de esta unidad. No se le cobrará.
Microsoft ofrece esta experiencia de laboratorio y el contenido relacionado con
fines educativos. Toda la información presentada es propiedad de Microsoft y
está destinada únicamente a brindar información sobre los productos y servicios
abordados en este módulo de Microsoft Learn.
Iniciar laboratorio
Nota
Se proporciona una máquina virtual que contiene las herramientas cliente que
necesita, junto con las instrucciones del ejercicio. Use el botón anterior para
iniciar la máquina virtual. Hay un número limitado de sesiones simultáneas
disponibles; si el entorno hospedado no está disponible, inténtelo de nuevo
más adelante. Como alternativa, puede usar estas instrucciones de
configuración para crear su propio entorno de laboratorio y seguir
estas instrucciones del ejercicio.
Cuando termine el ejercicio, finalice el laboratorio para cerrar la máquina virtual.
No olvide volver y completar la prueba de conocimientos para ganar puntos por
completar este módulo.
Categorizar funciones integradas
Completado100 XP
3 minutos
Transact-SQL incluye muchas funciones integradas, desde funciones que
convierten tipos de datos hasta funciones que agregan y analizan grupos de
filas.
Las funciones de T-SQL se pueden clasificar de la siguiente manera:
Categoría de la función
Descripción
Escalar
Opera sobre un solo valor y devuelve otro valor.
Lógicos
Compara varios valores para determinar una única salida.
Clasificación
Opera sobre una partición (conjunto) de filas.
Conjunto de filas
Devuelve una tabla virtual que se puede usar en una cláusula FROM de una instrucción
T-SQL.
Agregado
Toma uno o varios valores de entrada y devuelve un único valor de resumen.
Siguiente unidad: Usar funciones escalares
Usar funciones escalares
Completado100 XP
3 minutos
Las funciones escalares devuelven un valor único y normalmente funcionan en
una sola fila de datos. El número de valores de entrada que toman puede ser
cero (por ejemplo, GETDATE), uno (por ejemplo, UPPER) o varios (por ejemplo,
ROUND). Dado que las funciones escalares siempre devuelven un solo valor, se
pueden usar en cualquier lugar en el que se necesite un único valor (el
resultado). Se usan normalmente en cláusulas SELECT y predicados de cláusula
WHERE. También se pueden usar en la cláusula SET de una instrucción UPDATE.
Las funciones escalares integradas se pueden organizar en muchas categorías,
como cadena, conversión, lógica, matemática y otras. En este módulo se
explican algunas funciones escalares comunes.
Estas son algunas de las consideraciones que hay que tener en cuenta al usar
funciones escalares:
Determinismo: si la función devuelve el mismo valor para el mismo
estado de entrada y base de datos cada vez que se llama, se dice que
es determinista. Por ejemplo, ROUND(1.1, 0) siempre devuelve el valor 1.0.
Muchas funciones integradas son no deterministas. Por ejemplo,
GETDATE() devuelve la fecha y hora actuales. Los resultados de las
funciones no deterministas no se pueden indexar, lo que afecta a la
capacidad del procesador de consultas de idear un buen plan para
ejecutar la consulta.
Intercalación: cuando se usan funciones que manipulan datos de
caracteres, ¿qué intercalación se usará? Algunas funciones usan la
intercalación (criterio de ordenación) del valor de entrada; otros usan la
intercalación de la base de datos si no se proporciona ninguna
intercalación de entrada.
Ejemplos de funciones escalares
En el momento de redactar la documentación de SQL Server, se enumeran más
de 200 funciones escalares que abarcan varias categorías, entre las que se
incluyen las siguientes:
Funciones de configuración
Funciones de conversión
Funciones de cursores
Funciones de fecha y hora
Funciones matemáticas
Funciones de metadatos
Funciones de seguridad
Funciones de cadena
Funciones del sistema
Funciones estadísticas del sistema
Funciones de texto y de imagen
No hay tiempo suficiente en este curso para describir cada función, pero en los
ejemplos siguientes se muestran algunas funciones que se usan con frecuencia.
En el ejemplo hipotético siguiente se usan varias funciones de fecha y hora:
SQLCopiar
SELECT SalesOrderID,
OrderDate,
YEAR(OrderDate) AS OrderYear,
DATENAME(mm, OrderDate) AS OrderMonth,
DAY(OrderDate) AS OrderDay,
DATENAME(dw, OrderDate) AS OrderWeekDay,
DATEDIFF(yy,OrderDate, GETDATE()) AS YearsSinceOrder
FROM [Link];
A continuación se muestran resultados parciales:
[Link]
OrderDate
OrderYear
OrderMonth
OrderDay
OrderWeekDay
YearsSinceOrder
71774
2008-06-01T[Link]
2008
Junio
Domingo
13
...
...
...
...
...
...
...
En el ejemplo siguiente se incluyen algunas funciones matemáticas:
SQLCopiar
SELECT TaxAmt,
ROUND(TaxAmt, 0) AS Rounded,
FLOOR(TaxAmt) AS Floor,
CEILING(TaxAmt) AS Ceiling,
SQUARE(TaxAmt) AS Squared,
SQRT(TaxAmt) AS Root,
LOG(TaxAmt) AS Log,
TaxAmt * RAND() AS Randomized
FROM [Link];
Resultados parciales:
TaxAmt
Redondeo
Floor
Ceiling
Cuadrado
Root
Registro
Aleatorio
70,4279
70,0000
70,0000
71,0000
4960,089098
8,392133221
4,254589491
28,64120429
...
..
...
...
...
...
...
...
En el ejemplo siguiente se usan algunas funciones de cadena:
SQLCopiar
SELECT CompanyName,
UPPER(CompanyName) AS UpperCase,
LOWER(CompanyName) AS LowerCase,
LEN(CompanyName) AS Length,
REVERSE(CompanyName) AS Reversed,
CHARINDEX(' ', CompanyName) AS FirstSpace,
LEFT(CompanyName, CHARINDEX(' ', CompanyName)) AS FirstWord,
SUBSTRING(CompanyName, CHARINDEX(' ', CompanyName) + 1,
LEN(CompanyName)) AS RestOfName
FROM [Link];
Resultados parciales:
CompanyName
UpperCase
LowerCase
Length
Reversed
FirstSpace
FirstWord
RestOfName
Una tienda de bicicletas
UNA TIENDA DE BICICLETAS
una tienda de bicicletas
12
erotS ekiB A
Tienda de bicicletas
Progressive Sports
PROGRESSIVE SPORTS
progressive sports
18
stropS evissergorP
12
progresivo
Deportes
Advanced Bike Components
ADVANCED BIKE COMPONENTS
advanced bike components
24
stnenopmoC ekiB decnavdA
Avanzado
Bike Components
...
...
...
...
...
...
...
...
Funciones lógicas
Otra categoría de funciones permite determinar cuál de varios valores se va a
devolver. Las funciones lógicas evalúan una expresión de entrada y devuelven
un valor adecuado en función del resultado.
IIF
La función IIF evalúa una expresión de entrada booleana y devuelve un valor
especificado si la expresión se evalúa como True, y un valor alternativo si la
expresión se evalúa como False.
Por ejemplo, observe la siguiente consulta, que evalúa el tipo de dirección de un
cliente. Si el valor es "Oficina principal", la expresión devuelve "Facturación".
Para todos los demás valores de tipo de dirección, la expresión devuelve
"Correo".
SQLCopiar
SELECT AddressType,
IIF(AddressType = 'Main Office', 'Billing', 'Mailing') AS UseAddressFor
FROM [Link];
Los resultados parciales de esta consulta podrían tener este aspecto:
AddressType
UseAddressFor
Oficina principal
Facturación
Envío
Correo
...
...
CHOOSE
La función CHOOSE evalúa una expresión de entero y devuelve el valor
correspondiente de una lista en función de su posición ordinal (basada en 1).
SQLCopiar
SELECT SalesOrderID, Status,
CHOOSE(Status, 'Ordered', 'Shipped', 'Delivered') AS OrderStatus
FROM [Link];
Los resultados de esta consulta podrían tener un aspecto parecido al siguiente:
[Link]
Estado
OrderStatus
1234
Delivered (Entregado)
1235
Enviado
1236
Enviado
1237
Ordered (Realizado)
...
...
...
Utilizar funciones de clasificación y
conjunto de filas
Completado100 XP
3 minutos
Las funciones de clasificación y conjunto de filas no son funciones escalares
porque no devuelven un solo valor. Estas funciones aceptan un conjunto de filas
como entrada y devuelven un conjunto de filas como salida.
Funciones de categoría
Las funciones de clasificación permiten realizar cálculos en un conjunto de filas
definido por el usuario. Estas funciones incluyen funciones de clasificación,
desplazamiento, agregado y distribución.
En este ejemplo se usa la función RANK para calcular una clasificación basada
en ListPrice, con el precio más alto clasificado en 1:
SQLCopiar
SELECT TOP 100 ProductID, Name, ListPrice,
RANK() OVER(ORDER BY ListPrice DESC) AS RankByPrice
FROM [Link] AS p
ORDER BY RankByPrice;
Los resultados de la consulta pueden tener este aspecto:
ProductID
Nombre
ListPrice
RankByPrice
749
Road-150 Red, 62
3578,27
750
Road-150 Red, 44
3578,27
1
751
Road-150 Red, 48
3578,27
771
Mountain-100 Silver, 38
3399,99
772
Mountain-100 Silver, 42
3399,99
775
Mountain-100 Black, 38
3374,99
...
...
...
...
OVER
Puede usar la cláusula OVER para definir particiones o agrupaciones dentro de
los datos. Por ejemplo, la consulta siguiente amplía el ejemplo anterior para
calcular las clasificaciones basadas en precios de los productos dentro de cada
categoría.
SQLCopiar
SELECT [Link] AS Category, [Link] AS Product, ListPrice,
RANK() OVER(PARTITION BY [Link] ORDER BY ListPrice DESC) AS RankByPrice
FROM [Link] AS p
JOIN [Link] AS c
ON [Link] = [Link]
ORDER BY Category, RankByPrice;
Los resultados de esta consulta podrían tener un aspecto parecido al siguiente:
Category
Producto
ListPrice
RankByPrice
Pantalones de ciclismo
Pantalones de ciclismo, S
89,99
Pantalones de ciclismo
Pantalones de ciclismo, M
89,99
Bastidores de bicicletas
Bastidores de bicicletas, 4 bicicletas
120
1
Soportes de bicicletas
All-Purpose Bike Stand
159
Bidones y soportes
Mountain Bottle Cage
9,99
Bidones y soportes
Road Bottle Cage
8,99
Bidones y soportes
Water Bottle - 30 oz.
4,99
Ejes pedalier
Ejes pedalier HL
121,49
Ejes pedalier
Ejes pedalier ML
101,24
Ejes pedalier
Ejes pedalier LL
53,99
...
...
...
...
Nota
Observe que varias filas tienen el mismo valor de clasificación y que se han
omitido algunos valores. Esto se debe a que solo estamos usando RANK. En
función del requisito, es posible que quiera evitar vínculos con el mismo valor
de clasificación. Puede controlar el valor de clasificación con otras funciones,
DENSE_RANK, NTILE y ROW_NUMBER, según sea necesario. Para obtener más
información sobre estas funciones, consulte la documentación de referencia
de Transact-SQL.
Funciones de conjuntos de filas
Las funciones de conjunto de filas devuelven una tabla virtual que se puede usar
en la cláusula FROM como origen de datos. Estas funciones toman parámetros
específicos de la propia función de conjunto de filas. Incluyen
OPENDATASOURCE, OPENQUERY, OPENROWSET, OPENXML y OPENJSON.
Las funciones OPENDATASOURCE, OPENQUERY y OPENROWSET permiten
pasar una consulta a un servidor de bases de datos remoto. A continuación, el
servidor remoto devolverá un conjunto de filas de resultados. Por ejemplo, la
consulta siguiente usa OPENROWSET para obtener los resultados de una
consulta de una instancia de SQL Server llamada SalesDB.
SQLCopiar
SELECT a.*
FROM OPENROWSET('SQLNCLI', 'Server=SalesDB;Trusted_Connection=yes;',
'SELECT Name, ListPrice
FROM [Link]') AS a;
Para usar servidores remotos, debe habilitar algunas opciones avanzadas en la
instancia de SQL Server en la que se ejecuta la consulta.
Las funciones OPENXML y OPENJSON permiten consultar datos estructurados
en formato XML o JSON y extraer valores en un conjunto de filas tabular.
En este módulo no entraremos en detalle en las funciones de conjunto de filas.
Para obtener más información, consulte la documentación de referencia de
Transact-SQL.
Siguiente unidad: Uso de funciones de agregado
Continuar
Uso de funciones de agregado
Completado100 XP
3 minutos
T-SQL proporciona funciones de agregado como SUM, MAX y AVG para realizar
cálculos que toman varios valores y devuelven un único resultado.
Uso de funciones de agregado
La mayoría de las consultas que hemos visto funcionan de fila en fila, mediante
una cláusula WHERE para filtrar filas. Cada fila devuelta corresponde a una fila
del conjunto de datos original.
Muchas funciones de agregado se proporcionan en SQL Server. En esta sección,
veremos las funciones más comunes, como SUM, MIN, MAX, AVG y COUNT.
Al trabajar con funciones de agregado, debe tener en cuenta los siguientes
puntos:
Las funciones de agregado devuelven un único valor (escalar) y se
pueden usar en instrucciones SELECT casi en cualquier lugar en el
que se pueda usar un solo valor. Por ejemplo, estas funciones se
pueden usar en las cláusulas SELECT, HAVING y ORDER BY. Sin
embargo, no se pueden usar en la cláusula WHERE.
Las funciones de agregado omiten los valores NULL, excepto
cuando se usa COUNT(*).
Las funciones de agregado de una lista SELECT no tienen un
encabezado de columna, a menos que proporcione un alias
mediante AS.
Las funciones de agregado de una lista SELECT funcionan en todas
las filas que se pasan a la operación SELECT. Si no hay ninguna
cláusula GROUP BY, se resumirán todas las filas que cumplan
cualquier filtro de la cláusula WHERE. Obtendrá más información
sobre GROUP BY en la unidad siguiente.
A menos que use GROUP BY, no debe combinar funciones de
agregado con columnas no incluidas en las funciones de la misma
lista SELECT.
Para ampliar más allá de las funciones integradas, SQL Server proporciona un
mecanismo para las funciones de agregado definidas por el usuario a través de
Common Language Runtime (CLR) de .NET. Esta estrategia va más allá del
ámbito de este módulo.
Funciones de agregado integradas
Como se mencionó, Transact-SQL proporciona muchas funciones de agregado
integradas. Estas son algunas de las más comunes:
Nombre de la función
Sintaxis
Descripción
SUM
SUM(expression)
Suma todos los valores numéricos no NULL de una columna.
MEDIA
AVG(expression)
Promedia todos los valores numéricos no NULL de una columna (suma/recuento).
MÍN
MIN(expression)
Devuelve el número más pequeño, la fecha y hora más tempranas o la cadena que se
produce por primera vez (según las reglas de ordenación de intercalación).
MÁX
MAX(expression)
Devuelve el número más grande, la fecha y hora más recientes o la última cadena
(según las reglas de ordenación de intercalación).
COUNT o COUNT_BIG
COUNT(*) o COUNT(expresión)
Con (*), se cuentan todas las filas, incluidas las filas con valores NULL. Cuando se
especifica una columna como expresión, devuelve el recuento de filas que no son NULL
para esa columna. COUNT devuelve un valor int; COUNT_BIG devuelve un valor
big_int.
Para usar un agregado integrado en una cláusula SELECT, observe el ejemplo
siguiente en la base de datos de ejemplo MyStore:
SQLCopiar
SELECT AVG(ListPrice) AS AveragePrice,
MIN(ListPrice) AS MinimumPrice,
MAX(ListPrice) AS MaximumPrice
FROM [Link];
Los resultados de esta consulta son similares a los siguientes:
AveragePrice
MinimumPrice
MaximumPrice
744,5952
2,2900
3578,2700
Tenga en cuenta que en el ejemplo anterior se resumen todas las filas de la
tabla [Link]. Podríamos modificar fácilmente la consulta para
devolver los precios medios, mínimos y máximos de los productos de una
categoría específica mediante la adición de una cláusula WHERE, como la
siguiente:
SQLCopiar
SELECT AVG(ListPrice) AS AveragePrice,
MIN(ListPrice) AS MinimumPrice,
MAX(ListPrice) AS MaximumPrice
FROM [Link]
WHERE ProductCategoryID = 15;
Cuando se usan agregados en una cláusula SELECT, todas las columnas a las
que se hace referencia en la lista SELECT deben usarse como entradas para una
función de agregado o se debe hacer referencia a ella en una cláusula GROUP
BY.
Observe la siguiente consulta, que intenta incluir el
campo ProductCategoryID en los resultados agregados:
SQLCopiar
SELECT ProductCategoryID, AVG(ListPrice) AS AveragePrice,
MIN(ListPrice) AS MinimumPrice,
MAX(ListPrice) AS MaximumPrice
FROM [Link];
Esta consulta produce el siguiente error:
Mensaje 8120, Nivel 16, Estado 1, Línea 1
La columna "[Link]" de la lista de selección no es válida,
porque no está contenida en una función de agregado ni en la cláusula GROUP
BY.
La consulta trata todas las filas como un único grupo agregado. Por lo tanto,
todas las columnas deben usarse como entradas para agregar funciones.
En los ejemplos anteriores, agregamos datos numéricos como el precio y las
cantidades en el ejemplo anterior. Algunas de las funciones de agregado
también se pueden usar para resumir datos de fecha, hora y caracteres. En los
ejemplos siguientes se muestra el uso de agregados con fechas y caracteres:
Esta consulta devuelve la primera y la última empresa por nombre, mediante
MIN y MAX:
SQLCopiar
SELECT MIN(CompanyName) AS MinCustomer,
MAX(CompanyName) AS MaxCustomer
FROM [Link];
Esta consulta devolverá el primer y el último valor de CompanyName en la
secuencia de intercalación de la base de datos, que en este caso es alfabético:
MinCustomer
MaxCustomer
Una tienda de bicicletas
Yellow Bicycle Company
Otras funciones se pueden anidar con funciones de agregado.
Por ejemplo, la función escalar YEAR se usa en el ejemplo siguiente para
devolver solo la parte del año de la fecha de pedido, antes de que se evalúen
MIN y MAX:
SQLCopiar
SELECT MIN(YEAR(OrderDate)) AS Earliest,
MAX(YEAR(OrderDate)) AS Latest
FROM [Link];
Más antiguo
Más reciente
2008
2021
Las funciones MIN y MAX también se pueden usar con datos de fecha para
devolver los valores cronológicos más antiguos y más recientes. Sin embargo,
AVG y SUM solo se pueden usar para datos numéricos, lo que incluye tipos de
datos enteros, money, float y decimal.
Uso de DISTINCT con funciones de agregado
Debe tener en cuenta el uso de DISTINCT en una cláusula SELECT para quitar
filas duplicadas. Cuando se usa con una función de agregado, DISTINCT quita
los valores duplicados de la columna de entrada antes de calcular el valor de
resumen. DISTINCT es útil al resumir las apariciones únicas de valores, como los
clientes en la tabla de pedidos.
En el ejemplo siguiente se devuelve el número de clientes que han realizado
pedidos, independientemente del número de pedidos que han realizado:
SQLCopiar
SELECT COUNT(DISTINCT CustomerID) AS UniqueCustomers
FROM [Link];
COUNT(<una_columna>) simplemente cuenta cuántas filas tienen algún valor
en la columna. Si no hay valores NULL, COUNT(<una_columna>) será igual que
COUNT(*). COUNT (DISTINCT <una_columna>) cuenta cuántos valores
diferentes hay en la columna.
Uso de funciones de agregado con NULL
Es importante tener en cuenta la posible presencia de valores NULL en los datos
y cómo NULL interactúa con los componentes de consulta T-SQL, incluida la
función de agregado. Hay algunas consideraciones que se deben tener en
cuenta:
A excepción de COUNT que se usa con la opción (*), las funciones
de agregado de T-SQL omiten los valores NULL. Por ejemplo, una
función SUM solo agregará valores que no son NULL. Los valores
NULL no se evalúan como cero. COUNT(*) cuenta todas las filas,
independientemente del valor o no valor de cualquier columna.
La presencia de valores NULL en una columna puede dar lugar a
cálculos inexactos de AVG, que sumarán solo las filas rellenadas y
dividirán esa suma por el número de filas que no son NULL. Puede
haber una diferencia en los resultados entre AVG(<columna>) y
(SUM(<columna>)/COUNT(*)).
Observe, por ejemplo, la siguiente tabla llamada "t1":
C1
C2
NULL
10
20
4
30
40
50
Esta consulta muestra la diferencia entre cómo AVG controla NULL y cómo se
podría calcular un promedio con una columna calculada SUM/COUNT(*):
SQLCopiar
SELECT SUM(c2) AS sum_nonnulls,
COUNT(*) AS count_all_rows,
COUNT(c2) AS count_nonnulls,
AVG(c2) AS average,
(SUM(c2)/COUNT(*)) AS arith_average
FROM t1;
El resultado sería:
sum_nonnulls
count_all_rows
count_nonnulls
average
arith_average
150
30
25
En este conjunto de resultados, la columna denominada average es el
agregado que obtiene internamente la suma de 150 y divide por el recuento de
valores no NULL de la columna c2. El cálculo sería 150/5 o 30. La columna
denominada arith_average divide explícitamente la suma por el recuento de
todas las filas, por lo que el cálculo es 150/6 o 25.
Si necesita resumir todas las filas, sean NULL o no, plantéese reemplazar los
valores NULL por otro valor que la función de agregado no omitirá. Puede usar
la función COALESCE para este fin.
Siguiente unidad: Resumir datos con GROUP BY
Resumir datos con GROUP BY
Completado100 XP
3 minutos
Aunque las funciones de agregado son útiles para el análisis, recomendamos
organizar los datos en subconjuntos antes de resumirlos. En esta sección
aprenderá a hacerlo mediante la cláusula GROUP BY.
Uso de la cláusula GROUP BY
Como ha aprendido, cuando se procesa la instrucción SELECT, una vez que se
han evaluado la cláusula FROM y la cláusula WHERE, se crea una tabla virtual. El
contenido de la tabla virtual ahora está disponible para su posterior
procesamiento. Puede usar la cláusula GROUP BY para subdividir el contenido
de esta tabla virtual en grupos de filas.
Para agrupar filas, especifique uno o varios elementos en la cláusula GROUP BY:
SQLCopiar
GROUP BY <value1< [, <value2>, …]
GROUP BY crea grupos y coloca filas en cada grupo según lo determinado por
los elementos especificados en la cláusula.
Por ejemplo, la consulta siguiente dará como resultado un conjunto de filas
agrupadas, una fila por CustomerID en la tabla [Link]. Otra
manera de ver el proceso GROUP BY es que todas las filas con el mismo valor
para CustomerID se agruparán y se devolverán en una sola fila de resultado.
SQLCopiar
SELECT CustomerID
FROM [Link]
GROUP BY CustomerID;
La consulta anterior es equivalente a la consulta siguiente:
SQLCopiar
SELECT DISTINCT CustomerID
FROM [Link]
Una vez procesada la cláusula GROUP BY y que cada fila se haya asociado a un
grupo, las fases posteriores de la consulta deben agregar los elementos de las
filas de origen que se encuentran en la lista SELECT, pero que no aparecen en la
lista GROUP BY. Este requisito afectará a la forma de escribir las cláusulas
SELECT y HAVING.
Por lo tanto, ¿cuál es la diferencia entre escribir la consulta con GROUP BY o
DISTINCT? Si lo único que quiere saber son los distintos valores CustomerID,
no hay ninguna diferencia. Pero con GROUP BY, podemos agregar otros
elementos a la lista SELECT que, a continuación, se agregan para cada grupo.
La función de agregado más sencilla es COUNT(*). La consulta siguiente toma
las 830 filas de origen originales de CustomerID y las agrupa en 89 grupos, en
función de los valores CustomerID. Cada valor CustomerID distinto genera una
fila de salida en la consulta GROUP BY.
SQLCopiar
SELECT CustomerID, COUNT(*) AS OrderCount
FROM [Link]
GROUP BY CustomerID;
Para cada valor CustomerID, la consulta agrega y cuenta las filas, por lo que el
resultado nos muestra cuántas filas de la tabla SalesOrderHeader pertenecen a
cada cliente.
CustomerID
OrderCount
1234
1005
Tenga en cuenta que GROUP BY no garantiza el orden de los resultados. A
menudo, como resultado de la forma en que el procesador de consultas realiza
la operación de agrupación, los resultados se devuelven en el orden de los
valores de grupo. Sin embargo, no debe depender de este comportamiento. Si
necesita ordenar los resultados, debe incluir explícitamente una cláusula ORDER:
SQLCopiar
SELECT CustomerID, COUNT(*) AS OrderCount
FROM [Link]
GROUP BY CustomerID
ORDER BY CustomerID;
Esta vez, los resultados se devuelven en el orden especificado:
CustomerID
OrderCount
1005
1234
Las cláusulas de una instrucción SELECT se aplican en el orden siguiente:
1. FROM
2. WHERE
3. GROUP BY
4. HAVING
5. SELECT
6. ORDER BY
Los alias de columna se asignan en la cláusula SELECT, que se
produce después de la cláusula GROUP BY, pero antes de la cláusula ORDER BY.
Puede hacer referencia a un alias de columna en la cláusula ORDER BY, pero no
en la cláusula GROUP BY. La consulta siguiente producirá un error de nombre de
columna no válido:
SQLCopiar
SELECT CustomerID AS Customer,
COUNT(*) AS OrderCount
FROM [Link]
GROUP BY Customer
ORDER BY Customer;
Sin embargo, la consulta siguiente se realizará correctamente, agrupando y
ordenando los resultados por el identificador de cliente.
SQLCopiar
SELECT CustomerID AS Customer,
COUNT(*) AS OrderCount
FROM [Link]
GROUP BY CustomerID
ORDER BY Customer;
Solución de errores de GROUP BY
Un obstáculo común para sentirse cómodo con el uso de GROUP BY en
instrucciones SELECT es comprender por qué se produce el siguiente tipo de
mensaje de error:
Mensaje 8120, Nivel 16, Estado 1, Línea 2 La columna <nombre_columna> no es
válida en la lista de selección porque no está contenida en una función de
agregado ni en una cláusula GROUP BY.
Por ejemplo, se permite la consulta siguiente porque cada columna de la lista
SELECT es una columna de la cláusula GROUP BY o una función de agregado
que funciona en cada grupo:
SQLCopiar
SELECT CustomerID, COUNT(*) AS OrderCount
FROM [Link]
GROUP BY CustomerID;
La consulta siguiente devolverá un error porque PurchaseOrderNumber no
forma parte de GROUP BY y no se usa con una función de agregado.
SQLCopiar
SELECT CustomerID, PurchaseOrderNumber, COUNT(*) AS OrderCount
FROM [Link]
GROUP BY CustomerID;
Esta consulta devuelve el error:
Copiar
Msg 8120, Level 16, State 1, Line 1
Column '[Link]' is invalid in the select
list because it is not contained in either an aggregate function or the GROUP
BY clause.
Esta es otra manera de pensar en ello. Esta consulta devuelve una fila por cada
valor CustomerID. Pero las filas del mismo valor CustomerID pueden tener
valores PurchaseOrderNumber diferentes, por lo que ¿cuál de los valores es el
que se debe devolver?
Si desea ver los pedidos por identificador de cliente y por pedido de compra,
puede agregar la columna PurchaseOrderNumber a la cláusula GROUP BY,
como se muestra a continuación:
SQLCopiar
SELECT CustomerID, PurchaseOrderNumber, COUNT(*) AS OrderCount
FROM [Link]
GROUP BY CustomerID, PurchaseOrderNumber;
Esta consulta devolverá una fila por cada cliente y cada combinación de pedido
de compra, junto con el recuento de pedidos de esa combinación.
Siguiente unidad: Filtro de grupos con HAVING
Filtro de grupos con HAVING
Completado100 XP
3 minutos
Cuando haya creado grupos con una cláusula GROUP BY, puede filtrar aún más
los resultados. La cláusula HAVING actúa como filtro en los grupos. Esto es
similar a la forma en que la cláusula WHERE actúa como filtro en las filas
devueltas por la cláusula FROM.
Una cláusula HAVING permite crear una condición de búsqueda,
conceptualmente similar al predicado de una cláusula WHERE, que luego
prueba cada grupo devuelto por la cláusula GROUP BY.
En el ejemplo siguiente se cuentan los pedidos de cada cliente y se filtran los
resultados para incluir solo los clientes que han realizado más de 10 pedidos:
SQLCopiar
SELECT CustomerID,
COUNT(*) AS OrderCount
FROM [Link]
GROUP BY CustomerID
HAVING COUNT(*) > 10;
Comparación de HAVING con WHERE
Mientras que las cláusulas HAVING y WHERE filtran los datos, recuerde que
WHERE funciona en las filas devueltas por la cláusula FROM. Si la sección
GROUP BY ... HAVING existe en la consulta después de una cláusula WHERE, la
cláusula WHERE filtrará las filas antes de que se procese GROUP BY, lo que
podría limitar los grupos que se pueden crear.
Una cláusula HAVING se procesa después de GROUP BY y solo funciona en
grupos, no en filas de detalles. En resumen:
Una cláusula WHERE filtra las filas antes de formar grupos
Una cláusula HAVING filtra grupos completos y normalmente examina los
resultados de una agregación.
Siguiente unidad: Ejercicio: Uso de funciones
integradas
Ejercicio: Uso de funciones
integradas
Completado100 XP
30 minutos
Esta unidad incluye un laboratorio para completar.
Use los recursos gratuitos que se proporcionan en el laboratorio para completar
los ejercicios de esta unidad. No se le cobrará.
Microsoft ofrece esta experiencia de laboratorio y el contenido relacionado con
fines educativos. Toda la información presentada es propiedad de Microsoft y
está destinada únicamente a brindar información sobre los productos y servicios
abordados en este módulo de Microsoft Learn.
Iniciar laboratorio
Nota
Se proporciona una máquina virtual que contiene las herramientas cliente que
necesita, junto con las instrucciones del ejercicio. Use el botón anterior para
iniciar la máquina virtual. Hay un número limitado de sesiones simultáneas
disponibles; si el entorno hospedado no está disponible, inténtelo de nuevo
más adelante. Como alternativa, puede usar estas instrucciones de
configuración para crear su propio entorno de laboratorio y seguir
estas instrucciones del ejercicio.
Cuando termine el ejercicio, finalice el laboratorio para cerrar la máquina virtual.
No olvide volver y completar la prueba de conocimientos para ganar puntos por
completar este módulo.
Siguiente unidad: Comprobación de conocimiento
Introducción
Completado100 XP
2 minutos
En este módulo, se presentarán Visual Studio Code, Python y Jupyter Notebook.
Aprenderemos a instalar todo el software y los paquetes que necesitaremos
para empezar a escribir código y explorar distintos tipos de datos, en función de
la ruta de acceso de Learning en la que estemos trabajando.
Objetivos de aprendizaje
En este módulo, obtendrá información y probará software que ayuda a los
desarrolladores, especialmente en la exploración de datos. Durante el proceso,
aprenderá lo siguiente:
Qué es un lenguaje de programación
El procedimiento para instalar Visual Studio Code y las ventajas de
este editor de código
El procedimiento para instalar extensiones a fin de mejorar la
experiencia de Visual Studio Code
Instalación de Python y por qué es un lenguaje de programación
tan popular
El procedimiento para ejecutar una instancia básica de Jupyter
Notebook en Visual Studio Code
Requisitos previos
Un equipo con Windows, Mac o Linux
Conocimientos sobre cómo descargar programas de Internet
Siguiente unidad: Definición de un lenguaje de
programación
Continuar
Definición de un lenguaje de
programación
Completado100 XP
2 minutos
En la unidad anterior, hemos hablado de que aprender a programar es una gran
aptitud. Pero ¿qué es la codificación?
¿Qué es el código?
Las líneas de código son instrucciones que los humanos proporcionan a los
equipos para hacer cosas. Aunque pueda escuchar que los equipos son
inteligentes y asombrosos, por sí mismos solo son buenos en algo: en cumplir
instrucciones explícitas.
El código permite indicar a los vehículos lunares por dónde moverse y a los
cohetes cómo volar. Sin el código, los equipos no serían más que un montón de
metal. Pero con el código, los equipos pueden realizar acciones fuera del
alcance de los humanos.
¿Cómo se programa?
Para programar, o escribir instrucciones para los equipos, es necesario escribir
en un lenguaje que entiendan. Esta comunicación adopta la forma de lenguajes
de programación. El código que está escrito en estos lenguajes se traduce en
unos y ceros, lo que se denomina código binario, que los equipos pueden leer y
ejecutar como acciones. Hay muchos lenguajes de programación en todo el
mundo, y cada uno se especializa en algo diferente. En esta ruta de aprendizaje
nos centraremos en Python, un lenguaje que funciona bien para solucionar
problemas de datos de gran tamaño.
Nota
Las personas que programan reciben muchos nombres. Algunos nombres
implican distintas especialidades. Pero algunos de los nombres habituales que
puede encontrar son desarrollador, codificador y programador. En estos
módulos, verá que se denomina "desarrolladores" a quienes escriben código.
Ejecución y depuración de código
Una vez que un desarrollador ha escrito código, lo ejecuta. Al ejecutar el código,
se indica al equipo que lo lea y lleve a cabo las instrucciones. Cuando se le
indica al equipo que ejecute el código, realizará una de estas dos acciones:
ejecutarlo correctamente o indicar que se ha producido un error en algún lugar.
Los errores en el código se conocen como "errores" y su corrección se
denomina "depuración". La depuración es una parte importante de la
programación y una gran aptitud que se puede aplicar a otros muchos aspectos
de la vida.
Básicamente, la depuración consiste en seguir el método científico. Un
desarrollador:
Tendrá una hipótesis de lo que debería haber sucedido
Para recopilar información, examinará el código con una
herramienta denominada depurador, o bien lo leerá manualmente
Analizará en qué difiere la ejecución del comportamiento esperado
Modificará el código
Volverá a probarlo
Siguiente unidad: Capacidad de solucionar
problemas con Visual Studio Code
Capacidad de solucionar problemas
con Visual Studio Code
Completado100 XP
3 minutos
Ahora que ha visto una breve introducción al código, puede pasar a aprender
las herramientas que usan los desarrolladores para facilitar la codificación. En
concreto, en esta unidad, obtendrá información sobre los editores de código y
Visual Studio Code.
¿Qué es Visual Studio Code?
Visual Studio Code (a menudo conocido como VS Code) es un editor de código
gratuito, de código abierto y extensible. Esta descripción se puede desglosar
para entenderla mejor:
Editor de código: un editor de código se crea específicamente para
escribir, ejecutar y depurar código. Los editores de código se
pueden comparar con una aplicación como Microsoft Word, pero
incluyen funcionalidades adicionales, como autocompletar las
funciones de código y la capacidad de ejecutar código.
De código abierto: el software de código abierto (OSS) tiene su
código disponible para que cualquiera lo pueda explorar, modificar
y mejorar. La principal conclusión de esto es que cualquier usuario
puede crear una característica en software como Visual Studio Code
y contribuir al código fuente para que otros usuarios la puedan
utilizar. Puede encontrar el proyecto Visual Studio de código
abierto en GitHub.
Extensible: significa que algo se puede ampliar y expandir. En el
contexto de Visual Studio Code, ser extensible significa que puede
descargar extensiones, o incluso crearlas, para ajustar Visual Studio
Code de forma exacta a un estilo de trabajo. Piense en los mods de
un juego o las personalizaciones. Si la combinación de colores le
afecta a la vista o no se admite un lenguaje de programación
complejo, puede personalizar Visual Studio Code para agregar
colores nuevos o la compatibilidad con ese lenguaje. Puede
encontrar las extensiones de Visual Studio Code en marketplace o
descubrir cómo crear una extensión propia en la documentación de
Visual Studio Code.
Por qué Visual Studio Code es popular entre la
comunidad de desarrolladores
Se suele suponer que la popularidad de Visual Studio Code se debe a que es
gratuito. Es una razón importante, pero otros muchos editores también lo son.
Visual Studio Code es de código abierto y tiene una nutrida comunidad de
desarrolladores que trabajan para incorporar nuevas características.
Actualmente, en Visual Studio Code se admiten casi todos los lenguajes de
programación principales. Además, para cada lenguaje, marco o estilo de
trabajo, es probable que haya una extensión con el objetivo de que los
desarrolladores puedan tener una mejor experiencia. Muchos lo han elogiado
también por su facilidad de configuración y puesta en marcha en todas las
plataformas.
Siguiente unidad: Descripción de la importancia
de Python en la solución de problemas de
macrodatos
Descripción de la importancia de
Python en la solución de problemas
de macrodatos
Completado100 XP
2 minutos
Python es el lenguaje de programación que va a usar en esta ruta de
aprendizaje. Aunque pueda parecer que va a obtener información sobre un
único lenguaje de programación, los conceptos que se describen se pueden
aplicar a muchos otros.
Orígenes de Python
En 1991, Guido van Rossum creó Python y lo bautizó así por el programa de
televisión de los Monty Python. Python es un lenguaje de programación general
por lo que, desde el punto de vista del programador, el código se asemeja más
a un idioma natural (en inglés) y, por tanto, es más fácil de leer y escribir. Python
realiza el trabajo pesado en segundo plano y convierte instrucciones de
lenguaje relativamente naturales en comandos que un equipo puede ejecutar.
¿Por qué Python?
Es posible que se pregunte por qué de todos los lenguajes de programación
existentes se ha elegido Python. Durante los últimos 15 años, Python ha crecido
en popularidad y a menudo se considera un excelente lenguaje de
programación para principiantes. También es versátil y se puede aplicar a temas
informáticos avanzados, como la ciencia de datos y el aprendizaje automático.
Además, Python tiene muchos paquetes y bibliotecas de código escritos por
otros usuarios. Puede incluirlos en sus propios proyectos para disminuir el
código que debe escribir.
Ejemplos del mundo real de Python en
funcionamiento
Ejemplos de software que incluyen código de Python son YouTube, Dropbox y
Google. Incluso la NASA tiene una página de proyectos de código abierto,
muchos de ellos programados en Python.
Jupyter Notebook y Python
Se usará un tipo de archivo denominado Jupyter Notebook para ayudarle a
aprender Python. Jupyter Notebook admite Python en un estilo REPL (read-eval-
print loop), lo que significa que los usuarios pueden escribir unas cuantas líneas
de código en un archivo, ejecutarlas dentro del archivo y, después, escribir más
código y continuar la ejecución. Los cuadernos de Jupyter Notebook también
admiten la reejecución de "celdas", que son fragmentos de código. Este tipo de
entorno de codificación crea una gran experiencia para aprender un nuevo
lenguaje de programación. Pero no se preocupe, la instalación de la extensión
de Python para Visual Studio Code instala el cuaderno automáticamente.
Siguiente unidad: Ejercicio: Instalación y
configuración de Visual Studio Code para la
exploración de datos
Ejercicio: Instalación y configuración
de Visual Studio Code para la
exploración de datos
Completado100 XP
6 minutos
Aunque leer sobre estas tecnologías ha sido excelente, una manera mucho más
interesante de conocerlas es instalarlas y comenzar a usarlas. En esta unidad se
describe cómo instalar Visual Studio Code.
Si está realizando este módulo como parte de una ruta de aprendizaje,
probablemente tenga la oportunidad de escribir todo el código en una
experiencia de cuaderno integrada en el explorador desde el módulo de
Microsoft Learn mismo, con lo cual no tendrá que instalar estas herramientas de
desarrollador para completar el módulo. Sin embargo, configurar estas
herramientas es una buena forma de empezar su itinerario personal como
desarrollador, así que lo recomendamos igualmente.
Instalación de Visual Studio Code
Como se ha mencionado antes, Visual Studio Code es gratuito. Si usa un equipo
Windows, puede descargarlo en la página de aprendizaje de Visual Studio Code.
Descargue el paquete de codificación para Python, que también instalará
Python y las extensiones necesarias. Cuando el programa haya terminado de
descargarse, ejecute el archivo ejecutable para iniciar el proceso de instalación.
Nota
En la siguiente imagen aparece alguien usando Windows 11 con el explorador
Microsoft Edge. Si usa un dispositivo macOS o Linux, seleccione la versión
adecuada en la lista desplegable o seleccione (other downloads) ((otras
descargas)) para realizar la selección que mejor represente el sistema. En la
unidad 7 de este módulo explicaremos cómo instalar Python y todas las
extensiones necesarias.
Después de iniciar la instalación, se le pedirá que acepte el contrato de licencia
y rellene las preferencias de la aplicación. También se le preguntará dónde
instalar el programa. Lea y acepte el contrato de licencia y, luego,
seleccione Siguiente.
Nota
En Seleccionar tareas adicionales, asegúrese de seleccionar Agregar a PATH.
Por último, seleccione Instalar en la última ventana para finalizar la instalación.
Configuración de Visual Studio Code
Una vez que haya instalado Visual Studio Code, tiene la posibilidad de abrirlo
por sí solo. Si no puede ver el cuadro de diálogo de inicio, simplemente busque
la aplicación en el equipo e iníciela.
La primera vez que entre en Visual Studio Code, verá una ventana
de Introducción. Para empezar, cerremos esta ventana. En el lado izquierdo de
la pantalla verá que hay varios iconos que, al seleccionarlos, abren otras
características de Visual Studio Code. A continuación, se muestra una breve
descripción de algunas de las secciones que se van a usar.
Explorador: muestra los archivos que se han abierto y el contenido
de la carpeta, si se encuentra en una.
Buscar: permite buscar una palabra concreta o una colección de
palabras en el archivo.
Control de código fuente: ayuda a escribir o compartir código con
otros usuarios.
Ejecutar y depurar: Ejecuta y depura el código que escribe
Extensiones: muestra todas las adiciones realizadas por usuarios de
todo el mundo. Hay diferentes temas de color, lenguajes de
programación, etc. Puede instalar y personalizar Visual Studio Code
como prefiera
Siguiente unidad: (Opcional) Ejercicio: Ejecución
de Visual Studio Code en el explorador para la
exploración de datos
(Opcional) Ejercicio: Ejecución de
Visual Studio Code en el explorador
para la exploración de datos
Completado100 XP
5 minutos
Nota
Esta es una sección opcional que solo debe seguir si quiere usar Visual Studio
Code en el explorador mediante GitHub Codespaces, en lugar de descargarlo en
el equipo. En el resto del módulo se describen las instrucciones con una versión
descargada de Visual Studio Code.
Unirse a GitHub Codespaces le da la oportunidad de ejecutar Visual Studio
Code en el explorador. Con un explorador puede comenzar el recorrido de
codificación de Python sin tener que descargar ningún software.
Ventaja de GitHub Codespaces
Encontrará una guía de inicio rápido de Codespaces aquí.
Advertencia
GitHub Codespaces tiene una cuota mínima que se paga a través de la
suscripción de Azure. Para más información sobre la facturación de
Codespaces y el costo de usar una instancia básica, consulte Github
Codespaces.
Las ventajas de GitHub Codespaces incluyen las siguientes:
El entorno de desarrollo está vinculado a su cuenta de GitHub en
lugar de a un dispositivo físico.
Tiene una integración más estrecha con GitHub para sus proyectos.
Hay extensiones de Visual Studio Code disponibles para la
personalización.
Ausencia de conflictos entre proyectos y entornos de desarrollo
diferentes en el dispositivo físico.
Siguiente unidad: Ejercicio: Instalación de Python
para usarlo en Visual Studio Code para la
exploración de datos
Ejercicio: Instalación de Python para
usarlo en Visual Studio Code para la
exploración de datos
Completado100 XP
5 minutos
Ahora que instaló Visual Studio Code, tendrá que descargar Python para que el
equipo sepa cómo ejecutar e interpretar el código que escriba.
Nota
La mayoría de los equipos Mac y Linux incluyen Python preinstalado, pero es
posible que no esté actualizado. Además, si ha instalado el paquete de
codificación de Visual Studio Code para Python, puede ir a la unidad 9.
Para empezar, instale Python 3.10 (o versiones posteriores) de [Link].
Seleccione Descargar Python [Link] para empezar la instalación. Una vez que
descarga el archivo ejecutable, debe ejecutarlo para realizar la instalación. Estas
instrucciones son para un equipo Windows; si tiene Linux o Mac, use los
vínculos correspondientes del sistema operativo.
Cuando haya terminado, se lo dirigirá a una ventana de configuración en la que
deberá seguir los pasos de instalación siguientes:
1. Active la casilla para Agregar Python [Link] a PATH y, luego,
seleccione Instalar ahora.
2. Espere a que el programa termine de instalarse y, después,
seleccione Cerrar.
Python ya está instalado. En la unidad siguiente obtendrá información sobre
cómo ejecutar un programa de Python en Visual Studio Code.
Siguiente unidad: Ejercicio: Instalación de las
extensiones de Visual Studio Code necesarias para
la exploración de datos
Continuar
Ejercicio: Instalación de las
extensiones de Visual Studio Code
necesarias para la exploración de
datos
Completado100 XP
4 minutos
En esta unidad, obtendrá información sobre la pestaña Extensiones de
Visual Studio Code y cómo instalar la extensión Python e IntelliCode.
Nota
Si ha instalado el paquete de codificación de Visual Studio Code para
Python, ya se ha instalado la extensión de Python.
Instalación de la extensión de Python
Seleccione la pestaña de extensión de Visual Studio Code para acceder a todas
las herramientas de código abierto de Python que serán útiles en esta ruta de
aprendizaje. En la pestaña Extensión se ven tres bloques en forma de "L" y otro
bloque flotante en la derecha.
Si quiere, puede explorar el marketplace de extensiones e instalar las que le
gustaría tener, pero para este tutorial, se instalará la de Python.
1. Cuando esté en el marketplace de extensiones, vaya a la barra de
búsqueda y escriba "Python".
2. Busque la extensión denominada solo Python y publicada por
Microsoft; debe ser el primer resultado.
3. Seleccione la extensión y, luego, seleccione Instalar.
Después de instalar la extensión de Python, debe cerrar Visual Studio Code y
volver a abrirlo para asegurarse de que se reconoce.
La extensión de Python le permite crear archivos de Python y Jupyter Notebook
que pueden hacer lo siguiente:
Ayudarlo a escribir correctamente código con formato
Corregir errores tipográficos
Ejecutar el código que escribe
Instalación de la extensión IntelliCode
Mientras todavía está en la pestaña de extensiones, vuelva a la barra de
búsqueda y escriba "intellicode". A continuación, selecciónelo en la lista (debería
ser el primer resultado). Seleccione Instalar.
IntelliCode recomienda código cuando se escriben programas. Es una
herramienta ideal para principiantes que quizás no sepa cuál es la sintaxis
exacta.
Siguiente unidad: Ejercicio: Creación de un
archivo de Jupyter Notebook en Visual Studio
Code y ejecución de un programa sencillo
Continuar
Ejercicio: Creación de un archivo de
Jupyter Notebook en Visual Studio
Code y ejecución de un programa
sencillo
Completado100 XP
7 minutos
Ahora que ha instalado todo lo que necesita, puede crear un archivo de Jupyter
Notebook y comenzar la codificación.
Creación de un archivo Jupyter Notebook
Para empezar, cree una carpeta para organizar fácilmente todos los archivos de
Jupyter que va a crear. Elija una ubicación de fácil acceso en el equipo, como la
carpeta de documentos o el escritorio, y cree una carpeta con un nombre
similar a Jupyter files o Python.
Cree un archivo de Jupyter Notebook que ejecutará el código de Python:
1. Abra Visual Studio Code.
2. Seleccione Archivo>Nuevo archivo (o presione Ctrl-N). Se abre un
archivo en blanco.
3. Guárdelo como archivo de Jupyter:
1. Seleccione Archivo>Guardar (o escriba Ctrl-S).
2. Asigne al archivo el nombre que prefiera.
3. Seleccione la ubicación Guardar como en la carpeta que
acaba de crear.
4. Cambie el tipo de archivo a "Jupyter" en el menú
desplegable. También puede agregar la extensión de
archivo .ipynb, que cambia el tipo de archivo a "Jupyter"
de manera automática.
Sabrá que ha funcionado si ve el nombre de archivo seguido de ".ipynb" en la
parte superior izquierda de la pantalla y el archivo muestra celdas en lugar de la
vista sólida del editor cuando se abre en Visual Studio Code.
Nota
Si el archivo no muestra celdas, pero sigue mostrando la vista sólida del editor
en su lugar, intente cerrar VS Code y seleccione Abrir con código para abrir el
archivo .ipynb. A continuación, si el código indica que el archivo está en "modo
restringido", active la casilla Modo restringido que se encuentra en la esquina
inferior izquierda y, luego, seleccione Confiar.
Configuración del entorno de Python
Cuando tiene un archivo de Jupyter Notebook, debe elegir el entorno de Python
que va a usar. Es posible que Visual Studio Code haya reconocido a Python una
vez que lo instala. Pero si no es así, elija Select Kernel (Seleccionar kernel) en la
esquina superior derecha de la pantalla y, después, seleccione el entorno de
Python.
Ahora en VS Code se muestra la versión de Python seleccionada.
A continuación, tendrá que agregar cuadernos de Jupyter Notebook a la ruta de
acceso.
1. Escriba "2+2" en la primera línea del editor.
2. Seleccione el botón de reproducción situado a la izquierda de la
celda. Aparece una ventana en la que se le pide que instale
cuadernos de Jupyter Notebook.
3. Seleccione Instalar para iniciar la instalación. La instalación puede
tardar hasta cinco minutos, por lo que es posible que tenga que
esperar.
Ahora se debería instalar Jupyter Notebook en el equipo. Antes de continuar,
asegúrese de que el kernel de Jupyter Notebook también se ejecuta con la
versión correcta de Python. Puede ver la versión en la esquina superior derecha
de Visual Studio Code. Asegúrese de que, al volver a seleccionar el botón de
reproducción, el programa imprime "4".
Información sobre Jupyter Notebook
En Jupyter Notebook para Visual Studio Code se incluye documentación de
calidad sobre cómo usar el entorno. En los cuadernos de Jupyter Notebook, el
código se escribe en celdas.
Seleccione un botón Más en la parte superior del archivo para crear
una celda debajo de la actual. Puede crear una celda de Código o
una de Markdown.
Seleccione la papelera que hay encima de una celda para eliminarla.
Arrastre la celda desde el lado izquierdo para subir o bajar la celda
respecto de las celdas que la rodean.
Use el botón de reproducción a la izquierda de cada celda para
ejecutarla.
Después de ejecutar una celda, aparecerá un número entre corchetes. Con este
número podrá hacer un seguimiento de las células que ejecuta. Esto es
importante porque, como recordará, puede volver a ejecutar las celdas de un
cuaderno de Jupyter Notebook, lo que podría cambiar las variables o el estado
del programa.
Si observa la parte superior del archivo, verá que puede seleccionar Ejecutar
todo para ejecutar todas las celdas del cuaderno a la vez. Por último, puede
seleccionar el botón Interrumpir de color rojo para forzar la detención del
programa en cualquier momento.
Escritura y ejecución de un programa sencillo
Ahora probará la configuración mediante la escritura de un sencillo programa
"Hola mundo". En la primera celda, escriba el código siguiente y, después,
seleccione el botón de reproducción.
PythonCopiar
"Hello World"
Debajo de la celda que ejecutó, debería haber una salida en la que se
muestra Hola mundo.
Enhorabuena. Acaba de programar un equipo para que genere texto. Siguiente
paso: piratear el sistema central, o quizás mejor comenzar por obtener más
información sobre los aspectos fundamentales de Python.
Siguiente unidad: Prueba de conocimientos
Exploración de datos con NumPy y
Pandas
Completado100 XP
3 minutos
Los científicos de datos pueden usar diversas herramientas y técnicas para
explorar, visualizar y manipular datos. Una de las formas más comunes en las
que los científicos de datos trabajan con los datos es mediante el lenguaje de
programación Python y algunos paquetes específicos para el procesamiento de
datos.
Qué es NumPy
NumPy es una biblioteca de Python que ofrece una funcionalidad comparable a
la de herramientas matemáticas como MATLAB y R. Aunque NumPy simplifica
considerablemente la experiencia del usuario, también ofrece funciones
matemáticas completas.
Qué es Pandas
Pandas es una biblioteca de Python muy conocida para el análisis y la
manipulación de datos. Pandas es como el Excel de Python: proporciona una
funcionalidad fácil de usar para las tablas de datos.
Exploración de datos en un cuaderno de Jupyter
Notebook
Los cuadernos de Jupyter Notebooks son una forma conocida de ejecutar
scripts básicos mediante el explorador web. Normalmente, estos cuadernos son
una sola página web, dividida en secciones de texto y secciones de código que
se ejecutan en el servidor en lugar de en la máquina local. Esto significa que
puede empezar a trabajar rápidamente sin necesidad de instalar Python u otras
herramientas.
Prueba de hipótesis
La exploración y el análisis de datos suele ser un proceso iterativo en el que el
científico de datos toma una muestra de los datos y realiza las siguientes tareas
para analizarlos y probar una hipótesis:
Limpiar los datos para controlar errores, valores que faltan y otros
problemas.
Aplicar técnicas estadísticas para comprender mejor los datos y
cómo se puede esperar que la muestra represente la población de
datos del mundo real, teniendo en cuenta la variación aleatoria.
Visualizar los datos para determinar las relaciones entre variables
y, en el caso de un proyecto de aprendizaje automático, identificar
las características que potencialmente se pueden predecir de
la etiqueta.
Revisión de hipótesis y repetición del proceso.
Siguiente unidad: Ejercicio: Exploración de datos
con NumPy y Pandas
Continuar
Ejercicio: Exploración de datos con
NumPy y Pandas
Completado100 XP
10 minutos
Este módulo requiere un espacio aislado para completarse. Usó 4 de 10
espacios aislados por hoy. Mañana habrá disponibles más espacios aislados.
Activar espacio aislado
Las sugerencias de enlaces de teclado de la barra de herramientas están ahora ocultas
RuntimeArchivoEditarVista
Ejecutar todo
Kernel
Proceso no conectado
Exploring Data with Python
A significant part of a a data scientist's role is to explore, analyze, and visualize
data. There are many tools and programming languages that they can use to do
this. One of the most popular approaches is to use Jupyter notebooks (like this
one) and Python.
Python is a flexible programming language that is used in a wide range of
scenarios—from web applications to device programming. It's extremely
popular in the data science and machine learning community because of the
many packages it supports for data analysis and visualization.
In this notebook, we'll explore some of these packages and apply basic
techniques to analyze data. This is not intended to be a comprehensive Python
programming exercise or even a deep dive into data analysis. Rather, it's
intended as a crash course in some of the common ways in which data scientists
can use Python to work with data.
Note: If you've never used the Jupyter Notebooks environment before, there
are a few things you should be aware of:
Notebooks are made up of cells. Some cells (like this one)
contain markdown text, while others (like the one beneath this one)
contain code.
You can run each code cell by using the ► Run button. The ► Run button
will show up when you hover over the cell.
The output from each code cell will be displayed immediately below the
cell.
Even though the code cells can be run individually, some variables used in
the code are global to the notebook. That means that you should run all
of the code cells in order. There may be dependencies between code
cells, so if you skip a cell, subsequent cells might not run correctly.
Exploring data arrays with NumPy
Let's start by looking at some simple data.
Suppose a college professor takes a sample of student grades from a class to
analyze.
Run the code in the cell below by clicking the ► Run button to see the data.
CódigoMarkdown
[ ]
data = [50,50,47,97,49,3,53,42,26,74,82,62,37,15,70,27,36,35,48,52,63,64]
print(data)
Presione Mayús + Entrar para ejecutar
The data has been loaded into a Python list structure, which is a good data type
for general data manipulation, but it's not optimized for numeric analysis. For
that, we're going to use the NumPy package, which includes specific data types
and functions for working with Numbers in Python.
Run the cell below to load the data into a NumPy array.
[ ]
import numpy as np
grades = [Link](data)
print(grades)
Presione Mayús + Entrar para ejecutar
Just in case you're wondering about the differences between a list and a
NumPy array, let's compare how these data types behave when we use them in
an expression that multiplies them by 2.
[ ]
print (type(data),'x 2:', data * 2)
print('---')
print (type(grades),'x 2:', grades * 2)
Presione Mayús + Entrar para ejecutar
Note that multiplying a list by 2 creates a new list of twice the length with the
original sequence of list elements repeated. Multiplying a NumPy array on the
other hand performs an element-wise calculation in which the array behaves like
a vector, so we end up with an array of the same size in which each element has
been multiplied by 2.
The key takeaway from this is that NumPy arrays are specifically designed to
support mathematical operations on numeric data—which makes them more
useful for data analysis than a generic list.
You might have spotted that the class type for the NumPy array above is
a [Link]. The nd indicates that this is a structure that can consist of
multiple dimensions. (It can have n dimensions.) Our specific instance has a
single dimension of student grades.
Run the cell below to view the shape of the array.
[ ]
[Link]
Presione Mayús + Entrar para ejecutar
The shape confirms that this array has only one dimension, which contains 22
elements. (There are 22 grades in the original list.) You can access the individual
elements in the array by their zero-based ordinal position. Let's get the first
element (the one in position 0).
[ ]
grades[0]
Presione Mayús + Entrar para ejecutar
Now that you know your way around a NumPy array, it's time to perform some
analysis of the grades data.
You can apply aggregations across the elements in the array, so let's find the
simple average grade (in other words, the mean grade value).
[ ]
[Link]()
Presione Mayús + Entrar para ejecutar
So the mean grade is just around 50—more or less in the middle of the possible
range from 0 to 100.
Let's add a second set of data for the same students. This time, we'll record the
typical number of hours per week they devoted to studying.
[ ]
# Define an array of study hours
study_hours = [10.0,11.5,9.0,16.0,9.25,1.0,11.5,9.0,8.5,14.5,15.5,
13.75,9.0,8.0,15.5,8.0,9.0,6.0,10.0,12.0,12.5,12.0]
# Create a 2D array (an array of arrays)
student_data = [Link]([study_hours, grades])
# display the array
student_data
Presione Mayús + Entrar para ejecutar
Now the data consists of a 2-dimensional array—an array of arrays. Let's look at
its shape.
[ ]
# Show shape of 2D array
student_data.shape
Presione Mayús + Entrar para ejecutar
The student_data array contains two elements, each of which is an array
containing 22 elements.
To navigate this structure, you need to specify the position of each element in
the hierarchy. So to find the first value in the first array (which contains the
study hours data), you can use the following code.
[ ]
# Show the first element of the first element
student_data[0][0]
Presione Mayús + Entrar para ejecutar
Now you have a multidimensional array containing both the student's study
time and grade information, which you can use to compare study time to a
student's grade.
[ ]
# Get the mean value of each sub-array
avg_study = student_data[0].mean()
avg_grade = student_data[1].mean()
print('Average study hours: {:.2f}\nAverage grade: {:.2f}'.format(avg_study,
avg_grade))
Presione Mayús + Entrar para ejecutar
Exploring tabular data with Pandas
NumPy provides a lot of the functionality and tools you need to work with
numbers, such as arrays of numeric values. However, when you start to deal with
two-dimensional tables of data, the Pandas package offers a more convenient
structure to work with: the DataFrame.
Run the following cell to import the Pandas library and create a DataFrame with
three columns. The first column is a list of student names, and the second and
third columns are the NumPy arrays containing the study time and grade data.
[ ]
import pandas as pd
df_students = [Link]({'Name': ['Dan', 'Joann', 'Pedro', 'Rosie', 'Etha
n', 'Vicky', 'Frederic', 'Jimmie',
'Rhonda', 'Giovanni', 'Francesca', 'Raja
b', 'Naiyana', 'Kian', 'Jenny',
'Jakeem','Helena','Ismat','Anila','Skye'
,'Daniel','Aisha'],
'StudyHours':student_data[0],
'Grade':student_data[1]})
df_students
Presione Mayús + Entrar para ejecutar
Note that in addition to the columns you specified, the DataFrame includes
an index to uniquely identify each row. We could have specified the index
explicitly and assigned any kind of appropriate value (for example, an email
address). However, because we didn't specify an index, one has been created
with a unique integer value for each row.
Finding and filtering data in a DataFrame
You can use the DataFrame's loc method to retrieve data for a specific index
value, like this.
[ ]
# Get the data for index value 5
df_students.loc[5]
Presione Mayús + Entrar para ejecutar
You can also get the data at a range of index values, like this:
[ ]
# Get the rows with index values from 0 to 5
df_students.loc[0:5]
Presione Mayús + Entrar para ejecutar
In addition to being able to use the loc method to find rows based on the index,
you can use the iloc method to find rows based on their ordinal position in the
DataFrame (regardless of the index):
[ ]
# Get data in the first five rows
df_students.iloc[0:5]
Presione Mayús + Entrar para ejecutar
Look carefully at the iloc[0:5] results, and compare them to
the loc[0:5] results you obtained previously. Can you spot the difference?
The loc method returned rows with index label in the list of values from 0 to 5,
which includes 0, 1, 2, 3, 4, and 5 (six rows). However, the iloc method returns
the rows in the positions included in the range 0 to 5. Since integer ranges don't
include the upper-bound value, this includes positions 0, 1, 2, 3, and 4 (five
rows).
iloc identifies data values in a DataFrame by position, which extends beyond
rows to columns. So, for example, you can use it to find the values for the
columns in positions 1 and 2 in row 0, like this:
[ ]
df_students.iloc[0,[1,2]]
Presione Mayús + Entrar para ejecutar
Let's return to the loc method, and see how it works with columns. Remember
that loc is used to locate data items based on index values rather than positions.
In the absence of an explicit index column, the rows in our DataFrame are
indexed as integer values, but the columns are identified by name:
[ ]
df_students.loc[0,'Grade']
Presione Mayús + Entrar para ejecutar
Here's another useful trick. You can use the loc method to find indexed rows
based on a filtering expression that references named columns other than the
index, like this:
[ ]
df_students.loc[df_students['Name']=='Aisha']
Presione Mayús + Entrar para ejecutar
Actually, you don't need to explicitly use the loc method to do this. You can
simply apply a DataFrame filtering expression, like this:
[ ]
df_students[df_students['Name']=='Aisha']
Presione Mayús + Entrar para ejecutar
And for good measure, you can achieve the same results by using the
DataFrame's query method, like this:
[ ]
df_students.query('Name=="Aisha"')
Presione Mayús + Entrar para ejecutar
The three previous examples underline a confusing truth about working with
Pandas. Often, there are multiple ways to achieve the same results. Another
example of this is the way you refer to a DataFrame column name. You can
specify the column name as a named index value (as in
the df_students['Name'] examples we've seen so far), or you can use the
column as a property of the DataFrame, like this:
[ ]
df_students[df_students.Name == 'Aisha']
Presione Mayús + Entrar para ejecutar
Loading a DataFrame from a file
We constructed the DataFrame from some existing arrays. However, in many
real-world scenarios, data is loaded from sources such as files. Let's replace the
student grades DataFrame with the contents of a text file.
[ ]
!wget [Link]
to-machine-learning/main/Data/ml-basics/[Link]
df_students = pd.read_csv('[Link]',delimiter=',',header='infer')
df_students.head()
Presione Mayús + Entrar para ejecutar
The DataFrame's read_csv method is used to load data from text files. As you
can see in the example code, you can specify options such as the column
delimiter and which row (if any) contains column headers. (In this case, the
delimiter is a comma and the first row contains the column names. These are
the default settings, so the parameters could have been omitted.)
Handling missing values
One of the most common issues data scientists need to deal with is incomplete
or missing data. So how would we know that the DataFrame contains missing
values? You can use the isnull method to identify which individual values are
null, like this:
[ ]
df_students.isnull()
Presione Mayús + Entrar para ejecutar
Of course, with a larger DataFrame, it would be inefficient to review all of the
rows and columns individually, so we can get the sum of missing values for each
column like this:
[ ]
df_students.isnull().sum()
Presione Mayús + Entrar para ejecutar
So now we know that there's one missing StudyHours value and two
missing Grade values.
To see them in context, we can filter the DataFrame to include only rows where
any of the columns (axis 1 of the DataFrame) are null.
[ ]
df_students[df_students.isnull().any(axis=1)]
Presione Mayús + Entrar para ejecutar
When the DataFrame is retrieved, the missing numeric values show up
as NaN (not a number).
So now that we've found the null values, what can we do about them?
One common approach is to impute replacement values. For example, if the
number of study hours is missing, we could just assume that the student studied
for an average amount of time and replace the missing value with the mean
study hours. To do this, we can use the fillna method like this:
[ ]
df_students.StudyHours = df_students.[Link](df_students.StudyHo
[Link]())
df_students
Presione Mayús + Entrar para ejecutar
Alternatively, it might be important to ensure that you only use data you know
to be absolutely correct. In this case, you can drop rows or columns that contain
null values by using the dropna method. For example, we'll remove rows (axis 0
of the DataFrame) where any of the columns contain null values:
[ ]
df_students = df_students.dropna(axis=0, how='any')
df_students
Presione Mayús + Entrar para ejecutar
Explore data in the DataFrame
Now that we've cleaned up the missing values, we're ready to explore the data
in the DataFrame. Let's start by comparing the mean study hours and grades.
[ ]
# Get the mean study hours using to column name as an index
mean_study = df_students['StudyHours'].mean()
# Get the mean grade using the column name as a property (just to make the po
int!)
mean_grade = df_students.[Link]()
# Print the mean study hours and mean grade
print('Average weekly study hours: {:.2f}\nAverage grade: {:.2f
}'.format(mean_study, mean_grade))
Presione Mayús + Entrar para ejecutar
OK, let's filter the DataFrame to find only the students who studied for more
than the average amount of time.
[ ]
# Get students who studied for the mean or more hours
df_students[df_students.StudyHours > mean_study]
Presione Mayús + Entrar para ejecutar
Note that the filtered result is itself a DataFrame, so you can work with its
columns just like any other DataFrame.
For example, let's find the average grade for students who undertook more than
the average amount of study time.
[ ]
# What was their mean grade?
df_students[df_students.StudyHours > mean_study].[Link]()
Presione Mayús + Entrar para ejecutar
Let's assume that the passing grade for the course is 60.
We can use that information to add a new column to the DataFrame that
indicates whether or not each student passed.
First, we'll create a Pandas Series containing the pass/fail indicator (True or
False), and then we'll concatenate that series as a new column (axis 1) in the
DataFrame.
[ ]
passes = [Link](df_students['Grade'] >= 60)
df_students = [Link]([df_students, [Link]("Pass")], axis=1)
df_students
Presione Mayús + Entrar para ejecutar
DataFrames are designed for tabular data, and you can use them to perform
many of the same kinds of data analytics operations you can do in a relational
database, such as grouping and aggregating tables of data.
For example, you can use the groupby method to group the student data into
groups based on the Pass column you added previously and to count the
number of names in each group. In other words, you can determine how many
students passed and failed.
[ ]
print(df_students.groupby(df_students.Pass).[Link]())
Presione Mayús + Entrar para ejecutar
You can aggregate multiple fields in a group using any available aggregation
function. For example, you can find the mean study time and grade for the
groups of students who passed and failed the course.
[ ]
print(df_students.groupby(df_students.Pass)['StudyHours', 'Grade'].mean())
Presione Mayús + Entrar para ejecutar
DataFrames are amazingly versatile and make it easy to manipulate data. Many
DataFrame operations return a new copy of the DataFrame. So if you want to
modify a DataFrame but keep the existing variable, you need to assign the result
of the operation to the existing variable. For example, the following code sorts
the student data into descending order by Grade and assigns the resulting
sorted DataFrame to the original df_students variable.
[ ]
# Create a DataFrame with the data sorted by Grade (descending)
df_students = df_students.sort_values('Grade', ascending=False)
# Show the DataFrame
df_students
Presione Mayús + Entrar para ejecutar
Summary
NumPy and DataFrames are the workhorses of data science in Python. They
provide us ways to load, explore, and analyze tabular data. As we will see in
subsequent modules, even advanced analysis methods typically rely on NumPy
and Pandas for these important roles.
In our next workbook, we'll take a look at how create graphs and explore your
data in more interesting ways.
Sin proceso
Proceso no conectado
Visualización
Kernel no conectado
Siguiente unidad: Visualización de datos
Visualización de datos
Completado100 XP
3 minutos
Los científicos de datos visualizan los datos para comprenderlos mejor. Esto
puede significar examinar los datos sin procesar, las medidas de resumen, como
las medias, o trazar los datos. Los gráficos son un poderoso medio de
visualización de datos, ya que podemos discernir rápidamente patrones
medianamente complejos sin necesidad de definir medidas matemáticas de
resumen.
Representación visual de los datos
Representar los datos visualmente normalmente significa representarlos en
gráficos. Esto se hace para proporcionar una evaluación cualitativa rápida de
nuestros datos, que puede ser útil para entender los resultados, encontrar
valores atípicos, comprender cómo se distribuyen los números, etc.
Aunque a veces sabemos de antemano qué tipo de gráfico será más útil, otras
veces utilizamos los gráficos de forma exploratoria. Para entender el poder de la
visualización de datos, considere los datos siguientes: la ubicación (x,y) de un
coche que se conduce automáticamente. En su forma sin procesar, es difícil ver
patrones reales. La media o promedio, nos dice que su trayectoria giró en torno
a x=0,2 e y=0,3, y el intervalo de números parece estar entre -2 y 2
aproximadamente.
Time Ubicación X Ubicación Y
0 0 2
1 1,682942 1,080605
2 1,818595 -0,83229
3 0,28224 -1,97998
4 -1,5136 -1,30729
5 -1,91785 0,567324
6 -0,55883 1,920341
7 1,313973 1,507805
12 0,00001 0,00001
13 0,840334 1,814894
14 1,981215 0,273474
15 1,300576 -1,51938
16 -0,57581 -1,91532
17 -1,92279 -0,55033
18 -1,50197 1,320633
19 0,299754 1,977409
20 1,825891 0,816164
Si ahora trazamos la ubicación X a lo largo del tiempo, podemos ver que parece
que tenemos algunos valores perdidos entre los tiempos 7 y 12.
Si trazamos X frente a Y, terminamos con un mapa de por dónde se ha movido
el coche. Es inmediatamente obvio que el coche ha estado conduciendo en
círculo, pero en algún momento condujo hacia el centro de ese círculo.
Los gráficos no se limitan a los diagramas de dispersión en 2D como los
anteriores, sino que pueden utilizarse para explorar otros tipos de datos, como
las proporciones (que se muestran a través de gráficos circulares, gráficos de
barras apilados), cómo se distribuyen los datos (con histogramas, diagramas de
cajas) y cómo difieren dos conjuntos de datos. A menudo, cuando intentamos
comprender datos o resultados sin procesar, podemos experimentar con
diferentes tipos de gráficos hasta dar con uno que explique los datos de forma
visualmente intuitiva.
Exploring data with Python - visualize data
In this notebook, we'll apply a few techniques to analyze data with basic
statistics and visualize it using graphs.
Loading our data
Before we begin, let's load the same data about study hours that we analyzed in
the previous notebook. We'll also recalculate who passed the class in the same
way as last time.
Run the code in the cell below by clicking the ► Run button to see the data.
CódigoMarkdown
[ ]
import pandas as pd
# Load data from a text file
!wget [Link]
to-machine-learning/main/Data/ml-basics/[Link]
df_students = pd.read_csv('[Link]',delimiter=',',header='infer')
# Remove any rows with missing data
df_students = df_students.dropna(axis=0, how='any')
# Calculate who passed, assuming '60' is the grade needed to pass
passes = [Link](df_students['Grade'] >= 60)
# Save who passed to the Pandas dataframe
df_students = [Link]([df_students, [Link]("Pass")], axis=1)
# Print the result out into this notebook
df_students
Presione Mayús + Entrar para ejecutar
Visualizing data with Matplotlib
DataFrames provide a great way to explore and analyze tabular data, but
sometimes a picture is worth a thousand rows and columns.
The Matplotlib library provides the foundation for plotting data visualizations
that can greatly enhance your ability to analyze the data.
Let's start with a simple bar chart that shows the grade of each student.
Note: This first graph may take 1 to 2 minutes to render. Subsequent graphs will
render more quickly.
[ ]
# Ensure plots are displayed inline in the notebook
%matplotlib inline
from matplotlib import pyplot as plt
# Create a bar plot of name vs grade
[Link](x=df_students.Name, height=df_students.Grade)
# Display the plot
[Link]()
Presione Mayús + Entrar para ejecutar
Well, that worked, but the chart could use some improvements to make it
clearer what we're looking at.
Note that you used the pyplot class from Matplotlib to plot the chart. This class
provides many ways to improve the visual elements of the plot. For example, the
following code:
Specifies the color of the bar chart.
Adds a title to the chart (so we know what it represents)
Adds labels to the X and Y axes (so we know which axis shows which data)
Adds a grid (to make it easier to determine the values for the bars)
Rotates the X markers (so we can read them)
[ ]
# Create a bar plot of name vs grade
[Link](x=df_students.Name, height=df_students.Grade, color='orange')
# Customize the chart
[Link]('Student Grades')
[Link]('Student')
[Link]('Grade')
[Link](color='#95a5a6', linestyle='--', linewidth=2, axis='y', alpha=0.
7)
[Link](rotation=90)
# Display the plot
[Link]()
Presione Mayús + Entrar para ejecutar
A plot is technically contained within a Figure. In the previous examples, the
figure was created implicitly for you, but you can create it explicitly. For
example, the following code creates a figure with a specific size.
[ ]
# Create a Figure
fig = [Link](figsize=(8,3))
# Create a bar plot of name vs grade
[Link](x=df_students.Name, height=df_students.Grade, color='orange')
# Customize the chart
[Link]('Student Grades')
[Link]('Student')
[Link]('Grade')
[Link](color='#95a5a6', linestyle='--', linewidth=2, axis='y', alpha=0.
7)
[Link](rotation=90)
# Show the figure
[Link]()
Presione Mayús + Entrar para ejecutar
A figure can contain multiple subplots, each on its own axis.
For example, the following code creates a figure with two subplots: one is a bar
chart showing student grades, and the other is a pie chart comparing the
number of passing grades to non-passing grades.
[ ]
# Create a figure for 2 subplots (1 row, 2 columns)
fig, ax = [Link](1, 2, figsize = (10,4))
# Create a bar plot of name vs grade on the first axis
ax[0].bar(x=df_students.Name, height=df_students.Grade, color='orange')
ax[0].set_title('Grades')
ax[0].set_xticklabels(df_students.Name, rotation=90)
# Create a pie chart of pass counts on the second axis
pass_counts = df_students['Pass'].value_counts()
ax[1].pie(pass_counts, labels=pass_counts)
ax[1].set_title('Passing Grades')
ax[1].legend(pass_counts.keys().tolist())
# Add a title to the Figure
[Link]('Student Data')
# Show the figure
[Link]()
Presione Mayús + Entrar para ejecutar
Until now, you've used methods of the [Link] object to plot
charts. However, Matplotlib is so foundational to graphics in Python that many
packages, including Pandas, provide methods that abstract the underlying
Matplotlib functions and simplify plotting. For example, the DataFrame provides
its own methods for plotting data as shown in the following example, which
plots a bar chart of study hours.
[ ]
df_students.[Link](x='Name', y='StudyHours', color='teal', figsize=(6,4)
)
Presione Mayús + Entrar para ejecutar
Getting started with statistical analysis
Now that you know how to use Python to manipulate and visualize data, you
can start analyzing it.
A lot of data science is rooted in statistics, so we'll explore some basic statistical
techniques.
Note: This section is not intended to teach you statistics—that's much too big a
topic for this notebook. It will however introduce you to some statistical
concepts and techniques that data scientists use as they explore data in
preparation for machine learning modeling.
Descriptive statistics and data distribution
When examining a variable (for example, a sample of student grades), data
scientists are particularly interested in its distribution (in other words, how are all
the different grade values spread across the sample). The starting point for this
exploration is often to visualize the data as a histogram and see how frequently
each value for the variable occurs.
[ ]
# Get the variable to examine
var_data = df_students['Grade']
# Create a Figure
fig = [Link](figsize=(10,4))
# Plot a histogram
[Link](var_data)
# Add titles and labels
[Link]('Data Distribution')
[Link]('Value')
[Link]('Frequency')
# Show the figure
[Link]()
Presione Mayús + Entrar para ejecutar
The histogram for grades is a symmetric shape, where the most frequently
occurring grades tend to be in the middle of the range (around 50), with fewer
grades at the extreme ends of the scale.
Measures of central tendency
To understand the distribution better, we can examine so-called measures of
central tendency, which is a fancy way of describing statistics that represent the
"middle" of the data. The goal of this analysis is to try to find a "typical" value.
Common ways to define the middle of the data include:
The mean: A simple average based on adding together all of the values in the
sample set and then dividing the total by the number of samples.
The median: The value in the middle of the range of all of the sample values.
The mode: The most commonly occurring value in the sample set*.
Let's calculate these values, along with the minimum and maximum values for
comparison, and show them on the histogram.
*Of course, in some sample sets, there may be a tie for the most common value.
In those cases, the dataset is described as bimodal or even multimodal.
[ ]
# Get the variable to examine
var = df_students['Grade']
# Get statistics
min_val = [Link]()
max_val = [Link]()
mean_val = [Link]()
med_val = [Link]()
mod_val = [Link]()[0]
print('Minimum:{:.2f}\nMean:{:.2f}\nMedian:{:.2f}\nMode:{:.2f}\nMaximum:
{:.2f}\n'.format(min_val,
mean_val,
med_val,
mod_val,
max_val))
# Create a Figure
fig = [Link](figsize=(10,4))
# Plot a histogram
[Link](var)
# Add lines for the statistics
[Link](x=min_val, color = 'gray', linestyle='dashed', linewidth = 2)
[Link](x=mean_val, color = 'cyan', linestyle='dashed', linewidth = 2)
[Link](x=med_val, color = 'red', linestyle='dashed', linewidth = 2)
[Link](x=mod_val, color = 'yellow', linestyle='dashed', linewidth = 2
)
[Link](x=max_val, color = 'gray', linestyle='dashed', linewidth = 2)
# Add titles and labels
[Link]('Data Distribution')
[Link]('Value')
[Link]('Frequency')
# Show the figure
[Link]()
Presione Mayús + Entrar para ejecutar
For the grade data, the mean, median, and mode all seem to be more or less in
the middle of the minimum and maximum, at around 50.
Another way to visualize the distribution of a variable is to use a box plot
(sometimes called a box-and-whiskers plot). Let's create one for the grade data.
[ ]
# Get the variable to examine
var = df_students['Grade']
# Create a Figure
fig = [Link](figsize=(10,4))
# Plot a histogram
[Link](var)
# Add titles and labels
[Link]('Data Distribution')
# Show the figure
[Link]()
Presione Mayús + Entrar para ejecutar
The box plot shows the distribution of the grade values in a format different
from the histogram. The box part of the plot shows where the inner
two quartiles of the data reside. In this case, half of the grades are between
approximately 36 and 63. The whiskers extending from the box show the outer
two quartiles, so the other half of the grades in this case are between 0 and 36
or 63 and 100. The line in the box indicates the median value.
For learning, it can be useful to combine histograms and box plots, with the box
plot's orientation changed to align it with the histogram. (In some ways, it can
be helpful to think of the histogram as a "front elevation" view of the
distribution, and the box plot as a "plan" view of the distribution from above.)
[ ]
# Create a function that we can re-use
def show_distribution(var_data):
from matplotlib import pyplot as plt
# Get statistics
min_val = var_data.min()
max_val = var_data.max()
mean_val = var_data.mean()
med_val = var_data.median()
mod_val = var_data.mode()[0]
print('Minimum:{:.2f}\nMean:{:.2f}\nMedian:{:.2f}\nMode:{:.2f}\nMaximum:
{:.2f}\n'.format(min_val,
mean_val,
med_val,
mod_val,
max_val))
# Create a figure for 2 subplots (2 rows, 1 column)
fig, ax = [Link](2, 1, figsize = (10,4))
# Plot the histogram
ax[0].hist(var_data)
ax[0].set_ylabel('Frequency')
# Add lines for the mean, median, and mode
ax[0].axvline(x=min_val, color = 'gray', linestyle='dashed', linewidt
h = 2)
ax[0].axvline(x=mean_val, color = 'cyan', linestyle='dashed', linewid
th = 2)
ax[0].axvline(x=med_val, color = 'red', linestyle='dashed', linewidth
= 2)
ax[0].axvline(x=mod_val, color = 'yellow', linestyle='dashed', linewid
th = 2)
ax[0].axvline(x=max_val, color = 'gray', linestyle='dashed', linewidt
h = 2)
# Plot the boxplot
ax[1].boxplot(var_data, vert=False)
ax[1].set_xlabel('Value')
# Add a title to the Figure
[Link]('Data Distribution')
# Show the figure
[Link]()
# Get the variable to examine
col = df_students['Grade']
# Call the function
show_distribution(col)
Presione Mayús + Entrar para ejecutar
All of the measurements of central tendency are right in the middle of the data
distribution, which is symmetric with values becoming progressively lower in
both directions from the middle.
To explore this distribution in more detail, you need to understand that statistics
is fundamentally about taking samples of data and using probability functions
to extrapolate information about the full population of data.
What does this mean? Samples refer to the data we have on hand, such as
information about these 22 students' study habits and grades.
The population refers to all possible data we could collect, such as every
student's grades and study habits across every educational institution
throughout the history of time. Usually we're interested in the population, but
it's simply not practical to collect all of that data. Instead, we need to try
estimate what the population is like from the small amount of data (samples)
that we have.
If we have enough samples, we can calculate something called a probability
density function, which estimates the distribution of grades for the full
population.
The pyplot class from Matplotlib provides a helpful plot function to show this
density.
[ ]
def show_density(var_data):
from matplotlib import pyplot as plt
fig = [Link](figsize=(10,4))
# Plot density
var_data.[Link]()
# Add titles and labels
[Link]('Data Density')
# Show the mean, median, and mode
[Link](x=var_data.mean(), color = 'cyan', linestyle='dashed', lin
ewidth = 2)
[Link](x=var_data.median(), color = 'red', linestyle='dashed', li
newidth = 2)
[Link](x=var_data.mode()[0], color = 'yellow', linestyl
e='dashed', linewidth = 2)
# Show the figure
[Link]()
# Get the density of Grade
col = df_students['Grade']
show_density(col)
Presione Mayús + Entrar para ejecutar
As expected from the histogram of the sample, the density shows the
characteristic "bell curve" of what statisticians call a normal distribution with the
mean and mode at the center and symmetric tails.
Summary
Well done! There were a number of new concepts in here, so let's summarize.
Here we have:
1. Made graphs with Matplotlib.
2. Seen how to customize these graphs.
3. Calculated basic statistics, such as medians.
4. Looked at the spread of data using box plots and histograms.
5. Learned about samples versus populations.
6. Estimated what the population of grades might look like from a sample of
grades.
In our next notebook, we'll look at spotting unusual data and finding
relationships between data.
Further Reading
To learn more about the Python packages you explored in this notebook, see
the following documentation:
NumPy
Pandas
Matplotlib
Sin proceso
Proceso no conectado
Visualización
Kernel no conectado
Examen de datos del mundo real
Completado100 XP
3 minutos
Los datos presentados en el material educativo suelen ser notablemente
perfectos, diseñados para mostrar a los alumnos cómo encontrar relaciones
claras entre las variables. Los datos del mundo real son algo menos sencillos.
Debido a la complejidad de los datos del "mundo real", hay que inspeccionar
los datos sin procesar para detectar problemas antes de utilizarlos.
Por ello, el procedimiento recomendado es inspeccionar los datos sin procesar y
procesarlos antes de utilizarlos, lo que reduce los errores o problemas,
normalmente eliminando los puntos de datos erróneos o modificando los datos
para que sean más útiles.
Problemas de los datos del mundo real
Los datos del mundo real pueden contener muchos problemas diferentes que
pueden afectar a la utilidad de los datos y a nuestra interpretación de los
resultados.
Es importante tener en cuenta que la mayoría de los datos del mundo real están
influenciados por factores que no se registraron en ese momento. Por ejemplo,
podríamos tener una tabla con los tiempos de los coches de carreras junto con
los tamaños de los motores, pero otros factores que no se anotaron, como el
clima, probablemente también influyeron. Si son problemáticos, la influencia de
estos factores puede reducirse a menudo aumentando el tamaño del conjunto
de datos.
En otras situaciones, los puntos de datos que están claramente fuera de lo
esperado, también conocidos como valores atípicos, a veces se pueden quitar de
forma segura de los análisis, aunque se debe tener cuidado para no quitar
puntos de datos que proporcionen información real.
Otro problema común en los datos del mundo real es el sesgo. El sesgo se
refiere a la tendencia a seleccionar ciertos tipos de valores con más frecuencia
que otros, de forma que se falsea la población subyacente, o el "mundo real". A
veces se puede identificar el sesgo explorando los datos y teniendo en cuenta
los conocimientos básicos sobre la procedencia de estos.
Recuerde que los datos del mundo real siempre tendrán problemas, pero esto
suele ser un problema superable. Recuerde:
Compruebe los valores que faltan y los datos registrados de forma
incorrecta.
Considere la posibilidad de eliminar valores atípicos obvios.
Considere qué factores del mundo real podrían afectar al análisis y
vea si el tamaño del conjunto de datos es lo suficientemente
grande como para controlarlos.
Compruebe si los datos sin procesar están sesgados y considere sus
opciones para corregirlos, si se encuentran.
Siguiente unidad: Ejercicio: Examen de los datos
del mundo real
Ejercicio: Examen de los datos del
mundo real
Completado100 XP
12 minutos
Este módulo requiere un espacio aislado para completarse. Usó 4 de 10
espacios aislados por hoy. Mañana habrá disponibles más espacios aislados.
Activar espacio aislado
Las sugerencias de enlaces de teclado de la barra de herramientas están ahora ocultas
RuntimeArchivoEditarVista
Ejecutar todo
Kernel
Proceso no conectado
Exploring data with Python - real world data
In the last notebook, we looked at grades for our student data and investigated
the data visually with histograms and box plots. Now we'll look into more
complex cases, describe the data more fully, and discuss how to make basic
comparisons between data.
Real world data distributions
Previously, we looked at grades for our student data and estimated from this
sample what the full population of grades might look like. Let's refresh our
memory and take a look at this data again.
Run the code below to print out the data and make a histogram + box plot that
shows the grades for our sample of students.
CódigoMarkdown
[]
import pandas as pd
from matplotlib import pyplot as plt
# Load data from a text file
!wget [Link]
to-machine-learning/main/Data/ml-basics/[Link]
df_students = pd.read_csv('[Link]',delimiter=',',header='infer')
# Remove any rows with missing data
df_students = df_students.dropna(axis=0, how='any')
# Calculate who passed, assuming '60' is the grade needed to pass
passes = [Link](df_students['Grade'] >= 60)
# Save who passed to the Pandas dataframe
df_students = [Link]([df_students, [Link]("Pass")], axis=1)
# Print the result out into this notebook
print(df_students)
# Create a function that we can re-use
def show_distribution(var_data):
'''
This function will make a distribution (graph) and display it
'''
# Get statistics
min_val = var_data.min()
max_val = var_data.max()
mean_val = var_data.mean()
med_val = var_data.median()
mod_val = var_data.mode()[0]
print('Minimum:{:.2f}\nMean:{:.2f}\nMedian:{:.2f}\nMode:{:.2f}\nMaximum:
{:.2f}\n'.format(min_val,
mean_val,
med_val,
mod_val,
max_val))
# Create a figure for 2 subplots (2 rows, 1 column)
fig, ax = [Link](2, 1, figsize = (10,4))
# Plot the histogram
ax[0].hist(var_data)
ax[0].set_ylabel('Frequency')
# Add lines for the mean, median, and mode
ax[0].axvline(x=min_val, color = 'gray', linestyle='dashed', linewidth =
2)
ax[0].axvline(x=mean_val, color = 'cyan', linestyle='dashed', linewidth =
2)
ax[0].axvline(x=med_val, color = 'red', linestyle='dashed', linewidth = 2
)
ax[0].axvline(x=mod_val, color = 'yellow', linestyle='dashed', linewidth
= 2)
ax[0].axvline(x=max_val, color = 'gray', linestyle='dashed', linewidth =
2)
# Plot the boxplot
ax[1].boxplot(var_data, vert=False)
ax[1].set_xlabel('Value')
# Add a title to the Figure
[Link]('Data Distribution')
# Show the figure
[Link]()
show_distribution(df_students['Grade'])
Presione Mayús + Entrar para ejecutar
As you might recall, our data had the mean and mode at the center, with data
spread symmetrically from there.
Now let's take a look at the distribution of the study hours data.
[]
# Get the variable to examine
col = df_students['StudyHours']
# Call the function
show_distribution(col)
Presione Mayús + Entrar para ejecutar
The distribution of the study time data is significantly different from that of the
grades.
Note that the whiskers of the box plot only begin at around 6.0, indicating that
the vast majority of the first quarter of the data is above this value. The
minimum is marked with an o, indicating that it is statistically an outlier—a value
that lies significantly outside the range of the rest of the distribution.
Outliers can occur for many reasons. Maybe a student meant to record "10"
hours of study time, but entered "1" and missed the "0". Or maybe the student
was abnormally lazy when it comes to studying! Either way, it's a statistical
anomaly that doesn't represent a typical student. Let's see what the distribution
looks like without it.
[]
# Get the variable to examine
# We will only get students who have studied more than one hour
col = df_students[df_students.StudyHours>1]['StudyHours']
# Call the function
show_distribution(col)
Presione Mayús + Entrar para ejecutar
For learning purposes, we have just treated the value 1 as a true outlier here
and excluded it. In the real world, it would be unusual to exclude data at the
extremes without more justification when our sample size is so small. This is
because the smaller our sample size, the more likely it is that our sampling is a
bad representation of the whole population. (Here, the population means
grades for all students, not just our 22.) For example, if we sampled study time
for another 1,000 students, we might find that it's actually quite common to not
study much!
When we have more data available, our sample becomes more reliable. This
makes it easier to consider outliers as being values that fall below or above
percentiles within which most of the data lie. For example, the following code
uses the Pandas quantile function to exclude observations below the 0.01th
percentile (the value above which 99% of the data reside).
[]
# calculate the 0.01th percentile
q01 = df_students.[Link](0.01)
# Get the variable to examine
col = df_students[df_students.StudyHours>q01]['StudyHours']
# Call the function
show_distribution(col)
Presione Mayús + Entrar para ejecutar
Tip: You can also eliminate outliers at the upper end of the distribution by
defining a threshold at a high percentile value. For example, you could use
the quantile function to find the 0.99 percentile below which 99% of the data
reside.
With the outliers removed, the box plot shows all data within the four quartiles.
Note that the distribution is not symmetric like it is for the grade data. There are
some students with very high study times of around 16 hours, but the bulk of
the data is between 7 and 13 hours. The few extremely high values pull the
mean towards the higher end of the scale.
Let's look at the density for this distribution.
[]
def show_density(var_data):
fig = [Link](figsize=(10,4))
# Plot density
var_data.[Link]()
# Add titles and labels
[Link]('Data Density')
# Show the mean, median, and mode
[Link](x=var_data.mean(), color = 'cyan', linestyle='dashed', linewi
dth = 2)
[Link](x=var_data.median(), color = 'red', linestyle='dashed', linew
idth = 2)
[Link](x=var_data.mode()[0], color = 'yellow', linestyle='dashed', l
inewidth = 2)
# Show the figure
[Link]()
# Get the density of StudyHours
show_density(col)
Presione Mayús + Entrar para ejecutar
This kind of distribution is called right skewed. The mass of the data is on the left
side of the distribution, creating a long tail to the right because of the values at
the extreme high end, which pull the mean to the right.
Measures of variance
So now we have a good idea where the middle of the grade and study hours
data distributions are. However, there's another aspect of the distributions we
should examine: how much variability is there in the data?
Typical statistics that measure variability in the data include:
Range: The difference between the maximum and minimum. There's no built-in
function for this, but it's easy to calculate using the min and max functions.
Variance: The average of the squared difference from the mean. You can use
the built-in var function to find this.
Standard Deviation: The square root of the variance. You can use the built-
in std function to find this.
[]
for col_name in ['Grade','StudyHours']:
col = df_students[col_name]
rng = [Link]() - [Link]()
var = [Link]()
std = [Link]()
print('\n{}:\n - Range: {:.2f}\n - Variance: {:.2f}\n - [Link]: {:.2f
}'.format(col_name, rng, var, std))
Presione Mayús + Entrar para ejecutar
Of these statistics, the standard deviation is generally the most useful. It
provides a measure of variance in the data on the same scale as the data itself
(so grade points for the Grade distribution and hours for the StudyHours
distribution). The higher the standard deviation, the more variance there is when
comparing values in the distribution to the distribution mean—in other words,
the data is more spread out.
When working with a normal distribution, the standard deviation works with the
particular characteristics of a normal distribution to provide even greater insight.
Run the cell below to see the relationship between standard deviations and the
data in the normal distribution.
[]
import [Link] as stats
# Get the Grade column
col = df_students['Grade']
# get the density
density = stats.gaussian_kde(col)
# Plot the density
[Link]()
# Get the mean and standard deviation
s = [Link]()
m = [Link]()
# Annotate 1 stdev
x1 = [m-s, m+s]
y1 = density(x1)
[Link](x1,y1, color='magenta')
[Link]('1 std (68.26%)', (x1[1],y1[1]))
# Annotate 2 stdevs
x2 = [m-(s*2), m+(s*2)]
y2 = density(x2)
[Link](x2,y2, color='green')
[Link]('2 std (95.45%)', (x2[1],y2[1]))
# Annotate 3 stdevs
x3 = [m-(s*3), m+(s*3)]
y3 = density(x3)
[Link](x3,y3, color='orange')
[Link]('3 std (99.73%)', (x3[1],y3[1]))
# Show the location of the mean
[Link]([Link](), color='cyan', linestyle='dashed', linewidth=1)
[Link]('off')
[Link]()
Presione Mayús + Entrar para ejecutar
The horizontal lines show the percentage of data within 1, 2, and 3 standard
deviations of the mean (plus or minus).
In any normal distribution:
Approximately 68.26% of values fall within one standard deviation from the
mean.
Approximately 95.45% of values fall within two standard deviations from the
mean.
Approximately 99.73% of values fall within three standard deviations from the
mean.
So, since we know that the mean grade is 49.18, the standard deviation is 21.74,
and distribution of grades is approximately normal, we can calculate that
68.26% of students should achieve a grade between 27.44 and 70.92.
The descriptive statistics we've used to understand the distribution of the
student data variables are the basis of statistical analysis. Because they're such
an important part of exploring your data, there's a built-in describe method of
the DataFrame object that returns the main descriptive statistics for all numeric
columns.
[]
df_students.describe()
Presione Mayús + Entrar para ejecutar
Comparing data
Now that you know something about the statistical distribution of the data in
your dataset, you're ready to examine your data to identify any apparent
relationships between variables.
First of all, let's get rid of any rows that contain outliers so that we have a
sample that is representative of a typical class of students. We identified that the
StudyHours column contains some outliers with extremely low values, so we'll
remove those rows.
[]
df_sample = df_students[df_students['StudyHours']>1]
df_sample
Presione Mayús + Entrar para ejecutar
Comparing numeric and categorical variables
The data includes two numeric variables (StudyHours and Grade) and
two categorical variables (Name and Pass). Let's start by comparing the
numeric StudyHours column to the categorical Pass column to see if there's an
apparent relationship between the number of hours studied and a passing
grade.
To make this comparison, let's create box plots showing the distribution of
StudyHours for each possible Pass value (true and false).
[]
df_sample.boxplot(column='StudyHours', by='Pass', figsize=(8,5))
Presione Mayús + Entrar para ejecutar
Comparing the StudyHours distributions, it's immediately apparent (if not
particularly surprising) that students who passed the course tended to study for
more hours than students who didn't. So if you wanted to predict whether or
not a student is likely to pass the course, the amount of time they spend
studying may be a good predictive indicator.
Comparing numeric variables
Now let's compare two numeric variables. We'll start by creating a bar chart that
shows both grade and study hours.
[]
# Create a bar plot of name vs grade and study hours
df_sample.plot(x='Name', y=['Grade','StudyHours'], kind='bar', figsize=(8,5))
Presione Mayús + Entrar para ejecutar
The chart shows bars for both grade and study hours for each student, but it's
not easy to compare because the values are on different scales. A grade is
measured in grade points (and ranges from 3 to 97), and study time is measured
in hours (and ranges from 1 to 16).
A common technique when dealing with numeric data in different scales is
to normalize the data so that the values retain their proportional distribution
but are measured on the same scale. To accomplish this, we'll use a technique
called MinMax scaling that distributes the values proportionally on a scale of 0
to 1. You could write the code to apply this transformation, but the Scikit-
Learn library provides a scaler to do it for you.
[]
from [Link] import MinMaxScaler
# Get a scaler object
scaler = MinMaxScaler()
# Create a new dataframe for the scaled values
df_normalized = df_sample[['Name', 'Grade', 'StudyHours']].copy()
# Normalize the numeric columns
df_normalized[['Grade','StudyHours']] = scaler.fit_transform(df_normalized[['
Grade','StudyHours']])
# Plot the normalized values
df_normalized.plot(x='Name', y=['Grade','StudyHours'], kind='bar', figsize=(8
,5))
Presione Mayús + Entrar para ejecutar
With the data normalized, it's easier to see an apparent relationship between
grade and study time. It's not an exact match, but it definitely seems like
students with higher grades tend to have studied more.
So there seems to be a correlation between study time and grade. In fact,
there's a statistical correlation measurement we can use to quantify the
relationship between these columns.
[]
df_normalized.[Link](df_normalized.StudyHours)
Presione Mayús + Entrar para ejecutar
The correlation statistic is a value between -1 and 1 that indicates the strength
of a relationship. Values above 0 indicate a positive correlation (high values of
one variable tend to coincide with high values of the other), while values below
0 indicate a negative correlation (high values of one variable tend to coincide
with low values of the other). In this case, the correlation value is close to 1,
showing a strongly positive correlation between study time and grade.
Note: Data scientists often quote the maxim "correlation is not causation". In
other words, as tempting as it might be, you shouldn't interpret the statistical
correlation as explaining why one of the values is high. In the case of the
student data, the statistics demonstrate that students with high grades tend to
also have high amounts of study time, but this is not the same as proving that
they achieved high grades because they studied a lot. The statistic could equally
be used as evidence to support the nonsensical conclusion that the students
studied a lot because their grades were going to be high.
Another way to visualize the apparent correlation between two numeric
columns is to use a scatter plot.
[]
# Create a scatter plot
df_sample.[Link](title='Study Time vs Grade', x='StudyHours', y='Grade'
)
Presione Mayús + Entrar para ejecutar
Again, it looks like there's a discernible pattern in which the students who
studied the most hours are also the students who got the highest grades.
We can see this more clearly by adding a regression line (or a line of best fit) to
the plot that shows the general trend in the data. To do this, we'll use a
statistical technique called least squares regression.
Remember when you were learning how to solve linear equations in school, and
recall that the slope-intercept form of a linear equation looks like this:
y=mx+b�=��+�
In this equation, y and x are the coordinate variables, m is the slope of the line,
and b is the y-intercept (where the line goes through the Y-axis).
In the case of our scatter plot for our student data, we already have our values
for x (StudyHours) and y (Grade), so we just need to calculate the intercept and
slope of the straight line that lies closest to those points. Then we can form a
linear equation that calculates a new y value on that line for each of
our x (StudyHours) values. To avoid confusion, we'll call this
new y value f(x) (because it's the output from a linear equation function based
on x). The difference between the original y (Grade) value and the f(x) value is
the error between our regression line and the actual Grade achieved by the
student. Our goal is to calculate the slope and intercept for a line with the
lowest overall error.
Specifically, we define the overall error by taking the error for each point,
squaring it, and adding all the squared errors together. The line of best fit is the
line that gives us the lowest value for the sum of the squared errors—hence the
name least squares regression.
Fortunately, you don't need to code the regression calculation yourself.
The SciPy package includes a stats class that provides a linregress method to
do the hard work for you. This returns (among other things) the coefficients you
need for the slope equation: slope (m) and intercept (b) based on a given pair of
variable samples you want to compare.
[]
from scipy import stats
#
df_regression = df_sample[['Grade', 'StudyHours']].copy()
# Get the regression slope and intercept
m, b, r, p, se = [Link](df_regression['StudyHours'], df_regression[
'Grade'])
print('slope: {:.4f}\ny-intercept: {:.4f}'.format(m,b))
print('so...\n f(x) = {:.4f}x + {:.4f}'.format(m,b))
# Use the function (mx + b) to calculate f(x) for each x (StudyHours)
value
df_regression['fx'] = (m * df_regression['StudyHours']) + b
# Calculate the error between f(x) and the actual y (Grade) value
df_regression['error'] = df_regression['fx'] - df_regression['Grade']
# Create a scatter plot of Grade vs StudyHours
df_regression.[Link](x='StudyHours', y='Grade')
# Plot the regression line
[Link](df_regression['StudyHours'],df_regression['fx'], color='cyan')
# Display the plot
[Link]()
Presione Mayús + Entrar para ejecutar
Note that this time, the code plotted two distinct things—the scatter plot of the
sample study hours and grades is plotted as before, and then a line of best fit
based on the least squares regression coefficients is plotted.
The slope and intercept coefficients calculated for the regression line are shown
above the plot.
The line is based on the f(x) values calculated for each StudyHours value. Run
the following cell to see a table that includes the following values:
The StudyHours for each student.
The Grade achieved by each student.
The f(x) value calculated using the regression line coefficients.
The error between the calculated f(x) value and the actual Grade value.
Some of the errors, particularly at the extreme ends, and quite large (up to over
17.5 grade points). But, in general, the line is pretty close to the actual grades.
[]
# Show the original x,y values, the f(x) value, and the error
df_regression[['StudyHours', 'Grade', 'fx', 'error']]
Presione Mayús + Entrar para ejecutar
Using the regression coefficients for prediction
Now that you have the regression coefficients for the study time and grade
relationship, you can use them in a function to estimate the expected grade for
a given amount of study.
[]
# Define a function based on our regression coefficients
def f(x):
m = 6.3134
b = -17.9164
return m*x + b
study_time = 14
# Get f(x) for study time
prediction = f(study_time)
# Grade can't be less than 0 or more than 100
expected_grade = max(0,min(100,prediction))
#Print the estimated grade
print ('Studying for {} hours per week may result in a grade of {:.0f}'.forma
t(study_time, expected_grade))
Presione Mayús + Entrar para ejecutar
So by applying statistics to sample data, you've determined a relationship
between study time and grade and encapsulated that relationship in a general
function that can be used to predict a grade for a given amount of study time.
This technique is in fact the basic premise of machine learning. You can take a
set of sample data that includes one or more features (in this case, the number
of hours studied) and a known label value (in this case, the grade achieved) and
use the sample data to derive a function that calculates predicted label values
for any given set of features.
Summary
Here we've looked at:
1. What an outlier is and how to remove them
2. How data can be skewed
3. How to look at the spread of data
4. Basic ways to compare variables, such as grades and study time
Further Reading
To learn more about the Python packages you explored in this notebook, see
the following documentation:
NumPy
Pandas
Matplotlib
CódigoMarkdown
Sin proceso
Proceso no conectado
Visualización
Kernel no conectado
¿Qué son los modelos de aprendizaje
automático?
Completado100 XP
4 minutos
El modelo es el componente principal del aprendizaje automático y, en
definitiva, lo que estamos intentando crear. Un modelo podría calcular la edad
de una persona a partir de una foto, predecir lo que le gustaría ver en las redes
sociales o decidir hacia dónde se debe mover un brazo robótico. En nuestro
escenario, queremos crear un modelo que pueda calcular la talla de botas más
adecuada para un perro en función de la talla de su arnés.
Los modelos se pueden crear de muchas maneras. Por ejemplo, son las
personas las que crean un modelo tradicional que simula el vuelo de un avión,
con conocimientos de física e ingeniería. Los modelos de aprendizaje
automático son especiales, ya que en lugar de editarlos las personas para que
sean eficaces, son los datos los que les dan forma, es decir, aprenden de la
experiencia.
Planteamientos sobre los modelos
Un modelo puede plantearse como una función que acepta datos como entrada
y genera una salida. En concreto, un modelo usa los datos de entrada para
calcular otra cosa. Por ejemplo, en nuestro escenario, queremos crear un
modelo al que se le proporciona una talla de arnés y calcula la talla de unas
botas:
Tenga en cuenta que tanto la talla del arnés como la talla de las botas para
perros son datos, es decir, no forman parte del modelo. La talla del arnés es la
entrada y la talla de las botas para perros es la salida.
Los modelos suelen ser código sencillo
Los modelos no se suelen diferenciar de un modo significativo de las funciones
sencillas con las que ya está familiarizado. Al igual que otro código, contienen
lógica y parámetros. Por ejemplo, la lógica podría ser "multiplicar la talla del
arnés por parameter_1":
Si parameter_1 aquí fuese 2,5, nuestro modelo multiplicaría la talla del arnés por
2,5 y devolvería el resultado siguiente:
Selección de un modelo
Hay muchos tipos de modelo, algunos de ellos sencillos y otros complejos.
Al igual que sucede con cualquier código, los modelos más sencillos suelen ser
los más fiables y fáciles de entender, mientras que los modelos complejos
pueden llevar a cabo grandes hazañas. El tipo de modelo que debería elegir
depende de su objetivo. Por ejemplo, los investigadores del ámbito médico
suelen trabajar con modelos relativamente sencillos porque son fiables e
intuitivos. Por el contrario, los robots basados en inteligencia artificial suelen
depender de modelos muy complejos.
El primer paso del aprendizaje automático es seleccionar el tipo de modelo que
quiere usar. Esto significa que el modelo se elige en función de su lógica
interna. Por ejemplo, podríamos seleccionar un modelo de dos parámetros para
calcular la talla de las botas para perros a partir de la talla del arnés:
Observe cómo hemos seleccionado un modelo en función de cómo funciona
lógicamente, pero no en función de sus valores de parámetro. De hecho, en este
momento los parámetros aún no se han establecido en ningún valor concreto.
Detección de los parámetros durante el
entrenamiento
El diseñador humano no selecciona los valores de parámetro. En lugar de esto,
se define una estimación inicial de los valores de parámetro y después dichos
valores de parámetro se ajustan durante un proceso de aprendizaje
automatizado denominado entrenamiento.
Dada la selección de un modelo de dos parámetros (vea más arriba), ahora
proporcionamos estimaciones aleatorias para nuestros parámetros:
Estos parámetros aleatorios significarán que el modelo no es eficaz a la hora de
calcular la talla de las botas, por lo que llevamos a cabo el entrenamiento.
Durante el entrenamiento, estos parámetros son sustituidos de forma
automática por dos nuevos valores que proporcionan mejores resultados:
El funcionamiento exacto de este proceso es algo que explicaremos de forma
progresiva a lo largo del recorrido de aprendizaje.
Exercise: Train and Run Your First Model
We've learned that models are computer code that processes information to
make a prediction or a decision. Here, we'll train a model to guess a comfortable
boot size for a dog, based on the size of the harness that fits them.
In the examples below, there is no need to edit any code. Try to read it,
understand it, then press the run button to run it. As always with these
notebooks, it is vitally important that these code blocks are run in the correct
order, and nothing is missed.
Note: If you've never used the Jupyter Notebooks environment before, there
are a few things you should be aware of:
Notebooks are made up of cells. Some cells (like this one)
contain markdown text, while others (like the one beneath this one)
contain code.
You can run each code cell by using the ► Run button.
the ► Run button will show up when you hover over the cell.
The output from each code cell will be displayed immediately below
the cell.
Even though the code cells can be run individually, some variables
used in the code are global to the notebook. That means that you
should run all of the code cells in order. There may be
dependencies between code cells, so if you skip a cell, subsequent
cells might not run correctly.
Preparing data
The first thing we do with a model is load data. We'll cover this in more detail in
a later exercise. For now, we'll just write our data directly in our code. Review
and run the following code to get started:
CódigoMarkdown
[ ]
import pandas
!wget [Link]
to-machine-learning/main/[Link]
!wget [Link]
to-machine-learning/main/Data/[Link]
!pip install statsmodels
# Make a dictionary of data for boot sizes
# and harness size in cm
data = {
'boot_size' : [ 39, 38, 37, 39, 38, 35, 37, 36, 35, 40,
40, 36, 38, 39, 42, 42, 36, 36, 35, 41,
42, 38, 37, 35, 40, 36, 35, 39, 41, 37,
35, 41, 39, 41, 42, 42, 36, 37, 37, 39,
42, 35, 36, 41, 41, 41, 39, 39, 35, 39
],
'harness_size': [ 58, 58, 52, 58, 57, 52, 55, 53, 49, 54,
59, 56, 53, 58, 57, 58, 56, 51, 50, 59,
59, 59, 55, 50, 55, 52, 53, 54, 61, 56,
55, 60, 57, 56, 61, 58, 53, 57, 57, 55,
60, 51, 52, 56, 55, 57, 58, 57, 51, 59
]
}
# Convert it into a table using pandas
dataset = [Link](data)
# Print the data
# In normal python we would write
# print(dataset)
# but in Jupyter notebooks, if we simple write the name
# of the variable and it is printed nicely
dataset
Presione Mayús + Entrar para ejecutar
As you can see, we have the sizes of boots and harnesses for 50 avalanche dogs.
We want to use harness size to estimate boot size. This means harness_size is
our input. We want a model that will process the input and make its own
estimations of the boot size (output).
Select a model
The first thing we must do is select a model. We're just getting started, so we'll
start with a very simple model called OLS. This is just a straight line (sometimes
called a trendline).
Let's use an existing library to create our model, but we won't train it yet.
[ ]
# Load a library to do the hard work for us
import [Link] as smf
# First, we define our formula using a special syntax
# This says that boot_size is explained by harness_size
formula = "boot_size ~ harness_size"
# Create the model, but don't train it yet
model = [Link](formula = formula, data = dataset)
# Note that we have created our model but it does not
# have internal parameters set yet
if not hasattr(model, 'params'):
print("Model selected but it does not have parameters set. We
need to train it!")
Presione Mayús + Entrar para ejecutar
Train our model
OLS models have two parameters (a slope and an offset), but these haven't
been set in our model yet. We need to train (fit) our model to find these values
so that the model can reliably estimate dogs' boot size based on their harness
size.
The following code fits our model to data you've now seen:
[ ]
# Load some libraries to do the hard work for us
import graphing
# Train (fit) the model so that it creates a line that
# fits our data. This method does the hard work for
# us. We will look at how this method works in a later unit.
fitted_model = [Link]()
# Print information about our model now it has been fit
print("The following model parameters have been found:\n" +
f"Line slope: {fitted_model.params[1]}\n"+
f"Line Intercept: {fitted_model.params[0]}")
Presione Mayús + Entrar para ejecutar
Notice how training the model set its parameters. We could interpret these
directly, but it's simpler to see it as a graph:
[ ]
import graphing
# Show a graph of the result
# Don't worry about how this works for now
graphing.scatter_2D(dataset, label_x="harness_size",
label_y="boot_size",
trendline=lambda x: fitted_model.params[1] *
x + fitted_model.params[0]
)
Presione Mayús + Entrar para ejecutar
The graph above shows our original data as circles with a red line through it.
The red line shows our model.
We can look at this line to understand our model. For example, we can see that
as harness size increases, so will the estimated boot size.
Use the model
Now that we've finished training, we can use our model to predict a dog's boot
size from their harness size.
For example, by looking at the red line, we can see that that a harness size
of 52.5 (x axis) corresponds to a boot size of about 36.5 (y axis).
We don't have to do this by eye though. We can use the model in our program
to predict any boot size we like. Run the following code to see how we can use
our model now that it's trained:
[ ]
# harness_size states the size of the harness we are interested in
harness_size = { 'harness_size' : [52.5] }
# Use the model to predict what size of boots the dog will fit
approximate_boot_size = fitted_model.predict(harness_size)
# Print the result
print("Estimated approximate_boot_size:")
print(approximate_boot_size[0])
Presione Mayús + Entrar para ejecutar
If you'd like, change the value of 52.5 in harness_size to a new value and run
the block above to see the model in action.
Summary
Well done! You've trained your first model. We've demonstrated some topics
here without detailed explanation in order to just get your feet wet. In later
units, we'll explain many of these topics in more detail.
¿Qué son las entradas y salidas?
Completado100 XP
4 minutos
El objetivo del entrenamiento es mejorar un modelo para que pueda realizar
predicciones o estimaciones de alta calidad. Una vez entrenado, el modelo se
puede usar en el mundo real, de forma similar al software normal.
Los modelos no se entrenan a sí mismos, se entrenan con datos y dos
fragmentos de código: la función objetivo y el optimizador. A continuación,
exploramos cómo funcionan estos componentes en conjunto para entrenar un
modelo de manera que sea eficaz.
El objetivo
El objetivo es lo que queremos que el modelo pueda hacer. Por ejemplo, el
objetivo de nuestro escenario es poder calcular la talla de las botas de un perro
en función de la talla de su arnés.
Para que un equipo pueda comprender nuestro objetivo, debemos
proporcionárselo como un fragmento de código denominado función objetivo
(también conocido como función de costo). Las funciones objetivo evalúan si el
modelo es eficaz (es decir, si calcula la talla correcta de las botas) o no (es decir,
si se equivoca a la hora de calcular la talla de las botas). Trataremos las
funciones objetivo en profundidad en el material de aprendizaje posterior.
Datos
Los datos se refieren a la información que le proporcionamos al modelo
(también denominada entrada). En nuestro escenario, se corresponde con la
talla del arnés.
Los datos también se refieren a la información que la función objetivo podría
necesitar. Por ejemplo, si nuestra función objetivo nos indica si el modelo ha
predicho la talla correcta de las botas, necesitará saber cuál es la talla correcta
de las botas. Este es el motivo por el que, en el ejercicio anterior,
proporcionamos tanto las tallas de los arneses como las respuestas correctas al
código de entrenamiento.
Practicaremos el trabajo con datos en el ejercicio siguiente.
El optimizador
Durante el entrenamiento, el modelo realiza una predicción y la función objetivo
calcula la calidad de su rendimiento. El optimizador es un código que, a
continuación, cambia los parámetros del modelo para que sea más eficaz la
próxima vez.
El proceso que lleva a cabo el optimizador para realizar esta acción es complejo
y se tratará en material posterior. Sin embargo, no se debe preocupar. No
solemos escribir nuestros propios optimizadores, sino que usamos marcos de
código abierto en los que ya se ha hecho el trabajo duro.
Es importante tener en cuenta que el objetivo, los datos y el optimizador son
simplemente un medio para entrenar el modelo. No son necesarios una vez
completado el entrenamiento. También es importante recordar que el
entrenamiento solo cambia los valores de parámetro dentro del modelo, es
decir, no cambia el tipo de modelo que se usa.
Ejercicio: Visualización de entradas y
salidas
Completado100 XP
10 minutos
Este módulo requiere un espacio aislado para completarse.
Un espacio aislado le da acceso a recursos gratuitos. No se le cobrará en su
suscripción personal. El espacio aislado solo podrá usarse para completar el
aprendizaje en Microsoft Learn. El uso para cualquier otro motivo está prohibido
y podría generar la pérdida permanente del acceso al espacio aislado.
Microsoft ofrece esta experiencia de laboratorio y el contenido relacionado con
fines educativos. Toda la información presentada es propiedad de Microsoft y
está destinada únicamente a brindar información sobre los productos y servicios
abordados en este módulo de Microsoft Learn.
Activar espacio aislado
Las sugerencias de enlaces de teclado de la barra de herramientas están ahora ocultas
RuntimeArchivoEditarVista
Ejecutar todo
Kernel
Proceso no conectado
Exercise: Datasets in Python
In the previous exercise, we loaded some data and fit a model to it. Several
aspects of this were simplified, particularly that the data was hard-coded into
our python script, and we didn't spend any time really looking at the data itself.
Here, we'll load data from a file, filter it, and graph it. Doing so is a very
important first step in order to build proper models, or to understand their
limitations.
As before, there's no need to edit any code in the examples in this unit. Try to
read it, understand it, then press the Run button to run it. As always, it's vitally
important that these code blocks are run in the correct order, and nothing is
missed.
Load data with Pandas
There are large variety of libraries that help you work with data. In Python, one
of the most common is Pandas. We used pandas briefly in the previous exercise.
Pandas can open data saved as text files and store it in an organized table called
a DataFrame.
Let's open some text data that's stored on disk. Our data is saved in a file
called [Link].
CódigoMarkdown
[ ]
import pandas
!wget [Link]
to-machine-learning/main/[Link]
!wget [Link]
to-machine-learning/main/Data/[Link]
# Read the text file containing data using pandas
dataset = pandas.read_csv('[Link]')
# Print the data
# Because there are a lot of data, use head() to only print the first few row
s
[Link]()
Presione Mayús + Entrar para ejecutar
As you can see, this dataset contains information about dogs, including their
doggy boot size, harness size, sex, and age in years.
Data is stored as columns and rows, similar to a table you might see in Excel.
Filter data by Columns
Data is easy to filter by columns. We can either type this directly,
like dataset.my_column_name, or like so: dataset["my_column_name"].
We can use this to either extract data, or to delete data.
Lets take a look at the harness sizes, and delete
the sex and age_years columns.
[ ]
# Look at the harness sizes
print("Harness sizes")
print(dataset.harness_size)
# Remove the sex and age-in-years columns.
del dataset["sex"]
del dataset["age_years"]
# Print the column names
print("\nAvailable columns after deleting sex and age information:")
print([Link])
Presione Mayús + Entrar para ejecutar
Filter data by Rows
We can get data from the top of the table by using the head() function, or from
the bottom of the table by using the tail() function.
Both functions make a shallow copy of a section of our dataframe. Here, we're
sending these copies to the print() function. The head and tail views can also
be used for other purposes, such as for use in analyses or graphs.
[ ]
# Print the data at the top of the table
print("TOP OF TABLE")
print([Link]())
# print the data at the bottom of the table
print("\nBOTTOM OF TABLE")
print([Link]())
Presione Mayús + Entrar para ejecutar
We can also filter logically. For example, we can look at data for dogs who have
a harness smaller than a size 55.
This works by calculating a True or False value for each row, then keeping only
those rows where the value is True.
[ ]
# Print how many rows of data we have
print(f"We have {len(dataset)} rows of data")
# Determine whether each avalanche dog's harness size is < 55
# This creates a True or False value for each row where True means
# they are smaller than 55
is_small = dataset.harness_size < 55
print("\nWhether the dog's harness was smaller than size 55:")
print(is_small)
# Now apply this 'mask' to our data to keep the smaller dogs
data_from_small_dogs = dataset[is_small]
print("\nData for dogs with harness smaller than size 55:")
print(data_from_small_dogs)
# Print the number of small dogs
print(f"\nNumber of dogs with harness size less than 55:
{len(data_from_small_dogs)}")
Presione Mayús + Entrar para ejecutar
This looks like a lot of code, but we can compress the important parts into a
single line.
Let's do something similar: restrict our data to only those with boot sizes smaller
than 40.
[ ]
# Make a copy of the dataset that only contains dogs with
# a boot size below size 40
# The call to copy() is optional but can help avoid unexpected
# behaviour in more complex scenarios
data_smaller_paws = dataset[dataset.boot_size < 40].copy()
# Print information about this
print(f"We now have {len(data_smaller_paws)} rows in our dataset. The last fe
w rows are:")
data_smaller_paws.tail()
Presione Mayús + Entrar para ejecutar
Graph Data
Graphing data is often the easiest way to understand it.
In these exercises, we usually make our graphs using code in a custom file we've
created, called [Link], which you can look at on our github page.
Here, we'll practice making a graph without this custom code, however.
Lets make a simple graph of harness size versus boot size for our avalanche
dogs with smaller feet.
[ ]
# Load and prepare plotly to create our graphs
import [Link]
import graphing # this is a custom file you can find in our code on github
# Show a graph of harness size by boot size:
[Link](data_smaller_paws, x="harness_size", y="boot_size")
Presione Mayús + Entrar para ejecutar
Create New Columns
The preceding graph shows the relationship we want to investigate for our
store, but some customers might want harness-size lists in inches, not
centimeters. How can we view these harness sizes in imperial units?
To do this, we will need to create a new column
called harness_size_imperial and put that on the X axis instead.
Creating new columns uses very similar syntax to what we've seen before.
[ ]
# Convert harness sizes from metric to imperial units
# and save the result to a new column
data_smaller_paws['harness_size_imperial'] = data_smaller_paws.harness_size /
2.54
# Show a graph of harness size in imperial units
[Link](data_smaller_paws, x="harness_size_imperial", y="boot_
size")
Presione Mayús + Entrar para ejecutar
We've now graphed our new column of data ( harness_size_imperial) against
boot size for dogs with small paws.
Summary
We've introduced working with data in Python, including:
Opening data from a file into a DataFrame (table)
Inspecting the top and bottom of the dataframe
Adding and removing columns of data
Removing rows of data based on criteria
Graphing data to understand trends
Learning to work with dataframes can feel tedious or dry, but keep going,
because these basic skills are critical to unlocking exciting machine-learning
techniques that we'll cover in later modules.
Cómo usar un modelo
Completado100 XP
6 minutos
A continuación, repasamos cómo encajan estas partes para entrenar un modelo.
Diferencias entre entrenar y usar un modelo
Es importante diferenciar el entrenamiento del uso de un modelo.
Usar un modelo significa proporcionar entradas y recibir una estimación o
predicción. Lo hacemos tanto cuando entrenamos nuestro modelo como
cuando nosotros, o nuestros clientes, lo usamos en el mundo real. Usar un
modelo solo nos lleva unos pocos segundos.
Por el contrario, entrenar un modelo es el proceso de mejorar el
funcionamiento de dicho modelo. El entrenamiento requiere que usemos el
modelo, la función objetivo y el optimizador en un bucle específico. Esto puede
tardar unos minutos o días en completarse. Solemos entrenar el modelo solo
una vez. Una vez entrenado, podemos usarlo tantas veces como queramos sin
realizar más cambios.
Por ejemplo, en nuestro escenario de la tienda para perros de rescate de
avalanchas, queremos entrenar un modelo mediante un conjunto de datos
públicos, que cambiará el modelo para que pueda predecir la talla de las botas
de un perro en función de la talla de su arnés. Una vez entrenado, usaremos el
modelo en nuestra tienda en línea para asegurarnos de que los clientes van a
comprar las botas que se adaptarán mejor a sus perros.
Datos para usar, datos para entrenar
Recuerde que un conjunto de datos es una recopilación de información sobre
objetos o cosas. Por ejemplo, un conjunto de datos puede contener información
sobre perros:
Identificador del perro Talla de las botas Talla del arnés Color del perro R
0 27 12 Brown S
1 26 11 Negro L
2 25 10 Blanco L
3 29 14 Negro P
Cuando usamos nuestro modelo, solo necesitamos las columnas de datos que
el modelo acepta como entrada. Estas columnas se denominan
características. En nuestro escenario, si el modelo acepta la talla del arnés y
calcula la talla de las botas, entonces nuestra característica es la talla del
arnés.
Durante el entrenamiento, la función objetivo normalmente necesita saber tanto
la salida del modelo como cuál era la respuesta correcta. Estas se denominan
etiquetas. En nuestro escenario, si el modelo predice la talla de las
botas, nuestra etiqueta será la talla de las botas.
En conjunto, esto significa que para usar un modelo solo necesitamos las
características, mientras que durante el entrenamiento normalmente
necesitamos tanto las características como las etiquetas. En nuestro escenario,
durante el entrenamiento necesitamos tanto la característica de la talla del arnés
como la etiqueta de la talla de las botas. Cuando usamos el modelo en nuestro
sitio web, solo necesitamos saber la característica de la talla del arnés. A
continuación, nuestro modelo calculará la talla de las botas que debemos usar.
El entrenamiento ha finalizado. ¿Qué más?
Una vez que el modelo ha finalizado el entrenamiento, puede guardarse en un
archivo. Ya no necesitamos los datos originales, la función objetivo ni el
actualizador del modelo. Cuando queramos usar el modelo, podemos cargarlo
desde el disco, proporcionarle nuevos datos y obtener una predicción.
En el siguiente ejercicio, practicaremos cómo guardar un modelo, cargarlo
desde el disco y usarlo como lo haríamos en el mundo real. Para completar
nuestro escenario de la tienda en línea, también practicaremos cómo usar las
salidas del modelo para advertir a los clientes si parece que van a comprar la
talla equivocada de las botas para perros.
Ejercicio: Uso de los modelos de
aprendizaje automático
Completado100 XP
12 minutos
Este módulo requiere un espacio aislado para completarse.
Un espacio aislado le da acceso a recursos gratuitos. No se le cobrará en su
suscripción personal. El espacio aislado solo podrá usarse para completar el
aprendizaje en Microsoft Learn. El uso para cualquier otro motivo está prohibido
y podría generar la pérdida permanente del acceso al espacio aislado.
Microsoft ofrece esta experiencia de laboratorio y el contenido relacionado con
fines educativos. Toda la información presentada es propiedad de Microsoft y
está destinada únicamente a brindar información sobre los productos y servicios
abordados en este módulo de Microsoft Learn.
Activar espacio aislado
Las sugerencias de enlaces de teclado de la barra de herramientas están ahora ocultas
RuntimeArchivoEditarVista
Ejecutar todo
Kernel
Proceso no conectado
Exercise: Using a Trained Model on New Data
In Unit 3, we created a basic model that let us find the relationship between a
dog's harness size and their boot size. We showed how this model could then
be used to make a prediction about a new, previously unseen dog.
It's common to build, train, then use a model while we are just learning about
machine learning; but in the real world, we don't want to train the model every
time we want to make a prediction.
Consider our avalanche-dog equipment store scenario:
We want to train the model just once, then load that model onto the server that
runs our online store.
Although the model is trained on a dataset we downloaded from the internet,
we actually want to use it to estimate the boot size of our customers' dogs who
are not in this dataset!
How can we do this?
Here, we'll:
1. Create a basic model
2. Save it to disk
3. Load it from disk
4. Use it to make predictions about a dog who was not in the training dataset
Load the dataset
Let's begin by opening the dataset from file.
CódigoMarkdown
[]
import pandas
!pip install statsmodels
!wget [Link]
to-machine-learning/main/[Link]
!wget [Link]
to-machine-learning/main/Data/[Link]
# Load a file containing dog's boot and harness sizes
data = pandas.read_csv('[Link]')
# Print the first few rows
[Link]()
Presione Mayús + Entrar para ejecutar
Create and train a model
As we've done before, we'll create a simple Linear Regression model and train it
on our dataset.
[]
import [Link] as smf
# Fit a simple model that finds a linear relationship
# between boot size and harness size, which we can use later
# to predict a dog's boot size, given their harness size
model = [Link](formula = "boot_size ~ harness_size", data = data).fit()
print("Model trained!")
Presione Mayús + Entrar para ejecutar
Save and load a model
Our model is ready to use, but we don't need it yet. Let's save it to disk.
[]
import joblib
model_filename = './avalanche_dog_boot_model.pkl'
[Link](model, model_filename)
print("Model saved!")
Presione Mayús + Entrar para ejecutar
Loading our model is just as easy:
[]
model_loaded = [Link](model_filename)
print("We have loaded a model with the following parameters:")
print(model_loaded.params)
Presione Mayús + Entrar para ejecutar
Put it together
On our website, we'll want to take the harness of our customer's dog, then
calculate their dog's boot size using the model that we've already trained.
Let's put everything here together to make a function that loads the model from
disk, then uses it to predict our customer's dog's boot size height.
[]
# Let's write a function that loads and uses our model
def load_model_and_predict(harness_size):
'''
This function loads a pretrained model. It uses the model
with the customer's dog's harness size to predict the size of
boots that will fit that dog.
harness_size: The dog harness size, in cm
'''
# Load the model from file and print basic information about it
loaded_model = [Link](model_filename)
print("We've loaded a model with the following parameters:")
print(loaded_model.params)
# Prepare data for the model
inputs = {"harness_size":[harness_size]}
# Use the model to make a prediction
predicted_boot_size = loaded_model.predict(inputs)[0]
return predicted_boot_size
# Practice using our model
predicted_boot_size = load_model_and_predict(45)
print("Predicted dog boot size:", predicted_boot_size)
Presione Mayús + Entrar para ejecutar
Real world use
We've done it; we can predict an avalanche dog's boot size based on the size of
their harness. Our last step is to use this to warn people if they might be buying
the wrong sized doggy boots.
As an example, we'll make a function that accepts the harness size, the size of
the boots selected, and returns a message for the customer. We would integrate
this function into our online store.
[]
def check_size_of_boots(selected_harness_size, selected_boot_size):
'''
Calculates whether the customer has chosen a pair of doggy boots that
are a sensible size. This works by estimating the dog's actual boot
size from their harness size.
This returns a message for the customer that should be shown before
they complete their payment
selected_harness_size: The size of the harness the customer wants to buy
selected_boot_size: The size of the doggy boots the customer wants to buy
'''
# Estimate the customer's dog's boot size
estimated_boot_size = load_model_and_predict(selected_harness_size)
# Round to the nearest whole number because we don't sell partial sizes
estimated_boot_size = int(round(estimated_boot_size))
# Check if the boot size selected is appropriate
if selected_boot_size == estimated_boot_size:
# The selected boots are probably OK
return f"Great choice! We think these boots will fit your avalanche d
og well."
if selected_boot_size < estimated_boot_size:
# Selected boots might be too small
return "The boots you have selected might be TOO SMALL for a dog as "
\
f"big as yours. We recommend a doggy boots size of {estimated_
boot_size}."
if selected_boot_size > estimated_boot_size:
# Selected boots might be too big
return "The boots you have selected might be TOO BIG for a dog as "\
f"small as yours. We recommend a doggy boots size of {estimate
d_boot_size}."
# Practice using our new warning system
check_size_of_boots(selected_harness_size=55, selected_boot_size=39)
Presione Mayús + Entrar para ejecutar
Change selected_harness_size and selected_boot_size in the preceding
example and re-run the cell to see this in action.
Summary
Well done! We've put together a system that can predict if customers are
buying doggy boots that may not fit their avalanche dog, based solely on the
size of harness they're purchasing.
In this exercise, we practiced:
1. Creating basic models
2. Training, then saving them to disk
3. Loading them from disk
4. Making predictions with them using new data sets
Normalización y estandarización
Completado100 XP
4 minutos
El escalado de características es una técnica que cambia el intervalo de valores
que tiene una característica. Esto permite a los modelos aprender de forma más
rápida y sólida.
Normalización frente a estandarización
La normalización significa modificar la escala de los valores para que todos se
ajusten a un intervalo determinado (normalmente de 0 a 1). Por ejemplo, si
tuviera una lista de edades de personas de 0, 50 y 100 años, podría
normalizarlas dividiendo las edades entre 100, de modo que los valores fueran
0, 0,5 y 1.
La estandarización es similar, pero, en su lugar, se resta la media de los valores
y, después, se divide por la desviación estándar. Si no está familiarizado con la
desviación estándar, no se preocupe. Significa que, después de la
estandarización, el valor medio es 0 y aproximadamente el 95 % de los valores
se encuentra entre -2 y 2.
Hay otras maneras de escalar los datos, pero sus matices van más allá de lo que
necesitamos saber en este momento. Vamos a ver por qué aplicamos
la normalización o la estandarización.
¿Por qué es necesario modificar la escala?
Hay muchas razones por las que normalizamos o estandarizamos los datos
antes del entrenamiento. Estas se pueden entender más fácilmente con un
ejemplo. Supongamos que queremos entrenar un modelo para predecir si un
perro trabajará correctamente en la nieve. Los datos se muestran a continuación
como puntos y la línea de tendencia que intentamos encontrar se muestra
como una línea sólida:
El escalado proporciona un mejor punto de partida para el aprendizaje
La línea óptima anterior tiene dos parámetros: la intersección, que es 50, y la
línea en x=0 y la pendiente, que es 0,01; cada 1000 milímetros aumenta los
rescates en 10. Supongamos que comenzamos el entrenamiento con
estimaciones iniciales de 0 para ambos parámetros.
Si nuestras iteraciones de entrenamiento modifican los parámetros en torno a
0,01 por iteración de media, se necesitarán al menos 5000 iteraciones antes de
encontrar la intersección: 50/0,01 = 5000 iteraciones. La estandarización puede
acercar esta intersección óptima a cero, lo que significa que se puede identificar
mucho más rápido. Por ejemplo, si restamos la media de nuestra etiqueta
(rescates anuales) y nuestra característica (altura), la intersección es -0,5, en
lugar de 50, de modo que podremos encontrarla unas 100 veces más rápido.
Hay otras razones por las que los modelos complejos pueden ser muy lentos de
entrenar cuando la suposición inicial está lejos de la marca, pero la solución
sigue siendo la misma: desplazar las características a algo más cercano a la
suposición inicial.
La estandarización permite que los parámetros se entrenen a la misma
velocidad
En los datos recién desplazados, tenemos un desplazamiento ideal de -0,5 y una
pendiente ideal de 0,01. Aunque el desplazamiento ayuda a acelerar las cosas,
sigue siendo mucho más lento entrenar el desplazamiento que entrenar la
pendiente. Esto puede ralentizarlo todo y hacer que el entrenamiento sea
inestable.
Por ejemplo, nuestras suposiciones iniciales de desplazamiento y pendiente son
cero. Si cambiamos los parámetros en aproximadamente 0,1 en cada iteración,
encontraremos el desplazamiento rápidamente, pero será muy difícil encontrar
la pendiente correcta, ya que los aumentos de pendiente serán demasiado
grandes (0 + 0,1 > 0,01) y pueden sobrepasar el valor ideal. Podemos reducir los
ajustes, pero esto ralentizará el tiempo que se tarda en encontrar la
intersección.
¿Qué ocurre si escalamos nuestra característica de altura?
La pendiente de la línea ahora es 0,5. Preste atención al eje x. Nuestra
intersección óptima de -0,5 y la pendiente de 0,5 son de la misma escala. Ahora
es fácil elegir un tamaño de paso razonable, que es la rapidez con la que el
descenso de gradiente actualiza los parámetros.
El escalado ayuda con varias características
Cuando se trabaja con varias características, tener estas en una escala diferente
puede provocar problemas de ajuste, de forma similar a como lo acabamos de
ver con los ejemplos de interceptación y pendiente. Por ejemplo, si estamos
entrenando un modelo que acepta tanto la altura en mm como el peso en
toneladas métricas, muchos tipos de modelos tendrán dificultades para apreciar
la importancia de la característica del peso, simplemente porque es muy
pequeña en relación con las características de la altura.
¿Siempre es necesario escalar?
No siempre es necesario escalar. Algunos tipos de modelos, como las líneas
rectas anteriores, pueden ajustarse sin ningún procedimiento iterativo como el
descenso de gradiente y, por tanto, no les importa que las características tengan
un tamaño incorrecto. Otros modelos sí necesitan el escalado para que el
entrenamiento sea correcto, pero sus bibliotecas suelen realizar el escalado
automático de características.
Por lo general, las únicas desventajas reales de la normalización o la
estandarización son que puede dificultar la interpretación de los modelos y que
es necesario escribir algo más de código. Por esta razón, el escalado de
características es un elemento estándar de la creación de modelos de Machine
Learning.
Ejercicio: Escalado de características
Completado100 XP
8 minutos
Este módulo requiere un espacio aislado para completarse.
Un espacio aislado le da acceso a recursos gratuitos. No se le cobrará en su suscripción
personal. El espacio aislado solo podrá usarse para completar el aprendizaje en
Microsoft Learn. El uso para cualquier otro motivo está prohibido y podría generar la
pérdida permanente del acceso al espacio aislado.
Microsoft ofrece esta experiencia de laboratorio y el contenido relacionado con fines
educativos. Toda la información presentada es propiedad de Microsoft y está destinada
únicamente a brindar información sobre los productos y servicios abordados en este
módulo de Microsoft Learn.
Activar espacio aislado
Las sugerencias de enlaces de teclado de la barra de herramientas están ahora ocultas
RuntimeArchivoEditarVista
Ejecutar todo
Kernel
Proceso no conectado
Feature Scaling
Normalizing or standardizing are very similar techniques that change the range
of values that a feature has. Doing so helps models learn faster and more
robustly.
Both of these processes are commonly referred to as feature scaling.
In this exercise we'll use a dog training dataset to predict how many rescues a
dog will perform on a given year, based on how old they were when their
training began.
We will train models with and without feature scaling and compare their
behavior and results.
But first, let's load our dataset and inspect it:
CódigoMarkdown
[ ]
import pandas
!wget [Link]
to-machine-learning/main/[Link]
!wget [Link]
to-machine-learning/main/Data/[Link]
!wget [Link]
to-machine-learning/main/m1b_gradient_descent.py
data = pandas.read_csv("[Link]", delimiter="\t")
[Link]()
Presione Mayús + Entrar para ejecutar
The dataset above tells us at what age a dog began training, how many rescues,
on average, they have performed per year, and other stats, like what age they
were last year, their weight and how many rescues they performed in that
period.
Note that we also have variables expressed in different units, such
as month_old_when_trained in months, age_last_year in years,
and weight_last_year in kilograms.
Having features in widely different ranges and units is a good indicator that a
model can benefit from feature scaling.
First, let's train our model using the dataset "as is":
[ ]
from m1b_gradient_descent import gradient_descent
import numpy
import graphing
# Train model using Gradient Descent
# This method uses custom code that will print out progress as training advan
ces.
# You don't need to inspect how this works for these exercises, but if you ar
e
# curious, you can find it in out GitHub repository
model = gradient_descent(data.month_old_when_trained, data.mean_rescues_per_y
ear, learning_rate=5E-4, number_of_iterations=8000)
Presione Mayús + Entrar para ejecutar
Training Analysis
As you can see in the output above we're printing an estimate of weights and
the calculated cost at each iteration.
The final line in the output shows that the model stopped training because it
reached its maximum allowed number of iterations, but the cost could still be
lower if we had let it run longer.
Let's plot the model at the end of this training:
[ ]
# Plot the data and trendline after training
graphing.scatter_2D(data, "month_old_when_trained", "mean_rescues_per_year",
trendline=[Link])
Presione Mayús + Entrar para ejecutar
The plot above tells us that the younger a dog begins training, the more rescues
it be perform in a year.
Notice that it doesn't fit the data very well (most points are above the line).
That's due to training being cut off early, before the model could find the
optimal weights.
Standardizing data
Let's use standardization as the form of feature scaling for this model, applying
it to the month_old_when_trained feature:
[ ]
# Add the standardized verions of "age_when_trained" to the dataset.
# Notice that it "centers" the mean age around 0
data["standardized_age_when_trained"] = (data.month_old_when_trained - numpy.
mean(data.month_old_when_trained)) / ([Link](data.month_old_when_trained))
# Print a sample of the new dataset
data[:5]
Presione Mayús + Entrar para ejecutar
Notice the the values standardized_age_when_trained column above are
distributed in a much smaller range (between -2 and 2) and have their mean
centered around 0.
Visualizing Scaled Features
Let's use a box plot to compare the original feature values to their standardized
versions:
[ ]
from [Link] import make_subplots
import plotly.graph_objects as go
import [Link] as px
fig = [Link](data,y=["month_old_when_trained", "standardized_age_when_trained
"])
[Link]()
Presione Mayús + Entrar para ejecutar
Now compare the two features by hovering your mouse over the graph. You will
see that:
month_old_when_trained ranges from 1 to 71 and has its median
centered around 35.
standardized_age_when_trained ranges from -1.6381 to 1.6798, and is
centered exactly at 0.
Training with standardized features
We can now retrain our model using the standardized feature in our dataset:
[ ]
# Let's retrain our model, this time using the standardized feature
model_norm = gradient_descent(data.standardized_age_when_trained, data.mean_r
escues_per_year, learning_rate=5E-4, number_of_iterations=8000)
Presione Mayús + Entrar para ejecutar
Let's take a look at that output again.
Despite still being allowed a maximum of 8000 iterations, the model stopped at
the 5700 mark.
Why? Because this time, using the standardized feature, it was quickly able to
reach a point where the cost could no longer be improved.
In other words, it "converged" much faster than the previous version.
Plotting the standardized model
We can now plot the new model and see the results of standardization:
[ ]
# Plot the data and trendline again, after training with standardized feature
graphing.scatter_2D(data, "standardized_age_when_trained", "mean_rescues_per_
year", trendline=model_norm.predict)
Presione Mayús + Entrar para ejecutar
It looks like this model fits the data much better that the first one!
The standardized model shows a larger slope and data now centered on 0 on
the X-axis, both factors which should allow the model to converge faster.
But how much faster?
Let's plot a comparison between models to visualize the improvements.
[ ]
cost1 = model.cost_history
cost2 = model_norm.cost_history
# Creates dataframes with the cost history for each model
df1 = [Link]({"cost": cost1, "Model":"No feature scaling"})
df1["number of iterations"] = [Link] + 1
df2 = [Link]({"cost": cost2, "Model":"With feature scaling"})
df2["number of iterations"] = [Link] + 1
# Concatenate dataframes into a single one that we can use in our plot
df = [Link]([df1, df2])
# Plot cost history for both models
fig = graphing.scatter_2D(df, label_x="number of iterations", label_y="cost",
title="Training Cost vs Iterations", label_colour="Model")
fig.update_traces(mode='lines')
[Link]()
Presione Mayús + Entrar para ejecutar
This plots clearly shows that using a standardized dataset allowed our model to
converge much faster. Reaching the lowest cost and finding the optimal weights
required a much smaller number of iterations.
This is very important when you are developing a new model, as it allows you to
iterate quicker, but also when your model is deployed to a production
environment, as it will require less compute time for training and costing less
than a "slow" model.
Summary
In this exercise we covered the following concepts:
Feature scalaing techniques are used to improve the efficiency of training
models
How to add a standardized feature to a dataset
How to visualize standardized features and compare them to their original
values
Finally, we compared the performance of models before and after using
standardized features, using plots to visualize the improvements
Conjuntos de datos de prueba y
entrenamiento
Completado100 XP
4 minutos
Los datos que usamos para entrenar un modelo suelen denominarse conjunto
de datos de entrenamiento. Ya lo hemos visto en acción. Por suerte, cuando
usamos el modelo en el mundo real, después del entrenamiento, no sabemos
con certeza cómo funcionará nuestro modelo. Esta incertidumbre se debe a que
es posible que nuestro conjunto de datos de entrenamiento sea diferente a los
datos del mundo real.
¿Qué es el sobreajuste?
Un modelo se sobreajusta si funciona mejor en los datos de entrenamiento que
en otros. El nombre se refiere al hecho de que el modelo se ha ajustado tan
bien que ha memorizado detalles del conjunto de entrenamiento, en lugar de
buscar reglas generales que se apliquen a otros datos. El sobreajuste es
habitual, pero no deseable. Al final y al cabo, solo nos importa lo bien que
funciona nuestro modelo en datos del mundo real.
¿Cómo se puede evitar el sobreajuste?
El sobreajuste se puede evitar de varias maneras. La manera más sencilla es
tener un modelo más sencillo o usar un conjunto de datos que sea una
representación mejorada de lo que se ve en el mundo real. Para comprender
estos métodos, considere un escenario en el que los datos reales tengan este
aspecto:
Sin embargo, supongamos que recopilamos información solo sobre cinco
perros y la usamos como conjunto de datos de entrenamiento para ajustar una
línea compleja. Si podemos hacerlo, podremos ajustarla muy bien:
Sin embargo, cuando se use en el mundo real, veremos que realiza predicciones
que resultarán incorrectas:
Si tuviéramos un conjunto de datos más representativo y un modelo más
sencillo, la línea en la que nos ajustaríamos haría mejores predicciones, aunque
no perfectas:
Una manera gratuita de evitar el sobreajuste es detener el entrenamiento
después de que el modelo haya aprendido las reglas generales, pero antes de
que se haya sobreajustado. Sin embargo, esto requiere detectar cuándo
empezamos a sobreajustar el modelo. Podemos hacerlo mediante un conjunto
de datos de prueba.
¿Qué es un conjunto de datos de prueba?
Un conjunto de datos de prueba, también denominado conjunto de datos de
validación, es un conjunto de datos similar al conjunto de datos de
entrenamiento. De hecho, los conjuntos de datos de prueba normalmente se
crean tomando un conjunto de datos grande y dividiéndolo. Una parte se
denomina conjunto de datos de entrenamiento y la otra, conjunto de datos de
prueba.
El trabajo del conjunto de datos de entrenamiento es entrenar el modelo; ya
hemos visto el entrenamiento. El trabajo del conjunto de datos de prueba es
comprobar el funcionamiento del modelo; no contribuye al entrenamiento
directamente.
De acuerdo, pero ¿de qué sirve esto?
Un conjunto de datos de prueba sirve para dos cosas.
En primer lugar, si el rendimiento de las pruebas deja de mejorar durante el
entrenamiento, podemos detenernos, ya que no tiene sentido continuar. Si
continuamos, podemos terminar animando al modelo a obtener detalles sobre
el conjunto de datos de entrenamiento que no están en el conjunto de datos de
prueba, lo que da lugar al sobreajuste.
En segundo lugar, podemos usar un conjunto de datos de prueba después del
entrenamiento. Esto nos da una indicación de lo bien que funcionará el modelo
final cuando vea datos "reales" que no haya visto antes.
¿Qué significa eso para las funciones de costo?
Cuando usamos conjuntos de datos de entrenamiento y de prueba, terminamos
calculando dos funciones de costo.
La primera función de costo es usar el conjunto de datos de entrenamiento,
como hemos visto antes. Esta función de costo se proporciona al optimizador y
se usa para entrenar el modelo.
La segunda función de costo se calcula mediante el conjunto de datos de
prueba. Esta se usa para comprobar cómo funciona el modelo en el mundo real.
El resultado de la función de costo no se usa para entrenar el modelo. Para
calcularlo, pausamos el entrenamiento, observamos el rendimiento del modelo
en un conjunto de datos de prueba y, a continuación, reanudamos el
entrenamiento.
Ejercicio: prueba y entrenamiento de
conjuntos de datos
Completado100 XP
10 minutos
Este módulo requiere un espacio aislado para completarse.
Un espacio aislado le da acceso a recursos gratuitos. No se le cobrará en su
suscripción personal. El espacio aislado solo podrá usarse para completar el
aprendizaje en Microsoft Learn. El uso para cualquier otro motivo está prohibido
y podría generar la pérdida permanente del acceso al espacio aislado.
Microsoft ofrece esta experiencia de laboratorio y el contenido relacionado con
fines educativos. Toda la información presentada es propiedad de Microsoft y
está destinada únicamente a brindar información sobre los productos y servicios
abordados en este módulo de Microsoft Learn.
Activar espacio aislado
Las sugerencias de enlaces de teclado de la barra de herramientas están ahora ocultas
RuntimeArchivoEditarVista
Ejecutar todo
Kernel
Proceso no conectado
Training And Test Sets
We have seen previously how to fit a model to a dataset. In this exercise, we'll
be looking at how to check and confirm the validity and performance of our
models by using training and testing sets. As usual, we begin by loading in and
having a look at our data:
CódigoMarkdown
[ ]
import pandas
!pip install statsmodels
!wget [Link]
introduction-to-machine-learning/main/[Link]
!wget [Link]
introduction-to-machine-learning/main/Data/[Link]
!wget [Link]
introduction-to-machine-learning/main/Data/dog-training-
[Link]
data = pandas.read_csv("[Link]", delimiter="\t")
print([Link])
print([Link]())
Presione Mayús + Entrar para ejecutar
We are interested in the relationship between a dog's weight and the amount of
rescues it performed in the previous year. Let's begin by
plotting rescues_last_year as a function of weight_last_year:
[ ]
import graphing
import [Link] as smf
# First, we define our formula using a special syntax
# This says that rescues_last_year is explained by weight_last_year
formula = "rescues_last_year ~ weight_last_year"
model = [Link](formula = formula, data = data).fit()
graphing.scatter_2D(data, "weight_last_year", "rescues_last_year", trendli
ne = lambda x: [Link][1] * x + [Link][0])
Presione Mayús + Entrar para ejecutar
There seems to be a pretty clear relationship between a dog's weight and the
number of rescues it's performed. That seems pretty reasonable, as we would
expect heavier dogs to be bigger and stronger and thus better at saving lives!
Train/test split
This time, instead of fitting a model to the entirety of our dataset, we're going
to separate our dataset into two smaller partitions: a training set and a test set.
The training set is the largest of the two, usually made up of between 70-80% of
the overall dataset, with the rest of the dataset making up the test set. By
splitting our data, we're able to gauge the performance of our model when
confronted with previously unseen data.
Notice that data on the test set is never used in training. For that reason it's
commonly referred to as unseen data or data that is unknown by the model.
[ ]
from sklearn.model_selection import train_test_split
# Obtain the label and feature from the original data
dataset = data[['rescues_last_year','weight_last_year']]
# Split the dataset in an 70/30 train/test ratio. We also obtain the respecti
ve corresponding indices from the original dataset.
train, test = train_test_split(dataset, train_size=0.7, random_state=21)
print("Train")
print([Link]())
print([Link])
print("Test")
print([Link]())
print([Link])
Presione Mayús + Entrar para ejecutar
We can see that these sets are different, and that the training set and test
set contain 70% and 30% of the overall data respectively.
Let's have a look at how the training set and test set are separated out:
[ ]
# You don't need to understand this code well
# It's just used to create a scatter plot
# concatenate training and test so they can be graphed
plot_set = [Link]([train,test])
plot_set["Dataset"] = ["train"] * len(train) + ["test"] * len(test)
# Create graph
graphing.scatter_2D(plot_set, "weight_last_year", "rescues_last_year", "D
ataset", trendline = lambda x: [Link][1] * x + [Link][0])
Presione Mayús + Entrar para ejecutar
Training Set
We begin by training our model using the training set, and testing its
performance with the same training set:
[ ]
import [Link] as smf
from [Link] import mean_squared_error as mse
# First, we define our formula using a special syntax
# This says that rescues_last_year is explained by weight_last_year
formula = "rescues_last_year ~ weight_last_year"
# Create and train the model
model = [Link](formula = formula, data = train).fit()
# Graph the result against the data
graphing.scatter_2D(train, "weight_last_year", "rescues_last_year", trendl
ine = lambda x: [Link][1] * x + [Link][0])
Presione Mayús + Entrar para ejecutar
We can gauge our model's performance by calculating the mean squared
error (MSE).
[ ]
# We use the in-buit sklearn function to calculate the MSE
correct_labels = train['rescues_last_year']
predicted = [Link](train['weight_last_year'])
MSE = mse(correct_labels, predicted)
print('MSE = %f ' % MSE)
Presione Mayús + Entrar para ejecutar
Test Set
Next, we test the same model's performance using the test set:
[ ]
graphing.scatter_2D(test, "weight_last_year", "rescues_last_year", trendli
ne = lambda x: [Link][1] * x + [Link][0])
Presione Mayús + Entrar para ejecutar
Let's have a look at the MSE again.
[ ]
correct_labels = test['rescues_last_year']
predicted = [Link](test['weight_last_year'])
MSE = mse(correct_labels, predicted)
print('MSE = %f ' % MSE)
Presione Mayús + Entrar para ejecutar
We can see that the model performs much better on the known training
data than on the unseen test data (remember that higher MSE values are worse).
This can be down to a number of factors but first and foremost is overfitting,
which is when a model matches the data in the training set too closely. This
means that it will perform very well on the training set, but will
not generalize well. (i.e., work well with other datasets).
New Dataset
To illustrate our point further, let's have a look at how our model performs when
confronted with a completely new, unseen, and larger dataset. For our scenario,
we'll use data provided by the avalanche rescue charity's European branch.
[ ]
# Load an alternative dataset from the charity's European branch
new_data = pandas.read_csv("[Link]", delimiter="\t")
print(new_data.shape)
new_data.head()
Presione Mayús + Entrar para ejecutar
The features are the same, but we have much more data this time. Let's see how
our model does!
[ ]
# Plot the fitted model against this new dataset.
graphing.scatter_2D(new_data, "weight_last_year", "rescues_last_year", tr
endline = lambda x: [Link][1] * x + [Link][0])
Presione Mayús + Entrar para ejecutar
And now the MSE:
[ ]
correct_labels = new_data['rescues_last_year']
predicted = [Link](new_data['weight_last_year'])
MSE = mse(correct_labels, predicted)
print('MSE = %f ' % MSE)
Presione Mayús + Entrar para ejecutar
As expected, the model performs better on the training dataset as it does on the
unseen dataset. This is simply due to overfitting, as we saw previously.
Interestingly, the model performs better on this unseen dataset than it does on
the test set. This is because our previous test set was quite small, and thus not a
very good representation of 'real world' data. By contrast, this unseen dataset is
large and a much better representation of data we'll find outside of the lab. In
essence, this shows us that part of performance difference we see between
training and test is due to model overfitting, and part of the error is due to the
test set not being perfect. In the next exercises, we'll explore the trade-off we
have to make between training and test dataset sizes.
Summary
In this exercise we covered the following concepts:
Splitting a dataset into a training set and a test set.
Training a model using the training set and testing its performance on
the training set, test set, and on a new, unseen dataset.
Compared the respective MSEs to highlight the effects and dangers
of overfitting.
Matices de los conjuntos de pruebas
Completado100 XP
6 minutos
Los conjuntos de pruebas se consideran procedimientos recomendados para la
mayoría de los aspectos del aprendizaje automático, aunque el campo sigue
siendo relativamente pequeño y, por tanto, se debate exactamente cómo y
cuándo. Veamos algunos aspectos que se deben tener en cuenta.
Los conjuntos de pruebas pueden ser engañosos
Aunque los conjuntos de pruebas son útiles para identificar el
sobreentrenamiento, pueden proporcionarnos una confianza falsa. En concreto,
los conjuntos de pruebas solo son útiles si reflejan datos que esperamos ver en
el mundo real. Por ejemplo, nuestro conjunto de pruebas es muy pequeño y no
representará la variedad de datos que es probable que se vean en el mundo
real. Así mismo, los conjuntos de datos de prueba solo son tan buenos como su
origen. Si el conjunto de datos de prueba procede de un origen sesgado,
nuestras métricas no reflejarán el comportamiento en el mundo real.
Por ejemplo, supongamos que estamos intentando encontrar la relación entre el
número de rescates y la edad a la que un perro empezó a entrenar. Si nuestro
conjunto de pruebas solo contaba con tres perros, es posible que estos perros
no sean una buena representación de la amplia variedad de perros de trabajo
en el mundo real. Además, imagine que obtenemos nuestro conjunto de
pruebas de un solo criador, que no sabe cómo trabajar con cachorros. Nuestro
modelo podría predecir que los perros más mayores son los mejores para
entrenar, y nuestro conjunto de datos de prueba lo confirmaría, cuando de
hecho otros instructores podrían tener un éxito enorme con animales más
jóvenes.
Los conjuntos de pruebas no son gratuitos
Ya hemos visto que cuantos más datos de entrenamiento tengamos, menos
probable será que nuestro modelo se sobreajuste. Del mismo modo, cuanto
más grandes sean los conjuntos de pruebas, más confianza tendremos en los
resultados de las mismas. Sin embargo, normalmente trabajamos con
cantidades finitas de datos y un punto de datos no puede estar en el conjunto
de entrenamiento y en el de prueba. Esto significa que, a medida que
obtenemos conjuntos de pruebas más grandes, también obtenemos conjuntos
de datos de entrenamiento más pequeños y viceversa. La cantidad exacta de
datos que hay que sacrificar para que aparezcan en el conjunto de datos de
prueba depende de las circunstancias individuales. Lo más relativamente común
es entre un 10 y un 50 %, según el volumen de datos disponibles.
Entrenar y probar no es el único enfoque
Merece la pena tener en cuenta que el enfoque de entrenar y probar es
habitual, pero no es el único que se utiliza. Dos de las alternativas más comunes
son el enfoque de exclusión y los métodos estadísticos.
El enfoque de exclusión
El enfoque de exclusión es como el de entrenar y probar, pero en lugar de
dividir un conjunto de datos en dos, se divide en tres: entrenamiento, prueba
(también conocida como validación) y espera. Los conjuntos de datos de
entrenamiento y prueba son los que se han descrito anteriormente. El conjunto
de datos de exclusión es un tipo de conjunto de pruebas que se usa solo una
vez, cuando estamos listos para implementar nuestro modelo para su uso real.
En otras palabras, no se usa hasta que hayamos terminado de experimentar con
diferentes tipos de prácticas de entrenamiento, distintos tipos de modelos, etc.
Este enfoque aborda el hecho de que normalmente experimentamos con
diferentes modelos y prácticas de entrenamiento. Por ejemplo, ajustamos un
modelo, descubrimos que no funciona bien con el conjunto de datos de prueba,
cambiamos algunos aspectos del modelo entrenado y lo volvemos a intentar
hasta obtener un buen resultado. Esto significa que estamos modificando a
propósito el modelo para que funcione para un conjunto determinado de datos,
al igual que lo hace el entrenamiento normal con el conjunto de datos de
entrenamiento. Al hacerlo, podemos acabar con un modelo que básicamente
está demasiado entrenado para funcionar en nuestro conjunto de datos de
prueba.
La idea de un tercer conjunto de datos es que también podemos probarlo. Este
enfoque significa dividir los datos de tres maneras, lo que implica que
empezamos con incluso menos datos de entrenamiento. Si no tenemos muchos
datos con los que trabajar, este enfoque puede reducir nuestra capacidad de
obtener un buen modelo.
Enfoques estadísticos
Los modelos más sencillos que se han originado en las estadísticas a menudo
no necesitan conjuntos de datos de prueba. En cambio, el grado de sobreajuste
del modelo puede calcularse directamente como significación estadística: un
"valor p".
Estos métodos estadísticos son eficaces, están bien establecidos y forman la
base de la ciencia moderna. La ventaja es que el conjunto de entrenamiento no
tiene que dividirse nunca y obtenemos una comprensión mucho más precisa de
la confianza que podemos tener sobre un modelo. Por ejemplo, un valor p de
0,01 significa que hay una probabilidad muy pequeña de que nuestro modelo
haya encontrado una relación que realmente no exista en el mundo real. Por el
contrario, un valor p de 0,5 significa que, aunque nuestro modelo podría ser
bueno con nuestros datos de entrenamiento, no será mejor que lanzar una
moneda al aire en el mundo real.
El inconveniente de estos enfoques es que solo se aplican fácilmente a
determinados tipos de modelos, como los modelos de regresión lineal con los
que hemos estado trabajando. Para todos los modelos, salvo los más sencillos,
estos cálculos pueden ser extremadamente complejos de realizar
correctamente, por lo que están fuera del alcance de este curso. También sufren
la misma limitación con respecto a la selección de datos: si nuestros datos de
entrenamiento están sesgados, nuestros valores p serán engañosos.
Siguiente unidad: Ejercicio: matices del conjunto
de pruebas
Ejercicio: matices del conjunto de
pruebas
Completado100 XP
12 minutos
Este módulo requiere un espacio aislado para completarse.
Un espacio aislado le da acceso a recursos gratuitos. No se le cobrará en su
suscripción personal. El espacio aislado solo podrá usarse para completar el
aprendizaje en Microsoft Learn. El uso para cualquier otro motivo está prohibido
y podría generar la pérdida permanente del acceso al espacio aislado.
Microsoft ofrece esta experiencia de laboratorio y el contenido relacionado con
fines educativos. Toda la información presentada es propiedad de Microsoft y
está destinada únicamente a brindar información sobre los productos y servicios
abordados en este módulo de Microsoft Learn.
Activar espacio aislado
Las sugerencias de enlaces de teclado de la barra de herramientas están ahora ocultas
RuntimeArchivoEditarVista
Ejecutar todo
Kernel
Proceso no conectado
Test sets in depth
In the previous exercise we looked at how to split our data into training and test
sets to evaluate model performance.
We will now repeat the last exercise, but this time we'll look at what happens
when we split the data in different ways and ratios.
First let's recall what's in our dataset:
CódigoMarkdown
[ ]
import pandas
!pip install statsmodels
!wget [Link]
introduction-to-machine-learning/main/Data/[Link]
!wget [Link]
introduction-to-machine-learning/main/Data/dog-training-
[Link]
!wget [Link]
introduction-to-machine-learning/main/[Link]
import graphing
data = pandas.read_csv("[Link]", delimiter="\t")
print(f"Dataset shape: {[Link]}")
[Link]()
Presione Mayús + Entrar para ejecutar
Let's take a quick recap at what the distribution of our data looks like
(remember that we were using weight_last_year to predict the value
of rescues_last_year).
[ ]
# Obtain the label and feature from the original data
dataset = data[['rescues_last_year','weight_last_year']]
# Print the number of observations
print("No. observations:", [Link][0])
# Graph the distribution of variables for the unsplit dataset
graphing.scatter_2D(dataset, 'rescues_last_year', 'weight_last_year')
Presione Mayús + Entrar para ejecutar
Notice we have 50 observations plotted (which corresponds to the number of
samples in the dataset).
Dataset split ratio comparison
We will now split our dataset using different ratios to understand how these can
affect our models
[ ]
from sklearn.model_selection import train_test_split
# Split Dataset using different ratios 50:50, 60:40, 70:30, 80:20
train_5050, test_5050 = train_test_split(dataset, test_size=0.5, random_stat
e=2)
train_6040, test_6040 = train_test_split(dataset, test_size=0.4, random_stat
e=2)
train_7030, test_7030 = train_test_split(dataset, test_size=0.3, random_stat
e=2)
train_8020, test_8020 = train_test_split(dataset, test_size=0.2, random_stat
e=2)
# Add a column to each set to identify if a datapoint belongs to "train" or "
test"
train_5050, test_5050 = train_5050.assign(Set="train"), test_5050.assign(S
et="test")
train_6040, test_6040 = train_6040.assign(Set="train"), test_6040.assign(S
et="test")
train_7030, test_7030 = train_7030.assign(Set="train"), test_7030.assign(S
et="test")
train_8020, test_8020 = train_8020.assign(Set="train"), test_8020.assign(S
et="test")
# Concatenate the "train" and "test" sets for each split so we can plot them
on the same chart
df_5050 = [Link]([train_5050, test_5050], axis=0)
df_6040 = [Link]([train_6040, test_6040], axis=0)
df_7030 = [Link]([train_7030, test_7030], axis=0)
df_8020 = [Link]([train_8020, test_8020], axis=0)
# Plot each distribution for comparison
graphing.scatter_2D(df_5050, "weight_last_year", "rescues_last_year", title
="50:50 split", label_colour="Set", show=True)
graphing.scatter_2D(df_6040, "weight_last_year", "rescues_last_year", title
="60:40 split", label_colour="Set", show=True)
graphing.scatter_2D(df_7030, "weight_last_year", "rescues_last_year", title
="70:30 split", label_colour="Set", show=True)
graphing.scatter_2D(df_8020, "weight_last_year", "rescues_last_year", title
="80:20 split", label_colour="Set")
Presione Mayús + Entrar para ejecutar
Notice on how the first splits leave us with relatively small training datasets. On
the 50:50 split, we have only 25 samples to train with.
On the other hand, the latter ones leave us much more data for training, but
relatively little for testing. The 80:20 split leaves us with only 10 samples in
the test set!
Let's take a look at the distributions of training data for each split:
[ ]
# Add a column for each "train" set that identifies the split used
train_8020 = train_8020.assign(Split="80:20")
train_7030 = train_7030.assign(Split="70:30")
train_6040 = train_6040.assign(Split="60:40")
train_5050 = train_5050.assign(Split="50:50")
# Concatenate training sets so we can plot them on the same chart
split_df = [Link]([train_5050, train_6040, train_7030, train_8020],
axis=0)
# Plot a histogram of data distribution
graphing.multiple_histogram(split_df, label_x="rescues_last_year", label_g
roup="Split", title="Distribution of Training data")
Presione Mayús + Entrar para ejecutar
We can draw a couple of conclusions from the plot above:
1. The train_test_split() function we used does a fairly good job of
keeping a fair distribution of data across different ratios. It attempts to
keep different values represented in the same proportion.
2. When we use a 50:50 ratio, however, we have to leave so much data out
of the train set that some values aren't present anymore! (can you spot
where blue bars are missing?)
Point 2 is especially concerning since if that data isn't available for training, our
model can't learn from it, and therefore will not make accurate predictions. In
other words, using a 50:50 split doesn't look like a good idea for this dataset!
Fitting and evaluating models with different split ratios
Let's fit models using different splits, then see how they appear to perform:
[ ]
import [Link] as smf
from [Link] import mean_squared_error as mse
def train_and_test_model(name, train, test):
'''
This method creates a model, trains it on the provided data, and assesses
it against the test data
'''
# This formula says that rescues_last_year is explained by weight_last_y
ear
formula = "rescues_last_year ~ weight_last_year"
# Create and train a linear regression model using the training data
model = [Link](formula = formula, data = train).fit()
# Now evaluate the model (by calculating the Mean Squared Error) using t
he
# corresponding "test" set for that split
correct_answers = test['rescues_last_year']
predictions = [Link](test['weight_last_year'])
MSE = mse(correct_answers, predictions)
print(name + ' MSE = %f ' % MSE)
return model
# Train a model and test it for each kind of split
print("Mean Squared Error values (smaller is better)")
model_5050 = train_and_test_model("50:50", train_5050, test_5050)
model_6040 = train_and_test_model("60:40", train_6040, test_6040)
model_7030 = train_and_test_model("70:30", train_7030, test_7030)
model_8020 = train_and_test_model("80:20", train_8020, test_8020)
Presione Mayús + Entrar para ejecutar
The code above trains one model for each ratio, using the
corresponding train set for that ratio. It then calculates the MSE (Mean Squared
Error) for each model, using its corresponding test set.
The results seem mixed. The 80:20 ratio was best, but there is no clear pattern
as to whether growing or shrinking the training set is helpful.
Two things are influencing our results. Firstly, the larger the test set, the more
we can trust the test results. Secondly, models usually will train better with
larger training sets.
These influences are at odds with one another, and how influential they're is
exaggerated here because our dataset it very small. In this particular situation
it's hard to assess whether the 60:40 split is truly better than the 70:30 split, for
example. This is because the 70:30 split might just give the appearance of
being worse because it was tested against a less-representative (smaller) test
set.
Model evaluation
Let's take a look now what happens when these models are used against a
much larger dataset that it was not trained or tested on. This can happen in the
real world because we choose to hold-back data in the beginning, or simply
because we collect data after training our model. In our current scenario, this is
new data given to us by our avalanche-rescue charity's European arm.
[ ]
import [Link] as smf
from [Link] import mean_squared_error as mse
# Load some dog statistics from our charity's European arm
swiss_data = pandas.read_csv("[Link]", delimiter="\t")
# Show show information about the data
print(f"The Swiss dataset contains {swiss_data.shape[0]} samples")
graphing.scatter_2D(swiss_data, 'rescues_last_year', 'weight_last_year')
Presione Mayús + Entrar para ejecutar
This is clearly a much larger sample of data. Let's see how our models perform.
Note that we aren't re-training the models here; we're simply using them to
make predictions on a new dataset to assess how well they perform.
[ ]
# Test our models against the swiss data
features = swiss_data['weight_last_year']
correct_answers = swiss_data['rescues_last_year']
# We will now assess our models. Notice we're not training them again.
# We are simply testing them against some new data
# Assess the model trained on a 50:50 split
predictions = model_5050.predict(features)
MSE = mse(correct_answers, predictions)
print('50:50 MSE = %f ' % MSE)
# Assess the model trained on a 60:40 split
predictions = model_6040.predict(features)
MSE = mse(correct_answers, predictions)
print('60:40 MSE = %f ' % MSE)
# Assess the model trained on a 70:30 split
predictions = model_7030.predict(features)
MSE = mse(correct_answers, predictions)
print('70:30 MSE = %f ' % MSE)
# Assess the model trained on a 80:20 split
predictions = model_8020.predict(features)
MSE = mse(correct_answers, predictions)
print('80:20 MSE = %f ' % MSE)
Presione Mayús + Entrar para ejecutar
With this larger dataset, the model using to 80:20 split yielded the lowest error,
and thus the best performance. There is also a clear pattern, where the larger
the training dataset, the better the model could perform after training.
Together, this shows that we should try and evaluate different train/test splits
when building Machine Learning models, and that generally splits that favor
the train set with more data will yield better results.
Summary
In this exercise you learned the following concepts:
You can use different ratios when splitting your dataset into train and test sets.
Different ratios yield different distributions of variables in the
resulting train and test sets.
When the train:test ratios are close, you are possibly leaving a lot of data out of
the training set, and that can have a negative impact on your model's
performance.
When building models, it's important to test them using different train/test
splits. Simply assigning more data to the train set doesn't always guarantee the
best results.
¿Qué es la regresión?
Completado100 XP
8 minutos
La regresión consiste en establecer una relación entre las variables de los datos
que representan propiedades (conocidas como características) de lo que se está
observando y la variable que se está intentando predecir (conocida
como etiqueta). Recuerde nuestra empresa que alquila bicicletas y quiere
predecir el número esperado de alquileres en un día determinado. En este caso,
las características incluyen cosas como el día de la semana, el mes, etc., y la
etiqueta es el número de alquileres de bicicletas.
Para entrenar el modelo, comenzamos con una muestra de datos que contiene
las características, así como los valores conocidos de la etiqueta, por lo que, en
este caso, necesitamos datos históricos que incluyan fechas, condiciones
meteorológicas y el número de alquileres de bicicletas.
A continuación, esta muestra de datos se divide en dos subconjuntos:
Un conjunto de datos de entrenamiento al que aplicaremos un algoritmo
que determina una función que encapsula la relación entre los valores de
las características y los valores de etiqueta conocidos.
Un conjunto de datos de validación o de prueba que se puede usar para
evaluar el modelo mediante su uso para generar predicciones para la
etiqueta y su comparación con los valores de etiqueta conocidos reales.
El uso de datos históricos con valores de etiqueta conocidos para entrenar un
modelo hace que la regresión sea un ejemplo de aprendizaje
automático supervisado.
Un ejemplo sencillo
Observemos un ejemplo sencillo para ver cómo funciona el proceso de
entrenamiento y evaluación en principio. Simplifiquemos el escenario para que
se use una sola característica, la temperatura media diaria, para predecir la
etiqueta de alquileres de bicicletas.
Comenzamos con algunos datos que incluyen valores conocidos para la
característica de temperatura media diaria y la etiqueta de alquileres de
bicicletas.
Temperatura Alquileres
56 115
61 126
67 137
72 140
76 152
82 156
54 114
62 129
Ahora seleccionaremos aleatoriamente cinco de estas observaciones y las
usaremos para entrenar un modelo de regresión. Cuando hablamos de
"entrenar un modelo", lo que queremos decir es encontrar una función (una
ecuación matemática; vamos a llamarla f) que puede usar la característica de
temperatura (a la que llamaremos x) para calcular el número de alquileres (que
llamaremos y). En otras palabras, tenemos que definir la función
siguiente: f(x) = y.
Nuestro conjunto de datos de entrenamiento tiene el siguiente aspecto:
x y
56 115
61 126
67 137
72 140
76 152
Comencemos por trazar los valores de entrenamiento de x e y en un gráfico:
Ahora es necesario ajustar estos valores a una función, permitiendo una cierta
variación aleatoria. Probablemente pueda ver que los puntos trazados forman
casi una línea recta diagonal; es decir, existe una supuesta
relación lineal entre x e y, por lo que tenemos que encontrar una función lineal
que se ajuste de la mejor manera a la muestra de datos. Hay varios algoritmos
que se pueden usar para establecer esta función que, en definitiva, buscará una
línea recta con la varianza total mínima de los puntos trazados, de este modo:
La línea representa una función lineal que se puede usar con cualquier valor
de x para aplicar la pendiente de la línea y su intersección (donde la línea cruza
el eje y cuando x es 0) para calcular y. En este caso, si extendiésemos la línea a
la izquierda, veríamos que cuando x es 0, y es aproximadamente 20, y la
pendiente de la línea es tal que para cada unidad de x que avanza hacia la
derecha, y aumenta aproximadamente 1,7. Por lo tanto, la función f se puede
calcular como 20 + 1,7x.
Ahora que hemos definido la función de predicción, podemos usarla para
predecir las etiquetas para los datos de validación que retuvimos y comparar los
valores de predicción (lo que normalmente se indica con el símbolo ŷ, o "y con
acento circunflejo") con los valores de y conocidos reales.
x y ŷ
82 156 159,4
54 114 111,8
62 129 125,4
Veamos la comparación de los valores de y e ŷ en un trazado:
Los puntos trazados que se encuentran en la línea de función son los valores
de ŷ predichos calculados por la función, y los otros puntos trazados son los
valores de y reales.
Hay varias maneras de medir la varianza entre los valores predichos y los reales,
y podemos usar estas métricas para evaluar el grado de predicción del modelo.
Nota
El aprendizaje automático se basa en estadísticas y matemáticas, y es
importante tener en cuenta los términos específicos que usan los estadísticos y
matemáticos (y, por lo tanto, los científicos de datos). Puede considerar la
diferencia entre un valor de etiqueta predicho y el valor real de la etiqueta como
una medida del error. Sin embargo, en la práctica, los valores "reales" se basan
en observaciones de ejemplo (que a su vez pueden estar sujetas a una varianza
aleatoria). Para que quede claro que estamos comparando un valor predicho (ŷ)
con un valor observado (y), nos referimos a la diferencia entre ellos
como residuales. Podemos resumir los residuales de todas las predicciones de
datos de validación para calcular la pérdida general del modelo como medida
de su rendimiento predictivo.
Una de las formas más comunes de medir la pérdida es elevar al cuadrado los
residuales individuales, sumar los cuadrados y calcular la media. Elevar el valor
residual al cuadrado tiene el efecto de basar el cálculo en valores absolutos (sin
hacer caso a si la diferencia es negativa o positiva) y dar mayor ponderación a
las diferencias más grandes. Esta métrica se denomina error cuadrático medio.
En el caso de los datos de validación, el cálculo tiene el siguiente aspecto:
s ŷ y - ŷ (y - ŷ)2
156 159,4 -3,4 11,56
114 111,8 2.2 4.84
129 125,4 3.6 12,96
Sum ∑ 29,36
Media x̄ 9,79
Por lo tanto, la pérdida del modelo basada en la métrica del ECM es de 9,79.
¿Es bueno eso? Es difícil de saber porque el valor del ECM no se expresa en una
unidad de medida significativa. Sabemos que cuanto menor sea el valor, menos
pérdida tendrá el modelo; y, por tanto, mejor será la predicción. Esto lo
convierte en una métrica útil para comparar dos modelos y encontrar el que
tenga mejor rendimiento.
A veces, resulta más útil expresar la pérdida en la misma unidad de medida que
el propio valor de etiqueta predicho, en este caso, el número de alquileres. Es
posible hacer esto si se calcula la raíz cuadrada del ECM, lo que genera una
métrica conocida, evidentemente, como raíz del error cuadrático
medio (RECM).
√9,79 = 3,13
Por lo tanto, la RECM del modelo indica que la pérdida está apenas por encima
de 3, lo que se puede interpretar de forma flexible como que, en promedio, las
predicciones incorrectas se equivocan en unos 3 alquileres.
Hay muchas otras métricas que se pueden usar para medir la pérdida en una
regresión. Por ejemplo, R2 (R al cuadrado) (a veces conocido como coeficiente
de determinación) es la correlación entre x e y al cuadrado. Esto genera un valor
entre 0 y 1 que mide la cantidad de varianza que se puede explicar por el
modelo. En general, cuanto más se acerque a 1 este valor, mejor será la
predicción del modelo.
Siguiente unidad: Ejercicio: Entrenamiento y
evaluación de un modelo de regresión
Ejercicio: Entrenamiento y evaluación
de un modelo de regresión
Completado100 XP
8 minutos
Este módulo requiere un espacio aislado para completarse.
Un espacio aislado le da acceso a recursos gratuitos. No se le cobrará en su
suscripción personal. El espacio aislado solo podrá usarse para completar el
aprendizaje en Microsoft Learn. El uso para cualquier otro motivo está prohibido
y podría generar la pérdida permanente del acceso al espacio aislado.
Microsoft ofrece esta experiencia de laboratorio y el contenido relacionado con
fines educativos. Toda la información presentada es propiedad de Microsoft y
está destinada únicamente a brindar información sobre los productos y servicios
abordados en este módulo de Microsoft Learn.
Activar espacio aislado
Las sugerencias de enlaces de teclado de la barra de herramientas están ahora ocultas
RuntimeArchivoEditarVista
Ejecutar todo
Kernel
Proceso no conectado
Regression
Supervised machine learning techniques involve training a model to operate on
a set of features and predict a label using a dataset that includes some already-
known label values. The training process fits the features to the known labels to
define a general function that can be applied to new features for which the
labels are unknown, and predict them. You can think of this function like this, in
which y represents the label we want to predict and x represents the features
the model uses to predict it.
y=f(x)�=�(�)
In most cases, x is actually a vector that consists of multiple feature values, so to
be a little more precise, the function could be expressed like this:
y=f([x1,x2,x3,...])�=�([�1,�2,�3,...])
The goal of training the model is to find a function that performs some kind of
calculation to the x values that produces the result y. We do this by applying a
machine learning algorithm that tries to fit the x values to a calculation that
produces y reasonably accurately for all of the cases in the training dataset.
There are lots of machine learning algorithms for supervised learning, and they
can be broadly divided into two types:
Regression algorithms: Algorithms that predict a y value that is a numeric
value, such as the price of a house or the number of sales transactions.
Classification algorithms: Algorithms that predict to which category, or class,
an observation belongs. The y value in a classification model is a vector of
probability values between 0 and 1, one for each class, indicating the probability
of the observation belonging to each class.
In this notebook, we'll focus on regression, using an example based on a real
study in which data for a bicycle sharing scheme was collected and used to
predict the number of rentals based on seasonality and weather conditions.
We'll use a simplified version of the dataset from that study.
Citation: The data used in this exercise is derived from Capital Bikeshare and is
used in accordance with the published license agreement.
Explore the Data
The first step in any machine learning project is to explore the data that you will
use to train a model. The goal of this exploration is to try to understand the
relationships between its attributes; in particular, any apparent correlation
between the features and the label your model will try to predict. This may
require some work to detect and fix issues in the data (such as dealing with
missing values, errors, or outlier values), deriving new feature columns by
transforming or combining existing features (a process known as feature
engineering), normalizing numeric features (values you can measure or count) so
they're on a similar scale, and encoding categorical features (values that
represent discrete categories) as numeric indicators.
Let's start by loading the bicycle sharing data as a Pandas DataFrame and
viewing the first few rows.
CódigoMarkdown
[ ]
import pandas as pd
# load the training dataset
!wget [Link]
to-machine-learning/main/Data/ml-basics/[Link]
bike_data = pd.read_csv('[Link]')
bike_data.head()
Presione Mayús + Entrar para ejecutar
The data consists of the following columns:
instant: A unique row identifier
dteday: The date on which the data was observed - in this case, the data was
collected daily; so there's one row per date.
season: A numerically encoded value indicating the season (1:winter, 2:spring,
3:summer, 4:fall)
yr: The year of the study in which the observation was made (the study took
place over two years - year 0 represents 2011, and year 1 represents 2012)
mnth: The calendar month in which the observation was made (1:January ...
12:December)
holiday: A binary value indicating whether or not the observation was made on
a public holiday)
weekday: The day of the week on which the observation was made (0:Sunday ...
6:Saturday)
workingday: A binary value indicating whether or not the day is a working day
(not a weekend or holiday)
weathersit: A categorical value indicating the weather situation (1:clear,
2:mist/cloud, 3:light rain/snow, 4:heavy rain/hail/snow/fog)
temp: The temperature in celsius (normalized)
atemp: The apparent ("feels-like") temperature in celsius (normalized)
hum: The humidity level (normalized)
windspeed: The windspeed (normalized)
rentals: The number of bicycle rentals recorded.
In this dataset, rentals represents the label (the y value) our model must be
trained to predict. The other columns are potential features (x values).
As mentioned previously, you can perform some feature engineering to combine
or derive new features. For example, let's add a new column named day to the
dataframe by extracting the day component from the existing dteday column.
The new column represents the day of the month from 1 to 31.
[ ]
bike_data['day'] = [Link](bike_data['dteday']).day
bike_data.head(32)
Presione Mayús + Entrar para ejecutar
OK, let's start our analysis of the data by examining a few key descriptive
statistics. We can use the dataframe's describe method to generate these for
the numeric features as well as the rentals label column.
[ ]
numeric_features = ['temp', 'atemp', 'hum', 'windspeed']
bike_data[numeric_features + ['rentals']].describe()
Presione Mayús + Entrar para ejecutar
The statistics reveal some information about the distribution of the data in each
of the numeric fields, including the number of observations (there are 731
records), the mean, standard deviation, minimum and maximum values, and the
quartile values (the threshold values for 25%, 50% - which is also the median,
and 75% of the data). From this, we can see that the mean number of daily
rentals is around 848; but there's a comparatively large standard deviation,
indicating a lot of variance in the number of rentals per day.
We might get a clearer idea of the distribution of rentals values by visualizing
the data. Common plot types for visualizing numeric data distributions
are histograms and box plots, so let's use Python's matplotlib library to create
one of each of these for the rentals column.
[ ]
import pandas as pd
import [Link] as plt
# This ensures plots are displayed inline in the Jupyter notebook
%matplotlib inline
# Get the label column
label = bike_data['rentals']
# Create a figure for 2 subplots (2 rows, 1 column)
fig, ax = [Link](2, 1, figsize = (9,12))
# Plot the histogram
ax[0].hist(label, bins=100)
ax[0].set_ylabel('Frequency')
# Add lines for the mean, median, and mode
ax[0].axvline([Link](), color='magenta', linestyle='dashed', linewidth=2)
ax[0].axvline([Link](), color='cyan', linestyle='dashed', linewidth=2)
# Plot the boxplot
ax[1].boxplot(label, vert=False)
ax[1].set_xlabel('Rentals')
# Add a title to the Figure
[Link]('Rental Distribution')
# Show the figure
[Link]()
Presione Mayús + Entrar para ejecutar
The plots show that the number of daily rentals ranges from 0 to just over 3,400.
However, the mean (and median) number of daily rentals is closer to the low
end of that range, with most of the data between 0 and around 2,200 rentals.
The few values above this are shown in the box plot as small circles, indicating
that they are outliers - in other words, unusually high or low values beyond the
typical range of most of the data.
We can do the same kind of visual exploration of the numeric features. Let's
create a histogram for each of these.
[ ]
# Plot a histogram for each numeric feature
for col in numeric_features:
fig = [Link](figsize=(9, 6))
ax = [Link]()
feature = bike_data[col]
[Link](bins=100, ax = ax)
[Link]([Link](), color='magenta', linestyle='dashed', linewidth
=2)
[Link]([Link](), color='cyan', linestyle='dashed', linewidth=
2)
ax.set_title(col)
[Link]()
Presione Mayús + Entrar para ejecutar
The numeric features seem to be more normally distributed, with the mean and
median nearer the middle of the range of values, coinciding with where the
most commonly occurring values are.
Note: The distributions are not truly normal in the statistical sense, which would
result in a smooth, symmetric "bell-curve" histogram with the mean and mode
(the most common value) in the center; but they do generally indicate that most
of the observations have a value somewhere near the middle.
We've explored the distribution of the numeric values in the dataset, but what
about the categorical features? These aren't continuous numbers on a scale, so
we can't use histograms; but we can plot a bar chart showing the count of each
discrete value for each category.
[ ]
import numpy as np
# plot a bar plot for each categorical feature count
categorical_features = ['season','mnth','holiday','weekday','workingday','wea
thersit', 'day']
for col in categorical_features:
counts = bike_data[col].value_counts().sort_index()
fig = [Link](figsize=(9, 6))
ax = [Link]()
[Link](ax = ax, color='steelblue')
ax.set_title(col + ' counts')
ax.set_xlabel(col)
ax.set_ylabel("Frequency")
[Link]()
Presione Mayús + Entrar para ejecutar
Many of the categorical features show a more or less uniform distribution
(meaning there's roughly the same number of rows for each category).
Exceptions to this include:
holiday: There are many fewer days that are holidays than days that aren't.
workingday: There are more working days than non-working days.
weathersit: Most days are category 1 (clear), with category 2 (mist and cloud)
the next most common. There are comparatively few category 3 (light rain or
snow) days, and no category 4 (heavy rain, hail, or fog) days at all.
Now that we know something about the distribution of the data in our columns,
we can start to look for relationships between the features and the rentals label
we want to be able to predict.
For the numeric features, we can create scatter plots that show the intersection
of feature and label values. We can also calculate the correlation statistic to
quantify the apparent relationship..
[ ]
for col in numeric_features:
fig = [Link](figsize=(9, 6))
ax = [Link]()
feature = bike_data[col]
label = bike_data['rentals']
correlation = [Link](label)
[Link](x=feature, y=label)
[Link](col)
[Link]('Bike Rentals')
ax.set_title('rentals vs ' + col + '- correlation: ' + str(correlation))
[Link]()
Presione Mayús + Entrar para ejecutar
The results aren't conclusive, but if you look closely at the scatter plots
for temp and atemp, you can see a vague diagonal trend showing that higher
rental counts tend to coincide with higher temperatures; and a correlation value
of just over 0.5 for both of these features supports this observation. Conversely,
the plots for hum and windspeed show a slightly negative correlation,
indicating that there are fewer rentals on days with high humidity or windspeed.
Now let's compare the categorical features to the label. We'll do this by creating
box plots that show the distribution of rental counts for each category.
[ ]
# plot a boxplot for the label by each categorical feature
for col in categorical_features:
fig = [Link](figsize=(9, 6))
ax = [Link]()
bike_data.boxplot(column = 'rentals', by = col, ax = ax)
ax.set_title('Label by ' + col)
ax.set_ylabel("Bike Rentals")
[Link]()
Presione Mayús + Entrar para ejecutar
The plots show some variance in the relationship between some category values
and rentals. For example, there's a clear difference in the distribution of rentals
on weekends (weekday 0 or 6) and those during the working week (weekday 1
to 5). Similarly, there are notable differences
for holiday and workingday categories. There's a noticeable trend that shows
different rental distributions in spring and summer months compared to winter
and fall months. The weathersit category also seems to make a difference in
rental distribution. The day feature we created for the day of the month shows
little variation, indicating that it's probably not predictive of the number of
rentals.
Train a Regression Model
Now that we've explored the data, it's time to use it to train a regression model
that uses the features we've identified as potentially predictive to predict
the rentals label. The first thing we need to do is to separate the features we
want to use to train the model from the label we want it to predict.
[ ]
# Separate features and labels
X, y = bike_data[['season','mnth', 'holiday','weekday','workingday','weathers
it','temp', 'atemp', 'hum', 'windspeed']].values, bike_data['rentals'].values
print('Features:',X[:10], '\nLabels:', y[:10], sep='\n')
Presione Mayús + Entrar para ejecutar
After separating the dataset, we now have numpy arrays named X containing
the features, and y containing the labels.
We could train a model using all of the data; but it's common practice in
supervised learning to split the data into two subsets; a (typically larger) set with
which to train the model, and a smaller "hold-back" set with which to validate
the trained model. This enables us to evaluate how well the model performs
when used with the validation dataset by comparing the predicted labels to the
known labels. It's important to split the data randomly (rather than say, taking
the first 70% of the data for training and keeping the rest for validation). This
helps ensure that the two subsets of data are statistically comparable (so we
validate the model with data that has a similar statistical distribution to the data
on which it was trained).
To randomly split the data, we'll use the train_test_split function in the scikit-
learn library. This library is one of the most widely used machine learning
packages for Python.
[ ]
from sklearn.model_selection import train_test_split
# Split data 70%-30% into training set and test set
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30, ran
dom_state=0)
print ('Training Set: %d rows\nTest Set: %d rows' % (X_train.shape[0], X_tes
[Link][0]))
Presione Mayús + Entrar para ejecutar
Now we have the following four datasets:
X_train: The feature values we'll use to train the model
y_train: The corresponding labels we'll use to train the model
X_test: The feature values we'll use to validate the model
y_test: The corresponding labels we'll use to validate the model
Now we're ready to train a model by fitting a suitable regression algorithm to
the training data. We'll use a linear regression algorithm, a common starting
point for regression that works by trying to find a linear relationship between
the X values and the y label. The resulting model is a function that conceptually
defines a line where every possible X and y value combination intersect.
In Scikit-Learn, training algorithms are encapsulated in estimators, and in this
case we'll use the LinearRegression estimator to train a linear regression
model.
[ ]
# Train the model
from sklearn.linear_model import LinearRegression
# Fit a linear regression model on the training set
model = LinearRegression().fit(X_train, y_train)
print (model)
Presione Mayús + Entrar para ejecutar
Evaluate the Trained Model
Now that we've trained the model, we can use it to predict rental counts for the
features we held back in our validation dataset. Then we can compare these
predictions to the actual label values to evaluate how well (or not!) the model is
working.
[ ]
import numpy as np
predictions = [Link](X_test)
np.set_printoptions(suppress=True)
print('Predicted labels: ', [Link](predictions)[:10])
print('Actual labels : ' ,y_test[:10])
Presione Mayús + Entrar para ejecutar
Comparing each prediction with its corresponding "ground truth" actual value
isn't a very efficient way to determine how well the model is predicting. Let's see
if we can get a better indication by visualizing a scatter plot that compares the
predictions to the actual labels. We'll also overlay a trend line to get a general
sense for how well the predicted labels align with the true labels.
[ ]
import [Link] as plt
%matplotlib inline
[Link](y_test, predictions)
[Link]('Actual Labels')
[Link]('Predicted Labels')
[Link]('Daily Bike Share Predictions')
# overlay the regression line
z = [Link](y_test, predictions, 1)
p = np.poly1d(z)
[Link](y_test,p(y_test), color='magenta')
[Link]()
Presione Mayús + Entrar para ejecutar
There's a definite diagonal trend, and the intersections of the predicted and
actual values are generally following the path of the trend line; but there's a fair
amount of difference between the ideal function represented by the line and the
results. This variance represents the residuals of the model - in other words, the
difference between the label predicted when the model applies the coefficients
it learned during training to the validation data, and the actual value of the
validation label. These residuals when evaluated from the validation data
indicate the expected level of error when the model is used with new data for
which the label is unknown.
You can quantify the residuals by calculating a number of commonly used
evaluation metrics. We'll focus on the following three:
Mean Square Error (MSE): The mean of the squared differences between
predicted and actual values. This yields a relative metric in which the smaller the
value, the better the fit of the model
Root Mean Square Error (RMSE): The square root of the MSE. This yields an
absolute metric in the same unit as the label (in this case, numbers of rentals).
The smaller the value, the better the model (in a simplistic sense, it represents
the average number of rentals by which the predictions are wrong!)
Coefficient of Determination (usually known as R-squared or R2): A relative
metric in which the higher the value, the better the fit of the model. In essence,
this metric represents how much of the variance between predicted and actual
label values the model is able to explain.
Note: You can find out more about these and other metrics for evaluating
regression models in the Scikit-Learn documentation
Let's use Scikit-Learn to calculate these metrics for our model, based on the
predictions it generated for the validation data.
[ ]
from [Link] import mean_squared_error, r2_score
mse = mean_squared_error(y_test, predictions)
print("MSE:", mse)
rmse = [Link](mse)
print("RMSE:", rmse)
r2 = r2_score(y_test, predictions)
print("R2:", r2)
Presione Mayús + Entrar para ejecutar
So now we've quantified the ability of our model to predict the number of
rentals. It definitely has some predictive power, but we can probably do better!
Summary
Here we've explored our data and fit a basic regression model. In the next
notebook, we will try a number of other regression algorithms to improve
performance
Further Reading
To learn more about Scikit-Learn, see the Scikit-Learn documentation.
Descubrimiento de nuevos modelos
de regresión
Completado100 XP
5 minutos
En la unidad 2, hemos visto cómo ajustar una línea recta a los puntos de datos.
Sin embargo, la regresión puede ajustarse a muchos tipos de relaciones,
incluidas aquellas con varios factores y aquellas en las que la importancia de un
factor depende de otro.
Experimentación con modelos
A menudo se eligen los modelos de regresión porque funcionan con muestras
de datos pequeñas, son sólidos, fáciles de interpretar y existe una gran variedad.
La regresión lineal es la forma más simple de regresión, sin límite en cuanto al
número de características usadas. La regresión lineal se presenta de diversas
formas y, a menudo, se las denomina en función del número de características
usadas y la forma de la curva que mejor se ajusta.
Los árboles de decisión adoptan un enfoque paso a paso para predecir una
variable. Si pensamos en el ejemplo de las bicicletas, el árbol de decisión puede
dividir primero los ejemplos entre los que son durante primavera y verano y
otoño e invierno, para hacer una predicción basada en el día de la semana. El
lunes de primavera y verano puede tener una tasa de alquiler de bicicletas de
100 al día, mientras que el lunes de otoño e invierno puede tener una tasa de
alquiler de 20 al día.
Los algoritmos de conjunto construyen no solo un árbol de decisión, sino un
gran número de árboles, lo que permite realizar mejores predicciones sobre
datos más complejos. Los algoritmos de conjunto, como bosque aleatorio, se
usan ampliamente en el aprendizaje automático y en la ciencia debido a sus
sólidas capacidades de predicción.
Los científicos de datos suelen experimentar con el uso de modelos diferentes.
En el ejercicio siguiente, experimentaremos con diferentes tipos de modelos
para comparar su rendimiento con los mismos datos.
Siguiente unidad: Ejercicio: Experimentación con
los modelos de regresión más eficaces
Ejercicio: Experimentación con los
modelos de regresión más eficaces
Completado100 XP
10 minutos
Este módulo requiere un espacio aislado para completarse.
Un espacio aislado le da acceso a recursos gratuitos. No se le cobrará en su
suscripción personal. El espacio aislado solo podrá usarse para completar el
aprendizaje en Microsoft Learn. El uso para cualquier otro motivo está prohibido
y podría generar la pérdida permanente del acceso al espacio aislado.
Microsoft ofrece esta experiencia de laboratorio y el contenido relacionado con
fines educativos. Toda la información presentada es propiedad de Microsoft y
está destinada únicamente a brindar información sobre los productos y servicios
abordados en este módulo de Microsoft Learn.
Activar espacio aislado
Las sugerencias de enlaces de teclado de la barra de herramientas están ahora ocultas
RuntimeArchivoEditarVista
Ejecutar todo
Kernel
Proceso no conectado
Regression - Experimenting with additional
models
In the previous notebook, we used simple regression models to look at the
relationship between features of a bike rentals dataset. In this notebook, we'll
experiment with more complex models to improve our regression performance.
Let's start by loading the bicycle sharing data as a Pandas DataFrame and
viewing the first few rows. We'll also split our data into training and test
datasets.
CódigoMarkdown
[ ]
# Import modules we'll need for this notebook
import pandas as pd
from sklearn.linear_model import LinearRegression
from [Link] import mean_squared_error, r2_score
from sklearn.model_selection import train_test_split
import numpy as np
import [Link] as plt
%matplotlib inline
# load the training dataset
!wget [Link]
to-machine-learning/main/Data/ml-basics/[Link]
bike_data = pd.read_csv('[Link]')
bike_data['day'] = [Link](bike_data['dteday']).day
numeric_features = ['temp', 'atemp', 'hum', 'windspeed']
categorical_features = ['season','mnth','holiday','weekday','workingday','wea
thersit', 'day']
bike_data[numeric_features + ['rentals']].describe()
print(bike_data.head())
# Separate features and labels
# After separating the dataset, we now have numpy arrays named **X** c
ontaining the features, and **y** containing the labels.
X, y = bike_data[['season','mnth', 'holiday','weekday','workingday','weathers
it','temp', 'atemp', 'hum', 'windspeed']].values, bike_data['rentals'].values
# Split data 70%-30% into training set and test set
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30, ran
dom_state=0)
print ('Training Set: %d rows\nTest Set: %d rows' % (X_train.shape[0], X_tes
[Link][0]))
Presione Mayús + Entrar para ejecutar
Now we have the following four datasets:
X_train: The feature values we'll use to train the model
y_train: The corresponding labels we'll use to train the model
X_test: The feature values we'll use to validate the model
y_test: The corresponding labels we'll use to validate the model
Now we're ready to train a model by fitting a suitable regression algorithm to
the training data.
Experiment with Algorithms
The linear regression algorithm we used last time to train the model has some
predictive capability, but there are many kinds of regression algorithm we could
try, including:
Linear algorithms: Not just the Linear Regression algorithm we used above
(which is technically an Ordinary Least Squares algorithm), but other variants
such as Lasso and Ridge.
Tree-based algorithms: Algorithms that build a decision tree to reach a
prediction.
Ensemble algorithms: Algorithms that combine the outputs of multiple base
algorithms to improve generalizability.
Note: For a full list of Scikit-Learn estimators that encapsulate algorithms for
supervised machine learning, see the Scikit-Learn documentation. There are
many algorithms to choose from, but for most real-world scenarios, the Scikit-
Learn estimator cheat sheet can help you find a suitable starting point.
Try Another Linear Algorithm
Let's try training our regression model by using a Lasso algorithm. We can do
this by just changing the estimator in the training code.
[ ]
from sklearn.linear_model import Lasso
# Fit a lasso model on the training set
model = Lasso().fit(X_train, y_train)
print (model, "\n")
# Evaluate the model using the test data
predictions = [Link](X_test)
mse = mean_squared_error(y_test, predictions)
print("MSE:", mse)
rmse = [Link](mse)
print("RMSE:", rmse)
r2 = r2_score(y_test, predictions)
print("R2:", r2)
# Plot predicted vs actual
[Link](y_test, predictions)
[Link]('Actual Labels')
[Link]('Predicted Labels')
[Link]('Daily Bike Share Predictions')
# overlay the regression line
z = [Link](y_test, predictions, 1)
p = np.poly1d(z)
[Link](y_test,p(y_test), color='magenta')
[Link]()
Presione Mayús + Entrar para ejecutar
Try a Decision Tree Algorithm
As an alternative to a linear model, there's a category of algorithms for machine
learning that uses a tree-based approach in which the features in the dataset
are examined in a series of evaluations, each of which results in a branch in
a decision tree based on the feature value. At the end of each series of branches
are leaf-nodes with the predicted label value based on the feature values.
It's easiest to see how this works with an example. Let's train a Decision Tree
regression model using the bike rental data. After training the model, the code
below will print the model definition and a text representation of the tree it uses
to predict label values.
[ ]
from [Link] import DecisionTreeRegressor
from [Link] import export_text
# Train the model
model = DecisionTreeRegressor().fit(X_train, y_train)
print (model, "\n")
# Visualize the model tree
tree = export_text(model)
print(tree)
Presione Mayús + Entrar para ejecutar
So now we have a tree-based model; but is it any good? Let's evaluate it with
the test data.
[ ]
# Evaluate the model using the test data
predictions = [Link](X_test)
mse = mean_squared_error(y_test, predictions)
print("MSE:", mse)
rmse = [Link](mse)
print("RMSE:", rmse)
r2 = r2_score(y_test, predictions)
print("R2:", r2)
# Plot predicted vs actual
[Link](y_test, predictions)
[Link]('Actual Labels')
[Link]('Predicted Labels')
[Link]('Daily Bike Share Predictions')
# overlay the regression line
z = [Link](y_test, predictions, 1)
p = np.poly1d(z)
[Link](y_test,p(y_test), color='magenta')
[Link]()
Presione Mayús + Entrar para ejecutar
The tree-based model doesn't seem to have improved over the linear model, so
what else could we try?
Try an Ensemble Algorithm
Ensemble algorithms work by combining multiple base estimators to produce
an optimal model, either by applying an aggregate function to a collection of
base models (sometimes referred to a bagging) or by building a sequence of
models that build on one another to improve predictive performance (referred
to as boosting).
For example, let's try a Random Forest model, which applies an averaging
function to multiple Decision Tree models for a better overall model.
[ ]
from [Link] import RandomForestRegressor
# Train the model
model = RandomForestRegressor().fit(X_train, y_train)
print (model, "\n")
# Evaluate the model using the test data
predictions = [Link](X_test)
mse = mean_squared_error(y_test, predictions)
print("MSE:", mse)
rmse = [Link](mse)
print("RMSE:", rmse)
r2 = r2_score(y_test, predictions)
print("R2:", r2)
# Plot predicted vs actual
[Link](y_test, predictions)
[Link]('Actual Labels')
[Link]('Predicted Labels')
[Link]('Daily Bike Share Predictions')
# overlay the regression line
z = [Link](y_test, predictions, 1)
p = np.poly1d(z)
[Link](y_test,p(y_test), color='magenta')
[Link]()
Presione Mayús + Entrar para ejecutar
For good measure, let's also try a boosting ensemble algorithm. We'll use a
Gradient Boosting estimator, which like a Random Forest algorithm builds
multiple trees, but instead of building them all independently and taking the
average result, each tree is built on the outputs of the previous one in an
attempt to incrementally reduce the loss (error) in the model.
[ ]
# Train the model
from [Link] import GradientBoostingRegressor
# Fit a lasso model on the training set
model = GradientBoostingRegressor().fit(X_train, y_train)
print (model, "\n")
# Evaluate the model using the test data
predictions = [Link](X_test)
mse = mean_squared_error(y_test, predictions)
print("MSE:", mse)
rmse = [Link](mse)
print("RMSE:", rmse)
r2 = r2_score(y_test, predictions)
print("R2:", r2)
# Plot predicted vs actual
[Link](y_test, predictions)
[Link]('Actual Labels')
[Link]('Predicted Labels')
[Link]('Daily Bike Share Predictions')
# overlay the regression line
z = [Link](y_test, predictions, 1)
p = np.poly1d(z)
[Link](y_test,p(y_test), color='magenta')
[Link]()
Presione Mayús + Entrar para ejecutar
Summary
Here we've tried a number of new regression algorithms to improve
performance. In our notebook we'll look at 'tuning' these algorithms to improve
performance.
Further Reading
Mejora de los modelos con
hiperparámetros
Completado100 XP
5 minutos
A menudo, los modelos simples con conjuntos de datos pequeños se pueden
ajustar en un solo paso, mientras que los conjuntos de datos más grandes y los
modelos más complejos deben ajustarse mediante el uso repetido del modelo
con datos de entrenamiento y la comparación de la salida con la etiqueta
esperada. Si la predicción es lo suficientemente precisa, consideramos que el
modelo está entrenado. Si no es así, se ajusta ligeramente el modelo y se vuelve
a repetir.
Los hiperparámetros son valores que cambian la forma en que el modelo se
ajusta durante estos bucles. La velocidad de aprendizaje, por ejemplo, es un
hiperparámetro que establece cuánto se ajusta un modelo durante cada ciclo de
entrenamiento. Una alta velocidad de aprendizaje significa que un modelo se
puede entrenar más rápido, pero si es demasiado alta, los ajustes pueden ser
tan grandes que el modelo nunca termine de ajustarse y no sea óptimo.
Preprocesamiento de datos
El preprocesamiento hace referencia a los cambios realizados en los datos antes
de pasarse al modelo. Ya hemos leído que el preprocesamiento puede implicar
la limpieza del conjunto de datos. Aunque esto es importante, el
preprocesamiento también puede incluir el cambio del formato de los datos
para que el modelo los pueda usar más fácilmente. Por ejemplo, los datos
descritos como "rojo", "naranja", "amarillo", "lima" y "verde", pueden funcionar
mejor si se convierten en un formato más nativo para los equipos, como
números que indican la cantidad de rojo y la cantidad de verde.
Características de escalado
El paso de preprocesamiento más común consiste en escalar las características
para se encuentren entre cero y uno. Por ejemplo, el peso de una bicicleta y la
distancia que una persona recorre en una bicicleta pueden ser dos números
muy diferentes, pero al escalar ambos números a entre cero y uno, los modelos
pueden aprender de los datos con mayor eficacia.
Uso de categorías como características
En el aprendizaje automático, también se pueden usar características de
categorías como "bicicleta", "monopatín" o "automóvil". Estas características se
representan mediante valores de 0 o 1 en vectores one-hot, vectores que
tienen 0 o 1 para cada valor posible. Por ejemplo, la bicicleta, el monopatín y el
automóvil podrían ser respectivamente (1,0,0), (0,1,0) y (0,0,1).
Siguiente unidad: Ejercicio: Optimización y
guardado de modelos
Ejercicio: Optimización y guardado
de modelos
Completado100 XP
10 minutos
Este módulo requiere un espacio aislado para completarse.
Un espacio aislado le da acceso a recursos gratuitos. No se le cobrará en su
suscripción personal. El espacio aislado solo podrá usarse para completar el
aprendizaje en Microsoft Learn. El uso para cualquier otro motivo está prohibido
y podría generar la pérdida permanente del acceso al espacio aislado.
Microsoft ofrece esta experiencia de laboratorio y el contenido relacionado con
fines educativos. Toda la información presentada es propiedad de Microsoft y
está destinada únicamente a brindar información sobre los productos y servicios
abordados en este módulo de Microsoft Learn.
Activar espacio aislado
Las sugerencias de enlaces de teclado de la barra de herramientas están ahora ocultas
RuntimeArchivoEditarVista
Ejecutar todo
Kernel
Proceso no conectado
Regression - Optimize and save models
In the previous notebook, we used complex regression models to look at the
relationship between features of a bike rentals dataset. In this notebook, we'll
see if we can improve the performance of these models even further.
Let's start by loading the bicycle sharing data as a Pandas DataFrame and
viewing the first few rows. As usual, we'll also split our data into training and
test datasets.
CódigoMarkdown
[ ]
# Import modules we'll need for this notebook
import pandas as pd
from sklearn.linear_model import LinearRegression
from [Link] import mean_squared_error, r2_score
from sklearn.model_selection import train_test_split
import numpy as np
import [Link] as plt
%matplotlib inline
# load the training dataset
!wget [Link]
to-machine-learning/main/Data/ml-basics/[Link]
bike_data = pd.read_csv('[Link]')
bike_data['day'] = [Link](bike_data['dteday']).day
numeric_features = ['temp', 'atemp', 'hum', 'windspeed']
categorical_features = ['season','mnth','holiday','weekday','workingday','wea
thersit', 'day']
bike_data[numeric_features + ['rentals']].describe()
print(bike_data.head())
# Separate features and labels
# After separating the dataset, we now have numpy arrays named **X** c
ontaining the features, and **y** containing the labels.
X, y = bike_data[['season','mnth', 'holiday','weekday','workingday','weathers
it','temp', 'atemp', 'hum', 'windspeed']].values, bike_data['rentals'].values
# Split data 70%-30% into training set and test set
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30, ran
dom_state=0)
print ('Training Set: %d rows\nTest Set: %d rows' % (X_train.shape[0], X_test
.shape[0]))
Presione Mayús + Entrar para ejecutar
Now we have the following four datasets:
X_train: The feature values we'll use to train the model
y_train: The corresponding labels we'll use to train the model
X_test: The feature values we'll use to validate the model
y_test: The corresponding labels we'll use to validate the model
Now we're ready to train a model by fitting a boosting ensemble algorithm, as in
our last notebook. Recall that a Gradient Boosting estimator, is like a Random
Forest algorithm, but instead of building them all trees independently and
taking the average result, each tree is built on the outputs of the previous one in
an attempt to incrementally reduce the loss (error) in the model.
[ ]
# Train the model
from [Link] import GradientBoostingRegressor, RandomForestRegressor
# Fit a lasso model on the training set
model = GradientBoostingRegressor().fit(X_train, y_train)
print (model, "\n")
# Evaluate the model using the test data
predictions = [Link](X_test)
mse = mean_squared_error(y_test, predictions)
print("MSE:", mse)
rmse = [Link](mse)
print("RMSE:", rmse)
r2 = r2_score(y_test, predictions)
print("R2:", r2)
# Plot predicted vs actual
[Link](y_test, predictions)
[Link]('Actual Labels')
[Link]('Predicted Labels')
[Link]('Daily Bike Share Predictions')
# overlay the regression line
z = [Link](y_test, predictions, 1)
p = np.poly1d(z)
[Link](y_test,p(y_test), color='magenta')
[Link]()
Presione Mayús + Entrar para ejecutar
Optimize Hyperparameters
Take a look at the GradientBoostingRegressor estimator definition in the
output above, and note that it, like the other estimators we tried previously,
includes a large number of parameters that control the way the model is
trained. In machine learning, the term parameters refers to values that can be
determined from data; values that you specify to affect the behavior of a
training algorithm are more correctly referred to as hyperparameters.
The specific hyperparameters for an estimator vary based on the algorithm that
the estimator encapsulates. In the case of
the GradientBoostingRegressor estimator, the algorithm is an ensemble that
combines multiple decision trees to create an overall predictive model. You can
learn about the hyperparameters for this estimator in the Scikit-Learn
documentation.
We won't go into the details of each hyperparameter here, but they work
together to affect the way the algorithm trains a model. In many cases, the
default values provided by Scikit-Learn will work well; but there may be some
advantage in modifying hyperparameters to get better predictive performance
or reduce training time.
So how do you know what hyperparameter values you should use? Well, in the
absence of a deep understanding of how the underlying algorithm works, you'll
need to experiment. Fortunately, SciKit-Learn provides a way
to tune hyperparameters by trying multiple combinations and finding the best
result for a given performance metric.
Let's try using a grid search approach to try combinations from a grid of
possible values for the learning_rate and n_estimators hyperparameters of
the GradientBoostingRegressor estimator.
[ ]
from sklearn.model_selection import GridSearchCV
from [Link] import make_scorer, r2_score
# Use a Gradient Boosting algorithm
alg = GradientBoostingRegressor()
# Try these hyperparameter values
params = {
'learning_rate': [0.1, 0.5, 1.0],
'n_estimators' : [50, 100, 150]
}
# Find the best hyperparameter combination to optimize the R2 metric
score = make_scorer(r2_score)
gridsearch = GridSearchCV(alg, params, scoring=score, cv=3, return_train_scor
e=True)
[Link](X_train, y_train)
print("Best parameter combination:", gridsearch.best_params_, "\n")
# Get the best model
model=gridsearch.best_estimator_
print(model, "\n")
# Evaluate the model using the test data
predictions = [Link](X_test)
mse = mean_squared_error(y_test, predictions)
print("MSE:", mse)
rmse = [Link](mse)
print("RMSE:", rmse)
r2 = r2_score(y_test, predictions)
print("R2:", r2)
# Plot predicted vs actual
[Link](y_test, predictions)
[Link]('Actual Labels')
[Link]('Predicted Labels')
[Link]('Daily Bike Share Predictions')
# overlay the regression line
z = [Link](y_test, predictions, 1)
p = np.poly1d(z)
[Link](y_test,p(y_test), color='magenta')
[Link]()
Presione Mayús + Entrar para ejecutar
Note: The use of random values in the Gradient Boosting algorithm results in
slightly different metrics each time. In this case, the best model produced by
hyperparameter tuning is unlikely to be significantly better than one trained
with the default hyperparameter values; but it's still useful to know about the
hyperparameter tuning technique!
Preprocess the Data
We trained a model with data that was loaded straight from a source file, with
only moderately successful results.
In practice, it's common to perform some preprocessing of the data to make it
easier for the algorithm to fit a model to it. There's a huge range of
preprocessing transformations you can perform to get your data ready for
modeling, but we'll limit ourselves to a few common techniques:
Scaling numeric features
Normalizing numeric features so they're on the same scale prevents features
with large values from producing coefficients that disproportionately affect the
predictions. For example, suppose your data includes the following numeric
features:
A B C
48
3 65
0
Normalizing these features to the same scale may result in the following values
(assuming A contains values from 0 to 10, B contains values from 0 to 1000, and
C contains values from 0 to 100):
A B C
0.3 0.48 0.65
There are multiple ways you can scale numeric data, such as calculating the
minimum and maximum values for each column and assigning a proportional
value between 0 and 1, or by using the mean and standard deviation of a
normally distributed variable to maintain the same spread of values on a
different scale.
Encoding categorical variables
Machine learning models work best with numeric features rather than text
values, so you generally need to convert categorical features into numeric
representations. For example, suppose your data includes the following
categorical feature.
Size
M
Size
You can apply ordinal encoding to substitute a unique integer value for each
category, like this:
Size
Another common technique is to use one hot encoding to create individual
binary (0 or 1) features for each possible category value. For example, you could
use one-hot encoding to translate the possible categories into binary columns
like this:
Size_
Size_S Size_L
M
1 0 0
0 1 0
0 0 1
To apply these preprocessing transformations to the bike rental, we'll make use
of a Scikit-Learn feature named pipelines. These enable us to define a set of
preprocessing steps that end with an algorithm. You can then fit the entire
pipeline to the data, so that the model encapsulates all of the preprocessing
steps as well as the regression algorithm. This is useful, because when we want
to use the model to predict values from new data, we need to apply the same
transformations (based on the same statistical distributions and category
encodings used with the training data).
Note: The term pipeline is used extensively in machine learning, often to mean
very different things! In this context, we're using it to refer to pipeline objects in
Scikit-Learn, but you may see it used elsewhere to mean something else.
[ ]
# Train the model
from [Link] import ColumnTransformer
from [Link] import Pipeline
from [Link] import SimpleImputer
from [Link] import StandardScaler, OneHotEncoder
from sklearn.linear_model import LinearRegression
import numpy as np
# Define preprocessing for numeric columns (scale them)
numeric_features = [6,7,8,9]
numeric_transformer = Pipeline(steps=[
('scaler', StandardScaler())])
# Define preprocessing for categorical features (encode them)
categorical_features = [0,1,2,3,4,5]
categorical_transformer = Pipeline(steps=[
('onehot', OneHotEncoder(handle_unknown='ignore'))])
# Combine preprocessing steps
preprocessor = ColumnTransformer(
transformers=[
('num', numeric_transformer, numeric_features),
('cat', categorical_transformer, categorical_features)])
# Create preprocessing and training pipeline
pipeline = Pipeline(steps=[('preprocessor', preprocessor),
('regressor', GradientBoostingRegressor())])
# fit the pipeline to train a linear regression model on the training
set
model = [Link](X_train, (y_train))
print (model)
Presione Mayús + Entrar para ejecutar
OK, the model is trained, including the preprocessing steps. Let's see how it
performs with the validation data.
[ ]
# Get predictions
predictions = [Link](X_test)
# Display metrics
mse = mean_squared_error(y_test, predictions)
print("MSE:", mse)
rmse = [Link](mse)
print("RMSE:", rmse)
r2 = r2_score(y_test, predictions)
print("R2:", r2)
# Plot predicted vs actual
[Link](y_test, predictions)
[Link]('Actual Labels')
[Link]('Predicted Labels')
[Link]('Daily Bike Share Predictions')
z = [Link](y_test, predictions, 1)
p = np.poly1d(z)
[Link](y_test,p(y_test), color='magenta')
[Link]()
Presione Mayús + Entrar para ejecutar
The pipeline is composed of the transformations and the algorithm used to train
the model. To try an alternative algorithm you can just change that step to a
different kind of estimator.
[ ]
# Use a different estimator in the pipeline
pipeline = Pipeline(steps=[('preprocessor', preprocessor),
('regressor', RandomForestRegressor())])
# fit the pipeline to train a linear regression model on the training
set
model = [Link](X_train, (y_train))
print (model, "\n")
# Get predictions
predictions = [Link](X_test)
# Display metrics
mse = mean_squared_error(y_test, predictions)
print("MSE:", mse)
rmse = [Link](mse)
print("RMSE:", rmse)
r2 = r2_score(y_test, predictions)
print("R2:", r2)
# Plot predicted vs actual
[Link](y_test, predictions)
[Link]('Actual Labels')
[Link]('Predicted Labels')
[Link]('Daily Bike Share Predictions - Preprocessed')
z = [Link](y_test, predictions, 1)
p = np.poly1d(z)
[Link](y_test,p(y_test), color='magenta')
[Link]()
Presione Mayús + Entrar para ejecutar
We've now seen a number of common techniques used to train predictive
models for regression. In a real project, you'd likely try a few more algorithms,
hyperparameters, and preprocessing transformations; but by now you should
have got the general idea. Let's explore how you can use the trained model with
new data.
Use the Trained Model
First, let's save the model.
[ ]
import joblib
# Save the model as a pickle file
filename = './[Link]'
[Link](model, filename)
Presione Mayús + Entrar para ejecutar
Now, we can load it whenever we need it, and use it to predict labels for new
data. This is often called scoring or inferencing.
[ ]
# Load the model from the file
loaded_model = [Link](filename)
# Create a numpy array containing a new observation (for example tomor
row's seasonal and weather forecast information)
X_new = [Link]([[1,1,0,3,1,1,0.226957,0.22927,0.436957,0.1869]]).astype('fl
oat64')
print ('New sample: {}'.format(list(X_new[0])))
# Use the model to predict tomorrow's rentals
result = loaded_model.predict(X_new)
print('Prediction: {:.0f} rentals'.format([Link](result[0])))
Presione Mayús + Entrar para ejecutar
The model's predict method accepts an array of observations, so you can use it
to generate multiple predictions as a batch. For example, suppose you have a
weather forecast for the next five days; you could use the model to predict bike
rentals for each day based on the expected weather conditions.
[ ]
# An array of features based on five-day weather forecast
X_new = [Link]([[0,1,1,0,0,1,0.344167,0.363625,0.805833,0.160446],
[0,1,0,1,0,1,0.363478,0.353739,0.696087,0.248539],
[0,1,0,2,0,1,0.196364,0.189405,0.437273,0.248309],
[0,1,0,3,0,1,0.2,0.212122,0.590435,0.160296],
[0,1,0,4,0,1,0.226957,0.22927,0.436957,0.1869]])
# Use the model to predict rentals
results = loaded_model.predict(X_new)
print('5-day rental predictions:')
for prediction in results:
print([Link](prediction))
Presione Mayús + Entrar para ejecutar
Summary
That concludes the notebooks for this module on regression. In this notebook
we ran a complex regression, tuned it, saved the model, and used it to predict
outcomes for the future.
Further Reading
¿Qué son los modelos de
clasificación?
Completado100 XP
4 minutos
Los modelos de clasificación se usan para tomar decisiones o asignar elementos
a categorías. A diferencia de los módulos de regresión, que emiten números
continuos, como alturas o pesos, los modelos de clasificación emiten valores
booleanos (true o false) o decisiones categóricas, como ‘apple’, ’banana’ o
‘cherry’ ("manzana", "plátano" o "cereza").
Hay muchos tipos de modelos de clasificación. Algunos funcionan de forma
similar a los modelos de regresión clásica, mientras que otras son esencialmente
diferentes. Uno de los mejores modelos para aprender inicialmente se
denomina regresión logística.
¿Qué es la regresión logística?
La regresión logística es un tipo de modelo de clasificación que funciona de
forma similar a la regresión lineal. La diferencia entre esta y la regresión lineal es
la forma de la curva. Mientras que la regresión lineal simple tiene forma de línea
recta a los datos, los modelos de regresión logística tienen forma de curva en
forma de s:
La regresión logística es mejor para estimar los resultados booleanos que la
regresión lineal, porque la curva logística siempre genera un valor entre 0 (false)
y 1 (true). Cualquier valor entre estos dos se puede considerar una probabilidad.
Por ejemplo, supongamos que estamos intentando predecir si se producirá una
alud hoy. Si nuestro modelo de regresión logística nos proporciona el valor de
0,3, estima que la probabilidad de producirse un alud es del 30 %.
Conversión de salidas en categorías
Dado que la regresión logística nos proporciona estas probabilidades, en lugar
de valores true o false simples, es necesario realizar pasos adicionales para
convertir el resultado en una categoría. La manera más sencilla de hacerlo es
aplicar un umbral. Por ejemplo, en el gráfico siguiente, el umbral se establece en
0,5. Esto significa que cualquier valor de Y por debajo de 0,5 se convierte en
false (cuadro inferior izquierdo) y cualquier valor situado por encima de 0,5 se
convierte en true (cuadro superior derecho).
Si observamos el gráfico, podemos ver que esto significa que, si la característica
está por debajo de 5, la probabilidad será menor que 0,5 y, por tanto, se
convertirá en false. Los valores de características superiores a 5 aquí ofrecen
probabilidades superiores a 0,5, por lo que se convertirán en true.
Es importante que la regresión logística no tenga que limitarse a un resultado
true o false; también se puede usar cuando hay tres o más resultados
potenciales, como ‘rain’, ‘snow’ o ‘sun’ ("lluvia", "nieve" o "sol"). Esto requiere
una configuración ligeramente más compleja, denominada regresión logística
multinomial. Aunque no lo practicaremos durante los ejercicios siguientes,
merece la pena tenerlo en cuenta en situaciones en las que es necesario realizar
predicciones que no son binarias.
También merece la pena tener en cuenta que la regresión logística puede usar
más de una característica de entrada (lo veremos más adelante).
Siguiente unidad: Ejercicio: Creación de un
modelo de regresión logística simple
Ejercicio: Creación de un modelo de
regresión logística simple
Completado100 XP
8 minutos
Este módulo requiere un espacio aislado para completarse.
Un espacio aislado le da acceso a recursos gratuitos. No se le cobrará en su
suscripción personal. El espacio aislado solo podrá usarse para completar el
aprendizaje en Microsoft Learn. El uso para cualquier otro motivo está prohibido
y podría generar la pérdida permanente del acceso al espacio aislado.
Microsoft ofrece esta experiencia de laboratorio y el contenido relacionado con
fines educativos. Toda la información presentada es propiedad de Microsoft y
está destinada únicamente a brindar información sobre los productos y servicios
abordados en este módulo de Microsoft Learn.
Activar espacio aislado
Las sugerencias de enlaces de teclado de la barra de herramientas están ahora ocultas
RuntimeArchivoEditarVista
Ejecutar todo
Kernel
Proceso no conectado
Exercise: Build a simple logistic regression model
In this exercise, we'll fit a simple logistic regression model that will try to predict
the chance of an avalanche.
Recall that logistic regression fits an s-shaped curve to data, rather than a
straight line, and we can use this to calculate a probability of a binary outcome.
Data visualization
Let's start this exercise by loading in and having a look at our data:
CódigoMarkdown
[ ]
import pandas
!pip install statsmodels
!wget [Link]
to-machine-learning/main/[Link]
!wget [Link]
to-machine-learning/main/Data/[Link]
#Import the data from the .csv file
dataset = pandas.read_csv('[Link]', delimiter="\t")
#Let's have a look at the data
dataset
Presione Mayús + Entrar para ejecutar
Data Exploration
The avalanche field is our target. A value of 1 means that an avalanche did
occur at the conditions described by the features, whereas a value of 0 means
no avalanche hapenned. Since our targets can only be 0 or 1 we call this
a binary classification model.
Now let's plot the relationships between each feature and the target values.
That helps us understand which features are more likely to influence the results:
[ ]
import graphing # custom graphing code. See our GitHub repo for details
graphing.box_and_whisker(dataset, label_x="avalanche", label_y="surface_hoar"
, show=True)
graphing.box_and_whisker(dataset, label_x="avalanche", label_y="fresh_thickne
ss", show=True)
graphing.box_and_whisker(dataset, label_x="avalanche", label_y="weak_layers",
show=True)
graphing.box_and_whisker(dataset, label_x="avalanche", label_y="no_visitors")
Presione Mayús + Entrar para ejecutar
We can notice that:
For fresh_thickness the outcomes are very similar. This means that
variations in their values aren't strongly correlated with the results.
Variations in values for weak_layers and no_visitors, seem to correlate
with a larger number of avalanche results, and thus we should assign
more importance to these features.
The differences between avalanche and non-avalanche days are small and there
isn't one clear driver of issues. Weak layers looks like a good starting point as it
is related to the widest variation in results.
Building a simple logistic regression model
We will now built and train a model to predict the chance of an avalanche
happening based solely on the number of weak layers of snow:
[ ]
# Here we import a function that splits datasets according to a given ratio
from sklearn.model_selection import train_test_split
# Split the dataset in an 70/30 train/test ratio.
train, test = train_test_split(dataset, test_size=0.3, random_state=2)
print([Link])
print([Link])
Presione Mayús + Entrar para ejecutar
OK, lets train our model, using the train dataset we've just created (notice
that weak_layers will be the only feature used to determine the outcome):
[ ]
import [Link] as smf
import graphing # custom graphing code. See our GitHub repo for details
# Perform logistic regression.
model = [Link]("avalanche ~ weak_layers", train).fit()
print("Model trained")
Presione Mayús + Entrar para ejecutar
After training, we can print a model summary with very detailed information:
[ ]
print([Link]())
Presione Mayús + Entrar para ejecutar
Notice that the positive coefficient for weak_layers means that a higher value
means a higher likelihood for an avalanche.
Using our model
We can now use our trained model to make predictions and estimate
probabilities.
Let's pick the first four occurrences in our test set and print the probability of
an avalanche for each one of them:
[ ]
# predict to get a probability
# get first 3 samples from dataset
samples = test["weak_layers"][:4]
# use the model to get predictions as possibilities
estimated_probabilities = [Link](samples)
# Print results for each sample
for sample, pred in zip(samples,estimated_probabilities):
print(f"A weak_layer with value {sample} yields a {pred * 100:.2f}% chanc
e of an avalanche.")
Presione Mayús + Entrar para ejecutar
Let's plot out model to understand this:
[ ]
# plot the model
# Show a graph of the result
predict = lambda x: [Link]([Link]({"weak_layers": x}))
graphing.line_2D([("Model", predict)],
x_range=[-20,40],
label_x="weak_layers",
label_y="estimated probability of an avalanche")
Presione Mayús + Entrar para ejecutar
The line plots the function of the probability of an avalanche over the number
of weak layers; Notice that the more weak layers, the more likely an avalanche
will happen. This plot can look a bit confusing for two reasons.
Firstly, the curve can make predictions from negative to positive infinity, but we
only have data for 0 - 10 layers:
[ ]
print("Minimum number of weak layers:", min(train.weak_layers))
print("Maximum number of weak layers:", max(train.weak_layers))
Presione Mayús + Entrar para ejecutar
This is because logistic regression models allow predictions outside the range of
values they have seen, and sometimes do so quite well.
The second reason the plot is confusing is that at 0 layers, there's still some risk
of an avalanche. Similarly, at 10 layers, there isn't a 100% risk of an avalanche.
This is actually in line with the data:
[ ]
import numpy as np
# Get actual rates of avalanches at 0 years
avalanche_outcomes_for_0_layers = train[train.weak_layers == 0].avalanche
print("Average rate of avalanches for 0 weak layers of snow", [Link](aval
anche_outcomes_for_0_layers))
# Get actual rates of avalanches at 10 years
avalanche_outcomes_for_10_layers = train[train.weak_layers == 10].avalanche
print("Average rate of avalanches for 10 weak layers of snow", [Link](ava
lanche_outcomes_for_10_layers))
Presione Mayús + Entrar para ejecutar
Our model is actually doing a good job! It's just that avalanches
aren't only caused by weak layers of snow. If we want to do better, we probably
need to think about including other information in the model.
Classification or decision thresholds
To return a binary category (True = "avalanche", False = "no avalanche") we
need to define a Classification Threshold value. Any probability above that
threshold is returned as the positive category, whereas values below it will be
returned as the negative category.
Let's see what happens if set our threshold to 0.5 (meaning that our model will
return True whenever it calculates a chance above 50% of an avalanche
happening):
[ ]
# threshold to get an absolute value
threshold = 0.5
# Add classification to the samples we used before
for sample, pred in list(zip(samples,estimated_probabilities)):
print(f"A weak_layer with value {sample} yields a chance of {pred * 100:.
2f}% of an avalanche. Classification = {pred > threshold}")
Presione Mayús + Entrar para ejecutar
Note that a 0.5 threshold is just a starting point that needs to be tuned
depending on the data we're trying to classify.
Performance on test set
Now let's use our test dataset to perform a quick evaluation on how the model
did. For now, we'll just look at how often we correctly predicted if there would
be an avalanche or not
[ ]
# Classify the mdel predictions using the threshold
predictions = [Link](test) > threshold
# Compare the predictions to the actual outcomes in the dataset
accuracy = [Link](predictions == [Link])
# Print the evaluation
print(f"The model correctly predicted outcomes {accuracy * 100:.2f}% of time.
")
Presione Mayús + Entrar para ejecutar
Avalanches are hard to pick but we're doing ok. It's hard to tell exactly what
kind of mistakes our model is making, though. We'll focus on this in the next
exercise.
Summary
In this unit we covered the following topics:
Using Data Exploration to understand which features have a stronger correlation
to the outcomes
Building a simple Logistic Regression model
Using the trained model to predict probabilities
Using thresholds to map probabilities to binary classes
How to use a test set to measure the model's performance
Evaluación de un modelo de
clasificación
Completado100 XP
4 minutos
Gran parte del aprendizaje automático trata la evaluación del funcionamiento
de los modelos. Esto tiene lugar durante el entrenamiento, para ayudar a dar
forma al modelo y, después del entrenamiento, para ayudarnos a determinar si
el modelo está bien para usarse en el mundo real. Los modelos de clasificación
necesitan evaluación, al igual que los modelos de regresión, aunque la forma en
que se lleva a cabo esta evaluación a veces puede ser un poco más compleja.
Recordatorio sobre el costo
Recuerde que durante el entrenamiento, calculamos el bajo rendimiento de un
modelo y lo denominamos costo o pérdida. Por ejemplo, en regresión lineal a
menudo usamos una métrica denominada error cuadrático medio (MSE). Para
calcular el MSE, se comparan la predicción y la etiqueta real, se iguala la
diferencia y se toma el promedio del resultado. Podemos usar MSE para ajustar
el modelo e informar sobre cómo funciona.
Funciones de costo para la clasificación
Los modelos de clasificación se juzgarán en función de sus probabilidades de
salida, como el 40 % de probabilidad de alud o las etiquetas finales: ‘no
avalanche’ or ‘avalanche’ ("ningún alud" o "alud"). El uso de las probabilidades
puede ser beneficioso durante el entrenamiento porque se verán pequeños
cambios en las probabilidades, aunque no sean suficientes para cambiar la
decisión final. El uso de las etiquetas finales para una función de costo es más
útil si queremos estimar el rendimiento real del modelo, por ejemplo, en el
conjunto de pruebas. Esto se debe a que, para el uso real, usaremos las
etiquetas finales, no las probabilidades.
Pérdida de registro
La pérdida de registros es una de las funciones de costo más populares para la
clasificación simple. La pérdida de registros se suele aplicar a las probabilidades
de salida. De forma similar a MSE, pequeñas cantidades de errores tienen como
resultado un costo reducido, mientras que las cantidades moderadas de errores
tienen como resultado costos elevados. Hemos trazado la pérdida de registros a
continuación para una etiqueta en la que la respuesta correcta era 0 (false).
En el eje X hay posibles salidas de modelo (probabilidades de 0 a 1) y el eje Y se
indica el costo. Si un modelo está bastante seguro de que la respuesta correcta
es 0 (por ejemplo, predice 0,1), el costo es bajo porque la respuesta correcta es
0 en esta instancia. Si el modelo predice con confianza el resultado
incorrectamente (por ejemplo, predice 0,9), el costo es muy alto. De hecho, en
X=1, el costo es tan alto que aquí hemos recortado el eje X a 0,999 para
mantener el gráfico legible.
¿Por qué no MSE?
MSE y la pérdida de registros son métricas similares. Hay algunas razones
complejas por las que la pérdida de registros se prefiere para la regresión
logística, pero también algunas razones más sencillas. Por ejemplo, la pérdida
de registros castiga las respuestas incorrectas de manera mucho más
contundente que MSE. Por ejemplo, en el ejemplo siguiente, donde la respuesta
correcta es 0, las predicciones por encima de 0,8 tienen un costo mucho mayor
para la pérdida de registros que el MSE.
Tener un mayor costo de esta manera ayuda al modelo a aprender más rápido,
porque la pendiente de la línea es mucho más inclinada. De forma similar, la
pérdida de registros ayuda a los modelos a tener más seguridad a la hora de
dar la respuesta correcta: observe en el gráfico anterior que el costo de MSE
para los valores menores de 0,2 es muy pequeño y la pendiente es casi plana.
Esto hace que el entrenamiento sea lento para los modelos que son casi
correctos. La pérdida de registros tiene una pendiente más inclinada para estos
valores, lo que ayuda al modelo a aprender más rápido.
Limitaciones de las funciones de costo
El uso de una función de costo única para la evaluación humana del modelo
siempre está limitado porque no indica qué tipo de errores está cometiendo el
modelo. Por ejemplo, considere nuestro escenario de predicción de aludes. Un
valor de pérdida de registros alto podría significar que el modelo predice
repetidamente aludes cuando no se produce ninguno, o que no los predice
repetidamente cuando sí se producen.
Para comprender mejor nuestros modelos, puede ser más fácil usar más de un
número para evaluar si funcionan bien. Este es un tema más amplio que se trata
en otro material de aprendizaje, aunque se trata brevemente en los ejercicios
siguientes.
Siguiente unidad: Ejercicio: Evaluación de un
modelo de regresión logística
Ejercicio: Evaluación de un modelo de
regresión logística
Completado100 XP
10 minutos
Este módulo requiere un espacio aislado para completarse.
Un espacio aislado le da acceso a recursos gratuitos. No se le cobrará en su
suscripción personal. El espacio aislado solo podrá usarse para completar el
aprendizaje en Microsoft Learn. El uso para cualquier otro motivo está prohibido
y podría generar la pérdida permanente del acceso al espacio aislado.
Microsoft ofrece esta experiencia de laboratorio y el contenido relacionado con
fines educativos. Toda la información presentada es propiedad de Microsoft y
está destinada únicamente a brindar información sobre los productos y servicios
abordados en este módulo de Microsoft Learn.
Activar espacio aislado
Las sugerencias de enlaces de teclado de la barra de herramientas están ahora ocultas
RuntimeArchivoEditarVista
Ejecutar todo
Kernel
Proceso no conectado
Exercise: Assessing a logistic regression model
In the previous exercise, we fit a simple logistic regression model to predict the
chance of an avalanche. This time, we'll create the same model and take a
deeper look at how to best understand the mistakes that it makes.
Data visualization
Let's remind ourselves of our data. Remember we're planning to train a model
that can predict avalanches based on the number of weak layers of snow.
CódigoMarkdown
[ ]
import pandas
!pip install statsmodels
!wget [Link]
to-machine-learning/main/[Link]
!wget [Link]
to-machine-learning/main/Data/[Link]
import graphing # custom graphing code. See our GitHub repo for details
#Import the data from the .csv file
dataset = pandas.read_csv('[Link]', delimiter="\t")
#Let's have a look at the data and the relationship we're going to model
print([Link]())
graphing.box_and_whisker(dataset, label_x="avalanche", label_y="weak_layers")
Presione Mayús + Entrar para ejecutar
It seems that avalanches are associated with having more weak layers of snow.
That said, some days many weak layers have been recorded, but no avalanche
occurred. This means our model will have difficulty being extremely accurate
using only this feature. Let's continue though, and come back to this in a future
exercise.
Before we begin, we need to split our dataset into training and test sets. We will
train on the training set, and test on (you guessed it) the test set.
[ ]
from sklearn.model_selection import train_test_split
# Split the dataset in an 75/25 train/test ratio.
train, test = train_test_split(dataset, test_size=0.25, random_state=10)
print("Train size:", [Link][0])
print("Test size:", [Link][0])
Presione Mayús + Entrar para ejecutar
Fitting a model
Let's fit a simple logistic regression model using log-loss as a cost function. This
is a very standard way to fit a classification model - so standard, in fact that we
don't need to specify it at all.
[ ]
import [Link] as smf
# Perform logistic regression.
model = [Link]("avalanche ~ weak_layers", train).fit()
print("Model trained")
Presione Mayús + Entrar para ejecutar
Assessing the model with summary information
If we use statsmodels, we can get a detailed summary about the model by
simply calling summary()
[ ]
[Link]()
Presione Mayús + Entrar para ejecutar
This summary provides some detailed information.
Two useful pieces of information are in the bottom row. The coef
for weak_layers is positive, which means that as weak_layers increases, so
does the probability of an avalanche. The the P value column is less than 0.05,
which means the model is confident that weak_layers is a useful predictor of
avalanches.
The rest of this table, however, is difficult to understand for beginners and so it's
not clear how well our model is working. Let's try another way.
Assessing model visually
Sometimes, but not always, we can visually assess a logistic regression mode.
Let's plot our model against the actual data in the test dataset.
[ ]
def predict(weak_layers):
return [Link](dict(weak_layers=weak_layers))
graphing.scatter_2D(test, label_x="weak_layers", label_y="avalanche", trendli
ne=predict)
Presione Mayús + Entrar para ejecutar
It's hard to see the s-shape of the trendline, because the number of weak layers
of snow, and the likelihood of an avalanche, are only weakly related. If we zoom
out, we can get a slightly better view:
[ ]
graphing.scatter_2D(test, label_x="weak_layers", label_y="avalanche", x_range
=[-20,20], trendline=predict)
Presione Mayús + Entrar para ejecutar
Checking the earlier graph, we can see that our model will predict an avalanche
when the number of weak layers of snow is greater than 5. We can tell this
because the value of the line is 0.5 at x=5 (remember that in the previous unit
we defined a classifier threshold, so that probabilities over 0.5 would be
classified as True).
How this relates with points is hard to tell - the points overlap and so it is
difficult to see how many points are at 0 or at 1. How else can we assess the
model?
Assess with cost function
Let's assess our model with a log-loss cost function.
[ ]
from [Link] import log_loss
# Make predictions from the test set
predictions = [Link](test)
# Calculate log loss
print("Log loss", log_loss([Link], predictions))
Presione Mayús + Entrar para ejecutar
0.66 - what does that mean? This could be useful to compare two different
models, but it's hard to get a grasp on exactly what this means for real-world
performance.
Assess accuracy
Let's instead assess accuracy. Accuracy refers to the proportion of predictions the
model got correct, after predictions are converted from probabilities
to avalanche or no-avalanche.
The first thing to do is convert probabilities to hard predictions:
[ ]
import numpy
# Print a few predictions before we convert them to categories
print(f"First three predictions (probabilities): {[Link][0]}, {pred
[Link][1]}, {[Link][2]}")
# convert to absolute values
avalanche_predicted = predictions >= 0.5
# Print a few predictions converted into categories
print(f"First three predictions (categories): {avalanche_predicted.iloc[0]},
{avalanche_predicted.iloc[1]}, {avalanche_predicted.iloc[2]}")
Presione Mayús + Entrar para ejecutar
Now we can calculate accuracy:
[ ]
# Calculate what proportion were predicted correctly
guess_was_correct = [Link] == avalanche_predicted
accuracy = [Link](guess_was_correct)
# Print the accuracy
print("Accuracy for whole test dataset:", accuracy)
Presione Mayús + Entrar para ejecutar
It looks like it's predicting the correct answer 61% of the time. This is helpful
information. What kind of mistakes is it making, though? Let's take a look at
whether it is guessing avalanche when there are none (false positives), or failing
to guess 'avalanche' when one actually occurs (false negative):
[ ]
# False Negative: calculate how often it guessed no avalanche when one actual
ly occurred
false_negative = [Link](numpy.logical_not(guess_was_correct) & [Link]
alanche)
# False positive: calculate how often it guessed avalanche, when none actuall
y happened
false_positive = [Link](numpy.logical_not(guess_was_correct) & numpy.l
ogical_not([Link]))
print(f"Wrongly predicted an avalanche {false_positive * 100}% of the time")
print(f"Failed to predict avalanches {false_negative * 100}% of the time")
Presione Mayús + Entrar para ejecutar
I think we can agree that's a lot more understandable than what the cost
function or the graph!
Summary
We've walked through different ways to assess a logistic regression model.
We've seen that detailed summaries can provide rich information, but this can
be difficult to digest. Metrics for these kinds of models also aren't necessarily
intuitive or detailed enough to understand the model. With a little extra work,
we can look at actual predictions versus actual outcomes and get an intuition
for how the model might work in the real world.
Mejora de los modelos de
clasificación
Completado100 XP
6 minutos
En los ejercicios, encontramos que nuestro modelo podía predecir aludes hasta
cierto punto, pero seguía siendo incorrecto en torno al 40 % del tiempo. Esta
cantidad de error se debe a que nuestra característica (el número de capas de
nieve débiles) no es lo único que provoca aludes.
Hay dos formas principales de mejorar el rendimiento del modelo de
clasificación en el que profundizaremos ahora: proporcionar características
adicionales y ser selectivos sobre lo que se incluye en el modelo.
Proporcionar características adicionales
Al igual que la regresión lineal, la regresión logística no tiene que limitarse a una
sola entrada. Puede combinar características para realizar predicciones. Por
ejemplo, podríamos intentar predecir aludes en función de las nevadas y del
número de senderistas que alteran una pista. Podemos especificar ambas
características en el mismo modelo para calcular una probabilidad de alud.
Internamente, la regresión logística combina características de forma similar a la
regresión lineal. Es decir, trata todas las características como independientes, lo
que significa que supone que las características no influyen entre sí. Por
ejemplo, nuestro modelo supondrá que la cantidad de nieve no cambia la
cantidad de personas que visitarán la pista. De forma predeterminada, también
se da por supuesto que las nevadas aumentan el riesgo de aludes en una
cantidad establecida, independientemente de cuántos senderistas recorran la
pista.
Aspectos positivos y negativos de las características independientes
Se puede indicar explícitamente a la regresión logística que combine
características para que se pueda modelar la interacción entre estas, lo que no
se llevará a cabo de forma predeterminada. Hacer que la regresión logística sea
diferente de la mayoría de otros algoritmos de categorización conocidos,
como árboles de decisión y redes neuronales.
El hecho de que la regresión logística trate las características como
independientes de forma predeterminada es un punto fuerte y una limitación a
tener en cuenta. Por ejemplo, significa que puede hacer predicciones claras de
manera sencilla, como "un mayor número de personas aumenta el riesgo", lo
que normalmente no se puede hacer con otros modelos. También reduce la
posibilidad de sobreajustar los datos de entrenamiento. Por el contrario, el
modelo puede no funcionar bien si las características interactúan realmente. Por
ejemplo, es arriesgado que cinco senderistas atraviesen una montaña si hay
nieve, pero no lo es si no hay nieve que pueda provocar un alud. Se debe
indicar explícitamente a un modelo de regresión logística que busque
una interacción entre la nevada y el número de senderistas de este ejemplo
para considerar este matiz.
Considerar las características
La otra manera de mejorar los modelos es pensar realmente qué características
se proporcionan y por qué. Por lo general, cuantas más características
agreguemos a un modelo, mejor funcionará el modelo. Sin embargo, esto solo
es cierto si las características que proporcionamos son realmente pertinentes y
explican algo que no describen las características existentes.
Evitar el sobreentrenamiento
Si proporcionamos características adicionales que no son especialmente útiles,
el modelo puede sobreentrenarse. Puede parecer que funciona mejor, pero
realmente funciona peor.
Por ejemplo, imagine si hubo registros diarios de amount_of_snow (cantidad de
nieve), number_of_hikers (número de senderistas), temperature (temperatura) y
number_of_birds_spotted (cantidad de aves avistadas). Es probable que el
número de aves avistadas no sea información relevante. Sin embargo, si se
proporciona, el modelo acabará modelando una relación entre los aludes y el
número de animales avistados en días determinados. Si los animales se
avistaron más en días en que se produjeron aludes, el modelo sugerirá que los
animales podrían ser responsables de provocar aludes. A continuación,
podríamos configurar un programa de observación sistemática de aves para
predecir aludes, para concluir que no funciona en absoluto.
Evitar un entrenamiento deficiente
El uso de características de forma inocente también puede llevar a un
entrenamiento deficiente y a no realizar predicciones de la forma más correcta
posible. Por ejemplo, los valores de temperature (temperatura) y
number_of_hikers (número de senderistas) pueden estar estrechamente
vinculados a los aludes. Sin embargo, si las personas solo hacen senderismo en
días soleados, es posible que al modelo le resulte difícil diferenciar la
importancia de los senderistas en comparación con la temperatura. Del mismo
modo, es probable que descubramos que el modelo funciona mejor si
proporcionamos el valor de number_of_hikers (número de senderistas) como un
recuento exacto de visitantes, en lugar de simplemente un valor "alto" o "bajo",
para que el entrenamiento del modelo pueda encontrar una relación más
exacta.
Siguiente unidad: Ejercicio: Mejora de los
modelos de clasificación
Ejercicio: Mejora de los modelos de
clasificación
Completado100 XP
12 minutos
Este módulo requiere un espacio aislado para completarse.
Un espacio aislado le da acceso a recursos gratuitos. No se le cobrará en su
suscripción personal. El espacio aislado solo podrá usarse para completar el
aprendizaje en Microsoft Learn. El uso para cualquier otro motivo está prohibido
y podría generar la pérdida permanente del acceso al espacio aislado.
Microsoft ofrece esta experiencia de laboratorio y el contenido relacionado con
fines educativos. Toda la información presentada es propiedad de Microsoft y
está destinada únicamente a brindar información sobre los productos y servicios
abordados en este módulo de Microsoft Learn.
Activar espacio aislado
Las sugerencias de enlaces de teclado de la barra de herramientas están ahora ocultas
RuntimeArchivoEditarVista
Ejecutar todo
Kernel
Proceso no conectado
Exercise: Improving a logistic regression model
In the previous exercise, we fit a simple logistic regression model to predict the
chance of an avalanche. This time, we'll improve its performance by using
multiple features intelligently.
Data visualisation
Let's load our data.
[ ]
import pandas
!pip install statsmodels
!wget [Link]
to-machine-learning/main/[Link]
!wget [Link]
to-machine-learning/main/Data/[Link]
import graphing # custom graphing code. See our GitHub repo for details
#Import the data from the .csv file
dataset = pandas.read_csv('[Link]', delimiter="\t", index_col=0)
# Split our data into training and test
import sklearn.model_selection
train, test = sklearn.model_selection.train_test_split(dataset, test_size=0.2
5, random_state=10)
print("Train size:", [Link][0])
print("Test size:", [Link][0])
#Let's have a look at the data
print([Link]())
Presione Mayús + Entrar para ejecutar
We have numerous features available:
surface_hoar is how disturbed the surface of the snow is
fresh_thickness is how thick the top layer of snow is, or 0 if there's no fresh
snow on top
wind is the top wind speed that day, in km/h
weak_layers is the number of layers of snow that aren't well-bound to other
layers
no_visitors is the number of hikers who were on the trail that day
tracked_out is a 1 or 0. A 1 means that the snow has been trampled heavily
by hikers
Simple logistic regression
Let's make a simple logistic regression model and assess its performance with
accuracy.
[ ]
import sklearn
from [Link] import accuracy_score
import [Link] as smf
# Perform logistic regression.
model = [Link]("avalanche ~ weak_layers", train).fit()
# Calculate accuracy
def calculate_accuracy(model):
'''
Calculates accuracy
'''
# Make estimations and convert to categories
avalanche_predicted = [Link](test) > 0.5
# Calculate what proportion were predicted correctly
# We can use sklearn to calculate accuracy for us
print("Accuracy:", accuracy_score([Link], avalanche_predicted))
calculate_accuracy(model)
Presione Mayús + Entrar para ejecutar
CódigoMarkdown
Let's see how we can improve our model
Utilizing multiple features
Most of our features seem like they could be useful, least in theory. Let's try a
model with all features we've available.
[ ]
# Perform logistic regression.
model_all_features = [Link]("avalanche ~ weak_layers + surface_hoar + fres
h_thickness + wind + no_visitors + tracked_out", train).fit()
calculate_accuracy(model_all_features)
Presione Mayús + Entrar para ejecutar
That's a big improvement on the simpler model we've been working with.
To understand why, we can look at the summary information
[ ]
model_all_features.summary()
Presione Mayús + Entrar para ejecutar
Take a look at the P column, recalling that values less than 0.05 mean we can be
confident that this parameter is helping the model make better predictions.
Both surface_hoar and wind have very small values here, meaning they're
useful predictors and probably explain why our model is working better. If we
look at the coef (which states parameters) column we see that these have
positive values. This means that higher winds, and greater amounts of surface
hoar result in higher avalanche risk.
Simplifying our model
Looking at the summary again, we can see that tracked_out (how trampled the
snow is), and fresh_thickness have large p-values. This means they aren't
useful predictors. Let's see what happens if we remove them from our model:
[ ]
# Perform logistic regression.
model_simplified = [Link]("avalanche ~ weak_layers + surface_hoar + wind +
no_visitors", train).fit()
calculate_accuracy(model_simplified)
Presione Mayús + Entrar para ejecutar
Our new model works very similarly to the old one! In some circumstances
simplifying a model like this can even improve it, as it becomes less likely to
overfit.
Careful feature selection
Usually, we don't just pick features blindly. Let's think about what we've just
done - we removed how much fresh snow was in a model, trying to predict
avalanches. Something seems off. Surely avalanches are much more likely after it
has snowed? Similarly, the number of people on the track seems unrelated to
how many avalanches there were, but we know that people often can trigger
avalanches.
Let's review our earlier model again:
[ ]
model_all_features.summary()
Presione Mayús + Entrar para ejecutar
Look at the fresh_thickness row. We're told that it has a negative coefficient.
This means that as thickness increases, avalanches decrease.
Similarly, no_visitors has a negative coefficient, meaning that fewer hikers
means more avalanches.
How can this bes? Well, while visitors can cause avalanches if there's a lot of
fresh snow, presumably they cannot do so easily if there's no fresh snow. This
means that our features aren't fully independent.
We can tell the model to try to take into account that these features interact,
using a multiply sign. Let's try that now.
[ ]
# Create a model with an interaction. Notice the end of the string where
# we've a multiply sign between no_visitors and fresh_thickness
formula = "avalanche ~ weak_layers + surface_hoar + wind + no_visitors * fres
h_thickness"
model_with_interaction = [Link](formula, train).fit()
calculate_accuracy(model_with_interaction)
Presione Mayús + Entrar para ejecutar
The model has improved to 84% accuracy! Let's look at the summary
information:
[ ]
model_with_interaction.summary()
Presione Mayús + Entrar para ejecutar
We can see that the interaction term is helpful - the p-value is less than 0.05.
The model is also performing better than our previous attempts.
Making predictions with multiple features
Very quickly, lets explore what this interaction means by looking at model
predictions.
We will first graph two independent features in 3D. Let's start
with weak_layers and wind:
[ ]
graphing.model_to_surface_plot(model_with_interaction, ["weak_layers", "wind"
], test)
Presione Mayús + Entrar para ejecutar
The graph is interactive - rotate it and explore how there's a clear s-shaped
relationship between the features and probability.
Let's now look at the features that we've said can interact:
[ ]
graphing.model_to_surface_plot(model_with_interaction, ["no_visitors", "fresh
_thickness"], test)
Presione Mayús + Entrar para ejecutar
It looks quite different to the other! From any side, we can see an s-shape, but
these combine in strange ways.
We can see that the risk goes up on days with lots of visitors and lots of snow.
There is no real risk of avalanche when there's a lot of snow but no visitors, or
when there are a lot of visitors but no snow.
The fact that it shows high risk when there's no fresh snow and no visitors could
be due to rain, which keeps visitors and snow clouds away but results in
avalanches of the older snow. To confirm this, we'd need to explore the data in
more depth, but we'll stop here for now.
Summary
Well done! Let's recap. We've:
improved our simple model by adding more features.
practiced interpreting our model coefficients (parameters) from the model
summary
eliminated unnecessary features
explored how sometimes it's important to think about what your data really
mean
created a model that combined features to give superior result
¿Qué es la regresión?
Completado100 XP
4 minutos
La regresión es una técnica de análisis de datos sencilla, común y muy útil, que a
menudo se conoce de forma coloquial como "ajustar una línea". En su forma
más sencilla, la regresión se ajusta a una línea recta entre una variable
(característica) y otra (etiqueta). En formas más complicadas, la regresión puede
encontrar relaciones no lineales entre una sola etiqueta y varias características.
Regresión lineal simple
La regresión lineal simple modela una relación lineal entre una sola
característica y una etiqueta normalmente continua, lo que permite que la
función prediga la característica. Es posible que tenga un aspecto similar a este:
La regresión lineal simple tiene dos parámetros: una intersección (c) que indica
el valor de la etiqueta cuando la característica se establece en cero, y una
pendiente (m) que indica cuánto aumentará la etiqueta para cada aumento de
un punto de la característica.
Si le gusta pensar matemáticamente, es muy simple:
y = mx + c
Donde y es la etiqueta y x es la característica.
Por ejemplo, en nuestro escenario, si intentamos predecir qué pacientes tendrán
una temperatura corporal elevada en función de su edad, tendríamos el modelo:
temperatura = m * edad + c
Debe buscar los valores de "m" y "c" durante el procedimiento de ajuste. Si
resulta que m = 0,5 y c = 37, es posible que lo visualicemos de la siguiente
forma:
Esto significaría que cada año de edad está asociado con un aumento de la
temperatura corporal de 0,5 °C, con un punto inicial de 37 °C.
Ajuste de la regresión lineal
Normalmente, usamos bibliotecas existentes para ajustarnos a los modelos de
regresión. La regresión normalmente pretende encontrar la línea que genera la
menor cantidad de error, donde el error significa la diferencia entre el valor del
punto de datos real y el valor previsto. Por ejemplo, en la imagen siguiente, la
línea negra indica el error entre la predicción, la línea roja y un valor real: el
punto.
Al mirar estos dos puntos en un eje Y, podemos ver que la predicción era 39,5,
pero el valor real era 41.
Por lo tanto, el modelo estaba equivocado en 1,5 para este punto de datos.
Normalmente, ajustamos un modelo minimizando la suma residual de
cuadrados. Esto significa que la función de costo se calcula de la siguiente
manera:
1. Calcular la diferencia entre los valores reales y previstos (como los
anteriores) para cada punto de datos
2. Eleve estos valores al cuadrado
3. Suma (o promedio) de estos valores al cuadrado
El paso de elevar al cuadrado significa que no todos los puntos contribuyen
uniformemente a la línea: los valores atípicos, que son puntos que no se
encuentran en el patrón esperado, tienen un error desproporcionadamente
mayor, lo que puede influir la posición de la línea.
Puntos fuertes de la regresión
Las técnicas de regresión disponen de múltiples ventajas que otros modelos
más complejos no tienen.
Predecible y fácil de interpretar
Las regresiones son fáciles de interpretar porque describen ecuaciones
matemáticas simples, que a menudo se pueden representar en gráficos. Los
modelos más complejos a menudo se conocen como soluciones de "caja
negra", porque es difícil comprender cómo hacen las predicciones o cómo se
comportarán con determinadas entradas.
Fácil de extrapolar
Las regresiones hacen que sea fácil extrapolar: realizar predicciones para valores
fuera del intervalo de nuestro conjunto de datos. Por ejemplo, es fácil calcular
en el ejemplo anterior que con nueve años se tendrá una temperatura de 40,5
°C. Siempre se debe tener precaución a la hora de extrapolar: este modelo haría
la predicción siguiente: a los 90 años se tendría una temperatura lo
suficientemente alta como para hervir agua.
Normalmente, se garantiza un ajuste óptimo
La mayoría de los modelos de aprendizaje automático usan el trazo
descendente del gradiente para ajustar los modelos, lo que implica el ajuste del
algoritmo de trazo descendente del gradiente y no proporciona ninguna
garantía de que se encontrará una solución óptima. Por el contrario, la regresión
lineal que usa la suma de cuadrados como una función de costo realmente no
necesita un procedimiento de trazo descendente de gradiente iterativo. En su
lugar, se pueden usar las matemáticas para calcular la ubicación óptima de la
línea. Las matemáticas están fuera del ámbito de este módulo, pero es útil saber
que (siempre que el tamaño de la muestra no sea demasiado grande) la
regresión lineal no necesita prestar especial atención al proceso de ajuste y se
garantiza la solución óptima.
Siguiente unidad: Ejercicio: entrenamiento de un
modelo de regresión lineal simple
Ejercicio: entrenamiento de un
modelo de regresión lineal simple
Completado100 XP
8 minutos
Este módulo requiere un espacio aislado para completarse.
Un espacio aislado le da acceso a recursos gratuitos. No se le cobrará en su
suscripción personal. El espacio aislado solo podrá usarse para completar el
aprendizaje en Microsoft Learn. El uso para cualquier otro motivo está prohibido
y podría generar la pérdida permanente del acceso al espacio aislado.
Microsoft ofrece esta experiencia de laboratorio y el contenido relacionado con
fines educativos. Toda la información presentada es propiedad de Microsoft y
está destinada únicamente a brindar información sobre los productos y servicios
abordados en este módulo de Microsoft Learn.
Activar espacio aislado
Las sugerencias de enlaces de teclado de la barra de herramientas están ahora ocultas
RuntimeArchivoEditarVista
Ejecutar todo
Kernel
Proceso no conectado
Exercise: Train a simple linear regression model
In this exercise, we'll train a simple linear regression model to predict body
temperature based on dog's ages, and interpret the result.
Loading data
Let's begin by having a look at our data.
CódigoMarkdown
[ ]
import pandas
!pip install statsmodels
!wget [Link]
to-machine-learning/main/[Link]
!wget [Link]
to-machine-learning/main/Data/[Link]
# Convert it into a table using pandas
dataset = pandas.read_csv("[Link]", delimiter="\t")
# Print the data
print(dataset)
Presione Mayús + Entrar para ejecutar
We have a variety of information, including what the dogs did the night before,
their age, whether they're overweight, and their clinical signs. In this exercise,
our y values, or labels, are represented by the core_temperature column, while
our feature will be the age, in years.
Data visualization
Let's have a look at how the features and labels are distributed.
[ ]
import graphing
[Link](dataset, label_x='age', nbins=10, title="Feature", show=Tr
ue)
[Link](dataset, label_x='core_temperature', nbins=10, title="Labe
l")
Presione Mayús + Entrar para ejecutar
Looking at our feature (age), we can see dogs were at or under 9 years of age,
and ages are evenly distributed. In other words, no particular age is substantially
more common than any other.
Looking at our label (core_temperature), most dogs seem to have a slightly
elevated core temperature (we would normally expect ~37.5 degrees celcius),
which indicates they're unwell. A small number of dogs have a temperatue
above 40 degrees, which indicates they're quite unwell.
Simply because the shape of these distributions is different, we can guess that
the feature will not be able to predict the label extremely well. For example, if
old age perfectly predicted who would have a high temperature, then the
number of old dogs would exactly match the number of dogs with a high
temperature.
The model might still end up being useful though, so lets continue.
The next step is to eyeball the relationship. Lets plot relation between the labels
and features.
Celda Markdown vacía. Haga doble clic o presione Entrar para agregar contenido.
[ ]
graphing.scatter_2D(dataset, label_x="age", label_y="core_temperature", title
='core temperature as a function of age')
Presione Mayús + Entrar para ejecutar
It does seem that older dogs tended to have higher temperatures than younger
dogs. The relationship is quite 'noisy', though: many dogs of the same age have
quite different temperatures.
Simple linear regression
Let's formally examine the relationship between our labels and features by
fitting a line (simple linear regression model) to the dataset.
[ ]
import [Link] as smf
import graphing # custom graphing code. See our GitHub repo for details
# First, we define our formula using a special syntax
# This says that core temperature is explained by age
formula = "core_temperature ~ age"
# Perform linear regression. This method takes care of
# the entire fitting procedure for us.
model = [Link](formula = formula, data = dataset).fit()
# Show a graph of the result
graphing.scatter_2D(dataset, label_x="age",
label_y="core_temperature",
trendline=lambda x: [Link][1] * x + mod
[Link][0]
)
Presione Mayús + Entrar para ejecutar
The line seems to fit the data quite well, validating our hypothesis that there is a
positive correlation between a dog's age and their core temperature.
Interpreting our model
Visually, simple linear regression is easy to understand. Let's recap on what the
parameters mean though.
[ ]
print("Intercept:", [Link][0], "Slope:", [Link][1])
Presione Mayús + Entrar para ejecutar
Remember that simple linear regression models are explained by the line
intercept and the line slope.
Here, our intercept is 38 degrees celcius. This means that when age is 0, the
model will predict 38 degrees.
Our slope is 0.15 degrees celcius, meaning that for every year of age, the model
will predict temperatures 0.15 degrees higher.
In the box below, try to change the age to a few different values to see different
predictions, and compare these with the line in the graph above.
[ ]
def estimate_temperature(age):
# Model param[0] is the intercepts and param[1] is the slope
return age * [Link][1] + [Link][0]
print("Estimate temperature from age")
print(estimate_temperature(age=0))
Presione Mayús + Entrar para ejecutar
Summary
We covered the following concepts in this exercise:
Quickly visualizing a dataset
Qualitatively assessing a linear relationship
Build a simple linear regression model
Understanding parameters of a simple linear regression model
Regresión lineal múltiple y R
cuadrado
Completado100 XP
4 minutos
En esta unidad, se contrasta la regresión lineal múltiple con la regresión lineal
simple. También veremos una métrica llamada R2, que se usa normalmente para
evaluar la calidad de un modelo de regresión lineal.
Regresión lineal múltiple
La regresión lineal múltiple modela la relación entre varias características y una
sola etiqueta. Matemáticamente, es lo mismo que la regresión lineal simple y
normalmente se ajusta con la misma función de costo, pero con más
características.
En lugar de modelar una relación única, esta técnica modela simultáneamente
varias relaciones, que trata como independientes entre sí. Por ejemplo, si
predecimos cuán enfermo se pone un perro en función de age y
body_fat_percentage, se encuentran dos relaciones:
Cómo age aumenta o reduce la posibilidad de enfermedad
Cómo body_fat_percentage aumenta o reduce la posibilidad de
enfermedad
Si solo estamos trabajando con dos características, podemos visualizar nuestro
modelo como una superficie 2D plana, igual que podemos modelar la regresión
lineal simple como una línea. Exploraremos esto en el siguiente ejercicio.
La regresión lineal múltiple tiene suposiciones
El hecho de que el modelo espere que las características sean independientes se
denomina suposición de modelo. Cuando las suposiciones de modelo no son
verdaderas, el modelo puede realizar predicciones erróneas.
Por ejemplo, la edad probablemente pronostica cuán enfermos se ponen los
perros, puesto que los perros con más edad se enferman con más facilidad,
igual que saber si a los perros se les ha enseñado a jugar al frisbi: todos los
perros de más edad probablemente saben cómo jugar al frisbi. Si incluyéramos
age y knows_frisbee en nuestro modelo como características, es probable que el
resultado sería que knows_frisbee es un buen indicador de enfermedad y age se
subestima. Esto es un poco absurdo porque saber jugar a frisbi seguramente no
causa enfermedades. Por el contrario, dog_breed puede también ayudarnos a
predecir enfermedades, pero no hay ninguna razón para pensar que age
predice dog_breed, por lo que podríamos incluirlos en un solo modelo.
Bondad de ajuste: R2
Sabemos que las funciones de costo se pueden usar para evaluar el modo en
que un modelo se ajusta a los datos en los que se entrena. Los modelos de
regresión lineal tienen una medida relacionada especial denominada R2 ("R
cuadrado"). R2 es un valor entre 0 y 1 que nos indica cómo se ajusta un modelo
de regresión lineal a los datos. Cuando se habla de que las correlaciones son
sólidas, a menudo quiere decir que el valor de R2 era grande.
R2 usa las matemáticas más allá de todo aquello de lo que hablamos en este
curso, pero podemos pensar en ello de forma intuitiva. Fijémonos en el ejercicio
anterior en el que analizamos la relación entre age y core_temperature. Un R 2 de
1 significaría que se podrían usar años para predecir perfectamente quién tenía
temperatura alta y quién la tenía baja. Por el contrario, un 0 significaría
simplemente que no había ninguna relación entre los años y la temperatura.
La realidad está en algún lugar intermedio. Nuestro modelo podría predecir la
temperatura hasta cierto grado (por lo que es mejor que R2 = 0), pero los
puntos variaron ligeramente de esta predicción (por lo que es menor que R 2 =
1).
R2 es solo la mitad de la historia
Los valores de R2 se aceptan ampliamente, pero no son una medida perfecta
que podamos usar de forma aislada. Estos valores sufren cuatro limitaciones:
Debido a cómo se calcula R2, cuantas más muestras tenemos, mayor será
el R2. Esto puede hacer que pensemos que un modelo es mejor que otro
modelo (idéntico), simplemente porque los valores de R2 se calcularon con
diferentes cantidades de datos.
Los valores de R2 no nos dicen cómo funcionará un modelo con datos
nuevos y no vistos anteriormente. Los estadísticos lo superan al calcular
una medida complementaria, denominada valor P, de la que no vamos a
hablar. En el aprendizaje automático, a menudo se prueba explícitamente
el modelo en otro conjunto de datos.
Los valores de R2 no nos dicen la dirección de la relación. Por ejemplo, un
valor de R2 de 0,8 no nos indica si la línea está inclinada hacia arriba o
hacia abajo. Tampoco nos dice el grado de inclinación de la línea.
También merece la pena tener en cuenta que no hay ningún criterio universal
que describe lo que convierte un valor de R2 en "suficientemente bueno". Por
ejemplo, en física, normalmente, es poco probable que las correlaciones que no
estén muy cerca de 1 se consideren útiles, pero al modelar sistemas complejos,
los valores de R2 tan bajos como 0,3 podrían considerarse excelentes.
Siguiente unidad: Ejercicio: entrenamiento de un
modelo de regresión lineal múltiple
Ejercicio: entrenamiento de un
modelo de regresión lineal múltiple
Completado100 XP
10 minutos
Este módulo requiere un espacio aislado para completarse.
Un espacio aislado le da acceso a recursos gratuitos. No se le cobrará en su
suscripción personal. El espacio aislado solo podrá usarse para completar el
aprendizaje en Microsoft Learn. El uso para cualquier otro motivo está prohibido
y podría generar la pérdida permanente del acceso al espacio aislado.
Microsoft ofrece esta experiencia de laboratorio y el contenido relacionado con
fines educativos. Toda la información presentada es propiedad de Microsoft y
está destinada únicamente a brindar información sobre los productos y servicios
abordados en este módulo de Microsoft Learn.
Activar espacio aislado
Las sugerencias de enlaces de teclado de la barra de herramientas están ahora ocultas
RuntimeArchivoEditarVista
Ejecutar todo
Kernel
Proceso no conectado
Exercise: Train a multiple linear regression model
In this exercise, we'll train both a simple linear regression model and a multiple
linear regression model, and compare their performance using R-Squared.
Loading data
Let's start by having a look at our data.
CódigoMarkdown
[ ]
import pandas
!pip install statsmodels
!wget [Link]
to-machine-learning/main/[Link]
!wget [Link]
to-machine-learning/main/Data/[Link]
#Import the data from the .csv file
dataset = pandas.read_csv('[Link]', delimiter="\t")
#Let's have a look at the data
dataset
Presione Mayús + Entrar para ejecutar
For this exercise we'll try to predict core_temperature from some of the other
available features.
Data visualization
Let's quickly eyeball which features seem to have some kind of relationship
with core_temperature
[ ]
import graphing # Custom graphing code that uses Plotly. See our GitHub repo
sitory for details
graphing.box_and_whisker(dataset, "male", "core_temperature", show=True)
graphing.box_and_whisker(dataset, "attended_training", "core_temperature", sh
ow=True)
graphing.box_and_whisker(dataset, "ate_at_tonys_steakhouse", "core_temperatur
e", show=True)
graphing.scatter_2D(dataset, "body_fat_percentage", "core_temperature", show=
True)
graphing.scatter_2D(dataset, "protein_content_of_last_meal", "core_temperatur
e", show=True)
graphing.scatter_2D(dataset, "age", "core_temperature")
Presione Mayús + Entrar para ejecutar
At a glance, fatter, older, and male dogs seem to more commonly have higher
temperatures than thinner, younger, or female dogs. Dogs who ate a lot of
protein last night also seem to be more unwell. The other features don't seem
particularly useful.
Simple linear regression
Let's try to predict core_temperature using simple linear regression, and note
the R-Squared for these relationships.
[ ]
import [Link] as smf
import graphing # custom graphing code. See our GitHub repo for details
for feature in ["male", "age", "protein_content_of_last_meal", "body_fat_per
centage"]:
# Perform linear regression. This method takes care of
# the entire fitting procedure for us.
formula = "core_temperature ~ " + feature
simple_model = [Link](formula = formula, data = dataset).fit()
print(feature)
print("R-squared:", simple_model.rsquared)
# Show a graph of the result
graphing.scatter_2D(dataset, label_x=feature,
label_y="core_temperature",
title = feature,
trendline=lambda x: simple_model.params[1] *
x + simple_model.params[0],
show=True)
Presione Mayús + Entrar para ejecutar
Scrolling through these graphs, we get R-square values of 0.0002
(body_fat_percentage), 0.1 (male), and 0.26 (age).
While protein_content_of_last_meal looks very promising too, the
relationship looks curved, not linear. We'll leave this feature for now and come
back to it in the next exercise.
R-Squared
We've shown the R-Squared value for these models and used it as a measure of
'correctness' for our regression, but what is it?
Intuitively, we can think of R-Squared as ratio for how much better our
regression line is than a naive regression that just goes straight through the
mean of all examples. Roughly, the R-Squared is calculated by taking the
loss/error of the trained model, and dividing by the loss/error of the naive
model. That gives a range where 0 is better and 1 is worse, so the whole thing is
subtracted from 1 to flip those results.
Below, we once again show the scatter plot with age and core_temperature,
but this time, we show two regression lines. The first is the naive line that just
goes straight through the mean. This has an R-Squared of 0 (since it's no better
than itself). An R-Squared of 1 would be a line that fit each training example
perfectly. The second plot shows our trained regression line and we once again
see its R-Squared.
[ ]
formula = "core_temperature ~ age"
age_trained_model = [Link](formula = formula, data = dataset).fit()
age_naive_model = [Link](formula = formula, data = dataset).fit()
age_naive_model.params[0] = dataset['core_temperature'].mean()
age_naive_model.params[1] = 0
print("naive R-squared:", age_naive_model.rsquared)
print("trained R-squared:", age_trained_model.rsquared)
# Show a graph of the result
graphing.scatter_2D(dataset, label_x="age",
label_y="core_temperature",
title = "Naive model",
trendline=lambda x: dataset['core_temperature
'].repeat(len(x)),
show=True)
# Show a graph of the result
graphing.scatter_2D(dataset, label_x="age",
label_y="core_temperature",
title = "Trained model",
trendline=lambda x: age_trained_model.params[
1] * x + age_trained_model.params[0])
Presione Mayús + Entrar para ejecutar
Multiple Linear Regression
Instead of modelling these separately, lets try to combine these into a single
model. Body fat didn't seem to be useful after all, so let's just
use male and age as features.
[ ]
model = [Link](formula = "core_temperature ~ age + male", data = dataset).fi
t()
print("R-squared:", [Link])
Presione Mayús + Entrar para ejecutar
By using both features at the same time, we got a better result than any of the
one-feature (univariate) models.
How can we view this though? Well, a simple linear regression is drawn in 2d. If
we are working with an extra variable, we add one dimension and work in 3D.
[ ]
import numpy as np
# Show a graph of the result
# this needs to be 3D, because we now have three variables in play: two featu
res and one label
def predict(age, male):
'''
This converts given age and male values into a prediction from the model
'''
# to make a prediction with statsmodels, we need to provide a dataframe
# so create a dataframe with just the age and male variables
df = [Link](dict(age=[age], male=[male]))
return [Link](df)
# Create the surface graph
fig = [Link](
x_values=[Link]([min([Link]), max([Link])]),
y_values=[Link]([0, 1]),
calc_z=predict,
axis_title_x="Age",
axis_title_y="Male",
axis_title_z="Core temperature"
# Add our datapoints to it and display
fig.add_scatter3d(x=[Link], y=[Link], z=dataset.core_temperature,
mode='markers')
[Link]()
Presione Mayús + Entrar para ejecutar
The graph above is interactive. Try rotating it to see how the model (shown as a
solid plane) would predict core temperature from different combinations of age
and sex.
Inspecting our model
When we have more than two features, it becomes very difficult to visualise
these models. We usually have to look at the parameters directly. Let's do that
now. Statsmodels, one of the common machine learning and statistics libraries,
provides a summary() method which provides information about our model.
[ ]
# Print summary information
[Link]()
Presione Mayús + Entrar para ejecutar
If we look at the top right hand corner, we can see our R-squared statistic that
we printed out earlier.
Slightly down and to the left, we can also see information about the data we
trained our model on. For example, we can see that we trained it on 98
observations (No. Observations).
Below this we find information about our parameters, in a column
called coef (which stands for coefficients, a synonym for parameters in machine
learning). Here we can see the intercept was about 38 - meaning that the model
predicts a core temperature of 38 for a dog with age=0 and male=0. Below this
we see the parameter for age is 0.14, meaning that for each additional year of
age, the predicted temperature would rise 0.14 degrees celsius. For male, we
can see a parameter of 0.32, meaning that the model estimates all dogs (i.e.
where male == 1) to have temperatures 0.32 degrees celsius higher than female
dogs (i.e. where male == 0).
Although we don't have space here to go into detail, the P column is also very
useful. This tells us how confident the model is about this parameter value. As a
rule of thumb, if the p value is less than 0.05, there is a good chance that this
relationship if trustable. For example, here both age and male are less than 0.05,
so we should feel confident using this model in the real world.
As a final exercise, lets do the same thing with our earlier simple linear
regression model, relating age to core_temperature. Read through the table
below and see what you can make out from this model.
[ ]
age_trained_model.summary()
Presione Mayús + Entrar para ejecutar
Summary
We covered the following concepts in this exercise:
Build Simple and Multiple Linear Regression Models.
Compare the performance of both models by looking at R-Squared values.
Inspected models to understand how they work.
Regresión polinómica
Completado100 XP
6 minutos
Hasta ahora, solo hemos visto modelos de regresión lineal: modelos que se
pueden modelar como líneas rectas. Sin embargo, los modelos de regresión
pueden funcionar con prácticamente cualquier otro tipo de relación.
¿En qué consiste la regresión polinómica?
La regresión polinómica modela las relaciones como un tipo determinado de
curva. Los polinomios son una familia de curvas que abarcan desde formas
simples hasta complejas. Cuantos más parámetros tenga la ecuación (modelo),
más compleja puede ser la curva.
Por ejemplo, un polinomio de dos parámetros es simplemente una línea recta:
y = intersección + B1 * x
Mientras que un polinomio de tres parámetros tiene una única curva:
y = intersección + B1 * x + B2 * x2
Un polinomio de cuatro parámetros puede tener dos curvas:
y = intersección + B1 * x + B2 * x2 + B3 * x3
Polinomio frente a otras curvas
Hay muchos tipos de curvas, como las curvas de registro y las curvas logísticas
(en forma de s), que se pueden usar con regresión.
Una ventaja importante de la regresión polinómica es que se puede usar para
observar todo tipo de relaciones. Por ejemplo, la regresión polinómica se puede
usar para relaciones que son negativas dentro de un determinado intervalo de
valores de características, pero positivas dentro de otras. También se puede usar
cuando la etiqueta (valor y) no tiene ningún límite superior teórico.
La desventaja principal de las curvas polinómicas es que a menudo se
extrapolan de manera errónea. En otras palabras, si intentamos predecir valores
mayores o menores que nuestros datos de entrenamiento, los polinomios
pueden predecir valores extremos muy poco realistas. Otra desventaja es que
las curvas polinómicas son fáciles de sobreajustar. Esto significa que el ruido en
los datos puede cambiar la forma de la curva mucho más que los modelos más
sencillos, como la regresión lineal simple.
¿Se pueden usar curvas con varias características?
Hemos visto cómo la regresión múltiple puede ajustarse a varias relaciones
lineales al mismo tiempo. Sin embargo, no es necesario que se limite a las
relaciones lineales. Se pueden usar curvas de todo tipo para estas relaciones
cuando corresponda. Aunque se debe tener cuidado de no usar curvas, como
polinomios, con varias características donde no son necesarias. Esto se debe a
que las relaciones pueden acabar siendo muy complejas, lo que dificulta
comprender los modelos y evaluar si realizarán predicciones que no tienen
sentido desde el punto de vista del mundo real.
Siguiente unidad: Ejercicio: Regresión polinómica
Ejercicio: Regresión polinómica
Completado100 XP
12 minutos
Este módulo requiere un espacio aislado para completarse.
Un espacio aislado le da acceso a recursos gratuitos. No se le cobrará en su
suscripción personal. El espacio aislado solo podrá usarse para completar el
aprendizaje en Microsoft Learn. El uso para cualquier otro motivo está prohibido
y podría generar la pérdida permanente del acceso al espacio aislado.
Microsoft ofrece esta experiencia de laboratorio y el contenido relacionado con
fines educativos. Toda la información presentada es propiedad de Microsoft y
está destinada únicamente a brindar información sobre los productos y servicios
abordados en este módulo de Microsoft Learn.
Activar espacio aislado
Las sugerencias de enlaces de teclado de la barra de herramientas están ahora ocultas
RuntimeArchivoEditarVista
Ejecutar todo
Kernel
Proceso no conectado
Exercise: Fitting a Polynomial Curve
CódigoMarkdown
In this exercise, we'll have a look at a different type of regression
called polynomial regression. In contrast to linear regression which models
relationships as straight lines, polynomial regression models relationships as
curves.
Recall in our previous exercise how the relationship
between core_temperature and protein_content_of_last_meal could not be
properly explained using a straight line. In this exercise, we'll use polynomial
regression to fit a curve to the data instead.
Data visualisation
Let's start this exercise by loading in and having a look at our data.
[ ]
import pandas
!pip install statsmodels
!wget [Link]
to-machine-learning/main/[Link]
!wget [Link]
to-machine-learning/main/Data/[Link]
#Import the data from the .csv file
dataset = pandas.read_csv('[Link]', delimiter="\t")
#Let's have a look at the data
dataset
Presione Mayús + Entrar para ejecutar
Simple Linear Regression
Let's quickly jog our memory by performing the same simple linear regression as
we did in the previous exercise using
the temperature and protein_content_of_last_meal columns of the dataset.
[ ]
import [Link] as smf
import graphing # custom graphing code. See our GitHub repo for details
# Perform linear regression. This method takes care of
# the entire fitting procedure for us.
simple_formula = "core_temperature ~ protein_content_of_last_meal"
simple_model = [Link](formula = simple_formula, data = dataset).fit()
# Show a graph of the result
graphing.scatter_2D(dataset, label_x="protein_content_of_last_meal",
label_y="core_temperature",
trendline=lambda x: simple_model.params[1] * x +
simple_model.params[0])
Presione Mayús + Entrar para ejecutar
Notice how the relationship between the two variables is not truly linear.
Looking at the plot, it's fairly clear to see that the points tend more heavily
towards one side of the line, especially for the higher core-
temperature and protein_content_of_last_meal values. A straight line might
not be the best way to describe this relationship.
Let's have a quick look at the model's R-Squared score:
[ ]
print("R-squared:", simple_model.rsquared)
Presione Mayús + Entrar para ejecutar
That is quite a reasonable R-Squared score, but let's see if we can get an even
better one!
Simple Polynomial Regression
Let's fit a simple polynomial regression this time. Similarly to a simple linear
regression, a simple polynomial regression models the relationship between a
label and a single feature. Unlike a simple linear regression, a simple polynomial
regression can explain relationships that aren't simply straight lines.
In our example, we are going to use a three parameter polynomial.
[ ]
# Perform polynomial regression. This method takes care of
# the entire fitting procedure for us.
polynomial_formula = "core_temperature ~ protein_content_of_last_meal + I(pro
tein_content_of_last_meal**2)"
polynomial_model = [Link](formula = polynomial_formula, data = dataset).fit(
)
# Show a graph of the result
graphing.scatter_2D(dataset, label_x="protein_content_of_last_meal",
label_y="core_temperature",
# Our trendline is the equation for the polynomi
al
trendline=lambda x: polynomial_model.params[2] *
x**2 + polynomial_model.params[1] * x + polynomial_model.params[0])
Presione Mayús + Entrar para ejecutar
That looks a lot better already. Let's confirm by having a quick look at the R-
Squared score:
[ ]
print("R-squared:", polynomial_model.rsquared)
Presione Mayús + Entrar para ejecutar
That's a better R-Squared_ score than the one obtained from the previous
model - great! We can now confidently tell our vet to prioritize dogs who ate a
high protein diet the night before.
Let's chart our model as a 3D chart. We'll view X� and X2�2 as two separate
parameters. Notice that if you rotate the visual just right, our regression model
is still a flat plane. This is why polynomial models are still considered to
be linear models.
[ ]
import numpy as np
fig = [Link](
x_values=[Link]([min(dataset.protein_content_of_last_meal), max(dataset
.protein_content_of_last_meal)]),
y_values=[Link]([min(dataset.protein_content_of_last_meal)**2, max(data
set.protein_content_of_last_meal)**2]),
calc_z=lambda x,y: polynomial_model.params[0] + (polynomial_model.params[
1] * x) + (polynomial_model.params[2] * y),
axis_title_x="x",
axis_title_y="x2",
axis_title_z="Core temperature"
# Add our datapoints to it and display
fig.add_scatter3d(x=dataset.protein_content_of_last_meal, y=dataset.protein_c
ontent_of_last_meal**2, z=dataset.core_temperature, mode='markers')
[Link]()
Presione Mayús + Entrar para ejecutar
Extrapolating
Let's see what happens if we extroplate our data. We would like to see if dogs
that ate meals even higher in protein are expected to get even sicker.
Let's start with the linear regression. We can set what range we would like to
extrapolate our data over by using the x_range argument in the plotting
function. Let's extrapolate over the range [0,100]:
[ ]
# Show an extrapolated graph of the linear model
graphing.scatter_2D(dataset, label_x="protein_content_of_last_meal",
label_y="core_temperature",
# We extrapolate over the following range
x_range = [0,100],
trendline=lambda x: simple_model.params[1] * x +
simple_model.params[0])
Presione Mayús + Entrar para ejecutar
Next, we extrapolate the polynomial regression over the same range:
[ ]
# Show an extrapolated graph of the polynomial model
graphing.scatter_2D(dataset, label_x="protein_content_of_last_meal",
label_y="core_temperature",
# We extrapolate over the following range
x_range = [0,100],
trendline=lambda x: polynomial_model.params[2] *
x**2 + polynomial_model.params[1] * x + polynomial_model.params[0])
Presione Mayús + Entrar para ejecutar
These two graphs predict two very different things!
The extrapolated polynolmial regression expects core_temperature to go down,
while the extrapolated linear regression expects linear
expects core_temperature to go up. A quick look at the graphs obtained in the
previous exercise confirms that we should expect the core_temeprature to be
rising as the protein_content_of_last_meal increases, not falling.
In general, it's not recommended to extrapolate from a polynomial
regression unless you have an a-priori reason to do so (which is only very rarely
the case, so it's best to err on the side of caution, and never extrapolate
from polynomial regressions!)
Summary
We covered the following concepts in this exercise:
Build simple linear regression and simple polynomial regression models.
Compare the performance of both models by plotting them, and looking at R-
Squared values.
Extrapolated the models over a wider range of values.
Sin proceso
Proceso no conectado
Visualización
Kernel no conectado
Siguiente unidad: Prueba de conocimientos
Introducción
Completado100 XP
2 minutos
No todos los modelos son ecuaciones matemáticas simples que se pueden
representar como una línea. Algunos modelos complejos se consideran más
como gráficos de flujo o estructuras de programación tradicionales. Estos
modelos suelen contar con niveles adicionales de personalización, lo que puede
hacer que sean más eficaces, aunque también más complicado trabajar con
ellos. A lo largo de estos ejercicios, exploraremos este escenario, para lo cual
manipularemos el modo en que los modelos funcionan y se entrenan. Aunque
nos centraremos en un tipo de modelo, los principios generales que se enseñan
aquí también se aplican a muchos otros.
Escenario: Predicción de resultados olímpicos
mediante aprendizaje automático
A lo largo de este módulo, haremos referencia al siguiente escenario de ejemplo
cuando expliquemos los conceptos relacionados con la arquitectura de modelos
y los hiperparámetros. Aunque este escenario está diseñado para que parezca
complejo al principio, a medida que avancemos por los ejercicios veremos cómo
se puede abordar con un poco de experimentación y pensamiento crítico.
El eslogan de los Juegos Olímpicos consta de tres palabras en latín: Citius,
Altius, Fortius. Estas palabras significan Más rápido, Más alto, Más fuerte. Desde
que se estableció este eslogan, la variedad de juegos de las Olimpiadas ha
crecido enormemente para incluir el tiro, la vela y los deportes de equipo. Nos
gustaría explorar el papel que siguen jugando las características físicas básicas a
la hora de predecir quién gana una medalla en uno de los eventos deportivos
más prestigiosos del planeta. Para ello, exploraremos la gimnasia rítmica: una
incorporación moderna a los juegos que combina el baile, la gimnasia y la
calistenia. Podría caber esperar que las características básicas de edad, altura y
peso solo desempeñan un papel limitado, dada la necesidad de agilidad,
flexibilidad, destreza y coordinación. Vamos a usar algunos modelos de
aprendizaje automático más avanzados para ver lo críticos que son realmente
estos factores básicos.
Requisitos previos
Familiarizarse con los modelos de aprendizaje automático
Objetivos de aprendizaje
Detectar nuevos tipos de modelos: árboles de decisión y bosques
aleatorios.
Saber cómo la arquitectura del modelo puede afectar al
rendimiento.
Practicar el trabajo con hiperparámetros para mejorar la eficacia del
entrenamiento.
Siguiente unidad: Árboles de decisión y
arquitectura de modelos
Árboles de decisión y arquitectura de
modelos
Completado100 XP
4 minutos
Cuando se habla de arquitectura, a menudo pensamos en edificios. La
arquitectura es responsable de la estructura de un edificio: su altura,
profundidad, número de plantas y cómo se conectan las cosas internamente.
Esta arquitectura también determina cómo usamos un edificio: por dónde
entramos y qué podemos "obtener de él", en términos prácticos.
En el aprendizaje automático, la arquitectura hace referencia a un concepto
similar. ¿Cuántos parámetros tiene y cómo están vinculados para lograr un
cálculo? ¿Realizamos muchos cálculos en paralelo (ancho) o tenemos
operaciones en serie que se basan en un cálculo anterior (profundidad)? ¿Cómo
se pueden proporcionar entradas a este modelo y cómo se pueden recibir
salidas? Estas decisiones de arquitectura solo se aplican normalmente a
modelos más complejos y pueden variar desde las más sencillas a las más
complejas. Estas decisiones se suelen tomar antes de entrenar el modelo,
aunque, en algunas circunstancias, hay margen para realizar cambios después
del entrenamiento.
Vamos a explorar este escenario usando concretamente árboles de decisión
como ejemplo.
¿Qué es un árbol de decisión?
Básicamente, un árbol de decisión es un diagrama de flujo. Los árboles de
decisión son un modelo de categorización que divide las decisiones en varios
pasos.
La muestra se proporciona en el punto de entrada (arriba, en el diagrama
anterior) y cada punto de salida tiene una etiqueta (abajo en el diagrama). En
cada nodo, una instrucción simple "if" decide a qué rama pasa la muestra a
continuación. Una vez que la rama ha llegado al final del árbol (las hojas), se le
asigna una etiqueta.
¿Cómo se entrenan los árboles de decisión?
En los árboles de decisión se entrena un nodo o punto de decisión cada vez. En
el primer nodo, se evalúa todo el conjunto de entrenamiento. A partir de ahí, se
selecciona una característica que pueda separar mejor el conjunto en dos
subconjuntos que tengan etiquetas más homogéneas. Por ejemplo, imagine que
nuestro conjunto de entrenamiento fuera el siguiente:
Peso (característica) Edad (característica) Ganó una medalla (etiqueta)
90 18 No
80 20 No
70 19 No
70 25 No
60 18 Sí
80 28 Sí
85 26 Sí
Peso (característica) Edad (característica) Ganó una medalla (etiqueta)
90 25 Sí
Si lo que queremos es hacer todo lo posible para encontrar una regla sencilla
que divida estos datos, podríamos hacerlo por edad, en torno a 24 años, porque
la mayoría de los medallistas tenían más de 24 años. Esta división nos
proporcionaría dos subconjuntos de datos.
Subconjunto 1
Peso (característica) Edad (característica) Ganó una medalla (etiqueta)
90 18 No
80 20 No
70 19 No
60 18 Sí
Subconjunto 2
Peso (característica) Edad (característica) Ganó una medalla (etiqueta)
70 25 No
80 28 Sí
85 26 Sí
90 25 Sí
Si nos detenemos aquí, tenemos un modelo sencillo con un nodo y dos hojas.
La hoja 1 contiene los que no ganaron medalla y tiene una precisión del 75 %
en nuestro conjunto de entrenamiento. La hoja 2 contiene los medallistas y
también tiene una precisión del 75 % en el conjunto de entrenamiento.
Sin embargo, no es necesario detenerse aquí. Podemos continuar este proceso
y seguir dividiendo las hojas.
En el subconjunto 1, el primer nodo nuevo podría dividirse por el peso, ya que
el único medallista tenía un peso inferior a los que no ganaron una medalla. La
regla puede establecerse en "peso < 65". Se predice que las personas con un
peso < 65 han ganado una medalla. Aunque las personas con un peso ≥ 65 no
cumplen este criterio, se podría predecir que no ganarán una medalla.
En el subconjunto 2, el segundo nodo nuevo también podría dividirse por el
peso, pero esta vez se predice que cualquier persona con un peso superior a 70
habría ganado una medalla, mientras que los que están por debajo de ese peso
no.
Esto nos proporcionaría un árbol que podría lograr una precisión del 100 % en
el conjunto de entrenamiento.
Puntos fuertes y débiles de los árboles de decisión
Se considera que los árboles de decisión tienen un sesgo bajo. Esto significa
que suelen ser buenos para identificar características que son importantes para
etiquetar algo correctamente.
La principal debilidad de los árboles de decisión es el sobreajuste. Tenga en
cuenta el ejemplo anterior: el modelo proporciona una manera exacta de
calcular quién es probable que gane una medalla, de forma que se predecirá
correctamente el 100 % del conjunto de datos de entrenamiento. Este nivel de
precisión es inusual para los modelos de aprendizaje automático, que
normalmente producen numerosos errores en el conjunto de datos de
entrenamiento. Un buen rendimiento del entrenamiento no es algo malo en sí
mismo, pero el árbol se ha especializado tanto en el conjunto de entrenamiento
que es probable que no le vaya bien en el conjunto de pruebas. El motivo es
que el árbol ha logrado aprender relaciones en el conjunto de entrenamiento
que probablemente no son reales, como que tener un peso de 60 kilos
garantiza una medalla si se tienen menos de 25 años.
La arquitectura del modelo afecta al sobreajuste
La forma en que estructuramos el árbol de decisión es clave para evitar sus
puntos débiles. Cuanto más profundo sea el árbol, más probable es que se
sobreajuste el conjunto de entrenamiento. Por ejemplo, en el árbol simple
anterior, si limitásemos el árbol a solo el primer nodo, se producirían errores en
el conjunto de entrenamiento, pero es probable que funcionara mejor en el
conjunto de pruebas. El motivo es que habría reglas más generales sobre quién
gana una medalla, por ejemplo, "los atletas mayores de 24 años", en lugar de
reglas muy específicas que solo se podrían aplicar al conjunto de
entrenamiento.
Aunque aquí nos centramos en los árboles, otros modelos complejos suelen
tener puntos débiles similares que se pueden mitigar a través de decisiones
sobre cómo se estructuran o cómo pueden manipularse en el entrenamiento.
Siguiente unidad: Ejercicio: Árboles de decisión y
arquitectura de modelos
Ejercicio: Árboles de decisión y
arquitectura de modelos
Completado100 XP
8 minutos
Este módulo requiere un espacio aislado para completarse.
Un espacio aislado le da acceso a recursos gratuitos. No se le cobrará en su suscripción
personal. El espacio aislado solo podrá usarse para completar el aprendizaje en
Microsoft Learn. El uso para cualquier otro motivo está prohibido y podría generar la
pérdida permanente del acceso al espacio aislado.
Microsoft ofrece esta experiencia de laboratorio y el contenido relacionado con fines
educativos. Toda la información presentada es propiedad de Microsoft y está destinada
únicamente a brindar información sobre los productos y servicios abordados en este
módulo de Microsoft Learn.
Activar espacio aislado
Las sugerencias de enlaces de teclado de la barra de herramientas están ahora ocultas
RuntimeArchivoEditarVista
Ejecutar todo
Kernel
Proceso no conectado
Exercise: Decision trees and model architecture
Our goal in this exercise is to use a decision tree classifier to predict whether an
individual crime will be resolved, based on simple information such as where it
took place and what kind of crime it was.
Data visualization
As usual, let's begin by loading in and having a look at our data:
CódigoMarkdown
[ ]
import pandas
!wget [Link]
to-machine-learning/main/[Link]
!wget [Link]
to-machine-learning/main/Data/san_fran_crime.csv
#Import the data from the .csv file
dataset = pandas.read_csv('san_fran_crime.csv', delimiter="\t")
#Let's have a look at the data and the relationship we are going to model
print([Link]())
print([Link])
Presione Mayús + Entrar para ejecutar
Our data looks to be a mix of categorical variables like
Crime Category or PdDistrict, and numerical variables like
the day_of_year (1-365) and time_in_hours (time of day, converted to a float).
We also have X and Y which refer to GPS coordinates, and Resolution which is
our label.
Let's visualize our data:
[ ]
import graphing # custom graphing code. See our GitHub repo for details
import numpy as np
# Crime category
graphing.multiple_histogram(dataset, label_x='Category', label_group="Resolut
ion", histfunc='sum', show=True)
# District
graphing.multiple_histogram(dataset, label_group="Resolution", label_x="PdDis
trict", show=True)
# Map of crimes
graphing.scatter_2D(dataset, label_x="X", label_y="Y", label_colour="Resoluti
on", title="GPS Coordinates", size_multiplier=0.8, show=True)
# Day of the week
graphing.multiple_histogram(dataset, label_group="Resolution", label_x="DayOf
Week", show=True)
# day of the year
# For graphing we simplify this to week or the graph becomes overwhelmed with
bars
dataset["week_of_year"] = [Link](dataset.day_of_year / 7.0)
graphing.multiple_histogram(dataset,
label_x='week_of_year',
label_group='Resolution',
histfunc='sum', show=True)
del dataset["week_of_year"]
Presione Mayús + Entrar para ejecutar
It always pays to inspect your data before diving in. What we can see here is
that:
Most reported crimes were not resolved in 2016
Different police districts reported different volumes of crime
Different police districts reported different success rates resolving crimes
Friday and Saturday typically had more crimes than other days
Larsony/Theft was overwhelmingly the most common crime reported
Finalising Data preparation
Let's finalise our data preparation by one-hot encoding our categorical features:
[ ]
# One-hot encode categorical features
dataset = pandas.get_dummies(dataset, columns=["Category", "PdDistrict"], dro
p_first=False)
print([Link]())
Presione Mayús + Entrar para ejecutar
We also need to make a training and test set.
Did you notice how much data we were working with before? If not, re-check
the printouts from above.
We have over 150,000 samples to work with. That is a very large amount of data.
Due to the sheer size, we can afford to have a larger proportion in the training
set that we would normally have.
[ ]
from sklearn.model_selection import train_test_split
# Split the dataset in an 90/10 train/test ratio.
# We can afford to do this here because our dataset is very very large
# Normally we would choose a more even ratio
train, test = train_test_split(dataset, test_size=0.1, random_state=2, shuffl
e=True)
print("Data shape:")
print("train", [Link])
print("test", [Link])
Presione Mayús + Entrar para ejecutar
Model assessment code
We will fit several models here, so to maximise code reuse, we will make a
dedicated method that trains a model and then tests it.
Our test stage uses a metric called "balanced accuracy", which we will refer to as
"accuracy" for short throughout this exercise. It is not critical that you
understand this metric for these exercises, but in essence this is
between 0 and 1:
0 means no answers were correct
1 means all answers were correct
Balanced accuracy takes into account that our data set has more unresolved
than resolved crimes. We will cover what this means in later learning material in
this course.
[ ]
from [Link] import balanced_accuracy_score
# Make a utility method that we can re-use throughout this exercise
# To easily fit and test out model
features = [c for c in [Link] if c != "Resolution"]
def fit_and_test_model(model):
'''
Trains a model and tests it against both train and test sets
'''
global features
# Train the model
[Link](train[features], [Link])
# Assess its performance
# -- Train
predictions = [Link](train[features])
train_accuracy = balanced_accuracy_score([Link], predictions)
# -- Test
predictions = [Link](test[features])
test_accuracy = balanced_accuracy_score([Link], predictions)
return train_accuracy, test_accuracy
print("Ready to go!")
Presione Mayús + Entrar para ejecutar
Fitting a decision tree
Let's use a decision tree to help us determine whether a not a crime will be
resolved. Decision trees are categorisation models that break decisions down
into multiple steps. They can be likened to a flow chart, with a decision being
made at each subsequent level of the tree.
[ ]
import [Link]
# fit a simple tree using only three levels
model = [Link](random_state=2, max_depth=3)
train_accuracy, test_accuracy = fit_and_test_model(model)
print("Model trained!")
print("Train accuracy", train_accuracy)
print("Test accuracy", test_accuracy)
Presione Mayús + Entrar para ejecutar
That's not bad! Now that the model is trained, let's visualize it so we can get a
better idea of how it works (and also see where it gets its tree moniker from!):
[ ]
#--------------
from [Link] import plot_tree
from matplotlib import pyplot as plt
plot = [Link](figsize = (4,4), dpi=300)[0]
plot = plot_tree(model,
fontsize=3,
feature_names = features,
class_names = ['0','1'], # class_names in ascending numerical
order
label="root",
impurity=False,
filled=True)
[Link]()
Presione Mayús + Entrar para ejecutar
All of the blue colored boxes correspond to prediction that a crime would be
resolved.
Take a look at the tree to see what it thinks are important for predicting an
outcome. Compare this to the graphs we made earlier. Can you see a
relationship between the two?
The score we have is not bad, but the tree is pretty simple. Let's see if we can do
better.
Improving performance through architecture
We will try and improve our model's performance by changing its architecture.
Let's focus on the maximum_depth parameter.
Our previous tree was relatively simple and shallow with a maximum_depth = 3.
Let's see what happens if we increase it to 100:
[ ]
# fit a very deep tree
model = [Link](random_state=1, max_depth=100)
train_accuracy, test_accuracy = fit_and_test_model(model)
print("Train accuracy", train_accuracy)
print("Test accuracy", test_accuracy)
Presione Mayús + Entrar para ejecutar
As you can imagine, a tree with a maximum_depth = 100 is big. Too big to
visualize here, so let's jump straight into seeing how the new model works on
our training data.
Both the training and test accuracy have increased a lot. The training, however,
has increased much more. While we're happy with the improvement in test
accuracy, this is a clear sign of overfitting.
Overfitting with decision trees becomes even more obvious when we have more
typical (smaller) sized datasets. Let's re-run the previous exercise but with only
100 training samples:
[ ]
# Temporarily shrink the training set to something
# more realistic
full_training_set = train
train = train[:100]
# fit the same tree as before
model = [Link](random_state=1, max_depth=100)
# Assess on the same test set as before
train_accuracy, test_accuracy = fit_and_test_model(model)
print("Train accuracy", train_accuracy)
print("Test accuracy", test_accuracy)
# Roll the training set back to the full set
train = full_training_set
Presione Mayús + Entrar para ejecutar
The model performs badly on the test data. With reasonable sized
datasets, decision trees are notoriously prone to overfitting. In other words, they
tend to fit very well to the data they're trained on, but generalize very poorly to
unknown data. This gets worse the deeper the tree gets or the smaller the
training set gets. Let's see if we can mitigate this.
Pruning a tree
Pruning is the process of simplifying a decision tree so that it gives the best
classification results while simultaneously reducing overfitting. There are two
types of pruning: pre-pruning and post-pruning.
Pre-pruning involves restricting the model during training, so that it does not
grow larger than is useful. We will cover this below.
Post-pruning is when we simplify the tree after training it. It does not involve the
making of any design decision ahead of time, but simply optimizing the
exisiting model. This is a valid technique but is quite involved, and so we do not
cover it here due time constraints.
Prepruning
We can perform pre-pruning, by generating many models, each with
different max_depth parameters. For each, we recording the balanced
accuracy for the test set. To show that this is important even with quite large
datasets, we will work with 10000 samples here.
[ ]
# Temporarily shrink the training set to 10000
# for this exercise to see how pruning is important
# even with moderately large datasets
full_training_set = train
train = train[:10000]
# Loop through the values below and build a model
# each time, setting the maximum depth to that value
max_depth_range = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ,15, 20, 50, 100]
accuracy_trainset = []
accuracy_testset = []
for depth in max_depth_range:
# Create and fit the model
prune_model = [Link](random_state=1, max_dep
th=depth)
# Calculate and record its sensitivity
train_accuracy, test_accuracy = fit_and_test_model(prune_model)
accuracy_trainset.append(train_accuracy)
accuracy_testset.append(test_accuracy)
# Plot the sensitivity as a function of depth
pruned_plot = [Link](dict(max_depth=max_depth_range, accuracy=accur
acy_trainset))
fig = graphing.line_2D(dict(train=accuracy_trainset, test=accuracy_testset),
x_range=max_depth_range, show=True)
# Roll the training set back to the full thing
train = full_training_set
Presione Mayús + Entrar para ejecutar
We can see from our plot that the best accuracy is obtained for a max_depth of
about 10. We are looking to simplify our tree, so we pick max_depth = 10 for
our final pruned tree:
[ ]
# Temporarily shrink the training set to 10000
# for this exercise to see how pruning is important
# even with moderately large datasets
full_training_set = train
train = train[:10000]
# Not-pruned
model = [Link](random_state=1)
train_accuracy, test_accuracy = fit_and_test_model(model)
print("Unpruned Train accuracy", train_accuracy)
print("Unpruned Test accuracy", test_accuracy)
# re-fit our final tree to print out its performance
model = [Link](random_state=1, max_depth=10)
train_accuracy, test_accuracy = fit_and_test_model(model)
print("Train accuracy", train_accuracy)
print("Test accuracy", test_accuracy)
# Roll the training set back to the full thing
train = full_training_set
Presione Mayús + Entrar para ejecutar
Our new and improved pruned model shows a marginally better balanced
accuracy on the test set and much worse performance on the training set than
the model that is not pruned. This means our pruning has significantly reduced
overfitting.
If you would like, go back and change the number of samples to 100, and notice
how the optimal max_depth changes. Think about why this might be (hint:
model complexity versus sample size)
Another option that you may like to play with is how many features are entered
into the tree. Similar patterns of overfitting can be observed by manipulating
this. In fact, the number and type of the features provided to a decision tree can
be even more important than its sheer size.
Summary
In this unit we covered the following topics:
Using visualization techniques to gain insights into our data
Building a simple decision tree model
Using the trained model to predict labels
Pruning a decision tree to reduce the effects of overfitting
Bosques aleatorios y selección de
arquitecturas
Completado100 XP
4 minutos
La experimentación con arquitecturas suele centrarse en la creación de modelos
modernos eficaces. Y así lo hemos hecho a un nivel básico con árboles de
decisión, pero el único límite es nuestra imaginación y, quizás, la memoria del
equipo. De hecho, considerar los árboles de decisión desde una perspectiva más
amplia dio lugar a una arquitectura de modelos muy conocida que reduce la
tendencia de sus árboles de decisión a sobreajustar los datos.
¿Qué es un bosque aleatorio?
Un bosque aleatorio es una colección de árboles de decisión, que se usan
conjuntamente para calcular qué etiqueta se debe asignar a una muestra. Por
ejemplo, si entrenamos un bosque aleatorio para predecir los medallistas,
podríamos entrenar 100 árboles de decisión diferentes. Para realizar una
predicción, usaríamos todos los árboles de forma independiente. De hecho,
"votarían" si el atleta ganaría una medalla, lo que proporcionaría una decisión
final.
¿Cómo se entrena un bosque aleatorio?
Los bosques aleatorios se construyen sobre la idea de que, aunque un único
árbol de decisión esté muy sesgado o sobreajustado, si entrenamos varios
árboles de decisión, se sesgarán de maneras diferentes. Para ello, es necesario
que cada árbol se entrene de forma independiente y cada uno en un conjunto
de entrenamiento ligeramente diferente.
Para entrenar un único árbol de decisión, se extrae un determinado número de
muestras (atletas en nuestro escenario) del conjunto de entrenamiento
completo. Cada muestra se puede seleccionar más de una vez y esta operación
se realiza aleatoriamente. A continuación, el árbol se entrena de la manera
estándar. Este proceso se repite con cada árbol. A medida que cada árbol
obtiene una combinación diferente de ejemplos de entrenamiento, termina
entrenado y sesgado, de forma diferente a los otros.
Ventajas del bosque aleatorio
El rendimiento de los bosques aleatorios suele ser impresionante, por lo que
suele ser mejor compararlos con las redes neuronales, que son otro tipo de
modelo conocido y de alto rendimiento. A diferencia de las redes neuronales,
los modelos de bosque aleatorio son fáciles de entrenar: los marcos modernos
proporcionan métodos útiles que permiten hacerlo en solo unas pocas líneas de
código. Los bosques aleatorios también son rápidos de entrenar y no necesitan
grandes conjuntos de datos para funcionar bien. Esto los diferencia de las redes
neuronales, que a menudo pueden tardar minutos o días en entrenarse, se
necesita una experiencia considerable y, normalmente, requieren conjuntos de
datos muy grandes. Las decisiones de arquitectura de los bosques aleatorios si
bien son más complejas que las de los modelos, como es el caso de la regresión
lineal, son mucho más sencillas que las de las redes neuronales.
Desventajas del bosque aleatorio
La desventaja principal de los bosques aleatorios es que son difíciles de
comprender. En concreto, aunque estos modelos son totalmente transparentes
(cada árbol se puede inspeccionar y entender), a menudo contienen tantos
árboles que resulta prácticamente imposible hacerlo.
¿Cómo puedo personalizar estas arquitecturas?
Al igual que hay varios modelos, los bosques aleatorios tienen varias opciones
de arquitectura. Lo más fácil es tener en cuentas el tamaño del bosque: el
número de árboles que intervienen, junto con el tamaño de estos árboles. Por
ejemplo, se podría solicitar a un bosque que predijera los medallistas que
contengan 100 árboles, cada uno con una profundidad máxima de seis nodos.
Esto significa que la decisión final sobre si un atleta va a conseguir una medalla
se debe tomar con no más de seis declaraciones "if".
Como ya hemos visto, aumentar el tamaño de un árbol (en términos de
profundidad o número de hojas) hace que sea más probable que se
sobreajusten los datos sobre los que se entrena. Esta limitación también se
aplica a los bosques aleatorios. Sin embargo, con los bosques aleatorios
podemos hacer frente a ella aumentando el número de árboles, suponiendo
que cada árbol se sesgue de una manera diferente. También se puede restringir
cada árbol a un número determinado de características, o no permitir la
creación de hojas cuando solo haya una diferencia marginal en el rendimiento
del entrenamiento. La capacidad de un bosque aleatorio para realizar buenas
predicciones no es infinita. En algún momento, aumentar el tamaño y el número
de árboles no ofrece ninguna mejora adicional debido a la variedad limitada de
datos de entrenamiento de los que disponemos.
Siguiente unidad: Ejercicio: Selección de las
arquitecturas de bosque aleatorio
Ejercicio: Selección de las
arquitecturas de bosque aleatorio
Completado100 XP
10 minutos
Este módulo requiere un espacio aislado para completarse.
Un espacio aislado le da acceso a recursos gratuitos. No se le cobrará en su
suscripción personal. El espacio aislado solo podrá usarse para completar el
aprendizaje en Microsoft Learn. El uso para cualquier otro motivo está prohibido
y podría generar la pérdida permanente del acceso al espacio aislado.
Microsoft ofrece esta experiencia de laboratorio y el contenido relacionado con
fines educativos. Toda la información presentada es propiedad de Microsoft y
está destinada únicamente a brindar información sobre los productos y servicios
abordados en este módulo de Microsoft Learn.
Activar espacio aislado
Las sugerencias de enlaces de teclado de la barra de herramientas están ahora ocultas
RuntimeArchivoEditarVista
Ejecutar todo
Kernel
Proceso no conectado
Exercise: Random forests and model architecture
In the previous exercise, we used decision trees to predict whether a crime
would be solved in San Francisco.
Recall that decision trees did a reasonable job, but they have a tendency
to overfit, meaning that the results would degrade considerably when using
the test set or any unseen data.
This time we will used random forests to address that overfit tendency.
We will also look at how the model's architecture can influence its performance.
Data visualization and preparation
As usual, let's take another quick look at the crime dataset, then split it
into train and test sets:
CódigoMarkdown
[]
import pandas
!wget [Link]
to-machine-learning/main/[Link]
!wget [Link]
to-machine-learning/main/Data/san_fran_crime.csv
import numpy as np
from sklearn.model_selection import train_test_split
import graphing # custom graphing code. See our GitHub repo for details
# Import the data from the .csv file
dataset = pandas.read_csv('san_fran_crime.csv', delimiter="\t")
# Remember to one-hot encode our crime and PdDistrict variables
categorical_features = ["Category", "PdDistrict"]
dataset = pandas.get_dummies(dataset, columns=categorical_features, drop_firs
t=False)
# Split the dataset in an 90/10 train/test ratio.
# Recall that our dataset is very large so we can afford to do this
# with only 10% entering the test set
train, test = train_test_split(dataset, test_size=0.1, random_state=2, shuffl
e=True)
# Let's have a look at the data and the relationship we are going to model
print([Link]())
print("train shape:", [Link])
print("test shape:", [Link])
Presione Mayús + Entrar para ejecutar
Hopefully this looks familiar to you! If not, jump back and go through the
previous exercise on decision trees.
Model assessment code
We will use the same model assessment code as we did in the previous exercise
[]
from [Link] import balanced_accuracy_score
# Make a utility method that we can re-use throughout this exercise
# To easily fit and test out model
features = [c for c in [Link] if c != "Resolution"]
def fit_and_test_model(model):
'''
Trains a model and tests it against both train and test sets
'''
global features
# Train the model
[Link](train[features], [Link])
# Assess its performance
# -- Train
predictions = [Link](train[features])
train_accuracy = balanced_accuracy_score([Link], predictions)
# -- Test
predictions = [Link](test[features])
test_accuracy = balanced_accuracy_score([Link], predictions)
return train_accuracy, test_accuracy
print("Ready to go!")
Presione Mayús + Entrar para ejecutar
Decision tree
Let's quickly train a reasonably well-tuned decision tree to remind ourselves of
its performance:
[]
import [Link]
# re-fit our last decision tree to print out its performance
model = [Link](random_state=1, max_depth=10)
dt_train_accuracy, dt_test_accuracy = fit_and_test_model(model)
print("Decision Tree Performance:")
print("Train accuracy", dt_train_accuracy)
print("Test accuracy", dt_test_accuracy)
Presione Mayús + Entrar para ejecutar
Random Forest
A random forest is a collection of decision trees that work together to calculate
the label for a sample.
Trees in a random forest are trained independently, on different partitions of
data, and thus develop different biases, but when combined they are less likely
to overfit the data.
Let's build a very simple forest with two trees and the default parameters:
[]
from [Link] import RandomForestClassifier
# Create a random forest model with two trees
random_forest = RandomForestClassifier( n_estimators=2,
random_state=2,
verbose=False)
# Train and test the model
train_accuracy, test_accuracy = fit_and_test_model(random_forest)
print("Random Forest Performance:")
print("Train accuracy", train_accuracy)
print("Test accuracy", test_accuracy)
Presione Mayús + Entrar para ejecutar
Our two-tree forest has done more poorly than the single tree on the test set,
though has done a better job on the train set.
To some extent this should be expected. Random forests usually work with
many more trees. Simply having two allowed it to overfit the training data much
better than the original decision tree.
Altering the number of trees
Let's then build several forest models, each with a different number of trees, and
see how they perform:
[]
import graphing
# n_estimators states how many trees to put in the model
# We will make one model for every entry in this list
# and see how well each model performs
n_estimators = [2, 5, 10, 20, 50]
# Train our models and report their performance
train_accuracies = []
test_accuracies = []
for n_estimator in n_estimators:
print("Preparing a model with", n_estimator, "trees...")
# Prepare the model
rf = RandomForestClassifier(n_estimators=n_estimator,
random_state=2,
verbose=False)
# Train and test the result
train_accuracy, test_accuracy = fit_and_test_model(rf)
# Save the results
test_accuracies.append(test_accuracy)
train_accuracies.append(train_accuracy)
# Plot results
graphing.line_2D(dict(Train=train_accuracies, Test=test_accuracies),
n_estimators,
label_x="Numer of trees (n_estimators)",
label_y="Accuracy",
title="Performance X number of trees", show=True)
Presione Mayús + Entrar para ejecutar
The metrics look great for the training set, but not so much for the test set.
More trees tended to help both but only up to a point.
We might have expected the number of trees to resolve our overfitting problem,
but this was not the case! Chances are that the model is simply too complex
relative to the data, allowing it to overfit the training set.
Altering the minimum number of samples for split
parameter
Recall that decision trees have a root node, internal nodes and leaf nodes, and
that the first two can be split into newer nodes with subsets of data.
If we let our model split and create too many nodes, it can become increasingly
complex and start to overfit.
One way to limit that complexity is to tell the model that each node needs to
have at least a certain number of samples, otherwise it can't split into subnodes.
In other words, we can set the model's min_samples_split parameter to the
least number of samples required so that a node can be split.
Our default value for min_samples_split is only 2, so models will quickly
become too complex if that parameter is left untouched.
We will now use the best performing model above, then try it with
different min_samples_split values and compare the results:
[]
# Shrink the training set temporarily to explore this
# setting with a more normal sample size
full_trainset = train
train = full_trainset[:1000] # limit to 1000 samples
min_samples_split = [2, 10, 20, 50, 100, 500]
# Train our models and report their performance
train_accuracies = []
test_accuracies = []
for min_samples in min_samples_split:
print("Preparing a model with min_samples_split = ", min_samples)
# Prepare the model
rf = RandomForestClassifier(n_estimators=20,
min_samples_split=min_samples,
random_state=2,
verbose=False)
# Train and test the result
train_accuracy, test_accuracy = fit_and_test_model(rf)
# Save the results
test_accuracies.append(test_accuracy)
train_accuracies.append(train_accuracy)
# Plot results
graphing.line_2D(dict(Train=train_accuracies, Test=test_accuracies),
min_samples_split,
label_x="Minimum samples split (min_samples_split)",
label_y="Accuracy",
title="Performance", show=True)
# Rol back the trainset to the full set
train = full_trainset
Presione Mayús + Entrar para ejecutar
As you can see above, small restrictions on the model's complexity - by limiting
its ability to split nodes - reduce the gap between training and test
performance. If this is subtle, it does so without damaging test performance at
all.
By limiting the model complexity we address overfitting, improving its ability
to generalize and make accurate predictions on unseen data.
Notice that using min_samples_split=20 gave us the best result for the test set,
and that higher values worsened outcomes.
Altering the model depth
A related method to limit the trees is restricting max_depth. This is equivalent
to max_depth we used for our decision tree, earlier. Its default value is None,
which means nodes can be expanded until all leaves are pure (all samples in it
have the same label) or have less samples than the value set
for min_samples_split.
Whether max_depth, or min_samples_split is more appropriate depends on
the nature of your dataset, including its size. Usually we need to experiment to
find the best settings. Let's investigate max_depth as though we only had 500
crime samples available for our training set.
[]
# Shrink the training set temporarily to explore this
# setting with a more normal sample size
full_trainset = train
train = full_trainset[:500] # limit to 500 samples
max_depths = [2, 4, 6, 8, 10, 15, 20, 50, 100]
# Train our models and report their performance
train_accuracies = []
test_accuracies = []
for max_depth in max_depths:
print("Preparing a model with max_depth = ", max_depth)
# Prepare the model
rf = RandomForestClassifier(n_estimators=20,
max_depth=max_depth,
random_state=2,
verbose=False)
# Train and test the result
train_accuracy, test_accuracy = fit_and_test_model(rf)
# Save the results
test_accuracies.append(test_accuracy)
train_accuracies.append(train_accuracy)
# Plot results
graphing.line_2D(dict(Train=train_accuracies, Test=test_accuracies),
max_depths,
label_x="Maximum depth (max_depths)",
label_y="Accuracy",
title="Performance", show=True)
# Rol back the trainset to the full set
train = full_trainset
Presione Mayús + Entrar para ejecutar
The plot above tells us that our model actually benefits from a higher value
for max_depth, up to the limit of 15.
Increasing depth beyond this point begins to harm test performence, as it
constrains the model too much for it to generalize.
As usual, it is important to evaluate different values when setting model
parameters and defining its architecture.
An optimised model
Properly optimizing a model on a dataset this large can take many hours - more
than you need to commit to this exercise just to learn. If you would like to run a
model that has already been optimized for the full dataset, you can run the
code below, and compare its performance to everything we have seen so far.
This is optional - just note that the model may take 1 - 2 minutes to train due to
its size and the sheer volume of data
[]
# Prepare the model
rf = RandomForestClassifier(n_estimators=200,
max_depth=128,
max_features=25,
min_samples_split=2,
random_state=2,
verbose=False)
# Train and test the result
print("Training model. This may take 1 - 2 minutes")
train_accuracy, test_accuracy = fit_and_test_model(rf)
# Print out results, compared to the decision tree
data = {"Model": ["Decision tree","Final random forest"],
"Train sensitivity": [dt_train_accuracy, train_accuracy],
"Test sensitivity": [dt_test_accuracy, test_accuracy]
}
[Link](data, columns = ["Model", "Train sensitivity", "Test sensiti
vity"])
Presione Mayús + Entrar para ejecutar
As you can see, fine tuning the model's parameters resulted in a significant
improvement in the test set results.
Summary
In this exercise we covered the following topics:
Random forest models and how they differ from decision trees
How we can change a model's architecture by setting different parameters and
changing their values
The importance of trying several combinations of parameters and evaluate
these changes to improve performance
In the future you will see that different models have architectures where you can
fine tune the parameters. Experimentation is needed to achieve the best
possible results.
Hiperparámetros en la clasificación
Completado100 XP
6 minutos
Los hiperparámetros son como los valores de configuración que se usan para
el entrenamiento. Por ejemplo, podríamos decidir entrenar de manera lenta o
rápida. Los hiperparámetros afectan al entrenamiento y, por tanto, influyen en el
rendimiento final del modelo. Saber qué hiperparámetros están disponibles
exactamente depende del tipo de modelo que entrenemos. Normalmente,
experimentamos con hiperparámetros para optimizar el rendimiento de nuestro
modelo.
Bosques aleatorios como ejemplo
Los bosques aleatorios tienen diferentes tipos de hiperparámetros disponibles.
En concreto, con los bosques aleatorios, la línea entre los hiperparámetros de
decisiones de arquitectura puede ser difusa. El motivo es que los
hiperparámetros no solo afectan a los parámetros dentro del modelo, sino
también a cómo se estructuran los árboles y el bosque.
Recuerde que, al principio del entrenamiento, a cada árbol de decisión se le
proporcionan numerosas muestras, como 100 gimnastas, algunos de las cuales
ganaron medallas. Se debe crear un árbol que divida progresivamente estas
muestras en subgrupos de atletas más pequeños. El objetivo es que estos
subgrupos contengan atletas que sean iguales, por ejemplo, dentro de cada
subgrupo, todos los atletas ganaron medallas o todos no ganaron medallas.
Vamos a explorar algunos hiperparámetros que pueden afectar a este proceso
de entrenamiento.
Criterios de división
Durante el entrenamiento, el optimizador debe decidir cuándo dividir un nodo.
Hay diferentes maneras de tomar decisiones como esta y el método elegido se
conoce como hiperparámetro. Básicamente, los distintos métodos hacen
referencia a diferentes maneras de evaluar la similitud de una muestra.
Los métodos comunes de dividir los nodos se basan en la teoría de la
información. A grandes rasgos, se podría considerar como dividir una muestra
para que las dos submuestras resultantes sean "más puras" que la original. Los
métodos disponibles difieren ligeramente y pueden dar lugar a ligeras
diferencias en el árbol resultante final, de forma muy similar a cómo las
funciones de costo usadas para el descenso de gradiente pueden proporcionar
modelos finales diferentes. En el siguiente conjunto de ejercicios,
experimentaremos con dos criterios.
Disminución mínima de impurezas
El criterio utilizado para dividir nodos se puede personalizar aún más. Por
ejemplo, establecer la disminución de pureza mínima significa que un nodo solo
se puede dividir si mejora el modelo algo o bastante. Hay varios
hiperparámetros relacionados que pueden bloquear la creación de nuevos
nodos, como la profundidad máxima o el número mínimo de muestras en un
nodo.
La razón por la que se restringe el crecimiento de un árbol demasiado lejos es
para evitar el sobreajuste. Los árboles más grandes son mejores a la hora de
buscar coincidencias en el conjunto de datos de entrenamiento, pero pueden
ajustarse tanto a este conjunto de entrenamiento que dejen de funcionar con
otros datos. En otras palabras, restringir la complejidad de un árbol puede
reducir su tendencia al sobreajuste.
Número máximo de características
Cuando se crean árboles en un bosque aleatorio, se les proporciona un
subconjunto de datos de entrenamiento al que ajustarse y una lista de
características que se usarán. Lo importante es que cada árbol pueda recibir
diferentes colecciones de características. Por ejemplo, un árbol puede usar Peso
y Altura y otro Altura y Edad.
Es probable que al aumentar el número máximo de características que puede
recibir cada árbol se mejore la capacidad de cada uno para ajustarse al conjunto
de entrenamiento, ya que se proporciona más información. Para saber si esto
ayuda o perjudica sus capacidades en el conjunto de pruebas, puede ser
necesaria la experimentación. El motivo es que proporcionar siempre muchas
características puede significar que los árboles del bosque terminen por ser más
parecidos entre sí, lo que reduce la ventaja de un bosque aleatorio sobre un
árbol de decisión simple. Encontrar el equilibrio entre estos extremos
normalmente requiere cierta experimentación.
Propagación
El ajuste del modelo suele basarse, en algún momento, en números aleatorios.
Los equipos no generan números realmente aleatorios, sino que contienen
reglas que determinan cómo generar una lista de números aleatorios, dado un
número inicial, denominado valor de inicialización aleatorio.
Por ejemplo, si nuestro valor de inicialización era 10 y se toman los tres
primeros números "aleatorios", el equipo podría generar 0,75, 0,13, 0,68.
Aunque estos números parezcan aleatorios, cada vez que partamos de 10, se
obtendrá el mismo conjunto de números.
En el aprendizaje automático, usamos números aleatorios para inicializar los
parámetros del modelo o para dividir los conjuntos de datos en conjuntos de
entrenamiento y pruebas. Si se establece el valor de inicialización aleatorio, los
valores aleatorios usados durante el proceso de entrenamiento serán los
mismos cada vez que se vuelva a ejecutar el código. Lo que significa que, cada
vez que se vuelva a ejecutar el código, se asignarán los mismos datos a los
conjuntos de entrenamiento o prueba y a los modelos de entrenamiento que
tengan el mismo estado de inicialización (parámetros iniciales).
Por el contrario, si no establecemos el valor de inicialización, el equipo
seleccionará uno por nosotros, por ejemplo, en función del tiempo, lo que
significa que la ejecución de nuestro entrenamiento dos veces puede dar
resultados ligeramente diferentes.
La inicialización aleatoria no es estrictamente un hiperparámetro, pero lo
presentamos aquí para resaltar que este parámetro externo puede desempeñar
un papel en la eficacia del entrenamiento. Aunque suele ser menor, si el modelo
es muy complejo o la cantidad de datos disponibles es pequeña, el rendimiento
del conjunto de pruebas del modelo puede ser marcadamente diferente si se
usan dos valores de inicialización distintos. En tales situaciones, a menudo se
paga por ejecutar el entrenamiento con varios valores de inicialización
diferentes a fin de evaluar hasta qué punto el diseño del modelo es adecuado y
hasta qué punto el rendimiento es simplemente cuestión de suerte.
Ejercicio: Ajuste de hiperparámetros
con bosques aleatorios
Completado100 XP
12 minutos
Este módulo requiere un espacio aislado para completarse.
Un espacio aislado le da acceso a recursos gratuitos. No se le cobrará en su
suscripción personal. El espacio aislado solo podrá usarse para completar el
aprendizaje en Microsoft Learn. El uso para cualquier otro motivo está prohibido
y podría generar la pérdida permanente del acceso al espacio aislado.
Microsoft ofrece esta experiencia de laboratorio y el contenido relacionado con
fines educativos. Toda la información presentada es propiedad de Microsoft y
está destinada únicamente a brindar información sobre los productos y servicios
abordados en este módulo de Microsoft Learn.
Activar espacio aislado
Las sugerencias de enlaces de teclado de la barra de herramientas están ahora ocultas
RuntimeArchivoEditarVista
Ejecutar todo
Kernel
Proceso no conectado
Exercise: Random forests and hyperparameters
The goal of this unit is to explore how hyperparameters change training, and
thus model performance. The line between model architecture and
hyperparameters is a bit blurry for random forests because training itself
actually changes the architecture of the model by adding or removing branches.
We will again persue our goal of predicting which crimes in San Francisco will be
resolved.
Data and Training Preparation
Let's load our data, split it, and prepare for training. This is the same code
you've seen in the previous exercises. If you've not done those - go back and do
them now!
CódigoMarkdown
[ ]
# This code is exactly the same as what we have done in the previous e
xercises. You do not need to read it again.
import pandas
!wget [Link]
to-machine-learning/main/[Link]
!wget [Link]
to-machine-learning/main/Data/san_fran_crime.csv
from sklearn.model_selection import train_test_split
from [Link] import balanced_accuracy_score
import graphing # custom graphing code. See our GitHub repo for details
#Import the data from the .csv file
dataset = pandas.read_csv('san_fran_crime.csv', delimiter="\t")
# One-hot encode features
dataset = pandas.get_dummies(dataset, columns=["Category", "PdDistrict"], dro
p_first=False)
features = [c for c in [Link] if c != "Resolution"]
# Make a utility method that we can re-use throughout this exercise
# To easily fit and test out model
def fit_and_test_model(model):
'''
Trains a model and tests it against both train and test sets
'''
global features
# Train the model
[Link](train[features], [Link])
# Assess its performance
# -- Train
predictions = [Link](train[features])
train_accuracy = balanced_accuracy_score([Link], predictions)
# -- Test
predictions = [Link](test[features])
test_accuracy = balanced_accuracy_score([Link], predictions)
return train_accuracy, test_accuracy
print("Ready!")
[Link]()
Presione Mayús + Entrar para ejecutar
Let's not forget to split our data!
[ ]
# Split the dataset in an 90/10 train/test ratio.
train, test = train_test_split(dataset, test_size=0.1, random_state=2, shuffl
e=True)
Presione Mayús + Entrar para ejecutar
Criteria to split on
The first hyperparameter we will work with is the criterion. This is essentially a
kind of cost function that is used to determine whether a node should be split
or not. We have two options available in the package that we are
using: gini and entropy. Let's try them both:
[ ]
from [Link] import RandomForestClassifier
# Shrink the training set temporarily to explore this
# setting with a more normal sample size
sample_size = 1000
full_trainset = train
train = full_trainset[:sample_size]
# Prepare the model
rf = RandomForestClassifier(n_estimators=10,
# max_depth=12,
# max_features=cur_max_features,
random_state=2,
criterion="gini",
verbose=False)
# Train and test the result
train_accuracy, test_accuracy = fit_and_test_model(rf)
# Train and test the result
print(train_accuracy, test_accuracy)
# Prepare the model
rf = RandomForestClassifier(n_estimators=10,
random_state=2,
criterion="entropy",
verbose=False)
# Train and test the result
train_accuracy, test_accuracy = fit_and_test_model(rf)
# Train and test the result
print(train_accuracy, test_accuracy)
# Roll back the train dataset to the full train set
train = full_trainset
Presione Mayús + Entrar para ejecutar
Results are subtly different, and usually only subtly as both criterion use a
similar way to assess performance. We suggest you try different sample sizes,
such as 50 and 50000, to see how this changes with larger or smaller samples.
Minimum impurity decrease
The minimum impurity decrease is another criterion that is used to assess
whether a node should be split. It is used by the gini or entropy algorithms we
used, above. If minimu impurity decrease is high, then splitting a node must
result in substantial performance improvement. If it is very low, then nodes can
be split even if they offer very little to no performance improvements on the
training dataset.
[ ]
import numpy as np
# Shrink the training set temporarily to explore this
# setting with a more normal sample size
full_trainset = train
train = full_trainset[:1000] # limit to 1000 samples
min_impurity_decreases = [Link](0, 0.0005, num=100)
# Train our models and report their performance
train_accuracies = []
test_accuracies = []
print("Working...")
for min_impurity_decrease in min_impurity_decreases:
# Prepare the model
rf = RandomForestClassifier(n_estimators=10,
min_impurity_decrease=min_impurity_decrease,
random_state=2,
verbose=False)
# Train and test the result
train_accuracy, test_accuracy = fit_and_test_model(rf)
# Save the results
test_accuracies.append(test_accuracy)
train_accuracies.append(train_accuracy)
# Plot results
graphing.line_2D(dict(Train=train_accuracies, Test=test_accuracies),
min_impurity_decreases,
label_x="Minimum impurity decreases (min_impurity_decreas
e)",
label_y="Accuracy",
title="Performance", show=True)
# Roll back the train dataset to the full train set
train = full_trainset
Presione Mayús + Entrar para ejecutar
Notice that train performance drastically reduces as we get more scrict about
when a node can be split. This is because the higher the minimum impurity
decrease, the more strict we are about growing our tree. The smaller the tree,
the less overfitting we will see.
Changes in test performance are more subtle. A small increase above zero
appears to increase test performance. Further increases begin to hurt test
performance only subtly.
This is similar to what we saw in the previous exercise about model size - more
complex models (those with more nodes) can fit the training data better, but
once they exceed a certain complexity, they begin to overfit.
Maximum number of features
When trees are created, they are provided with a subset of the data. This not
only means they see a certain collection of rows (samples), but also a certain
collection of columns (features). The more features are provided, the more likely
a given tree is going to overfit. Let's see what happens when we restrict the
maximum number of features that can be provided to each tree in the forest:
[ ]
# Shrink the training set temporarily to explore this
# setting with a more normal sample size
full_trainset = train
train = full_trainset[:1000] # limit to 1000 samples
max_features = range(10, len(features) +1)
# Train our models and report their performance
train_accuracies = []
test_accuracies = []
print("Working...")
for cur_max_features in max_features:
# Prepare the model
rf = RandomForestClassifier(n_estimators=50,
max_depth=12,
max_features=cur_max_features,
random_state=2,
verbose=False)
# Train and test the result
train_accuracy, test_accuracy = fit_and_test_model(rf)
# Save the results
test_accuracies.append(test_accuracy)
train_accuracies.append(train_accuracy)
# Plot results
graphing.line_2D(dict(Train=train_accuracies, Test=test_accuracies),
max_features,
label_x="Maximum number of features (max_features)",
label_y="Accuracy",
title="Performance", show=True)
# Roll back the trainset to the full set
train = full_trainset
Presione Mayús + Entrar para ejecutar
The more features we have, the worse the overfitting (gap between blue and red
lines). Initial increases from 10 - 20 provide a minute improvement in test
performance, after which it begins to hurt test performance very slightly. As
features increase, training performance continues to grow, unmatches by test
performance, indicating overfitting. An optimal value here would be around 20
features.
Seeding
Finally, we come to seeding. When trees are initially made, there is a degree of
randomness that is used to decide which features and samples will be provided
to which trees. Changing the random state (seed) value changes this initial state.
The random seed is not a parameter to be tuned, but its effects on our models
shouldn't be forgotten, particularly when there isn't much data to work with.
Let's see how our model behaves with different random states.
[ ]
# Shrink the training set temporarily to explore this
# setting with a more normal sample size
sample_size = 1000
full_trainset = train
train = full_trainset[:sample_size]
seeds = range(0,101)
# Train our models and report their performance
train_accuracies = []
test_accuracies = []
for seed in seeds:
# Prepare the model
rf = RandomForestClassifier(n_estimators=10,
random_state=seed,
verbose=False)
# Train and test the result
train_accuracy, test_accuracy = fit_and_test_model(rf)
# Save the results
test_accuracies.append(test_accuracy)
train_accuracies.append(train_accuracy)
# Plot results
graphing.line_2D(dict(Train=train_accuracies, Test=test_accuracies),
seeds,
label_x="Seed value (random_state)",
label_y="Accuracy",
title="Performance", show=True)
# Roll back the trainset to the full set
train = full_trainset
Presione Mayús + Entrar para ejecutar
Performance, particularly on the test set, is variable and thus some part of
performance is blind luck. This is not only because the initial state of the model
can be different, but also that we split our training and test data differently.
Whether this would apply to a holdout set is not easy to tell without trying it
There's no correlation between high or low seed values and performance: seed
is not something to 'tune'. The seed is a random factor and it can help or hinder
depending on the model at play. Generally speaking, when we work with small
amounts of data, we are more likely to be affected by different seed values.
More complex models can also be affected more by the seed, but not always.
Try changing the sample size and/or number of trees in the model above and
watch how the variability in performance changes. Think about why this might
be.
Summary
Complex models typically have associated hyperparameters that can affect
training. The extent to which these matter, and how they affect the result,
depends on the data at hand and complexity of the model being used. We
usually need to experiment somewhat with these in order to achieve optimum
performance for the data that we have.
Introducción
Completado100 XP
2 minutos
Las métricas de un solo valor, como el error cuadrático medio o la pérdida
logarítmica, son formas rápidas de comparar los modelos en términos de
rendimiento. Sin embargo, no siempre son intuitivas y no siempre pueden dar
una imagen completa sobre cómo funciona realmente el modelo. Por ejemplo,
si estamos intentando detectar el cáncer, pero solo una de cada 100 000
muestras de tejido contiene realmente cáncer, un modelo que siempre dice "no
hay cáncer" tendrá una pérdida de registros (costo) excelente, pero será
completamente inútil en la clínica. Elegir formas más inteligentes de evaluar los
modelos es importante para que pueda comprender correctamente cómo
funcionará el modelo en el mundo real.
Escenario: Rescate en la montaña con aprendizaje
automático
A lo largo de este módulo, usaremos el siguiente escenario de ejemplo para
explicar las curvas de ROC y hacer prácticas de trabajo con ellas.
Con la llegada del invierno, ha aumentado la preocupación porque los
excursionistas ignoran las advertencias de riesgo de avalancha y se aventuran a
salir incluso cuando la montaña está cerrada. No solo se corre el riesgo de
provocar más avalanchas, sino que, como los excursionistas rara vez se registran
antes de aventurarse, no hay forma de saber si alguien estaba en la montaña
cuando se produjo una avalancha. Un generoso donante ha proporcionado al
equipo de rescate de avalanchas un enjambre de drones en miniatura capaces
de escanear automáticamente las laderas en busca de objetos. Debido al
terreno extremo y al agotamiento de la batería con el frío, su ancho de banda
sigue siendo demasiado bajo para transmitir vídeo. En cambio, los sensores de a
bordo pueden extraer información básica como la forma, el tamaño y el
movimiento del objeto y transmitirla a la base. ¿Se puede construir un modelo
que pueda determinar cuándo el dron se ha cruzado con una persona, para
llevar la cuenta de quién está en la montaña?
Requisitos previos
Matrices de confusión
Completado100 XP
4 minutos
Los datos pueden considerarse continuos, categóricos u ordinales (categóricos,
pero con un orden). Las matrices de confusión son un medio de evaluar el
rendimiento de un modelo categórico. Para saber cómo funcionan, primero
vamos a refrescar nuestros conocimientos sobre los datos continuos. A través
de esto, podemos ver cómo las matrices de confusión son simplemente una
extensión de los histogramas que ya conocemos.
Distribuciones de datos continuos
Cuando queremos comprender los datos continuos, el primer paso suele ser ver
cómo se distribuyen. Considere el siguiente histograma:
Podemos ver que la etiqueta es, por término medio, aproximadamente cero y
que la mayoría de los puntos de datos se encuentra entre -1 y 1. Aparece como
simétrico: hay un número aproximadamente igual de números más pequeños y
más grandes que la media. Si quisiéramos, podríamos usar una tabla en lugar
de un histograma, pero podría ser difícil de manejar.
Distribuciones de datos categóricos
En algunos aspectos, los datos categóricos no son tan diferentes de los datos
continuos. Podemos seguir generando histogramas para evaluar la forma en
que aparecen normalmente los valores para cada etiqueta. Por ejemplo, una
etiqueta binaria (verdadero/falso) podría aparecer con una frecuencia como
esta:
Esto nos indica que hay 750 muestras con la etiqueta "false" y 250 con la
etiqueta "true".
Una etiqueta para tres categorías es parecida:
Esto nos indica que hay 200 muestras que son "persona", 400 que son "animal"
y 100 que son "árbol".
Como las etiquetas de categorías son mucho más sencillas, a menudo podemos
mostrar estas como tablas simples. Los dos gráficos anteriores aparecerán de la
siguiente manera:
Etiqueta False True
Count 750 250
Y:
Etiqueta Person Animal
Count 200 400
Consulta de las predicciones
Podemos examinar las predicciones que realiza el modelo igual que observamos
las etiquetas reales de nuestros datos. Por ejemplo, podríamos ver que, en el
conjunto de pruebas, nuestro modelo predijo "false" 700 veces y "true" 300
veces.
Predicción de modelos C
False 7
True 3
Proporciona información muy directa sobre las predicciones que realiza nuestro
modelo, pero no nos dice cuáles de ellas son correctas. Aunque podemos usar
una función de costo para comprender la frecuencia con la que se dan las
respuestas correctas, la función de costo no nos dirá qué tipos de errores se
están cometiendo. Por ejemplo, el modelo podría adivinar correctamente todos
los valores "true", pero también adivinar "true" cuando debería haber adivinado
"false".
La matriz de confusión
La clave para comprender el rendimiento del modelo es combinar la tabla de
predicción del modelo con la tabla de etiquetas de datos reales:
El cuadrado que no hemos rellenado se denomina matriz de confusión.
Cada celda de la matriz de confusión nos indica algo sobre el rendimiento del
modelo. Se trata de verdaderos negativos (VN), falsos negativos (FN), falsos
positivos (FP) y verdaderos positivos (VP).
Vamos a explicar estos acrónimos uno por uno y a reemplazarlos por valores
reales. Los cuadrados azules significan que el modelo hizo una predicción
correcta y los cuadrados rojos que el modelo hizo una predicción incorrecta.
Verdaderos negativos (VN)
El valor superior izquierdo mostrará el número de veces que el modelo predijo
"false y la etiqueta real también fue "false". En otras palabras, se muestra
cuántas veces el modelo predijo correctamente "false". Supongamos que, en
nuestro ejemplo, esto ha ocurrido 500 veces:
Falsos negativos (FN)
El valor superior derecho indica cuántas veces el modelo predijo "false", pero la
etiqueta real fue "true". Ahora sabemos que son 200. ¿Cómo lo hago? Dado que
el modelo predijo "false" 700 veces y 500 de esas veces lo hizo correctamente.
Por lo tanto, 200 veces debe haber predicho "false" cuando no debería haberlo
hecho.
Falsos positivos (FP)
El valor inferior derecho contiene falsos positivos. Esto nos indica cuántas veces
predijo el modelo "true", pero la etiqueta real era "false". Ahora sabemos que
son 250, porque hubo 750 veces que la respuesta correcta fue "false". 500 de
estas veces aparecen en la celda superior izquierda (VN):
Verdaderos positivos (VP)
Por último, tenemos verdaderos positivos. Este es el número de veces que el
modelo predijo correctamente "true". Sabemos que son 50 por dos motivos. En
primer lugar, el modelo predijo "true" 300 veces, pero 250 veces fue incorrecto
(celda inferior izquierda). En segundo lugar, había 250 veces que la respuesta
correcta fue "true", pero 200 veces el modelo predijo "false".
La matriz final
Normalmente, simplificamos ligeramente nuestra matriz de confusión, de la
siguiente manera:
Hemos coloreado las celdas para resaltar cuándo el modelo realizó predicciones
correctas. A partir de esto, sabemos no solo la frecuencia con la que el modelo
realizó determinados tipos de predicciones, sino también la frecuencia con la
que esas predicciones fueron correctas o incorrectas.
Las matrices de confusión también se pueden construir cuando hay más
etiquetas. Por ejemplo, para nuestro ejemplo de persona, animal o árbol,
podríamos obtener una matriz como esta:
Cuando hay tres categorías, ya no se aplican métricas como verdaderos
positivos, pero todavía podemos ver exactamente con qué frecuencia el modelo
ha cometido ciertos tipos de errores. Por ejemplo, podemos ver que el modelo
predijo esa "persona" 200 veces cuando el resultado correcto real fue "animal".
Siguiente unidad: Ejercicio: Creación de una
matriz de confusión
Ejercicio: Creación de una matriz de
confusión
Completado100 XP
8 minutos
Este módulo requiere un espacio aislado para completarse.
Un espacio aislado le da acceso a recursos gratuitos. No se le cobrará en su
suscripción personal. El espacio aislado solo podrá usarse para completar el
aprendizaje en Microsoft Learn. El uso para cualquier otro motivo está prohibido
y podría generar la pérdida permanente del acceso al espacio aislado.
Microsoft ofrece esta experiencia de laboratorio y el contenido relacionado con
fines educativos. Toda la información presentada es propiedad de Microsoft y
está destinada únicamente a brindar información sobre los productos y servicios
abordados en este módulo de Microsoft Learn.
Activar espacio aislado
Las sugerencias de enlaces de teclado de la barra de herramientas están ahora ocultas
RuntimeArchivoEditarVista
Ejecutar todo
Kernel
Proceso no conectado
Exercise: Build a confusion matrix
In this exercise we go into more detail on measuring the performance of
classification models, using the concepts of imbalanced
datasets, accuracy and confusion matrices.
Data visualization
Our new dataset represents different classes of objects found in snow.
Let's start this exercise by loading in and having a look at our data:
CódigoMarkdown
[]
import pandas
!wget [Link]
to-machine-learning/main/[Link]
!wget [Link]
to-machine-learning/main/Data/snow_objects.csv
#Import the data from the .csv file
dataset = pandas.read_csv('snow_objects.csv', delimiter="\t")
#Let's have a look at the data
dataset
Presione Mayús + Entrar para ejecutar
Data Exploration
We can see that the dataset has both continuous ( size, roughness, motion) and
categorical data (color and label). Let's do some quick data exploration and
see what different label classes we have and their respective counts:
[]
import graphing # custom graphing code. See our GitHub repo for details
# Plot a histogram with counts for each label
graphing.multiple_histogram(dataset, label_x="label", label_group="label", ti
tle="Label distribution")
Presione Mayús + Entrar para ejecutar
The histogram above makes it very easy to understand both the labels we have
in the dataset and their distribution.
One important information to notice is that this is an imbalanced dataset:
classes are not represented in the same proportion (we have 4 times more rocks
and trees than animals, for example).
This is relevant as imbalanced sets are very common "in the wild", and in the
future we will learn how to address that to build better models.
We can do the same analisys for the color feature:
[]
# Plot a histogram with counts for each label
graphing.multiple_histogram(dataset, label_x="color", label_group="color", ti
tle="Color distribution")
Presione Mayús + Entrar para ejecutar
We can notice that:
We have 8 different color categories.
The color feature is also heavily imbalanced.
Out plotting algorithm is not smart enough to assign the correct colors to their
respective names.
Let's see what we can find about the other features:
[]
graphing.box_and_whisker(dataset, label_y="size", title='Boxplot of "size" fe
ature')
Presione Mayús + Entrar para ejecutar
Above we can see that the majority of our samples are relatively small, with sizes
ranging from 0 to 70, but we have a few much bigger outliers.
Let's take a look at the roughness feature:
[]
graphing.box_and_whisker(dataset, label_y="roughness", title='Boxplot of "rou
ghness" feature')
Presione Mayús + Entrar para ejecutar
There's not a lot of variation here: values for roughness range from 0 to a little
over 2, with most samples having values close to the mean.
Finally, let's plot the motion feature:
[]
graphing.box_and_whisker(dataset, label_y="motion", title='Boxplot of "motion
" feature')
Presione Mayús + Entrar para ejecutar
Most objects seem to be either static or moving very slowly. There is a smaller
number of objects moving faster, with a couple of outliers over 10.
From the data above one could assume that the smaller and faster objects are
likely hikers and animals, whereas the bigger, more static elements are trees and
rocks.
Building a classification model
Let's build and train a classification model using a random forest, to predict the
class of an object based on the features in our dataset:
[]
from [Link] import RandomForestClassifier
from sklearn.model_selection import train_test_split
# Split the dataset in an 70/30 train/test ratio.
train, test = train_test_split(dataset, test_size=0.3, random_state=2)
print([Link])
print([Link])
Presione Mayús + Entrar para ejecutar
Now we can train our model, using the train dataset we've just created:
[]
# Create the model
model = RandomForestClassifier(n_estimators=1, random_state=1, verbose=False)
# Define which features are to be used (leave color out for now)
features = ["size", "roughness", "motion"]
# Train the model
[Link](train[features], [Link])
print("Model trained!")
Presione Mayús + Entrar para ejecutar
Assessing our model
We can now use our newly trained model to make predictions using the test set.
By comparing the values predicted to the actual labels (also called true values),
we can measure the model's performance using different metrics.
Accuracy, for example, is the simply number of correctly predicted labels out of
all predictions performed:
Accuracy = Correct Predictions / Total Predictions
Let's see how this can be done in code:
[]
# Import a function that measures a models accuracy
from [Link] import accuracy_score
# Calculate the model's accuracy on the TEST set
actual = [Link]
predictions = [Link](test[features])
# Return accuracy as a fraction
acc = accuracy_score(actual, predictions)
# Return accuracy as a number of correct predictions
acc_norm = accuracy_score(actual, predictions, normalize=False)
print(f"The random forest model's accuracy on the test set is {acc:.4f}.")
print(f"It correctly predicted {acc_norm} labels in {len([Link])} predict
ions.")
Presione Mayús + Entrar para ejecutar
Our model seems to be doing quite well!
That intuition, however, can be misleading:
Accuracy does not take into account the wrong predictions made by the
model
It's also not very good at painting a clear picture in class-imbalanced
datasets, like ours, where the number of possible classes is not evenly
distributed (recall that we have 800 trees, 800 rocks, but only 200
animals)
Building a confusion matrix
A confusion matrix is a table where we compare the actual labels to what the
model predicted. It gives us a more detailed understanding of how the model is
doing and where it's getting things right or missing.
This is one of the ways we can do that in code:
[]
# sklearn has a very convenient utility to build confusion matrices
from [Link] import confusion_matrix
# Build and print our confusion matrix, using the actual values and predictio
ns
# from the test set, calculated in previous cells
cm = confusion_matrix(actual, predictions, normalize=None)
print("Confusion matrix for the test set:")
print(cm)
Presione Mayús + Entrar para ejecutar
While the matrix above can be useful in calculations, it's not very helpful or
intuitive.
Let's add a plot with labels and colors to turn that data into actual insights:
[]
# We use plotly to create plots and charts
import plotly.figure_factory as ff
# Create the list of unique labels in the test set, to use in our plot
# I.e., ['animal', 'hiker', 'rock', 'tree']
x = y = sorted(list(test["label"].unique()))
# Plot the matrix above as a heatmap with annotations (values) in its cells
fig = ff.create_annotated_heatmap(cm, x, y)
# Set titles and ordering
fig.update_layout( title_text="<b>Confusion matrix</b>",
yaxis = dict(categoryorder = "category descending"))
fig.add_annotation(dict(font=dict(color="black",size=14),
x=0.5,
y=-0.15,
showarrow=False,
text="Predicted label",
xref="paper",
yref="paper"))
fig.add_annotation(dict(font=dict(color="black",size=14),
x=-0.15,
y=0.5,
showarrow=False,
text="Actual label",
textangle=-90,
xref="paper",
yref="paper"))
# We need margins so the titles fit
fig.update_layout(margin=dict(t=80, r=20, l=100, b=50))
fig['data'][0]['showscale'] = True
[Link]()
Presione Mayús + Entrar para ejecutar
Notice that the plot has the Actual labels on the y-axis and Predicted
labels on the x-axis, as defined by the confusion_matrix function call.
We can see that the model is generally accurate, but only because we have so
many rocks and trees in our set and because it does well on those classes.
When it comes to hikers and animals the model gets confused (it shows a high
number of FPs and FNs), but because these classes are less represented in the
dataset the accuracy score remains high.
Summary
In this exercise we talked about the following concepts:
Imbalanced datasets, where features or classes can be represented by a
disproportionate number of samples.
Accuracy as a metric to assess model performance, and its shortcomings.
How to generate, plot and interpret confusion matrices, to get a better
understanding of how a classification model is performing.
Desequilibrios de datos
Completado100 XP
4 minutos
Cuando nuestras etiquetas de datos tienen más de una categoría que otra, se
dice que tenemos un desequilibrio de datos. Por ejemplo, recuerde que, en
nuestro escenario, estamos intentando identificar los objetos encontrados por
los sensores de drones. Nuestros datos están desequilibrados, porque hay un
número enormemente diferente de excursionistas, animales, árboles y rocas en
nuestros datos de entrenamiento. Esto se puede ver mediante la tabulación de
estos datos:
Etiqueta Excursionista Animal Árbol
Count 400 200 800
O bien, se puede representar de esta manera:
Observe cómo la mayoría de los datos son árboles o rocas. Un conjunto de
datos equilibrado no tiene este problema.
Por ejemplo, si intentáramos predecir si un objeto es un excursionista, un
animal, un árbol o una roca, lo ideal sería tener un número igual de todas las
categorías, de la siguiente manera:
Etiqueta Excursionista Animal Árbol
Count 550 550 550
Si simplemente intentáramos predecir si un objeto era un excursionista, lo ideal
sería tener un número igual de objetos de excursionista y objetos de no
excursionista:
Etiqueta Excursionista No excursionista
Count 1100 1100
¿Por qué son importantes los desequilibrios de
datos?
Los desequilibrios de datos son importantes porque los modelos pueden
aprender a imitar estos desequilibrios cuando no es deseable. Por ejemplo,
imagine que entrenamos un modelo de regresión logística para identificar
objetos como excursionista o no excursionista. Si en los datos de entrenamiento
dominan en gran medida las etiquetas de "excursionista", el entrenamiento
sesgará el modelo para devolver casi siempre estas etiquetas. Sin embargo, en
el mundo real, es posible que descubramos que la mayoría de las cosas que
encuentran los drones son árboles. Es probable que el modelo sesgado etiquete
muchos de estos árboles como excursionistas.
Este fenómeno tiene lugar porque las funciones de costo, de forma
predeterminada, determinan si se ha dado la respuesta correcta. Esto significa
que, en un conjunto de datos sesgado, la manera más sencilla que tiene un
modelo de alcanzar un rendimiento óptimo puede ser omitir prácticamente las
características proporcionadas y siempre, o casi siempre, devolver la misma
respuesta. Esta situación puede tener consecuencias negativas. Por ejemplo,
imagine que nuestro modelo de excursionista/no excursionista se entrena con
datos donde solo 1 de cada 1000 muestras contienen un excursionista. Un
modelo que ha aprendido a devolver "no excursionista" cada vez tiene una
precisión del 99,9 %. Esta estadística parece excelente, pero el modelo es inútil
porque nunca nos dirá si alguien está en la montaña, y no sabremos rescatarlo
si se produce una avalancha.
Sesgo en una matriz de confusión
Las matrices de confusión son la clave para identificar los desequilibrios de
datos o el sesgo del modelo. En un escenario ideal, los datos de prueba tienen
un número aproximadamente igual de etiquetas y las predicciones realizadas
por el modelo también se reparten aproximadamente entre las etiquetas. En
1000 muestras, un modelo no sesgado, pero que a menudo obtiene respuestas
incorrectas, podría tener un aspecto parecido al siguiente:
Podemos indicar que los datos de entrada no están sesgados, porque las sumas
de las filas son las mismas (500 cada una), lo que indica que la mitad de las
etiquetas son "true" y la mitad son "false". Del mismo modo, podemos ver que
el modelo está dando respuestas no sesgadas porque devuelve "true" la mitad
del tiempo y "false" la otra mitad.
Por el contrario, los datos sesgados contienen principalmente un tipo de
etiqueta, como:
De forma similar, un modelo sesgado genera principalmente un tipo de
etiqueta, como la siguiente:
El sesgo del modelo no es la precisión
Recuerde que el sesgo no es la precisión. Por ejemplo, algunos de los ejemplos
anteriores están sesgados y otros no, pero todos muestran un modelo que
obtiene la respuesta correcta el 50 % de las veces. Como ejemplo más extremo,
la siguiente matriz muestra un modelo no sesgado que es inexacto:
Observe cómo el número de filas y columnas se agrega a 500, lo que indica que
ambos datos están equilibrados y que el modelo no está sesgado. Sin embargo,
este modelo está obteniendo casi todas las respuestas incorrectas.
Por supuesto, nuestro objetivo es que los modelos sean precisos y no
sesgados, por ejemplo:
... pero debemos asegurarnos de que nuestros modelos precisos no estén
sesgados, simplemente porque los datos son:
En este ejemplo, observe cómo las etiquetas reales son principalmente "false"
(columna izquierda, que muestra un desequilibrio de datos) y que el modelo
también devuelve con frecuencia "false" (fila superior, que muestra el sesgo
del modelo). Este modelo no es bueno para dar correctamente respuestas
"true".
Evitar las consecuencias de los datos
desequilibrados
Algunas de las formas más sencillas de evitar las consecuencias de los datos
desequilibrados son:
Realizar una mejor selección de datos.
"Volver a muestrear" los datos para que contengan duplicados de la clase
de etiqueta minoritaria.
Realizar cambios en la función de costo para que dé prioridad a las
etiquetas menos comunes. Por ejemplo, si se da la respuesta incorrecta a
Árbol, la función de costo podría devolver 1, mientras que, si se da la
respuesta incorrecta a Excursionista, podría devolver 10.
Exploraremos estos métodos en el ejercicio siguiente.
Ejercicio: Resolución de sesgos en un
modelo de clasificación
Completado100 XP
10 minutos
Este módulo requiere un espacio aislado para completarse.
Un espacio aislado le da acceso a recursos gratuitos. No se le cobrará en su
suscripción personal. El espacio aislado solo podrá usarse para completar el
aprendizaje en Microsoft Learn. El uso para cualquier otro motivo está prohibido
y podría generar la pérdida permanente del acceso al espacio aislado.
Microsoft ofrece esta experiencia de laboratorio y el contenido relacionado con
fines educativos. Toda la información presentada es propiedad de Microsoft y
está destinada únicamente a brindar información sobre los productos y servicios
abordados en este módulo de Microsoft Learn.
Activar espacio aislado
Las sugerencias de enlaces de teclado de la barra de herramientas están ahora ocultas
RuntimeArchivoEditarVista
Ejecutar todo
Kernel
Proceso no conectado
Exercise: Imbalanced data model bias
In this exercise, we will take a closer look at imbalanced datasets, what effects
they have on predictions and how they can be addressed.
We will also employ confusion matrices to evaluate model updates.
Data visualization
Just like in the previous exercise, we use a dataset that represents different
classes of objects found on the mountain:
CódigoMarkdown
[]
import pandas
!wget [Link]
to-machine-learning/main/[Link]
!wget [Link]
to-machine-learning/main/Data/snow_objects.csv
!wget [Link]
to-machine-learning/main/Data/snow_objects_balanced.csv
#Import the data from the .csv file
dataset = pandas.read_csv('snow_objects.csv', delimiter="\t")
# Let's have a look at the data
dataset
Presione Mayús + Entrar para ejecutar
Recall that we have an imbalanced dataset. Some classes are much more
frequent than others:
[]
import graphing # custom graphing code. See our GitHub repo for details
# Plot a histogram with counts for each label
graphing.multiple_histogram(dataset, label_x="label", label_group="label", ti
tle="Label distribution")
Presione Mayús + Entrar para ejecutar
Using binary classification
For this exercise we will build a binary classification model. We want to predict if
objects in the snow are "hikers" or "not-hikers".
To do that, we first need to add another column to our dataset, and set it
to True where the original label is hiker, and False to anything else:
[]
# Add a new label with true/false values to our dataset
dataset["is_hiker"] = [Link] == "hiker"
# Plot frequency for new label
graphing.multiple_histogram(dataset, label_x="is_hiker", label_group="is_hike
r", title="Distribution for new binary label 'is_hiker'")
Presione Mayús + Entrar para ejecutar
We now have only two classes of labels in our dataset, but we have made it
even more imbalanced.
Let's train the random forest model using is_hiker as the target variable, then
measure its accuracy on both train and test sets:
[]
from [Link] import RandomForestClassifier
from sklearn.model_selection import train_test_split
# import [Link] as plt
# from [Link] import plot_confusion_matrix
from [Link] import accuracy_score
# Custom function that measures accuracy on different models and datasets
# We will use this in different parts of the exercise
def assess_accuracy(model, dataset, label):
"""
Asesses model accuracy on different sets
"""
actual = dataset[label]
predictions = [Link](dataset[features])
acc = accuracy_score(actual, predictions)
return acc
# Split the dataset in an 70/30 train/test ratio.
train, test = train_test_split(dataset, test_size=0.3, random_state=1, shuffl
e=True)
# define a random forest model
model = RandomForestClassifier(n_estimators=1, random_state=1, verbose=False)
# Define which features are to be used (leave color out for now)
features = ["size", "roughness", "motion"]
# Train the model using the binary label
[Link](train[features], train.is_hiker)
print("Train accuracy:", assess_accuracy(model,train, "is_hiker"))
print("Test accuracy:", assess_accuracy(model,test, "is_hiker"))
Presione Mayús + Entrar para ejecutar
Accuracy looks good for both train and test sets, but remember that this metric
is not an absolute measure of success.
We should plot a confusion matrix to see how the model is actually doing:
[]
# sklearn has a very convenient utility to build confusion matrices
from [Link] import confusion_matrix
import plotly.figure_factory as ff
# Calculate the model's accuracy on the TEST set
actual = test.is_hiker
predictions = [Link](test[features])
# Build and print our confusion matrix, using the actual values and predictio
ns
# from the test set, calculated in previous cells
cm = confusion_matrix(actual, predictions, normalize=None)
# Create the list of unique labels in the test set, to use in our plot
# I.e., ['True', 'False',]
unique_targets = sorted(list(test["is_hiker"].unique()))
# Convert values to lower case so the plot code can count the outcomes
x = y = [str(s).lower() for s in unique_targets]
# Plot the matrix above as a heatmap with annotations (values) in its cells
fig = ff.create_annotated_heatmap(cm, x, y)
# Set titles and ordering
fig.update_layout( title_text="<b>Confusion matrix</b>",
yaxis = dict(categoryorder = "category descending")
)
fig.add_annotation(dict(font=dict(color="black",size=14),
x=0.5,
y=-0.15,
showarrow=False,
text="Predicted label",
xref="paper",
yref="paper"))
fig.add_annotation(dict(font=dict(color="black",size=14),
x=-0.15,
y=0.5,
showarrow=False,
text="Actual label",
textangle=-90,
xref="paper",
yref="paper"))
# We need margins so the titles fit
fig.update_layout(margin=dict(t=80, r=20, l=120, b=50))
fig['data'][0]['showscale'] = True
[Link]()
Presione Mayús + Entrar para ejecutar
The confusion matrix shows us that, despite the reported metrics, the model is
not incredibly precise.
Out of the 660 samples present in the test set (30% of the total samples), it
predicted 29 false negatives and 33 false positives.
More importantly, look at the bottom row, which shows what happened when
the model was shown information about a hiker: it got the answer wrong almost
30% of the time. This means it would not correctly identify almost 30% of the
people on the mountain!
What happens if we used this model to make predictions on balanced sets?
Let's load a dataset with an equal number of outcomes for "hikers" and "non-
hikers", then use that data to make predictions:
[]
# Load and print umbiased set
#Import the data from the .csv file
balanced_dataset = pandas.read_csv('snow_objects_balanced.csv', delimiter="\
t")
#Let's have a look at the data
graphing.multiple_histogram(balanced_dataset, label_x="label", label_group="l
abel", title="Label distribution")
Presione Mayús + Entrar para ejecutar
This new dataset is balanced among the classes, but for our purposes we want it
balanced between hikers and non-hikers.
For simplicity, let's take the hikers plus a random sampling of the non-hikers.
[]
# Add a new label with true/false values to our dataset
balanced_dataset["is_hiker"] = balanced_dataset.label == "hiker"
hikers_dataset = balanced_dataset[balanced_dataset["is_hiker"] == 1]
nonhikers_dataset = balanced_dataset[balanced_dataset["is_hiker"] == False]
# take a random sampling of non-hikers the same size as the hikers subset
nonhikers_dataset = nonhikers_dataset.sample(n=len(hikers_dataset.index), ran
dom_state=1)
balanced_dataset = [Link]([hikers_dataset, nonhikers_dataset])
# Plot frequency for "is_hiker" labels
graphing.multiple_histogram(balanced_dataset, label_x="is_hiker", label_group
="is_hiker", title="Label distribution in balanced dataset")
Presione Mayús + Entrar para ejecutar
As you can see, the is_hiker label has the same number of True and False for
both classes. We are now using a class balanced dataset.
Let's run predictions on this set using the previously trained model:
[]
# Test the model using a balanced dataset
actual = balanced_dataset.is_hiker
predictions = [Link](balanced_dataset[features])
# Build and print our confusion matrix, using the actual values and predictio
ns
# from the test set, calculated in previous cells
cm = confusion_matrix(actual, predictions, normalize=None)
# Print accuracy using this set
print("Balanced set accuracy:", assess_accuracy(model,balanced_dataset, "is_h
iker"))
Presione Mayús + Entrar para ejecutar
As expected, we see a noticeable drop in accuracy using a different set.
Again, let's visually analyze its performance:
[]
# plot new confusion matrix
# Create the list of unique labels in the test set to use in our plot
unique_targets = sorted(list(balanced_dataset["is_hiker"].unique()))
# Convert values to lower case so the plot code can count the outcomes
x = y = [str(s).lower() for s in unique_targets]
# Plot the matrix above as a heatmap with annotations (values) in its cells
fig = ff.create_annotated_heatmap(cm, x, y)
# Set titles and ordering
fig.update_layout( title_text="<b>Confusion matrix</b>",
yaxis = dict(categoryorder = "category descending")
)
fig.add_annotation(dict(font=dict(color="black",size=14),
x=0.5,
y=-0.15,
showarrow=False,
text="Predicted label",
xref="paper",
yref="paper"))
fig.add_annotation(dict(font=dict(color="black",size=14),
x=-0.15,
y=0.5,
showarrow=False,
text="Actual label",
textangle=-90,
xref="paper",
yref="paper"))
# We need margins so the titles fit
fig.update_layout(margin=dict(t=80, r=20, l=120, b=50))
fig['data'][0]['showscale'] = True
[Link]()
Presione Mayús + Entrar para ejecutar
The confusion matrix confirms the poor accuracy using this dataset, but why is
this happening when we had such excellent metrics in the
earlier train and test sets?
Recall that the first model was heavily imbalanced. The "hiker" class made up
roughly 22% of the outcomes.
When such an imbalance happens, classification models don't have enough data
to learn the patterns for the minority class, and as a consequence become
biased towards the majority class!
Imbalanced sets can be addressed in a number of ways:
Improving data selection
Resampling the dataset
Using weighted classes
For this exercise, we will focus on the last option.
Using class weights to balance dataset
We can assign different weights to the majority and minority classes, according
to their distribution, and modify our training algorithm so that it takes that
information into account during the training phase.
It will then penalize errors when the minority class is misclassified, in essence
"forcing" the model to to better learn their features and patterns.
To use weighted classes, we have to retrain our model using the
original train set, but this time telling the algorithm to use weights when
calculating errors:
[]
# Import function used in calculating weights
from [Link] import class_weight
# Retrain model using class weights
# Using class_weight="balanced" tells the algorithm to automatically calculat
e weights for us
weighted_model = RandomForestClassifier(n_estimators=1, random_state=1, verbo
se=False, class_weight="balanced")
# Train the weighted_model using binary label
weighted_model.fit(train[features], train.is_hiker)
print("Train accuracy:", assess_accuracy(weighted_model,train, "is_hiker"))
print("Test accuracy:", assess_accuracy(weighted_model, test, "is_hiker"))
Presione Mayús + Entrar para ejecutar
After using the weighted classes, the train accuracy remained almost the same,
while the test accuracy showed a small improvement (roughly 1%).
Let's see if results are improved at all using the balanced set for predictions
again:
[]
print("Balanced set accuracy:", assess_accuracy(weighted_model, balanced_data
set, "is_hiker"))
# Test the weighted_model using a balanced dataset
actual = balanced_dataset.is_hiker
predictions = weighted_model.predict(balanced_dataset[features])
# Build and print our confusion matrix, using the actual values and predictio
ns
# from the test set, calculated in previous cells
cm = confusion_matrix(actual, predictions, normalize=None)
Presione Mayús + Entrar para ejecutar
The accuracy for the balanced set increased roughly 4%, but we should still try
to to visualize and understand the new results.
Final confusion matrix
We can now plot a final confusion matrix, representing predictions for
a balanced dataset, using a model trained on a weighted class dataset:
[]
# Plot the matrix above as a heatmap with annotations (values) in its cells
fig = ff.create_annotated_heatmap(cm, x, y)
# Set titles and ordering
fig.update_layout( title_text="<b>Confusion matrix</b>",
yaxis = dict(categoryorder = "category descending")
)
fig.add_annotation(dict(font=dict(color="black",size=14),
x=0.5,
y=-0.15,
showarrow=False,
text="Predicted label",
xref="paper",
yref="paper"))
fig.add_annotation(dict(font=dict(color="black",size=14),
x=-0.15,
y=0.5,
showarrow=False,
text="Actual label",
textangle=-90,
xref="paper",
yref="paper"))
# We need margins so the titles fit
fig.update_layout(margin=dict(t=80, r=20, l=120, b=50))
fig['data'][0]['showscale'] = True
[Link]()
Presione Mayús + Entrar para ejecutar
While the results might look a bit disappointing, we now have 21% wrong
predictions (FNs + FPs), against 25% from the previous experiment.
Correct predictions (TPs + TNs) went from 74.7% to 78.7%.
Is an all around 4% improvement significant or not?
Remember that we had relatively little data to train the model, and the features
we have available may still be so similar for different samples (for example,
hikers and animals tend to be small, non-rough and move a lot), that despite
our efforts, the model still has some difficulty making correct predictions.
We only had to change a single line of code to get better results, so it seems
worth the effort!
Summary
This was a long exercise, where we covered the following topics:
Creating new label fields so we can perform binary classification using a dataset
with multiple classes.
How training on imbalanced sets can have a negative effect in perfomance,
especially when using unseen data from balanced datasets.
Evaluating results of binary classification models using a confusion matrix.
Using weighted classes to address class imbalances when training a model and
evaluating the results.
Funciones de costo frente a métricas
de evaluación
Completado100 XP
6 minutos
En las últimas unidades, hemos empezado a ver una división en las funciones de
costo (que enseña el modelo) y las métricas de evaluación, que es cómo
evaluamos el modelo nosotros mismos.
Todas las funciones de costo pueden ser métricas
de evaluación
Todas las funciones de costo pueden ser métricas de evaluación, aunque no
necesariamente intuitivas. Como ejemplo, la pérdida de registros. Los valores no
son intuitivos.
Algunas métricas de evaluación no pueden ser
funciones de costo.
Es difícil que algunas métricas de evaluación se conviertan en
funciones de costo.
Esto se debe a restricciones prácticas y matemáticas.
A veces, las cosas no son fáciles de calcular (por ejemplo, "lo
perruno que es algo").
Las funciones de costo son idealmente suaves. Por ejemplo, la
precisión es útil, pero si cambiamos ligeramente el modelo, no se
advertirá. Dado que el ajuste es un procedimiento con muchos
cambios pequeños, da la impresión de que las modificaciones no
llevarán a la mejora.
Gráfico de función de costo con una gran cantidad de bits planos
Actualice las curvas ROC de antes. Para ello, es necesario cambiar el
umbral a todo tipo de valores, pero al final del día, nuestro modelo
solo tendrá uno (0,5).
No todo es malo.
Puede ser frustrante descubrir que no podemos utilizar nuestra métrica favorita
como función de costo. Sin embargo, hay un aspecto positivo, que está
relacionado con el hecho de que todas las métricas son simplificaciones de lo
que queremos conseguir; ninguna es perfecta. Lo que esto significa es que los
modelos complejos a menudo "hacen trampa": encuentran una manera de
obtener costos bajos sin encontrar realmente una regla general que resuelva
nuestro problema. Tener una métrica que no actúe como función de costo nos
permite comprobar que el modelo no ha encontrado la forma de hacer trampas.
Si sabemos que un modelo está tomando atajos, podemos replantear nuestra
estrategia de entrenamiento.
Ya hemos visto este "engaño" varias veces. Por ejemplo, cuando los modelos
sobreajustan los datos de entrenamiento, básicamente están "memorizando" las
respuestas correctas en lugar de encontrar una regla general que podamos
aplicar con éxito a otros datos. Utilizamos conjuntos de datos de prueba como
"prueba de congruencia" para comprobar que el modelo no acaba de hacer
esto. También hemos visto que, con datos desequilibrados, los modelos pueden
aprender a dar siempre la misma respuesta (por ejemplo, "false") sin tener en
cuenta las características, porque, por término medio, esto es correcto y
proporciona un pequeño error.
Los modelos complejos también encuentran atajos de otras maneras. A veces,
los modelos complejos pueden sobreajustar la propia función de costo. Por
ejemplo, imaginemos que intentamos construir un modelo que pueda dibujar
perros. Tenemos una función de costo que comprueba que la imagen es
marrón, muestra una textura peluda y contiene un objeto del tamaño adecuado.
Con esta función de costo, un modelo complejo podría aprender a crear una
bola de pelo marrón, no porque se parezca a un perro, sino porque proporciona
un costo bajo y es fácil de generar. Si tenemos una métrica externa que cuente
el número de patas y cabezas (lo que no se puede utilizar fácilmente como
función de costo porque no son métricas suaves), nos daremos cuenta
rápidamente de si nuestro modelo está haciendo trampas, y nos
replantearemos cómo lo estamos entrenando. Por el contrario, si nuestra
métrica alternativa obtiene una buena puntuación, podemos tener cierta
confianza en que el modelo ha captado la idea de cómo debe ser un perro, en
lugar de limitarse a engañar a la función de costo para obtener un valor bajo.
Ejercicio: Varias métricas y curvas
ROC
Completado100 XP
12 minutos
Este módulo requiere un espacio aislado para completarse.
Un espacio aislado le da acceso a recursos gratuitos. No se le cobrará en su
suscripción personal. El espacio aislado solo podrá usarse para completar el
aprendizaje en Microsoft Learn. El uso para cualquier otro motivo está prohibido
y podría generar la pérdida permanente del acceso al espacio aislado.
Microsoft ofrece esta experiencia de laboratorio y el contenido relacionado con
fines educativos. Toda la información presentada es propiedad de Microsoft y
está destinada únicamente a brindar información sobre los productos y servicios
abordados en este módulo de Microsoft Learn.
Activar espacio aislado
Las sugerencias de enlaces de teclado de la barra de herramientas están ahora ocultas
RuntimeArchivoEditarVista
Ejecutar todo
Kernel
Proceso no conectado
Exercise: More metrics derived from confusion
matrices
In this exercise we will learn about different metrics, using them to explain the
results obtained from the binary classification model we built in the previous
unit.
Data visualization
We will use the dataset with different classes of objects found on the mountain
one more time:
CódigoMarkdown
[]
import pandas
import numpy
!wget [Link]
to-machine-learning/main/[Link]
!wget [Link]
to-machine-learning/main/Data/snow_objects.csv
#Import the data from the .csv file
dataset = pandas.read_csv('snow_objects.csv', delimiter="\t")
#Let's have a look at the data
dataset
Presione Mayús + Entrar para ejecutar
Recall that to use the dataset above for binary classification, we need to add
another column to the dataset, and set it to True where the original label
is hiker, and False where it's not.
Let's then add that label, split the dataset and train the model again:
[]
from [Link] import RandomForestClassifier
from sklearn.model_selection import train_test_split
# Add a new label with true/false values to our dataset
dataset["is_hiker"] = [Link] == "hiker"
# Split the dataset in an 70/30 train/test ratio.
train, test = train_test_split(dataset, test_size=0.3, random_state=1, shuffl
e=True)
# define a random forest model
model = RandomForestClassifier(n_estimators=1, random_state=1, verbose=False)
# Define which features are to be used
features = ["size", "roughness", "motion"]
# Train the model using the binary label
[Link](train[features], train.is_hiker)
print("Model trained!")
Presione Mayús + Entrar para ejecutar
We can now use this model to predict whether objects in the snow are hikers or
not.
Let's plot its confusion matrix:
[]
# sklearn has a very convenient utility to build confusion matrices
from [Link] import confusion_matrix
import plotly.figure_factory as ff
# Calculate the model's accuracy on the TEST set
actual = test.is_hiker
predictions = [Link](test[features])
# Build and print our confusion matrix, using the actual values and predictio
ns
# from the test set, calculated in previous cells
cm = confusion_matrix(actual, predictions, normalize=None)
# Create the list of unique labels in the test set, to use in our plot
# I.e., ['True', 'False',]
unique_targets = sorted(list(test["is_hiker"].unique()))
# Convert values to lower case so the plot code can count the outcomes
x = y = [str(s).lower() for s in unique_targets]
# Plot the matrix above as a heatmap with annotations (values) in its cells
fig = ff.create_annotated_heatmap(cm, x, y)
# Set titles and ordering
fig.update_layout( title_text="<b>Confusion matrix</b>",
yaxis = dict(categoryorder = "category descending"))
fig.add_annotation(dict(font=dict(color="black",size=14),
x=0.5,
y=-0.15,
showarrow=False,
text="Predicted label",
xref="paper",
yref="paper"))
fig.add_annotation(dict(font=dict(color="black",size=14),
x=-0.15,
y=0.5,
showarrow=False,
text="Actual label",
textangle=-90,
xref="paper",
yref="paper"))
# We need margins so the titles fit
fig.update_layout(margin=dict(t=80, r=20, l=120, b=50))
fig['data'][0]['showscale'] = True
[Link]()
Presione Mayús + Entrar para ejecutar
[]
# Let's also calculate some values that will be used throughout this exercise
# We already have actual values and corresponding predictions, defined above
correct = actual == predictions
tp = [Link](correct & actual)
tn = [Link](correct & numpy.logical_not(actual))
fp = [Link](numpy.logical_not(correct) & actual)
fn = [Link](numpy.logical_not(correct) & numpy.logical_not(actual))
print("TP - True Positives: ", tp)
print("TN - True Negatives: ", tn)
print("FP - False positives: ", fp)
print("FN - False negatives: ", fn)
Presione Mayús + Entrar para ejecutar
We can use the values and matrix above to help us understand other metrics.
Calculating metrics
From here on we will take a closer look at each at the following metrics, how
they are calculated and how they can help explain our current model.
Accuracy
Sensitivity/Recall
Specificity
Precision
False positive rate
Let's first recall some useful terms:
TP = True positives: a positive label is correctly predicted
TN = True negatives: a negative label is correctly predicted
FP = False positives: a negative label is predicted as a positive
FN = False negatives: a positive label is predicted as a negative
Accuracy
Accuracy is the number of correct predictions divided by the total number of
predictions:
accuracy = (TP+TN) / number of samples
It's possibly the most basic metric used but, as we've seen, it's not the most
reliable when imbalanced datasets are used.
In code:
[]
# Calculate accuracy
# len(actual) is the number of samples in the set that generated TP and TN
accuracy = (tp+tn) / len(actual)
# print result as a percentage
print(f"Model accuracy is {accuracy:.2f}%")
Presione Mayús + Entrar para ejecutar
Sensitivity/Recall
Sensitivity and Recall are interchangeable names for the same metric, which
expresses the fraction of samples correctly predicted by a model:
sensitivity = recall = TP / (TP + FN)
This is an important metric, that tells us how out of all
the actually positive samples, how many are correctly predicted as positive.
In code:
[]
# code for sensitivity/recall
sensitivity = recall = tp / (tp + fn)
# print result as a percentage
print(f"Model sensitivity/recall is {sensitivity:.2f}%")
Presione Mayús + Entrar para ejecutar
Specificity
Specificity expresses the fraction of negative labels correctly predicted over the
total number of existing negative samples:
specificity = TN / (TN + FP)
Tells us how out of all the actually negative samples, how many
are correctly predicted as negative
It can be calculated using the following code:
[]
# Code for specificity
specificity = tn / (tn + fp)
# print result as a percentage
print(f"Model specificity is {specificity:.2f}%")
Presione Mayús + Entrar para ejecutar
Precision
Precision expresses the proportion of correctly predicted positive samples over
all positive predictions:
precision = TP / (TP + FP)
In other words, it indicates how out of all positive predictions, how many are
truly positive labels.
It can be calculated using the following code:
[]
# Code for precision
precision = tp / (tp + fp)
# print result as a percentage
print(f"Model precision is {precision:.2f}%")
Presione Mayús + Entrar para ejecutar
False positive rate
False positive rate or FPR, is the number of incorrect positive predictions
divided by the total number of negative samples:
false_positive_rate = FP / (FP + TN)
Out of all the actual negatives, how many were misclassified as positives?
In code:
[]
# Code for false positive rate
false_positive_rate = fp / (fp + tn)
# print result as a percentage
print(f"Model false positive rate is {false_positive_rate:.2f}%")
Presione Mayús + Entrar para ejecutar
Notice that the sum of specificity and false positive rate should always
be equal to 1.
Conclusion
There are several different metrics that can help us evaluate the performance of
a model, in the context of the quality of its predictions.
The choice of the most adequate metrics, however, is primarily a funciton of the
data and the problem we are trying to solve.
Summary
We covered the following topics in this unit:
How to calculate the very basic measurements used in the evaluation of
classification models: TP, FP, TN, FN.
How to use the measurement aboves to calculate more meaningful metrics,
such as:
o Accuracy
o Sensitivity/Recall
o Specificity
o Precision
o False positive rate
How the choice of metrics depends on the dataset and the problem we are
trying to solve.
Introducción
Completado100 XP
2 minutos
Podemos evaluar nuestros modelos de clasificación en términos de los tipos de
errores que cometen, como falsos negativos y falsos positivos. Esto puede
proporcionar información sobre los tipos de errores que comete un modelo,
pero no proporciona necesariamente información detallada sobre qué
rendimiento podría tener el modelo si se realizaran pequeños ajustes según sus
criterios de decisión. Aquí trataremos las curvas de características operativas del
receptor (ROC), que se basan en la idea de una matriz de confusión, pero nos
proporcionan información más detallada que nos permite mejorar nuestros
modelos en mayor medida.
Escenario:
A lo largo de este módulo, usaremos el siguiente escenario de ejemplo para
explicar y hacer prácticas de trabajo con las curvas de ROC.
Su organización benéfica para rescatar personas tras una avalancha ha creado
con éxito un modelo de Machine Learning que puede estimar si un objeto
detectado por sensores ligeros es un excursionista o un objeto natural, como un
árbol o una roca. Esto le permite realizar un seguimiento del número de
personas que se encuentran en la montaña con el fin de saber si se necesita un
equipo de rescate tras producirse una avalancha. El modelo funciona
razonablemente bien, aunque se pregunta si hay espacio para la mejora.
Internamente, el modelo debe tomar una decisión binaria sobre si un objeto es
un excursionista o no, pero esto se basa en probabilidades. ¿Se puede retocar
este proceso de toma de decisiones para mejorar su rendimiento?
Requisitos previos
Familiarizarse con los modelos de aprendizaje automático
Objetivos de aprendizaje
En este módulo, aprenderá a:
Comprenderá cómo crear curvas de ROC
Explorará cómo evaluar y comparar modelos mediante estas curvas
Practicará un ajuste a un modelo mediante características trazadas
en curvas de ROC
Siguiente unidad: Análisis de la clasificación con
curvas de características operativas del receptor
Análisis de la clasificación con curvas
de características operativas del
receptor
Completado100 XP
4 minutos
Los modelos de clasificación deben asignar un ejemplo a una categoría. Por
ejemplo, debe usar características como el tamaño, el color y el movimiento
para determinar si un objeto es un excursionista o un árbol.
Podemos mejorar los modelos de clasificación de muchas maneras. Por
ejemplo, podemos asegurarnos de que nuestros datos están equilibrados,
limpios y escalados. También podemos modificar nuestra arquitectura de
modelo y usar hiperparámetros para obtener tanto rendimiento como podamos
de nuestros datos y nuestra arquitectura. Finalmente, no encontramos ninguna
manera mejor de mejorar el rendimiento en nuestro conjunto de pruebas (o
datos de exclusión) y declarar que nuestro modelo está listo.
El ajuste del modelo a este punto puede ser complejo, pero se puede usar un
sencillo paso final para mejorar aún más el buen funcionamiento de nuestro
modelo. Sin embargo, para entender esto, es necesario volver a los aspectos
básicos.
Probabilidades y categorías
Muchos modelos tienen varias fases de toma de decisiones y la última suele ser
simplemente un paso de binarización. Durante la binarización, las
probabilidades se convierten en una etiqueta dura. Por ejemplo, supongamos
que el modelo se proporciona con características y calcula que existe una
probabilidad del 75 % de que se mostrara un excursionista y una probabilidad
del 25 % de que se mostrara un árbol. Un objeto no puede ser 75 %
excursionista y 25 % árbol, es una cosa o la otra. Como tal, el modelo aplica un
umbral, que normalmente es del 50 %. Como la clase correspondiente al
excursionista es mayor que el 50 %, se declara que el objeto es un excursionista.
El umbral del 50 % es lógico, lo que significa que siempre se elige la etiqueta
más probable según el modelo. Sin embargo, si el modelo está sesgado, es
posible que este umbral del 50 % no sea adecuado. Por ejemplo, si el modelo
tiene una ligera tendencia a elegir árboles más que excursionistas (la frecuencia
a la hora de elegir árboles es un 10 % mayor que la normal), podríamos ajustar
nuestro umbral de decisión para tener esto en cuenta.
Actualizador en función de las matrices de
decisión
Las matrices de decisión son una excelente manera de evaluar los tipos de
errores que está cometiendo un modelo. Esto nos proporciona las tasas de
verdaderos positivos (VP), verdaderos negativos (VN), falsos positivos (FP) y
falsos negativos (FN)
Podemos calcular algunas características útiles a partir de la matriz de
confusión. A continuación se muestran dos características populares:
Tasa de verdaderos positivos (sensibilidad): frecuencia con la que
las etiquetas "verdaderas" se identifican correctamente como
"verdaderas". Por ejemplo, la frecuencia con la que el modelo
predice "excursionista" cuando la muestra mostrada es, de hecho,
un excursionista.
Tasa de falsos positivos (tasa de falsas alarmas): frecuencia con la
que las etiquetas "falsas" se identifican incorrectamente como
"verdaderas". Por ejemplo, la frecuencia con la que el modelo
predice "excursionista" cuando se muestra un árbol.
El análisis de tasas de verdaderos positivos y falsos positivos puede ayudarnos a
comprender el rendimiento de un modelo.
Considere nuestro ejemplo del excursionista. Idealmente, la tasa de verdaderos
positivos es muy alta y la tasa de falsos positivos es muy baja, ya que esto
significa que el modelo identifica bien a los excursionistas y no identifica árboles
como excursionistas con mucha frecuencia. Aun así, si la tasa de verdaderos
positivos es muy alta, pero la tasa de falsos positivos también es muy alta, el
modelo está sesgado: identifica casi todo lo que encuentra como excursionista.
Del mismo modo, no queremos un modelo con una tasa de verdaderos
positivos baja, ya que, cuando el modelo encuentre un excursionista, lo
etiquetará como árbol.
Curvas ROC
Las curvas de características operativas del receptor (ROC) son un gráfico en el
que se traza la tasa de verdaderos positivos frente a la tasa de falsos positivos.
Las curvas de ROC pueden resultar confusas para principiantes por dos motivos
principales. El primero es que los principiantes saben que un modelo solo tiene
un valor para las tasas de verdaderos positivos y verdaderos negativos. Por lo
tanto, un trazado de ROC debe tener este aspecto:
Si también piensa esto, está en lo cierto. Un modelo entrenado solo genera un
punto. Sin embargo, recuerde que nuestros modelos tienen un umbral
(normalmente el 50 %) que se usa para decidir si se debe utilizar la etiqueta
verdadera (excursionista) o falsa (árbol). Si cambiamos este umbral al 30 % y
recalculamos las tasas de verdaderos positivos y falsos positivos, obtenemos
otro punto:
Si lo hacemos para umbrales entre el 0 % y el 100 %, podríamos obtener un
gráfico como el siguiente:
que normalmente mostramos como una línea, en su lugar:
El segundo motivo por el que estos gráficos pueden resultar confusos es la
jerga implicada. Recuerde que queremos una tasa de verdaderos positivos alta
(que identifique a los excursionistas como tales) y una tasa de falsos positivos
baja (que no identifique los árboles como excursionistas).
ROC buenas, ROC malas
Comprender las curvas de ROC buenas y malas es algo que se hace mejor en un
entorno interactivo. Cuando esté listo, vaya al ejercicio siguiente para explorar
este tema.
Siguiente unidad: Ejercicio: Evaluación de curvas
de ROC
Ejercicio: Evaluación de curvas de
ROC
Completado100 XP
8 minutos
Este módulo requiere un espacio aislado para completarse.
Un espacio aislado le da acceso a recursos gratuitos. No se le cobrará en su
suscripción personal. El espacio aislado solo podrá usarse para completar el
aprendizaje en Microsoft Learn. El uso para cualquier otro motivo está prohibido
y podría generar la pérdida permanente del acceso al espacio aislado.
Microsoft ofrece esta experiencia de laboratorio y el contenido relacionado con
fines educativos. Toda la información presentada es propiedad de Microsoft y
está destinada únicamente a brindar información sobre los productos y servicios
abordados en este módulo de Microsoft Learn.
Activar espacio aislado
Las sugerencias de enlaces de teclado de la barra de herramientas están ahora ocultas
RuntimeArchivoEditarVista
Ejecutar todo
Kernel
Proceso no conectado
Exercise: Good and Bad ROC curves
In this exercise, we will make some ROC curves to explain what good and bad
ROC curves might look like.
The goal of our models is to identify whether each item detected on the
mountain is a hiker (true) or a tree (false). Let's take a look at the dataset.
CódigoMarkdown
[ ]
import numpy
import pandas
!pip install statsmodels
!wget [Link]
to-machine-learning/main/[Link]
!wget [Link]
to-machine-learning/main/Data/hiker_or_tree.csv
import graphing # custom graphing code. See our GitHub repo for details
import sklearn.model_selection
# Load our data from disk
df = pandas.read_csv("hiker_or_tree.csv", delimiter="\t")
# Split into train and test
train, test = sklearn.model_selection.train_test_split(df, test_size=0.5, ra
ndom_state=1)
# Graph our three features
[Link](test, label_x="height", label_colour="is_hiker", show=True
)
graphing.multiple_histogram(test, label_x="motion", label_group="is_hiker", n
bins=12, show=True)
graphing.multiple_histogram(test, label_x="texture", label_group="is_hiker",
nbins=12)
Presione Mayús + Entrar para ejecutar
We have three visual features - height, motion, and texture. Our goal here is
not to optimize a model, but to explore ROC curves, so we'll work with just one
at a time.
Before diving into it, take a look at the distributions above. We can see that we
should be able to use height to separate hikers from trees quite easily. Motion
will be slightly more difficult, presumably because trees blow in the wind, and
some hikers are found sitting down. Texture seems much the same for hikers
and trees.
A perfect model
What would a perfect ROC look like? If we had a perfectly designed model, it
would calculate "0% chance of hiker" when it saw any tree and "100% of hiker"
when it saw any hiker. This means that, so long as the decision threshold was >
0% and < 100%, it would have perfect performance. Between these thresholds,
the true positive rate would always be 1, and the false positive rate would
always be 0.
Don't worry about the thresholds of exactly 0 and 1 (100%). At 0 we are forcing
a model to return a False value and at 1 we are forcing it to return True.
It's almost impossible to train a model that is so perfect, but for the sake of
learning, let's pretend we have done so, predicting the is_hiker label based
on height.
[ ]
import [Link]
# Create a fake model that is perfect at predicting labels
class PerfectModel:
def predict(self, x):
# The perfect model believes that hikers are all
# under 4m tall
return 1 / (1 + [Link](80*(x - 4)))
model = PerfectModel()
# Plot the model
import graphing
graphing.scatter_2D(test, trendline=[Link])
Presione Mayús + Entrar para ejecutar
Our red line is our model, and our blue dots are our datapoints. On the y-
axis 0 means tree, and 1 means hiker. We can see our perfect model is passing
through every single point.
Now we want to make an ROC curve for this perfect model. There are
automated ways to do this, but we're here to learn! It's not so hard to do
ourselves. We just need to break it down into steps.
Remember than an ROC curve plots the true positive rate (TPR) against the false
positive rate (FPR). Let's make a function that can calculate these for us. If you're
rusty on what these terms mean, pay attention to the code comments:
[ ]
def calculate_tpr_fpr(prediction, actual):
'''
Calculates true positive rate and false positive rate
prediction: the labels predicted by the model
actual: the correct labels we hope the model predicts
'''
# To calculate the true positive rate and true negative rate we need to k
now
# TP - how many true positives (where the model predicts hiker, and it is
a hiker)
# TN - how many true negatives (where the model predicts tree, and it is
a tree)
# FP - how many false positives (where the model predicts hiker, but it w
as a tree)
# FN - how many false negatives (where the model predicts tree, but it wa
s a hiker)
# First, make a note of which predictions were 'true' and which were 'fal
se'
prediction_true = [Link](prediction, 1)
prediction_false= [Link](prediction, 0)
# Now, make a note of which correct results were 'true' and which were 'f
alse'
actual_true = [Link](actual, 1)
actual_false = [Link](actual, 0)
# Calculate TP, TN, FP, and FN
# The combination of sum and '&' counts the overlap
# For example, TP calculates how many 'true' predictions
# overlapped with 'true' labels (correct answers)
TP = [Link](prediction_true & actual_true)
TN = [Link](prediction_false & actual_false)
FP = [Link](prediction_true & actual_false)
FN = [Link](prediction_false & actual_true)
# Calculate the true positive rate
# This is the proportion of 'hiker' labels that are identified as hikers
tpr = TP / (TP + FN)
# Calculate the false positive rate
# This is the proportion of 'tree' labels that are identified as hikers
fpr = FP / (FP + TN)
# Return both rates
return tpr, fpr
print("Ready!")
Presione Mayús + Entrar para ejecutar
Now remember that to make an ROC curve, we calculate TPR and FPR for a wide
range of thresholds. We then plot the TPR on the y-axis and the FPR on the x-
axis.
First, lets make a short method that can calculate the TPR and FPR for just one
decision threshold.
[ ]
def assess_model(model_predict, feature_name, threshold):
'''
Calculates the true positive rate and false positive rate of the model
at a particular decision threshold
model_predict: the model's predict function
feature_name: the feature the model is expecting
threshold: the decision threshold to use
'''
# Make model predictions for every sample in the test set
# What we get back is a probability that the sample is a hiker
# For example, if we had two samples in the test set, we might
# get 0.45 and 0.65, meaning the model says there is a 45% chance
# the first sample is a hiker, and 65% chance the second is a
# hiker
probability_of_hiker = model_predict(test[feature_name])
# See which predictions at this threshold would say hiker
predicted_is_hiker = probability_of_hiker > threshold
# calculate the true and false positives rates using our
# handy method
return calculate_tpr_fpr(predicted_is_hiker, test.is_hiker)
print("Ready!")
Presione Mayús + Entrar para ejecutar
Now we can use it in a loop to create an ROC curve:
[ ]
def create_roc_curve(model_predict, feature="height"):
'''
This function creates a ROC curve for a given model by testing it
on the test set for a range of decision thresholds. An ROC curve has
the True Positive rate on the x-axis and False Positive rate on the
y-axis
model_predict: The model's predict function
feature: The feature to provide the model's predict function
'''
# Calculate what the true positive and false positive rate would be if
# we had used different thresholds.
# Make a list of thresholds to try
thresholds = [Link](0,1,101)
false_positive_rates = []
true_positive_rates = []
# Loop through all thresholds
for threshold in thresholds:
# calculate the true and false positives rates using our
# handy method
tpr, fpr = assess_model(model_predict, feature, threshold)
# save the results
true_positive_rates.append(tpr)
false_positive_rates.append(fpr)
# Graph the result
# You don't need to understand this code, but essentially we are plotting
# TPR versus FPR as a line plot
# -- Prepare a dataframe, required by our graphing code
df_for_graphing = [Link](dict(fpr=false_positive_rates, tpr=tru
e_positive_rates, threshold=thresholds))
# -- Generate the plot
fig = graphing.scatter_2D(df_for_graphing, x_range=[-0.05,1.05])
fig.update_traces(mode='lines') # Comment our this line if you would like
to see points rather than lines
fig.update_yaxes(range=[-0.05, 1.05])
# Display the graph
[Link]()
# Create an roc curve for our model
create_roc_curve([Link])
Presione Mayús + Entrar para ejecutar
What are we seeing here?
Except for at a threshold of 0, the model always has a true positive rate of 1. It
also always has a false positive rate of 0, unless the threshold has been set to 1.
Note that because we've drawn a line, it appears that there are intermediate
values (such as a FPR of 0.5) but the line is simply deceiving. If you would like,
comment out fig.update_traces(mode='lines') in the above cell and re-run
to see points, rather than lines.
Think about it - our model is perfect. Using it, we will always gets all answers
correct, putting all points are in top left corner (unless the threshold is 0 or 1,
which effectively mean that we are discarding the model results completely).
Worse-than-chance
As a counter example to understand the ROC curve, lets consider a model that
is worse than chance. In fact, this model gets every single answer wrong.
This doesn't happen often in the real world, so again, we will have to fake this
model as well. Let's plot this fake model against our data:
[ ]
# Create a fake model that gets every single answer incorrect
class VeryBadModel:
def predict(self, x):
# This model thinks that all people are over 4m tall
# and all trees are shorter
return 1 / (1 + [Link](-80*(x - 4)))
model = VeryBadModel()
# Plot the model
graphing.scatter_2D(test, trendline=[Link])
Presione Mayús + Entrar para ejecutar
As you can see, the red line (model) goes the wrong direction! How will this look
on an ROC curve?
[ ]
# run our code to create the ROC curve
create_roc_curve([Link])
Presione Mayús + Entrar para ejecutar
It is the opposite of the perfect model. Rather than the line reaching the top left
of the graph, it reaches the bottom right. This means that the TPR is always 0 - it
gets nothing right at all. In this particular example, it also always has a false
positive rate of 1, so long as the threshold is less than 1.
A model no better than chance
The previous two models we've seen are very unusual. We've learned though,
that we would like the curve to be as close to the top left of the graph as
possible.
What would a model be like that does no better than chance? Let's have a look
by trying to fit a model to our texture feature. We know this won't work well,
because we've seen that hikers and trees have the same range of image
textures.
[ ]
import [Link]
# This is a helper method that reformats the data to be compatible
# with this particular logistic regression model
prep_data = lambda x: numpy.column_stack(([Link]([Link], 1), x))
# Train a logistic regression model to predict hiker based on texture
model = [Link](train.is_hiker, prep_data([Link])).fit()
# Plot the model
graphing.scatter_2D(test, label_x="texture", label_y="is_hiker", trendline=la
mbda x: [Link](prep_data(x)))
Presione Mayús + Entrar para ejecutar
Our model is not very good - it doesn't pass through a single data point and
probably will do no better than chance. This seems extreme but when we work
with more complicated problems, sometimes it can be hard to find any real
pattern in the data. What does this look like on an ROC curve?
[ ]
# run our code to create the ROC curve
create_roc_curve(lambda x: [Link](prep_data(x)), "texture")
Presione Mayús + Entrar para ejecutar
It's a diagonal line! Why?
Remember that the model could not find a way to reliably predict the label from
the feature. It is making a range of predictions but they are essentially
guesswork.
If we have a threshold of 0.5, about half of our probabilities will be above the
threshold, meaning that about half of our predictions are hiker. Half of the
labels are also hiker, but there is no correlation between the two. This means
we'll get about half the predicted hiker labels correct (TPR = 0.5). We will also
get about half the predicted hiker labels wrong (FPR = 0.5).
If we increased the threshold to 0.8, it would predict hiker 80% of the time.
Again, because this is random, it would identify about 80% of the hikers
correctly (by chance), and but also 80% of the trees as hikers.
If we continued this approach for all thresholds, we would achieve a diagonal
line.
A realistic model
In the real world, we typically achieve models that perform somewhere between
between pure chance (a diagonal line) and perfectly (a line that touches the top
left corner).
Let's finally build a more realistic model. We'll try to predict whether a sample is
a hiker or not based on motion. Our model should do OK, but it won't be
perfect. This is because hikers sometimes sit still (like trees) and trees sometimes
blow in the wind (moving, like a hiker).
[ ]
import [Link]
# Train a logistic regression model to predict hiker based on motion
model = [Link](train.is_hiker, prep_data([Link]), add_co
nstant=True).fit()
# Plot the model
graphing.scatter_2D(test, label_x="motion", label_y="is_hiker", trendline=lam
bda x: [Link](prep_data(x)))
Presione Mayús + Entrar para ejecutar
The model (red line) seems sensible, though we know sometimes it will get
answers wrong.
Now let's look at the ROC curve:
[ ]
create_roc_curve(lambda x: [Link](prep_data(x)), "motion")
Presione Mayús + Entrar para ejecutar
We can see the curve bulging toward the top left corner, meaning it is working
much better than chance.
This is a fairly typical ROC curve for an 'easy' machine-learning problem like this.
Harder problems often see the line much more similar to a diagonal line.
By contrast, if we ever came across a line that bulged the opposite direction - to
the bottom right - we would know we're doing worse than chance, and
something is deeply wrong.
Summary
We got through it! ROC curves can seem difficult at first, particularly due to the
terminology with respect to True and False positives. We built one from scratch
though, here to get a feel for how they are working inside. If you found that
tough, read through again slowly, and experiment with some of the functions
we made. Don't fret - we normally can use existing libraries to do most of this
work for us.
The mode important thing to remember with these curves is that we would like
our line to be as close to the top left of the graph as possible. A model that can
do this is correctly identifying the target (such as hikers) most of the time,
without falsely identifying the target (labelling trees as hikers) very often.
Comparación y optimización de
curvas de ROC
Completado100 XP
4 minutos
Las curvas de características operativas del receptor (ROC) nos permiten
comparar modelos entre sí y ajustar nuestro modelo seleccionado. Vamos a
analizar cómo y por qué se realizan.
Ajuste de un modelo
El uso más obvio de una curva de ROC es elegir un umbral de decisión que
proporcione el mejor rendimiento. Recuerde que nuestros modelos nos
proporcionan probabilidades, como una probabilidad del 65 % de que la
muestra sea un excursionista. El umbral de decisión es el punto por encima del
cual se asigna verdadero (excursionista) a una muestra o por debajo del cual se
le asigna false (árbol). Si nuestro umbral de decisión fuera del 50 %, el 65 % se
asignaría a "verdadero" (excursionista). Sin embargo, si nuestro umbral de
decisión fuera del 70 %, una probabilidad del 65 % sería demasiado pequeña y
se asignaría a falso ("árbol").
Hemos visto en el ejercicio anterior que, al construir una curva de ROC, solo
estamos cambiando el umbral de decisión y evaluando el funcionamiento del
modelo. Al hacerlo, podemos encontrar el umbral que proporciona los
resultados óptimos.
Por lo general, no hay un solo umbral que proporcione la mejor tasa de
verdaderos positivos (TPR) y la tasa de falsos positivos (FPR) más baja. Esto
significa que el umbral óptimo depende de lo que se intente lograr. Por
ejemplo, en nuestro escenario, es muy importante tener una tasa de verdaderos
positivos alta, ya que si no se identifica un excursionista y se produce una
avalancha, el equipo no sabrá rescatarle. Sin embargo, existe un inconveniente:
si la tasa de falsos positivos es demasiado alta, el equipo de rescate puede
enviarse repetidamente para rescatar a personas que simplemente no existen.
En otras situaciones, la tasa de falsos positivos se considera más importante. Por
ejemplo, la ciencia tiene una baja tolerancia para los resultados de falsos
positivos: si la tasa de falsos positivos de experimentos científicos fuera mayor,
habría una oleada interminable de notificaciones contradictorias y sería
imposible distinguir lo real.
Comparación de modelos con AUC
Las curvas de ROC se pueden usar para comparar modelos entre sí, al igual que
las funciones de costo. La curva de ROC de un modelo muestra lo bien que
funcionará para una variedad de umbrales de decisión. Al final del día, lo más
importante de un modelo es qué rendimiento tendrá en el mundo real, donde
solo hay un umbral de decisión. ¿Por qué, entonces, desearíamos comparar
modelos con umbrales que nunca usaremos? Existen dos respuestas para esto.
En primer lugar, comparar curvas de ROC de maneras concretas es como
realizar una prueba estadística que nos indique no solo que un modelo ha
funcionado mejor en este conjunto de pruebas concreto, sino si es probable
que siga teniendo un mejor rendimiento en el futuro. Esto está fuera del ámbito
de este material de aprendizaje, pero merece la pena tenerlo en cuenta.
En segundo lugar, la curva de ROC muestra, hasta cierto punto, cómo depende
el modelo de tener el umbral perfecto. Por ejemplo, si nuestro modelo solo
funciona bien cuando tenemos un umbral de decisión de 0,9, pero muy por
encima o por debajo de este valor, no es un buen diseño. Probablemente
preferiríamos trabajar con un modelo que funcione razonablemente bien para
varios umbrales, sabiendo que si los datos reales que encontramos son
ligeramente diferentes a nuestro conjunto de pruebas, el rendimiento de
nuestro modelo no se contraerá necesariamente.
¿Cómo se comparan las ROC?
La manera más fácil de comparar las ROC numéricamente es usar el área bajo la
curva (AUC). Literalmente, se trata del área del gráfico que se encuentra por
debajo de la curva. Por ejemplo, nuestro modelo perfecto del último ejercicio
tiene una AUC de 1:
Aunque nuestro modelo cuyo rendimiento no era mejor al del simple azar tenga
un área de aproximadamente 0,5:
Cuanto más perfecto sea un modelo, mayor será esta área. Si tenemos un
modelo con una AUC grande, sabemos que funciona bien para diversos
umbrales, por lo que probablemente tiene una buena arquitectura y ha recibido
un buen entrenamiento. Por el contrario, un modelo con una AUC pequeña
(más próxima a 0,5) no funciona bien.
Siguiente unidad: Ejercicio: Ajuste del área bajo la
curva
Ejercicio: Ajuste del área bajo la curva
Completado100 XP
12 minutos
Este módulo requiere un espacio aislado para completarse.
Un espacio aislado le da acceso a recursos gratuitos. No se le cobrará en su
suscripción personal. El espacio aislado solo podrá usarse para completar el
aprendizaje en Microsoft Learn. El uso para cualquier otro motivo está prohibido
y podría generar la pérdida permanente del acceso al espacio aislado.
Microsoft ofrece esta experiencia de laboratorio y el contenido relacionado con
fines educativos. Toda la información presentada es propiedad de Microsoft y
está destinada únicamente a brindar información sobre los productos y servicios
abordados en este módulo de Microsoft Learn.
Activar espacio aislado
Las sugerencias de enlaces de teclado de la barra de herramientas están ahora ocultas
RuntimeArchivoEditarVista
Ejecutar todo
Kernel
Proceso no conectado
Exercise: Tune the area under the curve
In this exercise, we will make and compare two models, using ROC curves, and
tune one using the area under the curve (AUC).
The goal of our models is to identify whether each item detected on the
mountain is a hiker (true) or a tree (false). We will work with
our motion feature here. Let's take a look:
CódigoMarkdown
[ ]
import numpy
import pandas
!pip install statsmodels
!wget [Link]
to-machine-learning/main/[Link]
!wget [Link]
to-machine-learning/main/Data/hiker_or_tree.csv
!wget [Link]
to-machine-learning/main/m2d_make_roc.py
import graphing # custom graphing code. See our GitHub repo for details
import sklearn.model_selection
# Load our data from disk
df = pandas.read_csv("hiker_or_tree.csv", delimiter="\\t")
# Remove features we no longer want
del df["height"]
del df["texture"]
# Split into train and test
train, test = sklearn.model_selection.train_test_split(df, test_size=0.5, ra
ndom_state=1)
# Graph our feature
graphing.multiple_histogram(test, label_x="motion", label_group="is_hiker", n
bins=12)
Presione Mayús + Entrar para ejecutar
Motion seems associated with hikers more than trees, but not perfectly.
Presumably this is because trees blow in the wind, and some hikers are found
sitting down.
A logistic regression model and a random forest
Let's train the same logistic regression model we used in the previous exercise,
as well as a random forest model. Both will try to predict which objects are
hikers.
First the logistic regression:
[ ]
import [Link]
from [Link] import accuracy_score
# This is a helper method that reformats the data to be compatible
# with this particular logistic regression model
prep_data = lambda x: numpy.column_stack(([Link]([Link], 1), x))
# Train a logistic regression model to predict hiker based on motion
lr_model = [Link](train.is_hiker, prep_data([Link]), add
_constant=True).fit()
# Assess its performance
# -- Train
predictions = lr_model.predict(prep_data([Link])) > 0.5
train_accuracy = accuracy_score(train.is_hiker, predictions)
# -- Test
predictions = lr_model.predict(prep_data([Link])) > 0.5
test_accuracy = accuracy_score(test.is_hiker, predictions)
print("Train accuracy", train_accuracy)
print("Test accuracy", test_accuracy)
# Plot the model
predict_with_logistic_regression = lambda x: lr_model.predict(prep_data(x))
graphing.scatter_2D(test, label_x="motion", label_y="is_hiker", title="Logist
ic Regression", trendline=predict_with_logistic_regression)
Presione Mayús + Entrar para ejecutar
Now our random forest model:
[ ]
from [Link] import RandomForestClassifier
from [Link] import accuracy_score
# Create a random forest model with 50 trees
random_forest = RandomForestClassifier(random_state=2,
verbose=False)
# Train the model
random_forest.fit(train[["motion"]], train.is_hiker)
# Assess its performance
# -- Train
predictions = random_forest.predict(train[["motion"]])
train_accuracy = accuracy_score(train.is_hiker, predictions)
# -- Test
predictions = random_forest.predict(test[["motion"]])
test_accuracy = accuracy_score(test.is_hiker, predictions)
# Train and test the model
print("Random Forest Performance:")
print("Train accuracy", train_accuracy)
print("Test accuracy", test_accuracy)
Presione Mayús + Entrar para ejecutar
These models have similar, but not identical, performance on the test set in
terms of accuracy.
Create ROC plots
Let's create ROC curves for these models. To do this, we will simply import code
from the last exercises so that we can focus on what we would like to learn here.
If you need a refresher on how these were made, re-read the last exercise.
Note that we've made a slight change. Now our method produces both a graph,
and the table of numbers we used to create the graph.
First let's look at the logistic regression model:
[ ]
from m2d_make_roc import create_roc_curve # import our previous ROC code
fig, thresholds_lr = create_roc_curve(predict_with_logistic_regression, test,
"motion")
# Uncomment the line below if you would like to see the area under the curve
#fig.update_traces(fill="tozeroy")
[Link]()
# Show the table of results
thresholds_lr
Presione Mayús + Entrar para ejecutar
We can see our model does better than chance (it is not a diagonal line). Our
table shows the false positive rate (fpr) and true positive rate (tpr) for each
threshold.
Let's repeat this for our random forest model:
[ ]
# Don't worry about this lambda function. It simply reorganizes
# the data into the shape expected by the random forest model,
# and calls predict_proba, which gives us predicted probabilities
# that the label is 'hiker'
predict_with_random_forest = lambda x: random_forest.predict_proba([Link]
y(x).reshape(-1, 1))[:,1]
# Create the ROC curve
fig, thresholds_rf = create_roc_curve(predict_with_random_forest, test, "moti
on")
# Uncomment the line below if you would like to see the area under the curve
#fig.update_traces(fill="tozeroy")
[Link]()
# Show the table of results
thresholds_lr
Presione Mayús + Entrar para ejecutar
Area under the curve
Our models look quite similar. Which model do we think is best? Let's use area
under the curve (AUC) to compare them. We should expect a number larger than
0.5, because these models are both better than chance, but smaller than 1,
because they are not perfect.
[ ]
from [Link] import roc_auc_score
# Logistic regression
print("Logistic Regression AUC:", roc_auc_score(test.is_hiker, predict_with_l
ogistic_regression([Link])))
# Random Forest
print("Random Forest AUC:", roc_auc_score(test.is_hiker, predict_with_random_
forest([Link])))
Presione Mayús + Entrar para ejecutar
By a very thin margin, the logistic regression model comes out on top.
Remember, this doesn't mean the logistic regression model will always do a
better job than the random forest. It means that the logistic regression model is
a slightly better choice for this kind of data, and probably is marginally less
reliant on having the perfect decision thresholds chosen.
Decision Threshold Tuning
We can also use our ROC information to find the best thresholds to use. We'll
just work with our random forest model for this part.
First, let's take a look at the rate of True and False positives with the default
threshold of 0.5:
[ ]
# Print out its expected performance at the default threshold of 0.5
# We previously obtained this information when we created our graphs
row_of_0point5 = thresholds_rf[thresholds_rf.threshold == 0.5]
print("TPR at threshold of 0.5:", row_of_0point5.[Link][0])
print("FPR at threshold of 0.5:", row_of_0point5.[Link][0])
Presione Mayús + Entrar para ejecutar
We can expect that, when real hikers are seen, we have an 86% chance of
identifying them. When trees or hikers are seen, we have a 16% chance of
identifying them as a hiker.
Let's say that for our particular situation, we consider obtaining true positive just
as important as avoiding a false positive. We don't want to ignore hikers on the
mountain, but we also don't want to send our team out into dangerous
conditions for no reason.
We can find the best threshold by making our own scoring system, and seeing
which threshold would get the best result:
[ ]
# Calculate how good each threshold is from our TPR and FPR.
# Our criteria is that the TPR is as high as possible and
# the FPR is as low as possible. We consider them equally important
scores = thresholds_rf.tpr - thresholds_rf.fpr
# Find the entry with the lowest score according to our criteria
index_of_best_score = [Link](scores)
best_threshold = thresholds_rf.threshold[index_of_best_score]
print("Best threshold:", best_threshold)
# Print out its expected performance
print("TPR at this threshold:", thresholds_rf.tpr[index_of_best_score])
print("FPR at this threshold:", thresholds_rf.fpr[index_of_best_score])
Presione Mayús + Entrar para ejecutar
Our best threshold, with this criteria, is 0.74, not 0.5! This would have us still
identify 83% of hikers properly - a slight decrease from 86% - but only mis-
identify 3.6% of trees as hikers.
If you would like, play with how we are calculating our scores here, and see how
the threshold is adjusted.
Summary
That's it! Here we've created ROC curves for two different models, using code
we wrote in the previous exercise.
Visually, they were quite similar, and when we compared them using the area-
under-the-curve metric we found that the logistic regression model was
marginally better performing.
We then used the ROC curve to tune our random forest model, based on criteria
specific to our circumstances. Our very simple criteria of TPR - FPR let us pick a
threshold that was right for us.
Introducción
Completado100 XP
3 minutos
El mundo empresarial está cada vez más controlado por los datos. Las pequeñas
y grandes empresas usan los datos por igual para tomar decisiones sobre
ventas, contratación, objetivos y todas las áreas para las que tienen datos.
Aunque la mayoría de las empresas tienen acceso a datos de un tipo u otro,
puede ser intimidante intentar comprenderlos sin conocimientos sobre el
análisis de datos o las estadísticas. Incluso, si comprende los datos, puede ser
un reto mostrarlos de una manera fácil de entender y comunicarlos a las
personas pertinentes. Power BI permite que la intimidación y los inconvenientes
del análisis y la visualización de los datos dejen de ser un problema. Mediante la
conexión a uno o varios de los cientos de orígenes de datos existentes y el uso
de una interfaz segura y fácil de comprender, puede interactuar rápidamente
con los datos y comprenderlos para influir en todos los sistemas empresariales.
En este módulo, aprenderá a:
Describir el valor empresarial y las características de Power BI
Ver cómo funciona Power BI y su aspecto desde la perspectiva del
usuario
¿Qué es Power BI?
Completado100 XP
10 minutos
Las empresas se ven ahogadas por los datos de clientes y empleados, las
métricas de los objetivos de la empresa, la información sobre ventas y
adquisiciones, pero estos datos solo son buenos según la capacidad que tenga
para interpretarlos y comunicar su significado. Aquí es donde entra en juego
Power BI (Business Intelligence).
Microsoft Power BI es una colección de servicios de software, aplicaciones y
conectores que funcionan conjuntamente para convertir orígenes de datos sin
relación entre sí en información coherente, interactiva y atractiva visualmente.
Tanto si se trata de un sencillo libro de Microsoft Excel como de una colección
de almacenes de datos híbridos locales o basados en la nube, Power BI le
permite conectar fácilmente con los orígenes de datos, limpiar y modelar los
datos sin afectar al origen subyacente, visualizar (o detectar) lo más importante
y compartirlo con quién quiera.
Partes de Power BI
Power BI consta de una aplicación de escritorio de Microsoft Windows
denominada Power BI Desktop, un servicio SaaS (software como servicio) en
línea denominado servicio Power BI, y aplicaciones móviles de Power BI
disponibles para teléfonos y tabletas.
Estos tres elementos, Desktop, el servicio y las aplicaciones móviles, están
diseñados para permitir a los usuarios crear, compartir y utilizar información
empresarial de la forma que les resulte más eficaz para su rol.
Conceptos de Power BI
Los pilares principales de Power BI son: conjuntos de datos, informes y paneles.
Están organizados en áreas de trabajo y se crean según las capacidades.
Capacidades
Las capacidades son un concepto básico de Power BI que representa un
conjunto de recursos que se usan para hospedar y facilitar el contenido de
Power BI. Las capacidades son compartidas o dedicadas. Una capacidad
compartida es la que se comparte con otros clientes de Microsoft, mientras que
una dedicada está confirmada plenamente para un solo cliente. Las capacidades
dedicadas requieren una suscripción. De forma predeterminada, las áreas de
trabajo se crean en una capacidad compartida.
Áreas de trabajo
Las áreas de trabajo son contenedores de paneles, informes, libros, conjuntos
de datos y flujos de datos de Power BI. Existen dos tipos de áreas de trabajo: Mi
área de trabajo y las áreas de trabajo.
Mi área de trabajo es el área de trabajo personal de cualquier
cliente de Power BI en la que puede trabajar con su contenido. Solo
usted tiene acceso a esta área de trabajo. Puede compartir paneles
e informes desde Mi área de trabajo. Si desea colaborar en paneles
e informes o crear una aplicación, querrá trabajar en un área de
trabajo.
Las áreas de trabajo se usan para colaborar y compartir el
contenido con los compañeros. Puede agregar compañeros a las
áreas de trabajo y colaborar en paneles, informes y conjuntos de
datos. Excepto en un caso concreto, todos los miembros del área de
trabajo necesitan licencias de Power BI Pro.
Las áreas de trabajo también son los lugares donde puede crear, publicar y
administrar aplicaciones para su organización. Entienda las áreas de trabajo
como áreas de almacenamiento provisional y contenedores del contenido que
compondrá una aplicación de Power BI. ¿Qué es una aplicación? Una aplicación
es una colección de paneles e informes creada para entregar las métricas clave a
los consumidores de Power BI de su organización. Las aplicaciones son
interactivas, pero los consumidores no pueden editarlas. Los consumidores de la
aplicación, los compañeros que tienen acceso a las aplicaciones, no requieren
necesariamente licencias Pro.
Conjuntos de datos
Un conjunto de datos es una colección de datos que importa o a lo que
se conecta. Power BI permite importar y conectar con todos los tipos de
conjuntos de datos y ponerlos todos en un solo lugar. Los conjuntos de datos
también pueden obtener datos de flujos de datos.
Los conjuntos de datos están asociados a áreas de trabajo y un único conjunto
de datos puede formar parte de muchas áreas de trabajo. Al abrir un área de
trabajo, los conjuntos de datos asociados aparecen en la pestaña Conjuntos de
datos. Cada conjunto de datos de la lista representa una colección de datos,
por ejemplo, un conjunto de datos puede contener datos de un libro de Excel
en OneDrive, un conjunto de datos tabulares de SSAS local o un conjunto de
datos de Salesforce. Se admiten muchos orígenes de datos diferentes. Los
conjuntos de datos que agrega un miembro del área de trabajo están
disponibles para otros miembros del área de trabajo con un rol
de administrador, miembro o colaborador.
Conjuntos de datos compartidos
La inteligencia empresarial es una actividad de colaboración. Es importante
establecer conjuntos de datos estandarizados que puedan ser el "único origen
de la verdad". La detección y reutilización de esos conjuntos de datos
estandarizados es fundamental. Cuando los expertos en modelos de datos de la
organización crean y comparten conjuntos de datos optimizados, los creadores
de informes pueden comenzar con esos conjuntos de datos para generar
informes precisos. Su organización puede disponer de datos coherentes para
tomar decisiones y una cultura de datos correcta. Para consumir estos conjuntos
de datos compartidos, solo tiene que elegir Conjuntos de datos de Power BI al
crear el informe de Power BI.
Informes
Un informe de Power BI se compone de una o más páginas de visualizaciones,
como gráficos de líneas, mapas y gráficos de rectángulos. A las visualizaciones
también se les denomina objetos visuales. Se pueden crear informes desde
cero en Power BI, se pueden importar con paneles que otros compañeros
compartan con usted o se pueden crear en Power BI mediante la conexión a
conjuntos de datos de Excel, Power BI Desktop, bases de datos y aplicaciones
SaaS. Por ejemplo, cuando se conecta a un libro de Excel que contiene hojas de
Power View, Power BI crea un informe basado en dichas hojas. Y cuando se
conecta a una aplicación SaaS, Power BI importa un informe generado
previamente.
Hay dos maneras de ver los informes e interactuar con ellos: Vista de
lectura y vista de edición. Al abrir un informe, se abre en la vista de lectura. Si
tiene permisos de edición, verá Editar informe en la esquina superior izquierda
y podrá ver el informe en la vista de edición. Si un informe se encuentra en un
área de trabajo, todos los usuarios con un rol de administrador, miembro o
colaborador pueden editarlo. Estos usuarios tienen acceso a todas las
funcionalidades de exploración, diseño, creación y uso compartido de la vista de
edición del informe. Las personas con las que comparta el informe pueden
explorarlo e interactuar con él mediante la vista de lectura.
Cuando se abre un área de trabajo, los informes asociados aparecen en la
pestaña Informes. Cada informe de la lista representa una o más páginas de
visualizaciones basadas en solo uno de los conjuntos de datos subyacentes.
Para abrir un informe, selecciónelo.
Cuando abre una aplicación, se le presenta un panel. Para acceder a un informe
subyacente, seleccione un icono del panel (se proporciona más información
sobre los iconos más adelante) que se ha anclado desde un informe. Tenga en
cuenta que no todos los iconos se anclan desde los informes, por lo que tendrá
que hacer clic en unos cuantos iconos para encontrar un informe.
De forma predeterminada, el informe se abre en la Vista de lectura.
Simplemente seleccione Editar informe para abrirlo en la vista de edición (si
tiene los permisos necesarios).
Paneles
Un panel es algo que usted crea en el servicio Power BI o que un compañero
de trabajo crea en este y comparte con usted. Es un lienzo individual que
contiene uno o varios iconos y widgets. Cada icono anclado desde un informe o
desde Preguntas y respuestas muestra una visualización única creada a partir de
un conjunto de datos y anclada al panel. Además, pueden anclarse páginas de
informe completas a un panel como un único icono. Hay muchas maneras de
agregar iconos al panel; demasiadas para tratarlas en este tema de información
general.
¿Por qué se crean paneles? Estas son solo algunas de las razones:
para observar de un solo vistazo toda la información necesaria para
tomar decisiones.
para supervisar la información más importante sobre su empresa.
para garantizar que todos los compañeros estén en la misma
sintonía, es decir, que vean y usen la misma información.
para supervisar el correcto funcionamiento de un negocio,
producto, unidad de negocio, campaña de marketing, etc.
para crear una vista personalizada de un panel mayor y mostrar
todas las métricas importantes.
Cuando se abre un área de trabajo, los paneles asociados aparecen en la
pestaña Paneles. Para abrir un panel, selecciónelo. Cuando abre una aplicación,
se le presenta un panel. Si es el propietario del panel, también tendrá acceso de
edición a los conjuntos de datos e informes subyacentes. Si el panel se ha
compartido con usted, podrá interactuar con el panel y los informes
subyacentes, pero no podrá guardar los cambios.
Aplicaciones plantilla
Las nuevas aplicaciones de plantilla de Power BI permiten a los asociados de
Power BI crear aplicaciones de Power BI con poca o ninguna codificación, e
implementarlas en cualquier cliente de Power BI. Como asociado de Power BI,
crea contenido rápido para los clientes y lo publica usted mismo.
Puede crear aplicaciones de plantillas que permitan a los clientes conectarse
dentro de sus propias cuentas. Como expertos de dominio, pueden desbloquear
los datos de forma que sus usuarios empresariales puedan consumirlos
fácilmente.
Las aplicaciones de plantilla se envían al Centro de partners para que estén
disponibles públicamente en el marketplace de aplicaciones de Power BI y
en Microsoft AppSource. Si está interesado en crear aplicaciones de plantilla
para distribuirlas fuera la organización, vea Creación de una plantilla de
aplicación en Power BI.
Instalación de una aplicación de plantilla
1. En el panel de navegación del servicio Power BI, haga clic
en Aplicaciones>Obtener aplicaciones.
2. En el marketplace de aplicaciones de Power BI que aparece,
seleccione Aplicaciones de plantilla. Se mostrarán todas las
aplicaciones de plantilla disponibles en AppSource. Busque la
aplicación de plantilla que está buscando u obtenga una selección
filtrada mediante el cuadro de búsqueda.
3. Cuando encuentre la aplicación de plantilla que está buscando,
haga clic en ella. Se mostrará el anuncio de la aplicación de plantilla.
Haga clic en OBTENERLO AHORA.
4. En el cuadro de diálogo que aparece, haga clic en Instalar.
La aplicación se instala, junto con un área de trabajo con el mismo nombre que
tiene todos los artefactos necesarios para una mayor personalización.
Nota
Si usa un vínculo de instalación para una aplicación que no aparece en
AppSource, se le pedirá que confirme la elección en un cuadro de diálogo de
validación.
Para poder instalar una aplicación de plantilla que no aparece en AppSource,
debe solicitar al administrador los permisos pertinentes. Vea la configuración de
aplicaciones de plantilla en el portal de administración de Power BI para obtener
más información.
Cuando la instalación finalice correctamente, una notificación le indicará que la
nueva aplicación está lista.
Siguiente unidad: Modelado y visualizaciones de
datos
Modelado y visualizaciones de datos
Completado100 XP
12 minutos
Power BI Desktop es una aplicación gratuita que se puede instalar en el equipo
local y que permite conectarse a los datos, transformarlos y visualizarlos. Con
Power BI Desktop, puede conectarse a varios orígenes de datos diferentes y
combinarlos (lo que se suele denominar modelado) en un modelo de datos.
Este modelo de datos permite compilar objetos visuales y colecciones de
objetos visuales que puede compartir como informes, con otras personas de su
organización.
La mayoría de los usuarios que trabajan en proyectos de inteligencia
empresarial usan Power BI Desktop para crear informes y luego usan el servicio
Power BI para compartir los informes con otros.
Cuando inicie Power BI Desktop, aparecerá el cuadro de diálogo Introducción,
el que proporcionará vínculos útiles a foros, blogs y vídeos de introducción.
En Power BI Desktop, empezará a crear informes en la vista Informe. Trabajará
en cinco áreas principales:
1. Cinta de opciones: muestra las tareas comunes asociadas con los
informes y las visualizaciones.
2. Vista Informe o lienzo: donde se crean y se organizan las
visualizaciones.
a. La Vista de datos le permite ver todos los datos
disponibles en el informe. Es una manera fácil de
comprobar rápidamente los tipos de datos y validarlos.
b. La Vista de modelo le permite establecer visualmente la
relación entre las tablas o los elementos. Una relación es
donde dos o más tablas se vinculan entre sí porque
contienen datos relacionados. Así se permite a los
usuarios ejecutar consultas de datos relacionados en
varias tablas.
3. Pestaña Páginas: ubicada en la parte inferior de la página, en esta
área se seleccionaría o agregaría una página de informe.
4. Panel de visualizaciones: donde puede cambiar las visualizaciones,
personalizar los colores o ejes, aplicar filtros, arrastrar campos, etc.
5. Panel Campos: donde los filtros y los elementos de consulta se
pueden arrastrar a la vista Informe o al área Filtros del panel
Visualizaciones.
Tipos de visualizaciones disponibles en Power BI
A continuación, se muestran solo algunos de los muchos tipos de
visualizaciones diferentes que se pueden agregar a los informes de Power BI,
especificados en las Preguntas y respuestas y anclados en los paneles.
Gráficos de barras y de columnas
Los gráficos de barras son el estándar para buscar un valor concreto en
categorías diferentes.
Tarjetas: fila única o múltiple
KPI
Muestra el progreso hacia un objetivo cuantificable.
Mapas: mapas básicos
Se usa para asociar información cuantitativa y de categorías con ubicaciones
espaciales.
Gráficos circulares
Los gráficos circulares muestran la relación de las partes con un todo.
Objeto visual Preguntas y respuestas
El objeto visual Preguntas y respuestas le permite formular preguntas sobre sus
datos empleando un lenguaje natural.
Tablas
Funcionan bien en las comparaciones cuantitativas entre elementos cuando hay
muchas categorías.
Estos son los objetos visuales de serie de Power BI disponibles en el panel de
visualización de Power BI Desktop y el servicio Power BI. Sin embargo, a veces
es necesario un objeto visual más personalizado y estos se pueden encontrar en
AppSource para Power BI.
Objetos visuales personalizados
Objetos visuales de Power BI de AppSource
Microsoft y los miembros de la comunidad aportan objetos visuales de Power BI
para el beneficio público y los publican en AppSource. Puede descargar estos
objetos visuales y agregarlos a los informes de Power BI. Microsoft ha probado
y aprobado la funcionalidad y calidad de todos estos objetos visuales de Power
BI.
Nota
Mediante el uso de objetos visuales de Power BI creados con nuestro SDK, es
posible que esté importando datos de terceros u otros servicios, o enviando
datos a estos, que se encuentren fuera del área geográfica, el límite de
cumplimiento o la instancia de la nube nacional del inquilino de Power BI.
Los objetos visuales certificados de Power BI son objetos visuales en AppSource
que se han probado además para comprobar que el objeto visual no tiene
acceso a recursos o servicios externos.
Una vez importados los objetos visuales de Power BI desde AppSource, estos
pueden actualizarse automáticamente sin ningún aviso adicional.
¿Qué es AppSource?
AppSource es la ubicación de las aplicaciones, los complementos y las
extensiones para el software de Microsoft. AppSource conecta a millones de
usuarios de productos como Microsoft 365, Azure, Dynamics 365, Cortana y
Power BI con soluciones que les ayudan a realizar su trabajo de forma más
eficaz e informada que antes.
Objetos visuales de Power BI certificados
Los objetos visuales certificados de Power BI son objetos visuales
de AppSource que cumplen determinados requisitos de código especificados
que el equipo de Microsoft Power BI ha probado y aprobado. Las pruebas están
diseñadas para comprobar que el objeto visual no accede a servicios o recursos
externos.
Filtrar datos con Power BI
Los datos constituyen el núcleo de Power BI. A medida que explora los informes,
cada objeto visual obtiene sus datos subyacentes de fuentes que a menudo
contienen muchos más datos de los que necesita. Power BI ofrece varias
maneras de filtrar y resaltar informes. Saber cómo filtrar los datos es clave para
buscar la información adecuada.
Nota
El filtrado solo se aplica a los informes, no a los paneles.
Nota
Al filtrar un objeto visual, como un gráfico de barras, simplemente está
cambiando la vista de los datos de ese objeto visual. No modifica los datos de
origen de manera alguna.
Segmentación de datos
Un tipo sencillo de filtrado que puede usar directamente en la página del
informe es la segmentación. La segmentación de datos proporciona
indicaciones sobre las formas en que puede filtrar los resultados en los objetos
visuales de una página del informe. Hay varios tipos diferentes de
segmentaciones de datos: números, categorías y fechas. La segmentación de
datos facilita el filtrado de todos los objetos visuales de la página a la vez.
Si desea seleccionar más de un campo, mantenga presionada la tecla Ctrl y haga
clic en los campos adicionales.
Explorar el panel Filtros
Otra manera de filtrar los datos consiste en abrir y modificar los filtros en el
panel Filtros. El panel Filtros contiene filtros que se agregaron al informe por el
diseñador de informes. Como consumidor, puede interactuar con los filtros y
guardar los cambios, pero no puede agregar nuevos filtros.
Los cuatro tipos de filtros son:
Informe: se aplica a todas las páginas del informe.
Página: se aplica a todos los objetos visuales en la página del
informe actual.
Objeto visual: se aplica a un solo objeto visual en una página del
informe. Solo verá los filtros de nivel de objeto visual si ha
seleccionado un objeto visual en el lienzo del informe.
Obtención de detalles: permite explorar sucesivamente vistas más
detalladas de las vistas dentro de un solo objeto visual.
Uso de botones en Power BI
El uso de botones en Power BI le permite crear informes que se comporten
como aplicaciones y, de ese modo, crear un entorno atractivo para que los
usuarios puedan mover el puntero sobre el contenido de Power BI, hacer clic e
interactuar con él. Puede agregar botones a informes en Power BI Desktop y
en el servicio Power BI. Al compartir los informes en el servicio Power BI,
proporcionan a los usuarios una experiencia similar a la de una aplicación.
Para crear un botón en Power BI Desktop, seleccione Botones en la
cinta Insertar; se mostrará un menú desplegable en el que puede seleccionar el
botón que quiera entre varias opciones, como se muestra en la imagen
siguiente.
Transformación de datos
A veces, es posible que los datos tengan datos adicionales o datos con formato
incorrecto. Power BI Desktop incluye la herramienta Editor de Power Query,
que puede ayudarlo a darle forma a los datos y a transformarlos, para que estén
listos para los modelos y las visualizaciones.
Inicio del Editor de Power Query
Para empezar, seleccione Editar en la ventana Navegador para iniciar el Editor
de Power Query. También puede iniciar el Editor de Power Query directamente
desde Power BI Desktop con el botón Transformar datos de la cinta Inicio.
Después de cargar los datos en el Editor de Power Query, verá la pantalla
siguiente:
1. En la cinta de opciones, los botones activos le permiten interactuar
con los datos de la consulta.
2. En el panel de la izquierda, se muestran las consultas (una para cada
tabla o entidad) y están disponibles para seleccionarlas, verlas y
darles forma.
3. En el panel del control, se muestran los datos de la consulta
seleccionada que ya están disponibles para darles forma.
4. La ventana Configuración de la consultamuestra las propiedades
de la consulta y los pasos aplicados.
Procedimiento para transformar datos
En el panel central, si se hace clic con el botón secundario en una columna, se
muestran las transformaciones disponibles. Entre los ejemplos de las
transformaciones disponibles se incluyen la eliminación de una columna de la
tabla, la duplicación de la columna con un nombre nuevo o el reemplazo de los
valores. En este menú, también puede dividir las columnas de texto en múltiplos
por delimitadores comunes.
La cinta de opciones del Editor de Power Query contiene herramientas
adicionales que pueden ayudarlo a cambiar el tipo de datos de las columnas,
agregar una notación científica o extraer elementos de las fechas, como puede
ser un día de semana.
Sugerencia
Si comete un error, puede deshacer cualquier paso en la lista Pasos aplicados.
A medida que aplica las transformaciones, cada paso aparece en la lista Pasos
aplicados del panel de configuración de consulta. Puede usar esta lista para
deshacer o revisar cambios específicos o, incluso, cambiar el nombre de un
paso. Para guardar las transformaciones, seleccione Cerrar y aplicar en la
pestaña Inicio.
Después de seleccionar Cerrar y aplicar, el Editor de Power Query aplica los
cambios de consulta y los aplica en Power BI Desktop.
Para más información, consulte Inicio rápido: Uso de Power Query en
Power BI Desktop.
Limpiar datos
Si bien Power BI puede importar sus datos desde prácticamente cualquier
origen, sus herramientas de visualización y modelado funcionan mejor con los
datos en columna. En algunas ocasiones, los datos no tendrán el formato de
columna simple, que es lo que suele pasar con las hojas de cálculo de Excel.
En esta unidad, limpiará los datos en columnas con el Editor de Power Query.
Puede que un diseño de tabla que se vea bien no sea óptimo para las consultas
automatizadas. Por ejemplo, la hoja de cálculo siguiente tiene encabezados que
abarcan varias columnas.
Procedimiento para limpiar datos
Afortunadamente, el Editor de Power Query tiene herramientas que lo ayudarán
a transformar rápidamente tablas de varias columnas en conjuntos de datos que
puede usar.
Transponer datos
Con el uso de Transpose (Transponer) en el Editor de Power Query, puede
intercambiar filas en columnas para que los datos tengan un mejor formato.
Dar formato a los datos
Es posible que tenga que darle formato a los datos para que Power BI pueda
clasificar en categorías e identificar correctamente los datos. Con algunas
transformaciones, limpiará los datos de un conjunto de datos que puede usar
en Power BI. Entre los ejemplos de transformaciones eficaces se incluyen la
promoción de filas a encabezados, el uso de Rellenar para reemplazar los
valores null y Anular la dinamización de columnas.
Con Power BI, puede experimentar con las transformaciones y determinar cuál
de ellas transformará los datos en el formato de columna más utilizable.
Recuerde que en la sección Pasos aplicados del Editor de Power Query se
registran todas sus acciones. Si una transformación no funciona según lo
previsto, seleccione la X junto al paso y deshágalo.
Después de limpiar los datos y dejarlos en un formato utilizable, puede empezar
a crear objetos visuales atractivos en Power BI.
Para más información, consulte Tutorial: Combinación de datos de ventas de
Excel y una fuente de OData.
Trabajar con agregados en el servicio Power BI
¿Qué es un agregado?
A veces, querrá combinar matemáticamente los valores de los datos. La
operación matemática podría ser suma, promedio, máximo, recuento, etc. A la
combinación de los valores de los datos se le llama agregación. El resultado de
esa operación matemática es un agregado.
Cuando el servicio Power BI y Power BI Desktop crean las visualizaciones,
pueden agregar los datos. A menudo el agregado es exactamente lo que
necesita, pero en otras ocasiones deseará agregar los valores de forma
diferente. Por ejemplo, una suma frente a una media. Hay varias maneras de
administrar y cambiar el agregado que usa Power BI en una visualización.
En primer lugar, echemos un vistazo a los tipos de datos, ya que el tipo de datos
determina si Power BI puede agregarlos y cómo.
Tipos de datos
La mayoría de los conjuntos de datos tienen más de un tipo de datos. En el nivel
más básico, los datos son valores numéricos o no lo son. Power BI puede
agregar datos numéricos con una suma, un promedio, un recuento, un mínimo,
una varianza y muchas funciones más. El servicio también puede agregar datos
de texto, a menudo llamados datos de categorías. Si intenta agregar un campo
de categorías al colocarlo en un cubo solo numérico
como Valores o Información sobre herramientas, Power BI cuenta las
apariciones de cada categoría o las apariciones distintas de cada categoría. Los
tipos especiales de datos, como las fechas, tienen algunas opciones de
agregado propias: más antiguo, más reciente, primero y último.
En el ejemplo siguiente:
Units Sold y Manufacturing Price son columnas que contienen
datos numéricos
Segment, Country, Product, Month y Month Name contienen
datos de categorías
Al crear una visualización en Power BI, el servicio agregará campos numéricos
(el valor predeterminado es sum) según algún campo de categorías. Por
ejemplo, "Unidades vendidas por producto", "Unidades vendidas por mes" y
"Precio de fabricación por segmento". Power BI hace referencia a algunos
campos numéricos como medidas. Es fácil identificar las medidas en el editor
de informes de Power BI porque en la lista Campos se muestran con el símbolo
∑ junto a ellas. Para obtener más información, consulte Paseo por el editor de
informes.
¿Por qué los agregados no funcionan como quiero?
Trabajar con agregados en el servicio Power BI puede resultar confuso. Es
posible que tenga un campo numérico y que Power BI no le permita cambiar la
agregación. O quizá tenga un campo, como un año, y no desea agregarlo sino
que desea contar el número de repeticiones.
Normalmente, el problema subyacente es la definición del campo en el
conjunto de datos. Es posible que el propietario del conjunto de datos haya
definido el campo como texto y eso explica por qué Power BI no puede sumarlo
ni calcular su promedio. Por desgracia, solo el propietario del conjunto de datos
puede cambiar la manera en que se clasifica un campo. Por lo tanto, si tiene
permisos de propietario para el conjunto de datos, ya sea en Desktop o en el
programa que se ha usado para crear el conjunto de datos (por ejemplo, Excel),
puede solucionar este problema. En caso contrario, debe ponerse en contacto
con el propietario del conjunto de datos para obtener ayuda.
Cambiar el modo en que un campo numérico se agrega
Supongamos que tiene un gráfico que suma las unidades vendidas de los
distintos productos, pero preferiría disponer de la media.
1. Cree un gráfico de columnas agrupadas que use una medida y una
categoría. En este ejemplo Units Sold by Product. De forma
predeterminada, Power BI crea un gráfico que suma las unidades vendidas
(arrastre la medida al área Valor) de cada producto (arrastre la categoría
al área Eje).
2. En el panel Visualizaciones, haga clic con el botón derecho en la medida y
seleccione el tipo de agregado que necesita. En este caso,
seleccionamos Promedio.
Nota
Las opciones disponibles en la lista desplegable varían en función de 1) el
campo seleccionado y 2) la manera en que el propietario del conjunto de datos
ha clasificado ese campo.
3. La visualización ahora está usando una agregación por la media.
Formas de agregar los datos
Algunas de las opciones que pueden estar disponibles para agregar un campo:
No resumir. Si se elige esta opción, Power BI trata cada valor de
ese campo por separado y no los resume. Use esta opción si hay
una columna de identificador numérico que el servicio no deba
sumar.
Suma. Suma todos los valores de ese campo.
Media. Calcula la media aritmética de los valores.
Mínimo. Muestra el valor menor.
Máximo. Muestra el valor mayor.
Recuento (no vacíos). Cuenta el número de valores de ese campo
que no están en blanco.
Recuento (Distinct). Cuenta el número de valores diferentes en ese
campo.
Desviación estándar.
Varianza.
Mediana. Muestra el valor de la mediana (intermedio). Este valor
tiene el mismo número de elementos por encima que por debajo. Si
hay dos medianas, Power BI calcula su promedio.
Siguiente unidad: Seguridad y administración
Seguridad y administración
Completado100 XP
4 minutos
La seguridad es uno de los principales objetivos de los datos. La administración
es una de la principales preocupaciones empresariales. Afortunadamente, la
estructura y las capacidades de Power BI proporcionan tranquilidad a los
usuarios y administradores de la empresa.
Seguridad
De forma similar a muchos servicios Microsoft, Power BI se basa en Azure. Se
trata de una plataforma e infraestructura de informática en la nube de
Microsoft, que garantiza el mismo nivel de seguridad para Power BI que otros
servicios Microsoft. Los usuarios inician sesión con sus credenciales conservadas
en Azure Active Directory y controlan el nivel de uso compartido de cada
informe, datos o panel, y determinan si los destinatarios pueden editar o solo
ver los elementos.
Es importante tener en cuenta que los usuarios son responsables de los datos
que comparten. Si un usuario se conecta a los orígenes de datos con sus
credenciales, puede compartir un informe (o un panel o un conjunto de datos)
basado en esos datos. Los usuarios con los que se comparte el panel no se
autentican en el origen de datos original y se les concederá acceso al informe.
Resulta útil para permitir que los usuarios compartan los informes y los paneles
que han creado, pero requieren responsabilidad por parte del usuario.
Para obtener información más detallada sobre la seguridad de Power BI,
asegúrese de consultar los recursos de este módulo en la última unidad.
Administración
La administración de Power BI es la administración de un inquilino de Power BI,
incluida la configuración de directivas de gobernanza, supervisión del uso y
aprovisionamiento de licencias, funcionalidades y recursos de la
organización.
Power BI está diseñado para la inteligencia empresarial de autoservicio. El
administrador es el guardián de los datos, los procesos y las directivas en el
inquilino de Power BI. Un administrador de Power BI es un miembro de clave de
un equipo que incluye a los desarrolladores, analistas y otros roles de
inteligencia artificial. El administrador puede ayudar a una organización a
asegurarse de que se cumplen los objetivos importantes.
Puede encontrar más información sobre la administración de Power BI, incluidos
los roles, las tareas y las herramientas, mediante el acceso a los vínculos en la
unidad de recursos al final de este módulo.
Siguiente unidad: Caso práctico de cliente: Miami
Heat
Caso práctico de cliente: Miami Heat
Completado100 XP
5 minutos
Aunque se acepta que los datos pueden mejorar los procesos empresariales y
aumentar los ingresos, un ejemplo real ayuda a unificar los conceptos que ya se
han tratado y permite ver el potencial de Power BI en acción. Uno de estos
casos es el de los Miami Heat, cuya adopción de Power BI es del 70 % en toda la
organización.
Miami Heat aprovechó las eficaces características de análisis y visualización para
transformar completamente sus interacciones con los clientes y sus operaciones
empresariales.
Miami Heat aumenta las ventas de entradas en un
30 % y ahorra aproximadamente 1 millón de
dólares en operaciones
El baloncesto es mucho más que las habilidades de los jugadores. De la
experiencia compartida de visualización y participación en deportes surge un
sentimiento y una vinculación. Miami Heat quería comprender mejor a la familia
de clientes que entran en su estadio o interactúan con sus numerosas
plataformas en línea. Pero ¿cómo comprender realmente a un cliente cuando
hay tantos? Aquí es donde entran en juego las tecnologías de Microsoft,
Power BI es la principal entre ellas.
Vea este videotutorial:
Mediante el análisis de los datos en Power BI, el equipo de operaciones de
Miami Heat ha podido aumentar los ingresos, pero también mejorar la
asignación de recursos mediante la predicción del comportamiento de los
clientes.
"Con Power BI y toda la plataforma de datos de Azure, podemos predecir la
asistencia a los 44 partidos de la temporada tan solo unas horas después de la
publicación del calendario", comenta Edson Crevecoeur, vicepresidente de
estrategia y análisis de datos de los Miami Heat. "En la pasada temporada,
conseguimos el 4 por ciento de las cifras reales de toda la temporada, dos
meses antes de que se hubiera jugado ningún partido. Esto nos coloca en una
mejor posición para identificar oportunidades, mitigar los riesgos y administrar
nuestros recursos de un modo más eficaz. En última instancia, ayuda a todas las
áreas de nuestra empresa a centrarse en mejorar la experiencia de los
aficionados".
Como los Miami Heat demuestran de forma eficaz, el uso de Power BI y otras
tecnologías de Microsoft puede conducir a beneficios significativos, no solo por
ingresos, sino también por la capacidad de los usuarios de la empresa de
adoptar decisiones beneficiosas.
Ahora que entiende cómo le puede ayudar Power BI a aprovechar los
datos para mejorar las operaciones y decisiones empresariales, veamos
cómo empezar a usarlo.
La primera tarea será conectarnos a los datos.
Para ello, hay que hacer clic en este botón de arriba, "Obtener
datos".
Puede conectarse a muchos orÃgenes de datos diferentes, pero hoy
usaremos uno de los más comunes: Excel.
Cuando haga clic en "Conectar", busque el archivo entre los archivos
locales y haga clic en "Abrir".
Podemos ver los datos en esta tabla. Cuando la seleccionemos,
aparecerá una vista previa de los datos y, después, podremos
cargarla.
Tras unos instantes, verá que los campos de datos aparecen bajo la
pestaña "Campos".
Esto significa que los datos se han cargado correctamente en el
sistema.
Crear objetos visuales en Power BI es simple y fácil.
Para empezar, haga clic en la visualización que quiera usar.
Hoy empezaremos con "Elementos influyentes clave", una visualización
muy avanzada.
Lo que hace es analizar un campo comparándolo con otros.
En este ejemplo, analizaremos los beneficios.
Podemos hacer clic en "Beneficios" o arrastrarlo a la categorÃa
correcta.
La visualización nos pide que agreguemos campos en "Explicar por".
En este caso, volcaremos muchos campos diferentes en "Explicar por".
Hay que destacar que "Elementos influyentes clave" es un objeto visual
muy inteligente.
Si algo no explica un aumento o una disminución en el factor de
análisis, "Beneficios", omitirá esos datos.
Expandamos el objeto visual para ver qué sucede.
Como puede ver, el objeto visual nos indica qué influye en el aumento
de los beneficios.
Parece que el factor más influyente son las ventas, lo que tiene
sentido.
Puede ver que "Elementos influyentes clave" elige automáticamente el
gráfico que muestra mejor los datos.
En algunos casos es un gráfico de dispersión y, en otros, uno de
columnas.
"Elementos influyentes clave" no solo indica qué influye en el
aumento de los beneficios, sino que puede cambiar a la disminución
para ver factores alternativos.
Otra ventaja de este objeto visual es la sección "Segmentos
principales", que desglosa los datos en varios segmentos.
Puede ver en este segmento que las ventas son menores o iguales que
cierta cantidad. También se indican los descuentos y el precio de
venta.
Cuando desglose este segmento, le mostrará un análisis especÃfico
solo de esta porción de datos.
Puede ser útil si se dirige a clientes especÃficos o si quiere
entender en qué se diferencian los segmentos de datos.
Ahora que entiende cómo se crean e interpretan los objetos visuales,
vamos a crear uno con el que estemos más familiarizados: un gráfico
de columnas.
De nuevo, basta con hacer clic en el objeto visual que queremos
mostrar y en los campos que nos interesa que incluya.
En este caso, mostraremos el producto con el precio de fabricación,
el precio de venta y los beneficios.
Los beneficios se muestran automáticamente en valores de columna,
pero recuerde que podemos arrastrar y colocar los campos donde
queramos.
Ahora tenemos una bonita visualización nueva.
Conviene saber algo más antes de publicar el informe.
Hay un marketplace de objetos visuales.
Puede importar o eliminar un objeto visual personalizado o ver el
marketplace.
Si no ve un objeto visual en el panel de visualización, este es un
buen lugar para buscar, por ejemplo, un diagrama de Gantt.
Como puede ver, los objetos visuales están valorados y es muy fácil
agregarlos al informe.
Nos hemos centrado en la creación de objetos visuales, pero se puede
hacer mucho más en Power BI Desktop.
Si va a la sección de datos, puede agregar columnas y cambiarles el
nombre, asà como calcular columnas y realizar otras acciones para dar
forma a los datos.
Además, en el panel de relaciones, si tiene varios orÃgenes de datos,
puede apuntar a sus relaciones.
Esto puede ser muy útil sobre todo si los datos proceden de más de
un tipo de origen, como Excel, SharePoint o SQL.
Es importante tener en cuenta que los cambios que haga al dar forma a
los datos o buscar relaciones en Power BI no afectan al origen de
datos subyacente y solo se reflejan en estos resultados.
Cuando esté satisfecho con el informe y haya guardado los cambios, es
el momento de publicarlo.
Puede publicarlo en un área de trabajo existente o crear una.
En este caso, lo publicaremos en una existente.
Cuando se haya publicado correctamente, puede abrirlo en el servicio
en lÃnea de Power BI. Vamos a hacerlo.
AquÃ, puede ver que los objetos visuales del informe se han cargado en
el servicio en lÃnea de Power BI.
Para crear un panel, solo tiene que presionar esta chincheta y crear
un panel o anclarlo a uno existente.
El servicio Power BI le ofrecerá la opción de ir al panel o crear
una vista de teléfono.
Cuando haya visitado el panel y tenga varios objetos visuales,
encontrará aquà muchas opciones, incluida la de colaborar agregando
comentarios.
Incluso puede iniciar una conversación si menciona a otras personas
con el sÃmbolo "@".
Compartir el panel es tan fácil como hacer clic en este botón e
indicar con quiénes quiere compartirlo, o enviarles el enlace que
aparece aquà abajo.
Power BI también puede analizar los datos automáticamente.
Si va al conjunto de datos, haga clic en "Más opciones" y en "Ver
conclusiones".
Aquà puede ver que Power BI ha analizado un subconjunto de los datos
y ha creado todos estos objetos visuales para ofrecer más
información.
Y lo mejor es que puede anclarlos directamente al panel.
Ahora que conoce un poco mejor Power BI, ya puede empezar a trabajar
con
Caso práctico
Más información sobre el caso práctico de Miami Heat
Más información sobre Power BI
Documentación de Power BI
Filtrar datos con Power BI
Completado100 XP
15 minutos
Los datos constituyen el núcleo de Power BI. A medida que explora los informes,
cada objeto visual obtiene sus datos subyacentes de fuentes que a menudo
contienen muchos más datos de los que necesita. Power BI ofrece varias
maneras de filtrar y resaltar informes. Saber cómo filtrar los datos es clave para
buscar la información adecuada.
Nota
El filtrado solo se aplica a los informes, no a los paneles.
Nota
Al filtrar un objeto visual, como un gráfico de barras, simplemente está
cambiando la vista de los datos de ese objeto visual. No está modificando los
datos de origen de manera alguna.
Segmentación de datos
Un tipo sencillo de filtrado que puede usar directamente en la página del
informe es la segmentación. La segmentación de datos proporciona
indicaciones sobre las formas en que puede filtrar los resultados en los objetos
visuales de una página de informe. Hay varios tipos diferentes de
segmentaciones de datos: números, categorías y fechas. La segmentación de
datos facilita el filtrado de todos los objetos visuales de la página a la vez.
Si desea seleccionar más de un campo, mantenga presionada la tecla Ctrl y haga
clic en los campos adicionales.
Explorar el panel Filtros
Otra manera de filtrar los datos consiste en abrir y modificar los filtros en el
panel Filtros. El panel Filtros contiene filtros que se agregaron al informe por el
diseñador de informes. Como consumidor, puede interactuar con los filtros y
guardar los cambios, pero no puede agregar nuevos filtros.
Los cuatro tipos de filtros son:
Informe: se aplica a todas las páginas del informe.
Página: se aplica a todos los objetos visuales en la página del informe
actual.
Objeto visual: se aplica a un solo objeto visual en una página del informe.
Solo verá los filtros a nivel de objeto visual si ha seleccionado un objeto
visual en el lienzo del informe.
Obtención de detalles: permite explorar sucesivamente vistas más
detalladas de las vistas dentro de un solo objeto visual.
Por ejemplo, en la siguiente captura de pantalla, el diseñador agregó tres filtros
de nivel de página: Segment, Year y Region. Observe que Year está
establecido actualmente para filtrar por el año 2014.
Puede aplicar filtros en el panel Filtros, o bien seleccionar datos directamente
en el informe para restringir por fecha, categoría, geografía, etc.
Nota
Puede explorar los datos modificando los filtros existentes. Los cambios que
realice se guardan para usted (no para otros) con el informe, incluso si abre el
informe en una aplicación móvil.
Cuando cierre el informe, los filtros se guardan. Para deshacer el filtrado y volver
a los valores predeterminados de filtrado, segmentación, obtención de detalles
y clasificación que ha establecido el autor del informe, seleccione Restablecer
valores predeterminados en la barra de menús superior.
Borrar un filtro
En el modo de filtrado básico o avanzado, seleccione el icono de borrador para
borrar el filtro. A medida que ajuste el filtro, la consulta de búsqueda se
actualiza para reflejar las opciones seleccionadas.
Modo avanzado
La activación de las casillas para aplicar filtros simples es eficaz, pero a veces es
necesario aplicar un filtro basado en un intervalo dinámico. Es posible que
quiera filtrar entre dos fechas, por ejemplo, desde el 1 de mayo de 2018 al 31 de
julio de 2018. Puede filtrar dentro de un valor numérico determinado, por
ejemplo, las ventas entre 10 000 y 50 000 dólares. En estas situaciones, se
necesita el modo avanzado.
Si los valores son continuos (no discretos) o representan un intervalo, puede
seleccionar el nombre del campo para abrir el modo de filtro avanzado. Utilice
le menú desplegable y los cuadros de texto para especificar un intervalo de
valores que desee ver.
Si los valores de campo representan una fecha u hora, puede especificar una
hora inicial y final al usar los filtros de fecha y hora.
Cambiar el modo en que se ordena un gráfico en un informe
En un informe de Power BI, puede ordenar la mayoría de los objetos visuales
alfabéticamente o por valores numéricos de cada categoría. Por ejemplo, el
siguiente gráfico se ordena por la categoría Store name (Nombre de tienda).
Es sencillo cambiar el criterio de ordenación de una categoría (por ejemplo,
nombre de almacén) a un valor (por ejemplo, ventas por pies cuadrados). En
este ejemplo, tendría que seleccionar el botón de puntos suspensivos (…) y
elegir Ordenar por > Sales Per Sq Ft (Ventas por pies cuadrados). Si lo desea,
puede volver a seleccionar los puntos suspensivos y elegir Orden descendente.
Nota
No todos los objetos visuales se pueden ordenar. Por ejemplo, los siguientes
objetos visuales no se pueden ordenar: gráfico de rectángulos, mapa, mapa
coroplético, dispersión, medidor, tarjeta, tarjeta de varias filas y cascada.
Guardar los cambios del criterio de ordenación
Los informes de Power BI conservan los filtros, las segmentaciones, la
ordenación y otros cambios en la vista de datos que realice. Cuando cierra un
informe y más adelante vuelve a él, los cambios se habrán guardado. Si desea
revertir los cambios realizados en la configuración del diseñador de informes,
seleccione Restablecer valores predeterminados en la barra de menús
superior.
Exploración en profundidad de un objeto visual
Cuando un objeto visual tiene una jerarquía, puede profundizar para mostrar
detalles adicionales. Por ejemplo, podría tener un objeto visual que examina el
número de medallas olímpicas mediante una jerarquía formada por deporte,
disciplina y evento.
En este ejemplo, puede seleccionar el elemento Deportes acuáticos para ver
datos de natación, trampolín y waterpolo. Seleccione el elemento de salto para
ver los detalles de eventos de trampolín, plataforma y salto sincronizado.
Si no está seguro de qué objetos visuales de Power BI contienen una jerarquía,
mantenga el cursor sobre un objeto visual. Si ve los siguientes controles de
exploración en profundidad en la esquina superior, el objeto visual tiene una
jerarquía.
Las fechas son un tipo único de jerarquía. Cuando el diseñador de informes
agrega un campo de fecha a un objeto visual, Power BI agrega
automáticamente una jerarquía de tiempo que contiene el año, el trimestre, el
mes y el día.
Usar marcadores para compartir información
detallada y crear historias
Puede interactuar con filtros y guardar solo los cambios para usted. Sin
embargo, en ocasiones es posible que desee compartir determinadas vistas
filtradas con su equipo. En esos casos, puede crear marcadores de informe.
El uso de marcadores en Power BI le ayuda a capturar la vista configurada
actualmente de una página del informe, incluidos los filtros y el estado de los
objetos visuales. Más adelante puede volver a ese estado simplemente
seleccionando el marcador guardado.
Para ver los marcadores de informes en acción, vaya a cualquier informe de
Power BI para el que tenga acceso de vista o edición y seleccione el menú
desplegable Marcadores en la barra de acción.
Crear marcadores
Cuando haya seleccionado el informe y la vista que desee, expanda el menú
desplegable Marcadores y seleccione Agregar marcador personal. De forma
predeterminada, Power BI le sugerirá un nombre genérico para el marcador.
Puede escribir su propio nombre y seleccionar Guardar.
Después de crear un marcador, para mostrarlo, seleccione su nombre en la lista
desplegable. Tenga en cuenta que la ruta de navegación para el informe ahora
contendrá el marcador que está viendo actualmente.
Nota
Podrá crear un máximo de 20 marcadores por informe.
Abrir y ver los marcadores
A veces, el diseñador de informes incluirá marcadores como parte del informe.
Para ver un marcador personal o un marcador de informe, seleccione el icono
de marcador y seleccione lo que quiera. Los iconos de marcador se muestran en
el panel Marcador que puede abrir mediante la selección de Marcadores >
Mostrar más marcadores.
Siguiente unidad: Consulta de los datos
Consulta de los datos
Completado100 XP
5 minutos
Los objetos visuales se crean por los diseñadores de informes y paneles y, a
continuación, se comparten con los consumidores. Como consumidor, puede
elegir mostrar, exportar y analizar los datos que se usaron para crear cada
objeto visual.
Mostrar datos
Los objetos visuales de Power BI se crean a partir de datos que puede ver. Al
activar Mostrar datos, Power BI muestra los datos debajo del objeto visual.
En Power BI, puede abrir un informe y seleccionar un objeto visual. Para mostrar
los datos que se usaron para crear el objeto visual, seleccione la opción Más
opciones (...) correspondiente al objeto visual y Mostrar como tabla.
Exportación de datos a Excel
En ocasiones, es posible que desee utilizar Excel para ver e interactuar con datos
de Power BI. La característica Analizar en Excel le permite hacerlo. Con esta
opción también le puede tener acceso a las características de tabla dinámica,
gráfico de datos y segmentación en Excel en función del conjunto de datos que
existe en Power BI.
Al seleccionar Analizar en Excel, Power BI crea un archivo de conexión de datos
de Office (.odc) y lo descarga del explorador al equipo.
Nota
Los datos exportados en Excel son su propia copia de los datos y no se
actualizarán automáticamente si se actualizan los datos originales.
Analizar datos en Excel
Al abrir el archivo en Excel, aparece una lista de Tabla
dinámica y Campos vacía con las tablas, los campos y las medidas del conjunto
de datos de Power BI. Puede crear tablas dinámicas y gráficos, así como analizar
ese conjunto de datos, como lo haría con un conjunto de datos local en Excel.
Nota
Si desea ver los datos que se usaron para crear un objeto visual, puede exportar
esos datos a Excel como un archivo .xlsx o. csv.
Siguiente unidad
Realizar preguntas de los datos
Completado100 XP
5 minutos
A veces, la manera más rápida de obtener respuestas sobre los datos es
formular preguntas en la característica Preguntas y respuestas de Power BI.
Nota
Aunque Preguntas y respuestas de Power BI solo puede actualmente responder
consultas formuladas en inglés, existe una versión preliminar para español que
su administrador de Power BI puede habilitar.
Exploración de Preguntas y respuestas
Puede usar Preguntas y respuestas para explorar los datos mediante
funcionalidades intuitivas de lenguaje natural de Power BI y obtener respuestas
en forma de gráficos.
Hacer una pregunta
Formule una pregunta sobre sus datos en Preguntas y respuestas con un
lenguaje natural. Por lenguaje natural nos referimos al lenguaje normal que los
seres humanos usan para comunicarse entre sí cada día. Por ejemplo: "¿Cuál es
el total de unidades por región?"
Preguntas y respuestas está disponible en paneles e informes de Power BI. Para
abrir la pantalla de Preguntas y respuestas, vaya al panel y coloque el cursor en
el cuadro de pregunta.
Si las etiquetas del eje y los valores de los objetos visuales incluyen las
palabras ventas, cuenta, mes y oportunidades, puede formular preguntas que
utilicen esos valores. Por ejemplo, "Qué cuenta tiene la mayor oportunidad" o
"Mostrar las ventas por mes como un gráfico de barras".
En el lateral de la pantalla se proporcionan otros elementos útiles. Para cada
conjunto de datos, Preguntas y respuestas muestra las palabras clave y, en
ocasiones, algunas sugerencias o ejemplos de preguntas. Seleccione cualquier
elemento para agregarlo al cuadro de pregunta.
Otra forma en que Preguntas y Respuestas le ayuda a formular preguntas es
mediante indicaciones, la característica de autocompletar y pistas visuales.
Objetos visuales de Preguntas y respuestas
Preguntas y respuestas escoge el mejor objeto visual en función de los datos
que se muestran. Por ejemplo, los números podrían mostrarse como un gráfico
de líneas, mientras que las ciudades es más probable que se muestren como un
mapa.
También puede indicar a Preguntas y respuestas qué objeto visual se debe usar
si lo agrega a su pregunta. Preguntas y respuestas le pedirá confirmación acerca
de una lista de tipos de objetos visuales factibles. En el ejemplo anterior, podría
preguntar, ""¿Cuál es el total de unidades por región en un gráfico circular?"
Palabras y terminología que Preguntas y respuestas reconoce
La mejor manera de determinar si Power BI reconoce una palabra clave es
escribiéndola en el cuadro de pregunta. Si la palabra o término aparece
atenuado, Power BI no lo reconoce. Las palabras clave en la siguiente tabla usan
el singular y el presente, pero reconocen todos los tiempos verbales y
pluralidades.
Para obtener información más detallada, consulte Sugerencias para hacer
preguntas con Preguntas y respuestas de Power BI
Categoría Palabras clave
Agregados total, suma, cantidad, número, recuento, promedio, máximo, mínimo, menor, más grande, más
máximo, máx., mayor, menor, más pequeño, mínimo, mín
Comparaciones vs, frente a, en comparación con
Fechas Power BI reconoce la mayoría de los términos de fecha (día, semana, mes, año, trimestre, décad
Fechas relativas hoy, ahora, hora actual, ayer, mañana, actual, después, las próximas, último, anterior, hace, ante
tardar, de, en, desde ahora, después de ahora, en el futuro, pasado, último, anterior, sobre, hace
una vez, dos veces. Ejemplo: número de pedidos en los seis últimos días.
Comandos de ordenado, ordenar por, dirección, agrupar, agrupar por, de, mostrar, enumerar, darme, nombre
consulta comparar, con, por orden alfabético, ascendente, descendente, orden
Intervalo mayor, más, más grande, superior, sobre, >, menos, más pequeño, menor, bajo, <, al menos, no
máximo, no más de, <=, en, entre, en el intervalo de, desde, más adelante, anteriormente, antes
Categoría Palabras clave
después, desde, a partir de, terminando con
Horas a. m., p. m., en punto, mediodía, medianoche, hora, minuto, segundo, hh:mm:ss. Ejemplos: 10 p
p. m., 10 en punto, mediodía, medianoche, hora, minuto, segundo.
Preguntas y respuestas le ayuda a formular la pregunta
Preguntas y respuestas hace todo lo posible para comprender y responder a la
pregunta de esta manera:
Completa automáticamente palabras y preguntas. Usa diversas
estrategias, como el completado automático de palabras reconocidas y
preguntas utilizadas anteriormente que devolvieron respuestas válidas. Si
hay más de una opción para el completado automático, aparecerán en
una lista desplegable.
Corrige la ortografía.
Proporciona una vista previa de la respuesta en forma de un objeto visual.
El objeto visual se actualiza a medida que escribe y modifica la pregunta
(no espera a que presione Entrar).
Sugiere términos de reemplazo de los conjuntos de datos subyacentes
cuando mueve el cursor en el cuadro de pregunta.
Redefine la pregunta en función de los datos de los conjuntos de datos
subyacentes. Preguntas y respuestas reemplaza las palabras usadas con
sinónimos de los conjuntos de datos subyacentes. Leyendo la redefinición,
sabrá si Preguntas y respuestas comprendió su pregunta o no.
Atenúa palabras que no entiende.
Siguiente unidad: Aplicar filtros a informes
Aplicar filtros a informes
Completado100 XP
25 minutos
Escenario
¡Enhorabuena! Le acaban de nombrar director de ventas de una empresa de
fabricación de ropa llamada Van Arsdel. Su primera tarea es analizar los datos
de ventas y marketing para detectar por qué hay una caída inesperada en las
ventas de junio.
Procedimiento
Adición de la aplicación de ejemplo de marketing y ventas
Nota
Si ya tiene la aplicación de Ejemplo de marketing y ventas instalada, vaya a la
sección siguiente.
1. Inicie sesión en [Link]
2. Seleccione la pestaña Aplicaciones situada a la izquierda.
3. Seleccione el botón Obtener aplicaciones.
4. Busque “Retail Analysis”.
5. Seleccione el vínculo "Obtener ahora" y espere a que la aplicación
se instale.
6. Cuando aparezca la indicación ¿Quiere instalar esta aplicación de
Power BI?, seleccione el botón Instalar.
7. En la pantalla Empezar a trabajar con la nueva aplicación,
seleccione el botón Explorar aplicación.
8. Seleccione la pestaña Aplicaciones a la izquierda y, a continuación,
seleccione el icono de la aplicación Ejemplo de marketing y
ventas.
9. La primera vez que inicie la aplicación, verá Empezar a trabajar con
la nueva aplicación.
10. Seleccione el botón Explorar aplicación para explorar el panel.
Aplicar un filtro a una página de informe
En esta sección, explorará dos preguntas:
¿Por qué nuestra empresa, VanArsdel, tuvo en junio resultados por debajo
de lo esperado?
¿Cuáles son nuestras mejores oportunidades de crecimiento?
1. En la aplicación Sales and Marketing sample, empiece por la
página del informe YTD Category; para ello, seleccione la
pestaña YTD Category en la parte izquierda de la pantalla.
2. Observe la anomalía del gráfico relativo a las unidades totales por
mes y fabricante.
3. Si aún no está abierto, abra el panel de filtros
seleccionando Filtros en el lado derecho del informe.
4. Power BI muestra todos los filtros que la diseñadora del informe
aplicó a ese objeto visual.
5. La diseñadora del informe filtró por Van Arsdel, nuestros tres
principales competidores y el año 2014. Es una buena idea, pero
filtró también por la región central, y lo que usted quiere ver son
todas las regiones. Desactive el filtro de región haciendo clic en el
icono de borrador en ese filtro.
6. Mueva el puntero sobre el gráfico de unidades totales del año
hasta la fecha por mes y fabricante y fíjese en los segmentos en
los que compite Van Arsdel. Observe que competimos
en moderación y comodidad.
7. Mantenga el puntero sobre nuestros competidores para ver los
segmentos en que compiten. ¿Detecta algún patrón?
8. Explore la misma pregunta solo para el mes de junio. Para aplicar
un filtro cruzado para esta página del informe de junio, en el objeto
visual del total de unidades por mes y fabricante, haga clic en la
etiqueta del 14 de junio. Observe que todos los objetos visuales de
esta página del informe se actualizan para junio.
9. Observe el resaltado cruzado del objeto visual del total de
unidades del año hasta la fecha por fabricante y región.
10. Mantenga el puntero sobre cada compañía para ver el patrón de
segmentos durante junio.
11. ¿Qué conclusiones obtiene sobre los dos segmentos con mejores
resultados en junio y por qué nuestras ventas totales disminuyen
durante ese tiempo?
12. Para explorar la misma pregunta de manera diferente: vaya al
informe de oportunidades de crecimiento seleccionando la
pestaña de oportunidades de crecimiento.
13. Mantenga el puntero sobre el objeto visual del gráfico de barras
del total de unidades por segmento y, a continuación, seleccione
el icono "Rastrear agrupando datos" (flecha arriba) para ver el "total
de unidades por fabricante".
14. Desactive los filtros isVanArsdel y Segmento haciendo clic en los
iconos de borrador. Esto nos permitirá ver todas las empresas y los
segmentos. Observe que el Van Arsdel es el fabricante líder a nivel
global.
15. Aplique un filtro cruzado para junio para el total de unidades y
total de unidades por 12 meses consecutivos por
mes seleccionando la fecha de 14 de junio. Una vez más, observe
el rendimiento de Van Arsdel en junio.
16. Explore en profundidad para ver los segmentos de junio haciendo
clic en el icono "Haga clic para activar Explorar en profundidad" y
luego en el icono "Ir al siguiente nivel de la jerarquía".
17. Una vez más, ¿cuáles son los segmentos con mejor rendimiento en
junio?
18. ¿Por qué las ventas de Van Arsdel no ofrecen en junio los
resultados esperados? ¿Qué podemos hacer para competir mejor?
Siguiente unidad: Comprobación de
conocimientos
Introducción
Completado100 XP
2 minutos
La eficacia predictiva del aprendizaje automático se debe a que está formado
por datos. Para crear modelos eficaces, es importante que entienda los datos
con los que trabaja.
Aquí se analiza cómo pueden clasificarse, almacenarse e interpretarse los datos,
tanto por las personas como por los equipos. Se analiza qué hace que un
conjunto de datos sea adecuado y cómo corregir problemas de los datos con
los que contamos. También se explorarán datos nuevos y se mostrará cómo
reflexionar en mayor detalle sobre un conjunto de datos puede ayudar a crear
modelos más predictivos.
Escenario: el último viaje del Titanic
Como entusiasta arqueólogo marino que es, tiene un interés inusual en los
desastres marítimos. Una noche, mientras repasa imágenes de huesos de
ballenas y pergaminos antiguos sobre Atlantis, se encuentra con un conjuntos
de datos público con una lista de las personas de las que se sabe que estaban
en el Titanic en su primer (y último) viaje. Cautivado por el contrapunto entre el
destino y la casualidad, reflexiona: ¿qué factores dictaron que una persona
sobreviviera a este famoso naufragio? Los datos de este período no son nada
exhaustivos: se desconoce gran cantidad de información de ciertos pasajeros.
Deberá buscar formas de remendar estos datos antes de realizar un análisis
completo.
Requisitos previos
Estar familiarizado con los conceptos del aprendizaje automático
(como los modelos y el costo) resulta útil, pero no es fundamental.
Objetivos de aprendizaje
En este módulo, aprenderá a:
Visualización de conjuntos de datos grandes con análisis
exploratorio de los datos (EDA)
Limpiar un conjunto de datos de errores
Predecir valores desconocidos mediante datos numéricos y
categóricos
Datos correctos e incorrectos y datos
que faltan
Completado100 XP
3 minutos
La eficacia predictiva del aprendizaje automático se debe a que está formado
por datos. Un efecto colateral es que los modelos entrenados solo en
cantidades pequeñas de datos no suelen funcionar bien en el mundo real. Esto
se debe a que las cantidades pequeñas de datos no suelen ser buenas
representaciones del mundo real. Por ejemplo, si seleccionáramos
aleatoriamente cuatro personas en todo el mundo, estas no serían muy
representativas de una persona típica de la Tierra. Por el contrario, si
seleccionamos mil millones de personas, los datos obtenidos serían
probablemente bastante representativos.
Pero no todo se trata de la cantidad. Puede ser igualmente importante que los
datos:
No solo aparezcan en cantidad, sino que sean representativos
No contengan errores
No carezcan de información clave
Aquí trataremos estos temas antes de pasar a un ejercicio práctico en el que
trabajaremos con nuestro conjunto de datos del Titanic.
¿Qué significa "representativo"?
Los creadores de estadísticas se basan en dos conceptos clave: las poblaciones y
las muestras, que nos ayudan a reflexionar acerca de si los datos que tenemos
son aquellos que queremos.
Una población es aquello que nos interesa o, de otra forma, todos los puntos de
datos imaginables. Para nuestro escenario del Titanic, nos interesa saber qué
factores llevaron a que algunas personas sobrevivieran, incluidos los polizones
no registrados en las listas oficiales. Como ejemplo alternativo, si investigamos
la relación entre los rasgos de la personalidad y la probabilidad de hundir un
barco, nuestra población serían todos los capitanes de barco que hayan
existido.
Una muestra hace referencia a los datos que tenemos disponibles (un
subconjunto de la población). Para nuestro conjunto de datos del Titanic, esta
muestra solo serán las personas que aparecen en la lista oficial de pasajeros.
Para nuestro ejemplo alternativo, la muestra podrían ser todos los capitanes de
barco a los que podamos convencer para hacerse una prueba de personalidad
en nuestro puerto local.
Es importante pensar si la muestra es representativa ("semejante") respecto a la
población. En el ejemplo del Titanic, la muestra es tan grande que
probablemente sea muy útil. Por el contrario, para nuestro ejemplo alternativo,
hablar solo con los capitanes de barco del puerto local probablemente no sea
una sección representativa de los tipos de marineros que existen en todo el
mundo. El uso de datos de nuestro puerto local podría crear un modelo que
funcione bien para los capitanes locales, pero que no sea muy útil en relación
con los capitanes de otros países.
¿Qué es un error de datos?
Los errores de datos significan simplemente que los datos son incorrectos. Si es
así, pueden distorsionar un modelo de forma que se realicen predicciones
incorrectas continuamente. En resumen, si se introducen datos incorrectos, se
obtendrán predicciones erróneas.
Los errores de los datos son un hecho real y proceden en gran parte de dos
orígenes:
Los errores de medición significan que, cuando se recopilaron los datos, se
midieron mal. Estos errores suelen ser sutiles y difíciles o imposibles de eliminar.
Los errores de entrada de datos significan que los datos se recopilaron
correctamente, pero se escribieron de forma incorrecta en una hoja de cálculo o
similar. A veces este tipo de errores es más fácil de detectar que los errores de
medición. Por ejemplo, puede que al medir la altura de una persona
concluyamos que mide 1,8 metros de alto, pero que se nos escape la posición
decimal y escribamos 18 m, lo cual es fácil de detectar, porque una persona del
tamaño de un árbol no es un dato realista.
¿Qué son los datos completos?
En un conjunto de datos que está completo no faltan datos. Pueden faltar datos
de dos formas. Supongamos que anotamos la altura y el peso de Dylan, Reece y
Tom:
Nombre Altura (m) Peso (kg)
Dylan 1.8 75
Reece 82
Los datos están incompletos porque falta una muestra: faltan todos los datos de
Tom y también falta la altura de Reece.
Lo ideal es trabajar siempre con datos completos, pero esto no es siempre
posible. Cuando tenemos datos incompletos, podemos:
Elegir un modelo que pueda funcionar con datos incompletos, o
bien
Quitar las muestras (filas) que tengan datos incompletos y trabajar
con lo que nos quede, o bien
Agregar de forma asistida los valores que faltan con sustitutos
razonables.
En la mayoría de las circunstancias, es mejor elegir un modelo que pueda
controlar los datos que faltan, aunque no siempre es posible. La eliminación de
datos es la solución más fácil y suele ser válida, aunque debemos tener cuidado
de que esto no haga que la muestra deje de ser representativa de una
población. La adición de datos de forma asistida suele ser el último recurso.
En la unidad siguiente trabajaremos con el conjunto de datos del Titanic, donde
identificaremos los datos incompletos y los remediaremos.
Siguiente unidad: Ejercicio: visualizar los datos
que faltan
Ejercicio: visualizar los datos que
faltan
Completado100 XP
8 minutos
Este módulo requiere un espacio aislado para completarse.
Un espacio aislado le da acceso a recursos gratuitos. No se le cobrará en su
suscripción personal. El espacio aislado solo podrá usarse para completar el
aprendizaje en Microsoft Learn. El uso para cualquier otro motivo está prohibido
y podría generar la pérdida permanente del acceso al espacio aislado.
Microsoft ofrece esta experiencia de laboratorio y el contenido relacionado con
fines educativos. Toda la información presentada es propiedad de Microsoft y
está destinada únicamente a brindar información sobre los productos y servicios
abordados en este módulo de Microsoft Learn.
Activar espacio aislado
Las sugerencias de enlaces de teclado de la barra de herramientas están ahora ocultas
RuntimeArchivoEditarVista
Ejecutar todo
Kernel
Proceso no conectado
Exercise: Titanic Dataset - Find and Visualize
Missing Data
Datasets can often have missing data, which can cause problems when we
perform machine learning. Missing data can be hard to spot at a first glance.
In our scenario, we obtained a list of passengers on the failed maiden voyage of
the Titanic. We'd like to know which factors predicted passenger survival. For
our first task, which we'll perform here, we'll check whether our dataset has
missing information.
CódigoMarkdown
The required 'graphing' library package
This tutorial relies on the 'graphing' library package resource. Depending on the
environment you use to execute the code in this notebook, you might need to
install that package to proceed. To install the 'graphing' package, uncomment
and execute this notebook cell code:
[ ]
# %pip install graphing
Presione Mayús + Entrar para ejecutar
Preparing data
Let's use Pandas to load the dataset and take a cursory look at it:
[ ]
import pandas as pd
!pip install missingno
# Load data from our dataset file into a pandas dataframe
!wget [Link]
to-machine-learning/main/Data/[Link]
!wget [Link]
to-machine-learning/main/[Link]
dataset = pd.read_csv('[Link]', index_col=False, sep=",", header=0)
# Let's take a look at the data
[Link]()
Presione Mayús + Entrar para ejecutar
Now, we'll see how many samples and columns we have:
[ ]
# Shape tells us how many rows and columns we have
print([Link])
Presione Mayús + Entrar para ejecutar
We have data for 891 passengers, each described by 12 different variables.
Finding Missing Data
Do we have a complete dataset?
No. We know from history that there were more than 2000 people on the
Titanic, so we know straight away that we are missing information on more than
1000 people!
How can we tell if the data we have available is complete?
We could print the entire dataset, but this could involve human error, and it
would become impractical with this many samples.
A better option would use pandas to report the columns that have "empty"
cells:
[ ]
# Calculate the number of empty cells in each column
# The following line consists of three commands. Try
# to think about how they work together to calculate
# the number of missing entries per column
missing_data = [Link]().sum().to_frame()
# Rename column holding the sums
missing_data = missing_data.rename(columns={0:'Empty Cells'})
# Print the results
print(missing_data)
Presione Mayús + Entrar para ejecutar
It looks like we don't know the age of 177 passengers, and we don't know if two
of them even embarked.
Cabin information for a whopping 687 persons is also missing.
Missing Data Visualizations
Sometimes it can help if we can see if the missing data form some kind of
pattern.
We can plot the absence of data in a few ways. One of the most helpful is to
literally plot gaps in the dataset:
[ ]
# import missingno package
import missingno as msno
# Plot a matrix chart, set chart and font size
[Link](dataset, figsize=(10,5), fontsize=11)
Presione Mayús + Entrar para ejecutar
The white bars in the graph show missing data. Here, the patterns aren't visually
clear, but maybe many passengers with missing Age information are also
missing Cabin information.
Identifying Individual Passengers with Missing Information.
Let's use pandas to get a list of passengers of unknown age:
[ ]
# Select Passengers with unknown age
# Notice how we use .isnull() rows with no value
unknown_age = dataset[dataset["Age"].isnull()]
# Print only the columns we want for the moment (to better fit the scr
een)
# limit output to 20 rows
unknown_age[["PassengerId","Name", "Survived", "Age"]][:20]
Presione Mayús + Entrar para ejecutar
This technique lists the passengers with missing Cabin or Embarked information
as well. Let's combine these using an AND, to see how many passengers are
missing both Cabin and Age information
[ ]
# Find those passengers with missing age or cabin information
missing_age = dataset["Age"].isnull()
missing_cabin = dataset["Cabin"].isnull()
# Find those passengers missing both
unknown_age_and_cabin = dataset[missing_age & missing_cabin]
print("Number of passengers missing age and cabin information:", len(unknown_
age_and_cabin))
Presione Mayús + Entrar para ejecutar
Our suspicions were correct - most passengers missing age information are also
missing cabin information.
Normally, from here, we would want to know why we have this issue. A good
hypothesis is that information was not collected carefully enough for the
passengers who used the cheap tickets.
Let's plot a histogram of ticket classes, and another of just people missing
information.
[ ]
import graphing
# The 'graphing' library is custom code we use to make graphs
# quickly. If you don't run this notebook in the sandbox
# environment, you might need to formally install this library
# in the environment you use. See the first cell of this notebook
# for more information about installation of the 'graphing'
# library.
#
# To review the 'graphing' library in detail, find it in our
# GitHub repository
[Link](dataset, 'Pclass', title='Ticket Class (All Passengers)',
show=True)
[Link](unknown_age_and_cabin, 'Pclass', title='Ticket Class (Pass
engers Missing Cabin and Age Information)')
Presione Mayús + Entrar para ejecutar
It seems that those passengers with missing information typically used the
cheaper tickets. These sorts of biases might cause problems in real-world
analyses.
Missing as Zero
Additionally, some datasets may have missing values that appear as zero. While
the Titanic dataset doesn't have this problem, let's see how that would work
here.
[ ]
import numpy as np
# Print out the average age of passengers for whom we have age data
mean_age = [Link]([Link])
print("The average age on the ship was", mean_age, "years old")
# Now, make another model where missing ages contained a '0'
dataset['Age_2'] = dataset['Age'].fillna(0)
mean_age = [Link](dataset.Age_2)
print("The average age on the ship was", mean_age, "years old")
Presione Mayús + Entrar para ejecutar
What happened here? Our analyses have considered the values of 0 to not be
'missing' but rather to be actual ages.
This shows that it can be important to time the review of your raw data before
you run the analyses. Another fast way to get a feel for a dataset is to graph its
distribution:
[ ]
[Link](dataset, label_x="Age_2")
Presione Mayús + Entrar para ejecutar
Here, we see an unlikely number of very young children. This would be cause for
further inspection of the data, to hopefully spot the fact that the missing ages
appear as zeros.
Handling Missing Data
There are many ways to address missing data, each with pros and cons.
Let's take a look at the less complex options:
Option 1: Delete data with missing rows
When we have a model that cannot handle missing data, the most prudent
thing to do is to remove rows that have information missing.
Let's remove some data from the Embarked column, which only has two rows
with missing data.
[ ]
# Create a "clean" dataset, where we cumulatively fix missing values
# Start by removing rows ONLY where "Embarked" has no values
print(f"The original size of our dataset was", [Link])
clean_dataset = [Link](subset=["Embarked"])
clean_dataset = clean_dataset.reindex()
# How many rows do we have now?
print("The shape for the clean dataset is", clean_dataset.shape)
Presione Mayús + Entrar para ejecutar
We can see that this removed the offending two rows from our new, clean
dataset.
Option 2: Replace empty values with the mean or median for that data.
Sometimes, our model cannot handle missing values, and we also cannot afford
to remove too much data. In this case, we can sometimes fill in missing data
with an average calculated on the basis of the rest of the dataset. Note that
imputing data like this can affect model performance in a negative way. Usually,
it's better to simply remove missing data, or to use a model designed to handle
missing values.
Below, we impute data for the Age field. We use the mean Age from the
remaining rows, given that >80% of these aren't empty:
[ ]
# Calculate the mean value for the Age column
mean_age = clean_dataset["Age"].mean()
print("The mean age is", mean_age)
# Replace empty values in "Age" with the mean calculated above
clean_dataset["Age"].fillna(mean_age, inplace=True)
# Let's see what the clean dataset looks like now
print(clean_dataset.isnull().sum().to_frame().rename(columns={0:'Empty Cells'
}))
Presione Mayús + Entrar para ejecutar
The Age field has no longer has empty cells anymore.
Option 3: Assign a new category to unknown categorical data
The Cabin field is a categorical field, because the Titanic cabins have a finite
number of possible options. Unfortunately, many records have no cabin listed.
For this exercise, it makes perfect sense to create an Unknown category, and
assign it to the cases where the cabin is unknown:
[ ]
# Assign unknown to records where "Cabin" is empty
clean_dataset["Cabin"].fillna("Unknown", inplace=True)
# Let's see what the clean dataset looks like now
print(clean_dataset.isnull().sum().to_frame().rename(columns={0:'Empty Cells'
}))
Presione Mayús + Entrar para ejecutar
That's it! No more missing data!
We only lost two records (where Embarked was empty).
That said, we had to make some approximations to fill the missing gaps for
the Age and Cabin columns, and those will certainly influence the performance
of any model we train on this data.
Summary
Missing values can affect the way a Machine Learning model works in a negative
way. It's important to quickly verify the existence of data gaps, and the locations
of those gaps.
You can now get a "big picture" of what is missing, and select only those items
that you must address, by the use of lists and charts.
In this exercise, we practiced:
Finding and visualization of missing dataset values, using
the pandas and missingno packages.
Checking whether a dataset uses the value '0' to represent missing values.
Handling missing data in three ways: removing of rows that contain missing
values, replacment of the missing values with the mean or median of that
particular feature, and creation of a new Unknown category, if dealing with
categorical data.
Sin proceso
Proceso no conectado
Visualización
Kernel no conectado
Siguiente unidad: Examinar distintos tipos de
datos
Examinar distintos tipos de datos
Completado100 XP
4 minutos
"Datos" es simplemente otra palabra para expresar "información recopilada".
Existe gran cantidad de información de cualquier tipo, ya sea sobre los
pasajeros del Titanic o el color favorito de su peluquera, entre otros.
También hay muchas formas de clasificar los datos. Para trabajar en el
aprendizaje automático, debemos comprender el tipo de datos y cómo se
almacenan digitalmente.
Datos continuos, ordinales y categóricos
En ocasiones, al trabajar con datos, es necesario saber qué clase de cosas
representan. Esto nos puede ayudar a elegir el modelo de aprendizaje
automático adecuado o a organizar los datos de maneras concretas.
Los datos continuos son números que se pueden incrementar o reducir en una
cantidad cualquiera. Por ejemplo, puede agregar 1 mm a 1 m, lo que da como
resultado 1001 m.
Los datos categóricos son datos que no se enmarcan en ningún espectro. En
nuestro escenario, las personas que viajaban en el Titanic se clasificaron como
"personal" o "pasajeros". Los datos categóricos no se pueden almacenar como
números de forma obvia.
Los datos ordinales son datos categóricos que tienen un orden, por lo que
pueden almacenarse como números. Por ejemplo, grande, mediano y pequeño
son datos ordinales porque se pueden clasificar como grande > mediano >
pequeño. Por el contrario, "manzana", "naranja" y "coco" son datos categóricos
porque no se pueden clasificar. Los datos ordinales también pueden hacer
referencia a números que se pueden incrementar o reducir, pero solo por
cantidades establecidas. Por ejemplo, el número de personas que se sube a un
barco es seguro un número entero; no se puede medio-embarcar.
Los identificadores son una clase especial de datos categóricos donde cada
muestra tiene su propio identificador. Por ejemplo, en nuestro conjunto de
datos, cada una de las personas que viajaba en el Titanic tiene su identificador
propio, aunque tenga el mismo nombre que otro. Las identidades son útiles
para ayudarnos a orientarnos en un conjunto de datos, pero no son datos que
analicemos por sí mismos.
Tipos de datos
Todos los datos que usamos para el aprendizaje automático deben poder
almacenarse en un equipo que, además, pueda procesarlos. Al igual que para
anotar prácticamente cualquier dato que queramos en un trozo de papel
podemos usar un lápiz, los equipos almacenan información como series de
números 0 y 1. Esto significa que la forma de usar la información es mucho más
restringida.
Tipo de datos hace referencia al tipo de datos que se almacena en un equipo.
Los tipos de datos básicos comunes son:
Enteros: números de recuento, como 2
Números de punto flotante: números con posiciones decimales,
como 2,43
Cadenas: letras y palabras
Booleanos: true y false
Ninguno, nulo o null: no son datos, sino más bien la ausencia de
ellos.
Los términos exactos y la implementación de estos conceptos varían de un
idioma a otro, pero la forma de funcionamiento básico es muy similar.
Cabe destacar que, en algunas circunstancias, dos tipos de datos diferentes
ofrecen una funcionalidad equivalente. Por ejemplo, los valores true/false a
menudo pueden codificarse como booleanos (true o false), cadenas ("y" o "n"),
enteros (0 o 1) o incluso números de punto flotante (0,0 o 1,0).
Tipos de datos derivados
Ya hemos visto que hay tipos de datos más impresionantes. Los equipos
pueden almacenar fechas, imágenes y modelos 3D, entre otros. Estos se
denominan tipos de datos derivados y están formados por uno o varios tipos
primitivos.
En el aprendizaje automático, a menudo resulta útil convertir tipos derivados en
representaciones más simples. Por ejemplo, una fecha (1 de enero de 2017)
puede almacenarse como número entero o de punto flotante: 20170101. Esto
facilita el cálculo matemático subyacente de nuestros modelos.
¿Demasiadas opciones?
Saber qué clase de datos tiene puede ayudarle a elegir el tipo de datos correcto.
El tipo de datos correcto puede depender del paquete que use para ejecutar los
modelos, aunque los paquetes suelen ser bastante permisivos. En general:
Si trabaja con datos continuos, los números de punto flotante son
la mejor opción.
Los datos ordinales suelen codificarse como enteros.
Los datos categóricos de solo dos categorías normalmente pueden
codificarse como datos booleanos o enteros. Trabajar con tres
categorías o más puede ser algo más complicado. No hay que
preocuparse: trataremos este tema en la lección siguiente.
En el ejercicio siguiente, practicaremos la visualización de nuestros datos para
comprenderlos bien. Al hacerlo, tenga especialmente en cuenta los tipos de
datos que se están procesando e intente identificar cuáles de ellos son
continuos, ordinales o categóricos.
Siguiente unidad: Ejercicio: trabajar con los datos
para predecir los valores que faltan
Ejercicio: trabajar con los datos para
predecir los valores que faltan
Completado100 XP
8 minutos
Este módulo requiere un espacio aislado para completarse.
Un espacio aislado le da acceso a recursos gratuitos. No se le cobrará en su
suscripción personal. El espacio aislado solo podrá usarse para completar el
aprendizaje en Microsoft Learn. El uso para cualquier otro motivo está prohibido
y podría generar la pérdida permanente del acceso al espacio aislado.
Microsoft ofrece esta experiencia de laboratorio y el contenido relacionado con
fines educativos. Toda la información presentada es propiedad de Microsoft y
está destinada únicamente a brindar información sobre los productos y servicios
abordados en este módulo de Microsoft Learn.
Activar espacio aislado
Las sugerencias de enlaces de teclado de la barra de herramientas están ahora ocultas
RuntimeArchivoEditarVista
Ejecutar todo
Kernel
Proceso no conectado
Exercise: Titanic Dataset - Visualising Different
Types of Data
To build better machine learning models we should understand the available
data. This usually means both:
1. data visualization
2. understanding the kind of data we have available
In this module, we'll practice cleaning our Titanic dataset, and visualization of
different kinds of data, especially
continuous
ordinal
categorical
simple identity column
data types.
A Note On Our Graphing
In this exercise, we'll use a custom python script to create our graphs. This script
uses Plotly, a well-known graphing library.
This script will focus on data exploration, instead of a deep focus on Plotly. If
you'd like to review this custom script, you can find it in our GitHub repository.
First Inspection
Let's reload the Titanic Dataset, and reacquaint ourselves with its data:
CódigoMarkdown
[ ]
import pandas as pd
# Load data from our dataset file into a pandas dataframe
!wget [Link]
to-machine-learning/main/Data/[Link]
!wget [Link]
to-machine-learning/main/[Link]
dataset = pd.read_csv('[Link]', index_col=False, sep=",", header=0)
# Let's take a look at the data
[Link]()
Presione Mayús + Entrar para ejecutar
Take a careful look at the columns, and try to identify those columns holding
continuous, ordinal, categorical, or identity data.
We can display a brief summary of the dataypes with panda's info() method:
[ ]
[Link]()
Presione Mayús + Entrar para ejecutar
We can see several columns stored as numerical data
(the int64 or float64 types), while others contain more complex data types
(those with object as Dtype)
Visualising Ordinal Data
Let's visualize some ordinal data. We have available:
1. Pclass - the ticket class
2. Parch - the number of parents or children on the ship
3. sibsp - the number of siblings or spouses on the ship
We can view ordinal data with almost any kind of graph. We'll start with a
simple histogram that describes relationships between the ticket class and the
likelihood of survival.
[ ]
import graphing
[Link](dataset, label_x='Pclass', label_y='Survived', histfunc='a
vg', include_boxplot=True)
Presione Mayús + Entrar para ejecutar
The box and whisker plot (top) shows that at least half the people had third-
class tickets - note how the median and maximum of the plot both sit at Pclass
= 3.
The histogram shows that people in second and third class tended not to
survive the wreck.
Let's look at how survival varies, depending on whether a passenger had parents
or children on the ship
[7]
graphing.multiple_histogram(dataset,
label_x='Pclass', # group by ticket class
label_group="Parch", # colour by no parents or ch
ildren
label_y='Survived',
histfunc="avg")
12300.[Link]
Parch0123456Pclassavg of Survived
For first and second class ticket holders, people in larger family groups appear
to have had better rates of survival. However, this doesn't seem to be the case
for third class passengers.
Lastly, let's see if those with different ticket types tended to be in different sized
families. For data spread analysis, a box and whisker is a nice alternative to
histograms.
[ ]
graphing.box_and_whisker(dataset, label_x="Pclass", label_y="SibSp")
Presione Mayús + Entrar para ejecutar
Most values are zero. This shows that most people traveled without siblings and
without a partner. There are no obvious differences in this value between the
different ticket classes.
Visualising Continuous Data
Continuous data are usually best viewed using either:
1. An XY scatter plot, especially for relationships between two continuous features
2. Histograms or Box and Whisker plots, to look at the spread of data
Our dataset has Age and Fare as continuous data columns. Let's view them:
[ ]
graphing.scatter_2D(dataset, label_x="Age", label_y="Fare")
Presione Mayús + Entrar para ejecutar
We don't see an obvious relationship between Age and Fare.
Does the cost of a fare, or the person's age, have any relationship with
likelihood of survival?
[ ]
# Plot Fare vs Survival
[Link](dataset, label_x="Fare", label_y="Survived", histfunc="avg
", nbins=30, title="Fare vs Survival", include_boxplot=True, show=True)
# Plot Age vs Survival
[Link](dataset, label_x="Age", label_y="Survived", histfunc="avg"
, title="Age vs Survival", nbins=30, include_boxplot=True)
Presione Mayús + Entrar para ejecutar
The boxplot (top) of the first figure shows us that most people held tickets that
cost less than £25, and the histogram shows us that people with more expensive
tickets tended to survive.
Our second figure indicates passengers were about 30 years old on average,
and that most children under 10 years old survived, unlike most adults.
Visualising Categorical Data
Our Titanic dataset has the following categorical columns:
Sex (Male, Female)
Embarked - the port of ambarkation (C, Q, or S)
Cabin (many options)
Survival (0 = no, 1 = yes)
Categorical data are usually viewable in a similar way to ordinal data, but with
data viewed as order-less groups. Alternatively, categories appear as colors, or
groups, in other kinds of plots.
Plotting categorical data against other categorical data shows how data is
clustered. This is little more than a colored table. Let's do this now:
[ ]
import plotly.graph_objects as go
import numpy as np
# Create some simple functions
# Read their descriptions to find out more
def get_rows(sex, port):
'''Returns rows that match in terms of sex and embarkment port'''
return dataset[([Link] == port) & ([Link] == sex)]
def proportion_survived(sex, port):
'''Returns the proportion of people meeting criteria who survived'''
survived = get_rows(sex, port).Survived
return [Link](survived)
# Make two columns of data - together these represent each combination
# of sex and embarkment port
sexes = ["male", "male", "male", "female","female", "female"]
ports = ["C", "Q", "S" ] * 2
# Calculate the number of passengers at each port + sex combination
passenger_count = [len(get_rows(sex, port)) for sex,port in zip(sexes, ports
)]
# Calculate the proportion of passengers from each port + sex combination who
survived
passenger_survival = [proportion_survived(sex, port) for sex,port in zip(sex
es, ports)]
# Combine into a single data frame
table = [Link](dict(
sex=sexes,
port=ports,
passenger_count=passenger_count,
passenger_survival_rate=passenger_survival
))
# Make a bubble plot
# This is just a scatter plot but each entry in the plot
# has a size and colour. We set colour to passenger_survival
# and size to the number of passengers
graphing.scatter_2D(table,
label_colour="passenger_survival_rate",
label_size="passenger_count",
size_multiplier=0.3,
title="Bubble Plot of Categorical Data")
Presione Mayús + Entrar para ejecutar
It appears that women have a much higher survival rate than men, but there
were more men on the ship.
We can also see that most people boarded at Port S ("Southampton"). It does
seem that there is a weak relationship between the port of boarding and
survival.
Summary
You've learned about different types of data, and you practiced data exploration
through graphs.
Through these, we've discovered that some features are related to others, and
that many features seem to influence the survival rate.
Sin proceso
Proceso no conectado
Visualización
Kernel no conectado
Siguiente unidad: Vectores one-hot
Vectores one-hot
Completado100 XP
5 minutos
Hasta ahora, hemos abordado la codificación de datos continuos (números de
punto flotante), datos ordinales (normalmente enteros) y datos categóricos
binarios, como supervivientes/fallecidos, hombres/mujeres.
Aquí veremos cómo codificar y los datos categóricos que tienen más de dos
clases. También exploraremos cómo algunas decisiones que tomamos para
mejorar nuestros modelos pueden en realidad afectar a su rendimiento.
Los datos categóricos no son numéricos
Los datos categóricos no son números de la misma manera que otros tipos de
datos. Con los datos ordinales o continuos (numéricos), los valores más altos
implican un aumento de la cantidad. Por ejemplo, en el Titanic, un precio de
billete de 30 £ es más caro que el de un billete de 12 £.
Intentar codificar como números las características categóricas con más de dos
clases genera problemas, ya que los datos categóricos no tienen un orden
lógico.
Por ejemplo, Puerto de embarque tiene tres valores: C (Cherbourg), Q
(Queenstown) y S (Southampton). No hay ninguna forma correcta de
reemplazar estos símbolos por números, ya que hacerlo implicaría que uno de
estos puertos es "menor que" el resto, mientras que otro sería "mayor que" los
otros. No tiene sentido.
Como ejemplo de este problema, pasaremos a otra cosa y modelaremos la
relación entre el Puerto de embarque y la Clase de billete, tratando el Puerto de
embarque como un número. En primer lugar, se establece C < S < Q:
En el trazado anterior, la línea predice un valor Pclass de ~3 para el Puerto Q.
Ahora, al establecer S < C< Q, se obtienen una predicción y una línea de
tendencia completamente distintas:
Ninguna de estas líneas de tendencia es correcta; no tiene sentido tratar las
categorías como características continuas. Por lo tanto, ¿cómo se trabaja con las
categorías?
Codificación one-hot
La codificación one-hot es una forma de codificar datos categóricos que evita el
problema anterior. Cada categoría disponible obtiene su columna propia y una
fila determinada únicamente contiene un solo 1 en la categoría a la que
pertenece.
Por ejemplo, nuestro puerto se codificaría como tres columnas: una para
Cherbourg, otra para Queenstown y otra para Southampton (el orden no es
importante). Una persona que embarcara en Cherbourg tendría un 1 en la
columna Port_Cherbourg, de esta forma:
Port_Cherbourg Port_Queenstown Port_Southampton
1 0 0
Una persona que embarcara en Queenstown tendría un 1 en la segunda
columna:
Port_Cherbourg Port_Queenstown Port_Southampton
0 1 0
Una persona que embarcara en Southampton tendría un 1 en la tercera
columna:
Port_Cherbourg Port_Queenstown Port_Southampton
0 0 1
Codificación one-hot, limpieza de datos y
potencia estadística
Antes de usar la codificación one-hot, es importante comprender que su uso
puede tener un impacto positivo o negativo en el rendimiento real de un
modelo.
¿Qué es la potencia estadística?
La potencia estadística hace referencia a la capacidad de un modelo para
identificar de forma confiable las relaciones reales entre las características y las
etiquetas. Por ejemplo, un modelo con potencia podría informar de la relación
entre el precio del billete y la tasa de supervivencia con un alto grado de
certeza. Por el contrario, un modelo con una potencia estadística baja podría no
encontrar esta relación o notificarla con un bajo grado de certeza.
No entraremos en matemáticas, pero es importante tener en cuenta que
determinadas opciones que tomamos pueden afectar a la potencia de nuestros
modelos.
La eliminación de datos reduce la potencia estadística
Hemos hablado varias veces sobre cómo limpiar los datos mediante la
eliminación de muestras que están incompletas. Un efecto colateral indeseado
es que, al hacerlo, también se reduce la potencia estadística. Por ejemplo,
supongamos que queremos predecir la supervivencia dados los datos
siguientes:
Precio del billete Supervivencia
4 £ 0
Precio del billete Supervivencia
8 £ 0
10 £ 1
25 £ 1
A partir de estos datos, podríamos suponer que los pasajeros con un billete de
15 £ sobrevivieron, porque todas las personas con billetes con un precio
superior a 10 £ sobrevivieron. Sin embargo, si tuviéramos menos datos, esto
sería más difícil de suponer:
Precio del billete Supervivencia
4 £ 0
8 £ 0
25 £ 1
Las columnas sin valor reducen la potencia estadística
La potencia estadística también puede verse perjudicada al proporcionar
modelos con características de poco valor, sobre todo cuando el número de
características (columnas) comienza a aproximarse al número de muestras (filas).
Por ejemplo, supongamos que queremos predecir la supervivencia dados los
datos siguientes:
Precio del billete Supervivencia
4 £ 0
4 £ 0
25 £ 1
25 £ 1
Podríamos usar estos datos para predecir con confianza que un pasajero con un
billete de 25 £ para la Cabina A sobreviviría, porque todos los pasajeros con
billetes de 25 £ sobrevivieron.
Imagine, sin embargo, que tenemos otra característica (Cabina):
Precio del billete Cabin Supervivencia
4 £ A 0
4 £ A 0
25 £ B 1
25 £ B 1
La columna Cabina no proporciona información útil, ya que simplemente
corresponde al precio del billete. Ahora no queda claro si aquellos con un billete
de 25 £ para la Cabina A sobrevivirían. ¿Fallecieron, como otros pasajeros de la
Cabina A, o sobrevivieron como aquellos con billetes de 25 £?
La codificación one-hot puede reducir la potencia estadística
La codificación one-hot reduce la potencia estadística mucho más que los datos
continuos u ordinales porque requiere varias columnas: una para cada valor
categórico posible. Por ejemplo, la codificación one-hot del puerto de
embarque agrega tres entradas de modelo (C, S y Q).
Como regla general, merece la pena incluir una variable categórica si el número
de categorías es considerablemente menor que el número de muestras (filas del
conjunto de datos) y esta categoría proporciona información que aún no está
disponible para el modelo a través de otras entradas.
Por ejemplo, vimos que la probabilidad de supervivencia era distinta para las
personas que embarcaron en puertos diferentes. Probablemente, esto solo
refleja que la mayoría de las personas del puerto Queenstown tenían billetes de
tercera clase. Por lo tanto, es probable que el embarque reduzca ligeramente la
potencia estadística sin agregar información relevante a nuestro modelo.
Por el contrario, es probable que la Cabina influya considerablemente en la
supervivencia, ya que las cabinas de la parte inferior del barco se llenarían de
agua antes que las más cercanas a la cubierta. Dicho esto, el conjunto de datos
del Titanic contiene 147 cabinas distintas, lo cual reducirá la potencia estadística
del modelo si se incluye. Para averiguar si la Cabina es útil en definitiva, puede
que tengamos que experimentar con su inclusión o exclusión en nuestro
modelo.
En el ejercicio siguiente, por fin crearemos nuestro modelo de predicción de la
supervivencia en el Titanic y practicaremos una codificación one-hot durante
este proceso.
Siguiente unidad: Ejercicio: predicción de valores
desconocidos con vectores one-hot
Ejercicio: predicción de valores
desconocidos con vectores one-hot
Completado100 XP
10 minutos
Este módulo requiere un espacio aislado para completarse.
Un espacio aislado le da acceso a recursos gratuitos. No se le cobrará en su
suscripción personal. El espacio aislado solo podrá usarse para completar el
aprendizaje en Microsoft Learn. El uso para cualquier otro motivo está prohibido
y podría generar la pérdida permanente del acceso al espacio aislado.
Microsoft ofrece esta experiencia de laboratorio y el contenido relacionado con
fines educativos. Toda la información presentada es propiedad de Microsoft y
está destinada únicamente a brindar información sobre los productos y servicios
abordados en este módulo de Microsoft Learn.
Activar espacio aislado
Las sugerencias de enlaces de teclado de la barra de herramientas están ahora ocultas
RuntimeArchivoEditarVista
Ejecutar todo
Kernel
Proceso no conectado
Exercise: Titanic Dataset - One-Hot Vectors
In this unit, we'll build a model to predict who survived the Titanic disaster. We'll
practice transforming data between numerical and categorical types, including
use of one-hot vectors.
Data prepartion
First, we'll open and quickly clean our dataset, like we did in the last unit:
CódigoMarkdown
[ ]
import pandas
!wget [Link]
to-machine-learning/main/m0c_logistic_regression.py
!wget [Link]
to-machine-learning/main/Data/[Link]
# Open our dataset from file
dataset = pandas.read_csv("[Link]", index_col=False, sep=",", header=0)
# Fill missing cabin information with 'Unknown'
dataset["Cabin"].fillna("Unknown", inplace=True)
# Remove rows missing Age information
[Link](subset=["Age"], inplace=True)
# Remove the Name, PassengerId, and Ticket fields
# This is optional; it makes it easier to read our print-outs
[Link](["PassengerId", "Name", "Ticket"], axis=1, inplace=True)
[Link]()
Presione Mayús + Entrar para ejecutar
About Our Model
We'll training a model type known as Logistic Regression, which will predict who
survives the Titanic disaster.
For this exercise, you don't need to understand logistic regression. We placed
the implementation outside this notebook in a method
called train_logistic_regression. If you're curious, you can read this method
in our GitHub repository.
train_logistic_regression:
1. Accepts our data frame and a list of features to include in the model.
2. Trains the model.
3. Returns a number that states how well the model performs as it predicts
passenger survival. Smaller numbers are better.
Numerical Only
Let's create a model that uses only the numerical features.
First, we'll use Pclass here as an ordinal feature, rather than a one-hot encoded
categorical feature.
[ ]
from m0c_logistic_regression import train_logistic_regression
features = ["Age", "Pclass", "SibSp", "Parch", "Fare"]
loss_numerical_only = train_logistic_regression(dataset, features)
print(f"Numerical-Only, Log-Loss (cost): {loss_numerical_only}")
Presione Mayús + Entrar para ejecutar
We have our starting point. Let's see if categorical features will improve the
model.
Binary Categorical Features
Categorical features with only two potential values can be encoded in a single
column, as 0 or 1.
We'll convert Sex values into IsFemale - a 0 for male and 1 for female - and
include that in our model.
[ ]
# Swap male / female with numerical values
# We can do this because there are only two categories
dataset["IsFemale"] = [Link]({'male':0, 'female':1})
# Print out the first few rows of the dataset
print([Link]())
# Run and test the model, also using IsFemale this time
features = ["Age", "Pclass", "SibSp", "Parch", "Fare", "IsFemale"]
loss_binary_categoricals = train_logistic_regression(dataset, features)
print(f"\nNumerical + Sex, Log-Loss (cost): {loss_binary_categoricals}")
Presione Mayús + Entrar para ejecutar
Our loss (error) decreased! This model performs better than the previous model.
One-Hot Encoding
Ticket class (Pclass) is an Ordinal feature. Its potential values (1, 2 & 3) have an
order and they have equal spacing. However, this even spacing might be
incorrect - in stories about the Titanic, the third-class passengers were treated
much worse than those in 1st and 2nd class.
Let's convert Pclass into a categorical feature using one-hot encoding:
[ ]
# Get all possible categories for the "PClass" column
print(f"Possible values for PClass: {dataset['Pclass'].unique()}")
# Use Pandas to One-Hot encode the PClass category
dataset_with_one_hot = pandas.get_dummies(dataset, columns=["Pclass"], drop_f
irst=False)
# Add back in the old Pclass column, for learning purposes
dataset_with_one_hot["Pclass"] = [Link]
# Print out the first few rows
dataset_with_one_hot.head()
Presione Mayús + Entrar para ejecutar
Note that Pclass converted into three
values: Pclass_1, Pclass_2 and Pclass_3.
Rows with Pclass values of 1 have a value in the Pclass_1 column. We see the
same pattern for values of 2 and 3.
Now, re-run the model, and treat Pclass values as a categorical values, rather
than ordinal values.
[ ]
# Run and test the model, also using Pclass as a categorical feature this tim
e
features = ["Age", "SibSp", "Parch", "Fare", "IsFemale",
"Pclass_1", "Pclass_2", "Pclass_3"]
loss_pclass_categorical = train_logistic_regression(dataset_with_one_hot, fea
tures)
print(f"\nNumerical, Sex, Categorical Pclass, Log-Loss (cost):
{loss_pclass_categorical}")
Presione Mayús + Entrar para ejecutar
This seems to have made things slightly worse!
Let's move on.
Including Cabin
Recall that many passengers had Cabin information. Cabin is a categorical
feature and should be a good predictor of survival, because people in lower
cabins probably had little time to escape during the sinking.
Let's encode cabin using one-hot vectors, and include it in a model. This time,
there are so many cabins that we won't print them all out. To practice printing
them out, feel free to edit the code as practice.
[ ]
# Use Pandas to One-Hot encode the Cabin and Pclass categories
dataset_with_one_hot = pandas.get_dummies(dataset, columns=["Pclass", "Cabin"
], drop_first=False)
# Find cabin column names
cabin_column_names = list(c for c in dataset_with_one_hot.columns if [Link]
swith("Cabin_"))
# Print out how many cabins there were
print(len(cabin_column_names), "cabins found")
# Make a list of features
features = ["Age", "SibSp", "Parch", "Fare", "IsFemale",
"Pclass_1", "Pclass_2", "Pclass_3"] + \
cabin_column_names
# Run the model and print the result
loss_cabin_categorical = train_logistic_regression(dataset_with_one_hot, feat
ures)
print(f"\nNumerical, Sex, Categorical Pclass, Cabin, Log-Loss (cost):
{loss_cabin_categorical}")
Presione Mayús + Entrar para ejecutar
That's our best result so far!
Improving Power
Including very large numbers of categorical classes - for example, 135 cabins - is
often not the best way to train a model, because the model only has a few
examples of each category class to learn from.
Sometimes, we can improve models if we simplify features. Cabin was probably
useful because it indicated which Titanic deck people were probably situated in:
those in lower decks would have had their quarters flooded first.
It might become simpler to use deck information, instead of categorizing
people into Cabins.
Let's simplify what we have run, replacing the 135 Cabin categories with a
simpler Deck category that has only 9 values: A - G, T, and U (Unknown)
[ ]
# We have cabin names, like A31, G45. The letter refers to the deck that
# the cabin was on. Extract just the deck and save it to a column.
dataset["Deck"] = [c[0] for c in [Link]]
print("Decks: ", sorted([Link]()))
# Create one-hot vectors for:
# Pclass - the class of ticket. (This could be treated as ordinal or categori
cal)
# Deck - the deck that the cabin was on
dataset_with_one_hot = pandas.get_dummies(dataset, columns=["Pclass", "Deck"]
, drop_first=False)
# Find the deck names
deck_of_cabin_column_names = list(c for c in dataset_with_one_hot.columns if
[Link]("Deck_"))
features = ["Age", "IsFemale", "SibSp", "Parch", "Fare",
"Pclass_1", "Pclass_2", "Pclass_3",
"Deck_A", "Deck_B", "Deck_C", "Deck_D",
"Deck_E", "Deck_F", "Deck_G", "Deck_U", "Deck_T"]
loss_deck = train_logistic_regression(dataset_with_one_hot, features)
print(f"\nSimplifying Cabin Into Deck, Log-Loss (cost): {loss_deck}")
Presione Mayús + Entrar para ejecutar
Comparing Models
Let's compare the loss for these models:
[ ]
# Use a dataframe to create a comparison table of metrics
# Copy metrics from previous Unit
l =[["Numeric Features Only", loss_numerical_only],
["Adding Sex as Binary", loss_binary_categoricals],
["Treating Pclass as Categorical", loss_pclass_categorical],
["Using Cabin as Categorical", loss_cabin_categorical],
["Using Deck rather than Cabin", loss_deck]]
[Link](l, columns=["Dataset", "Log-Loss (Low is better)"])
Presione Mayús + Entrar para ejecutar
We can see that including categorical features can both improve and harm how
well a model works. Often, experimentation is the best way to find the best
model.
Summary
In this unit you learned how to use One-Hot encoding to address categorical
data.
We also explored how sometimes critical thinking about the problem at hand
can improve a solution more than simply including all possible features in a
model.
Sin proceso
Proceso no conectado
Visualización
Kernel no conectado
Siguiente unidad: Prueba de conocimientos
Introducción
Completado100 XP
1 minuto
El aprendizaje automático es la base de la mayoría de las soluciones de
inteligencia artificial. La creación de una solución inteligente empieza a veces
con el uso del aprendizaje automático para entrenar un modelo predictivo con
datos históricos que se hayan recopilado.
Azure Machine Learning es un servicio en la nube que se puede usar para
entrenar y administrar modelos de Machine Learning.
En este módulo, aprenderá a:
Identifique el proceso de aprendizaje automático.
Comprenda las funcionalidades de Azure Machine Learning.
Use el aprendizaje automático automatizado de Estudio de Azure
Machine Learning para entrenar un modelo predictivo e implementarlo.
Para completar este módulo, necesitará una suscripción de Microsoft Azure. Si
aún no tiene una, puede solicitar una prueba gratuita
en [Link]
¿Qué es el aprendizaje automático?
Completado100 XP
5 minutos
El aprendizaje automático es una técnica que utiliza matemáticas y estadísticas
para crear un modelo que puede predecir valores desconocidos.
Por ejemplo, supongamos que Adventure Works Cycles es un negocio que
alquila bicicletas en una ciudad. El negocio podría utilizar datos históricos para
entrenar un modelo que prediga la demanda diaria de alquileres con el fin de
asegurarse de que haya suficientes bicicletas y personal disponibles.
Para ello, Adventure Works podría crear un modelo de Machine Learning que
tome información sobre un día específico (el día de la semana, las condiciones
climáticas previstas, etc.) como entrada y prediga el número previsto de
alquileres como salida.
De forma matemática, puede considerar el aprendizaje automático como una
forma de definir una función (por ejemplo, f) que opera con una o
más características de algo (que se denominará x) para calcular
una etiqueta prevista (y), como esta:
f(x) = y
En el ejemplo del alquiler de bicicletas, los detalles sobre un día determinado
(día de la semana, clima, etc.) son las características (x), el número de alquileres
para ese día es la etiqueta (y) y la función (f) que calcula el número de alquileres
según la información sobre el día está encapsulada en el modelo de Machine
Learning.
La operación específica que realiza la función f en x para calcular y depende de
una serie de factores, incluidos el tipo de modelo que se intenta crear y el
algoritmo específico usado para entrenarlo. Además, en la mayoría de casos, los
datos usados para entrenar el modelo de Machine Learning requieren algún
preprocesamiento antes de que se pueda realizar el entrenamiento del modelo.
Tipos de aprendizaje automático
Hay dos enfoques generales para el aprendizaje automático: supervisado y no
supervisado. En ambos enfoques, hay que entrenar un modelo que realice
predicciones.
El enfoque de aprendizaje automático supervisado requiere comenzar con un
conjunto de datos con valores de etiqueta conocidos. Entre los tipos de tareas
de aprendizaje automático supervisadas están la regresión y la clasificación.
Regresión: se usa para predecir un valor continuo, como un precio,
un total de ventas o alguna otra medida.
Clasificación: se usa para determinar una etiqueta de clase: un
ejemplo de una etiqueta de clase binaria es si un paciente tiene
diabetes o no; un ejemplo de etiquetas de varias clases es clasificar
el texto como positivo, negativo o neutro.
El enfoque de aprendizaje automático no supervisado comienza con un
conjunto de datos sin valores de etiqueta conocidos. Un tipo de tarea de
aprendizaje automático no supervisado es la agrupación en clústeres.
Agrupación en clústeres: se usa para determinar las etiquetas
agrupando información similar en grupos de etiquetas, como
agrupar medidas de aves en especies.
En el vídeo siguiente se describen los distintos tipos de modelos de Machine
Learning que se pueden crear y el proceso que se suele seguir para entrenarlos
y usarlos.
Siguiente unidad: ¿Qué es Azure Machine
Learning Studio?
¿Qué es Azure Machine Learning
Studio?
Completado100 XP
5 minutos
Entrenar e implementar un modelo de Machine Learning eficaz implica una gran
cantidad de trabajo, siendo buena parte de este intensivo en tiempo y en
recursos. Azure Machine Learning es un servicio basado en la nube que permite
simplificar algunas de las tareas para preparar los datos, entrenar un modelo e
implementar un servicio predictivo.
Y lo más importante, Azure Machine Learning ayuda a los científicos de datos a
aumentar su eficiencia al automatizar muchas tareas que requieren bastante
tiempo y que están asociadas a los modelos de entrenamiento. Además, les
permite usar recursos de procesos basados en la nube que se escalan de
manera eficaz para manejar grandes volúmenes de datos, incurriendo en costos
solo cuando realmente se usan.
Área de trabajo de Azure Machine Learning
Para usar Azure Machine Learning, debe crear un área de trabajo en la
suscripción de Azure. Después, puede usar esta área de trabajo para administrar
datos, recursos de proceso, código, modelos y otros artefactos relacionados con
las cargas de trabajo de aprendizaje automático.
Después de crear un área de trabajo de Azure Machine Learning, puede
desarrollar soluciones con el servicio Azure Machine Learning, ya sea con
herramientas de desarrollo o con el portal web de Estudio de Azure Machine
Learning.
Azure Machine Learning Studio
Estudio de Azure Machine Learning es un portal web de soluciones de
aprendizaje automático en Azure. Incluye una amplia gama de características y
funcionalidades que ayudan a los científicos de datos a preparar datos, entrenar
modelos, publicar servicios predictivos y supervisar su uso. Para empezar a usar
el portal web, debe asignar el área de trabajo que creó en el Azure Portal a
Azure Machine Learning Studio.
Proceso de Azure Machine Learning
En esencia, Azure Machine Learning es un servicio para entrenar y administrar
modelos de Machine Learning, para los que se necesita proceso sobre el que
ejecutar el proceso de entrenamiento.
Los destinos de proceso son recursos basados en la nube en los que se pueden
ejecutar procesos de entrenamiento de modelos y exploración de datos.
En Estudio de Azure Machine Learning, puede administrar los destinos de
proceso para las actividades de ciencia de datos. Puede crear cuatro tipos de
recursos de proceso:
Instancias de proceso: estaciones de trabajo de desarrollo que los
científicos de datos pueden usar para trabajar con datos y modelos.
Clústeres de proceso: clústeres escalables de máquinas virtuales para el
procesamiento a petición de código de experimento.
Clústeres de inferencia: destinos de implementación para servicios
predictivos que usan los modelos entrenados.
Proceso asociado: vínculos a recursos de proceso de Azure existentes,
como clústeres de Azure Virtual Machines o Azure Databricks.
Siguiente unidad: Descripción del aprendizaje
automático automatizado de Azure
Descripción del aprendizaje
automático automatizado de Azure
Completado100 XP
3 minutos
Azure Machine Learning incluye una capacidad de aprendizaje automático
automatizado que prueba automáticamente varias técnicas de procesamiento
previo y algoritmos de entrenamiento de modelos en paralelo. Estas
capacidades automatizadas usan la potencia del proceso en la nube para
encontrar el modelo de Machine Learning supervisado con el mejor rendimiento
para los datos.
El aprendizaje automático automatizado el permite entrenar modelos sin un
amplio conocimiento de programación ni de ciencia de datos. En el caso de las
personas con conocimientos de programación y de ciencia de datos,
proporciona una manera de ahorrar tiempo y recursos mediante la
automatización de la selección de algoritmos y la optimización de los
hiperparámetros.
Puede crear un trabajo de aprendizaje automático automatizado en Azure
Machine Learning Studio.
En Azure Machine Learning, las operaciones que se ejecutan se
denominan trabajos. Puede configurar varias opciones para el trabajo antes de
iniciar una ejecución de aprendizaje automático automatizado. La configuración
de ejecución proporciona la información necesaria para especificar el script de
entrenamiento, el destino de proceso y el entorno de Azure ML en la
configuración de ejecución y ejecutar un trabajo de entrenamiento.
Siguiente unidad: Comprender el proceso de
AutoML
Comprender el proceso de AutoML
Completado100 XP
5 minutos
Puede pensar en los pasos de un proceso de aprendizaje automático como:
1. Preparar datos: identifique las características y la etiqueta de un
conjunto de datos. Procese previamente o limpie y transforme los
datos según sea necesario.
2. Entrenar el modelo: divida los datos en dos grupos, un
entrenamiento y un conjunto de validación. Entrene un modelo de
Machine Learning mediante el conjunto de datos de entrenamiento.
Pruebe el modelo de Machine Learning para obtener un
rendimiento mediante el conjunto de datos de validación.
3. Evaluar el rendimiento: compare la proximidad de las predicciones
del modelo con las etiquetas conocidas.
4. Implementar un servicio predictivo: después de entrenar un
modelo de Machine Learning, puede implementar el modelo como
una aplicación en un servidor o dispositivo para que otros usuarios
puedan usarlo.
Estos son los mismos pasos del proceso de aprendizaje automático
automatizado con Azure Machine Learning.
Preparación de los datos
Los modelos de Machine Learning deben entrenarse con los datos existentes.
Los científicos de datos dedican muchos esfuerzos a explorar y preprocesar los
datos, así como a probar varios tipos de algoritmos de entrenamiento de
modelos para generar modelos precisos, lo que lleva mucho tiempo y a veces
no emplea el hardware de proceso, de elevado costo, de forma eficaz.
En Azure Machine Learning, los datos para el entrenamiento de modelos y otras
operaciones se encapsulan normalmente en un objeto denominado conjunto de
datos. Puede crear su propio conjunto de datos en Estudio de Azure Machine
Learning.
Entrenamiento de un modelo
La funcionalidad de aprendizaje automático automatizado de Azure Machine
Learning admite modelos de Machine Learning supervisados, es decir, modelos
para los que los datos de entrenamiento incluyen valores de etiqueta conocidos.
Puede usar el aprendizaje automático automatizado a fin de entrenar modelos
para:
Clasificación (predicción de categorías o clases)
Regresión (predicción de valores numéricos)
Previsión de series temporales (predicción de valores numéricos
en un momento futuro en el tiempo)
En el aprendizaje automático automatizado puede seleccionar varios tipos de
tareas:
En el aprendizaje automático automatizado puede seleccionar configuraciones
para la métrica principal, el tipo de modelo que se usa para el entrenamiento,
los criterios de salida y los límites de simultaneidad.
Lo importante es que AutoML dividirá los datos en un conjunto de
entrenamiento y un conjunto de validación. Puede configurar los detalles en la
configuración antes de ejecutar el trabajo.
Evaluación del rendimiento
Una vez finalizado el trabajo, puede revisar el modelo de mejor rendimiento. En
este caso, ha usado criterios de salida para detener el trabajo. Por lo tanto, el
"mejor" modelo que generó el trabajo podría no ser el mejor modelo posible,
sino solo el mejor que se ha encontrado en el tiempo permitido para este
ejercicio.
El mejor modelo se identifica en función de la métrica de evaluación que se
haya especificado raíz del error cuadrático medio normalizado.
Para calcular la métrica de evaluación se usa una técnica denominada validación
cruzada. Una vez entrenado el modelo con una parte de los datos, la parte
restante se usa para probar de forma iterativa o validar de forma cruzada el
modelo entrenado. La métrica se calcula comparando el valor previsto de la
prueba con el valor conocido real o la etiqueta.
La diferencia entre el valor previsto y el real, conocido como valores residuales,
indica la cantidad de error en el modelo. La métrica de rendimiento raíz del
error cuadrático medio (RMSE) se calcula elevando al cuadrado los errores en
todos los casos de prueba, buscando la media de estos cuadrados y, después,
tomando la raíz cuadrada. Lo que significa todo esto es que cuanto menor sea
este valor, más precisa serán las predicciones del modelo. La raíz del error
cuadrático medio normalizado (NRMSE) normaliza la métrica RMSE para poder
usarla para la comparación entre modelos que tienen variables en diferentes
escalas.
En el Histograma de valores residuales se muestra la frecuencia de los
intervalos de los valores residuales. Los valores residuales representan la
varianza entre los valores previstos y los reales que el modelo no puede
explicar, es decir, los errores. Debería esperar ver los valores residuales que se
producen con más frecuencia agrupados en torno a cero. Quiere errores
pequeños y menos errores en los extremos de la escala.
El gráfico Valores previstos frente a los reales debe mostrar una tendencia
diagonal en la que el valor previsto se correlacione estrechamente con el valor
verdadero. La línea de puntos muestra cómo debe realizarse un modelo
perfecto. Cuanto más se acerque la línea del valor previsto promedio del
modelo a la línea de puntos, mejor será su rendimiento. Un histograma debajo
del gráfico de líneas muestra la distribución de los valores verdaderos.
Después de usar el aprendizaje automático automatizado a fin de entrenar
algunos modelos, puede implementar el modelo de mejor rendimiento como
servicio para que lo usen las aplicaciones cliente.
Implementación de un servicio predictivo
En Azure Machine Learning, puede implementar un servicio como una instancia
de Azure Container Instances (ACI) o en un clúster de Azure Kubernetes Service
(AKS). En escenarios de producción, se recomienda una implementación de AKS,
para lo cual debe crear un destino de proceso de clúster de inferencia. En este
ejercicio usará un servicio ACI, que es un destino de implementación adecuado
para las pruebas y no requiere la creación de un clúster de inferencia.
Siguiente unidad: Ejercicio: Exploración del
aprendizaje automático automatizado en Azure
ML
Ejercicio: Exploración del aprendizaje
automático automatizado en Azure
ML
Completado100 XP
50 minutos
En este ejercicio, usará un conjunto de datos de información histórica de
alquiler de bicicletas para entrenar un modelo que prediga el número de
alquileres de bicicletas que se espera un día determinado, en función de las
características estacionales y meteorológicas.
Nota
Para completar este laboratorio, necesitará una suscripción de Azure en la que
tenga acceso administrativo.
Inicie el ejercicio y siga las instrucciones.
Siguiente unidad: Comprobación de conocimiento
Introducción
Completado100 XP
2 minutos
Puede usar el diseñador de Microsoft Azure Machine Learning para crear
modelos de regresión mediante una interfaz visual de arrastrar y colocar, sin
necesidad de escribir código.
En este módulo aprenderá a:
Identificación de escenarios de aprendizaje automático de regresión.
Usar el diseñador de Azure Machine Learning para entrenar un modelo de
regresión.
Usar un modelo de regresión para la inferencia.
Implementar un modelo de regresión como servicio.
Para completar este módulo, necesitará una suscripción de Microsoft Azure. Si
aún no tiene una, puede solicitar una prueba gratuita
en [Link]
Identificación de escenarios de
aprendizaje automático de regresión
Completado100 XP
3 minutos
La regresión es una forma de aprendizaje automático que se usa para
comprender las relaciones entre variables para predecir un resultado deseado.
La regresión predice una etiqueta numérica o un resultado en función de
variables o características. Por ejemplo, una empresa de venta de automóviles
podría usar las características de un coche (como el tamaño del motor, el
número de asientos, el kilometraje, etc.) para predecir su precio de venta
probable. En este caso, las características del coche son las características y el
precio de venta es la etiqueta.
La regresión es un ejemplo de técnica de aprendizaje automático supervisado en
la que se entrena un modelo con datos que incluyen tanto las características
como los valores conocidos para la etiqueta, de modo que el modelo aprenda
a ajustar las combinaciones de características para la etiqueta. Después de
completar el entrenamiento, puede usar el modelo entrenado para predecir
etiquetas de nuevos elementos para los que la etiqueta se desconoce.
Escenarios de modelos de aprendizaje automático
de regresión
Los modelos de aprendizaje automático de regresión se usan en muchos
sectores. Algunos escenarios son los siguientes:
Uso de características de las casas, como las superficies cuadradas y
el número de habitaciones, para predecir los precios de las casas.
Uso de características de las condiciones de una granja, como el
clima y la calidad del suelo, para predecir el rendimiento de los
cultivos.
Uso de características de una campaña pasada, como los registros
de publicidad, para predecir futuros clics de anuncios.
Siguiente unidad: ¿Qué es Azure Machine
Learning?
¿Qué es Azure Machine Learning?
Completado100 XP
5 minutos
Entrenar e implementar un modelo de Machine Learning eficaz implica una gran
cantidad de trabajo, siendo buena parte de este intensivo en tiempo y en
recursos. Azure Machine Learning es un servicio basado en la nube que permite
simplificar algunas de las tareas para preparar los datos, entrenar un modelo e
implementar un servicio predictivo. Los modelos de aprendizaje automático de
regresión se pueden crear mediante Azure Machine Learning.
Lo más importante es que Azure Machine Learning ayuda a los científicos de
datos a aumentar su eficiencia mediante la automatización de muchas de las
tareas que consumen mucho tiempo asociadas a los modelos de
entrenamiento. Les permite usar recursos de proceso basados en la nube que se
escalan de manera eficaz para manejar grandes volúmenes de datos,
incurriendo en costes solo cuando realmente se usan.
Área de trabajo de Azure Machine Learning
Para usar Azure Machine Learning, debe crear un recurso de área de trabajo en
su suscripción de Azure. Después, puede usar esta área de trabajo para
administrar datos, recursos de proceso, código, modelos y otros artefactos
relacionados con las cargas de trabajo de aprendizaje automático.
Después de crear un área de trabajo de Azure Machine Learning, puede
desarrollar soluciones con el servicio Azure Machine Learning, ya sea con
herramientas de desarrollo o con el portal web de Azure Machine Learning
Studio.
Azure Machine Learning Studio
Azure Machine Learning Studio es un portal web de soluciones de aprendizaje
automático en Azure. Incluye una amplia gama de características y
funcionalidades que ayudan a los científicos de datos a preparar datos, entrenar
modelos, publicar servicios predictivos y supervisar su uso. Para empezar a usar
el portal web, debe asignar el área de trabajo que creó en el Azure Portal a
Azure Machine Learning Studio.
Proceso de Azure Machine Learning
En esencia, Azure Machine Learning es un servicio para entrenar y administrar
modelos de aprendizaje automático, para los que se necesita recursos de
proceso en los que ejecutar el proceso de entrenamiento. Los destinos de
proceso son recursos basados en la nube en los que se pueden ejecutar
procesos de entrenamiento de modelos y exploración de datos.
En Azure Machine Learning Studio, puede administrar los destinos de proceso
para las actividades de ciencia de datos. Puede crear cuatro tipos de recursos de
proceso:
Instancias de proceso: estaciones de trabajo de desarrollo que los
científicos de datos pueden usar para trabajar con datos y modelos.
Clústeres de proceso: clústeres escalables de máquinas virtuales para el
procesamiento a petición de código de experimento.
Clústeres de inferencia: destinos de implementación para servicios
predictivos que usan los modelos entrenados.
Proceso asociado: vínculos a recursos de proceso de Azure existentes,
como clústeres de Azure Virtual Machines o Azure Databricks.
Siguiente unidad: ¿Qué es el diseñador de Azure
Machine Learning?
¿Qué es el diseñador de Azure
Machine Learning?
Completado100 XP
4 minutos
En Estudio de Azure Machine Learning, hay varias maneras de crear modelos de
aprendizaje automático de regresión. Una de ellas consiste en usar una interfaz
visual denominada diseñador, que puede usar para entrenar, probar e
implementar modelos de aprendizaje automático. La interfaz de arrastrar y
colocar usa entradas y salidas claramente definidas que se pueden compartir,
reutilizar y controlar la versión.
Cada proyecto de diseñador, conocido como canalización, tiene un panel
izquierdo para la navegación y un lienzo en el lado derecho. Para usar
el diseñador, identifique los bloques de creación o los componentes necesarios
para el modelo, colóquelos y conéctelos en el lienzo y ejecute un trabajo de
aprendizaje automático.
Pipelines
Las canalizaciones permiten organizar, administrar y reutilizar flujos de trabajo
de aprendizaje automático complejos entre proyectos y usuarios. Una
canalización se inicia con el conjunto de datos desde el que quiere entrenar el
modelo. Cada vez que se ejecuta una canalización, la configuración de esta y sus
resultados se almacenan en el área de trabajo como un trabajo de canalización.
Componentes
Un componente de Azure Machine Learning encapsula un paso en una
canalización de aprendizaje automático. Puede considerar un componente
como una función de programación y como un bloque de creación para las
canalizaciones de Azure Machine Learning. En un proyecto de canalización,
puede acceder a los componentes y recursos de datos desde la
pestaña Biblioteca de recursos del panel izquierdo.
Conjuntos de datos
Puede crear recursos de datos en la página Datos a partir de archivos locales,
un almacén de datos, archivos web y Open Datasets. Estos recursos de datos
aparecerán junto con los conjuntos de datos de ejemplo estándar en
la biblioteca de
recursos del diseñador.
Trabajos de Azure Machine Learning
Un trabajo de Azure Machine Learning (ML) ejecuta una tarea en un destino de
proceso especificado. Los trabajos permiten el seguimiento sistemático de los
flujos de trabajo y la experimentación de aprendizaje automático. Una vez
creado un trabajo, Azure ML mantiene un registro de ejecución del mismo.
Todos los registros de ejecución de los trabajos se pueden ver en Azure ML
Studio.
En el proyecto del diseñador, puede acceder al estado de un trabajo de
canalización mediante la pestaña Trabajos enviados del panel
izquierdo.
Puede encontrar todos los trabajos que ha ejecutado en un área de trabajo en
la página Trabajos.
Siguiente unidad: Comprensión de los pasos para
la regresión
Comprensión de los pasos para la
regresión
Completado100 XP
6 minutos
Puede pensar en los pasos para entrenar y evaluar un modelo de aprendizaje
automático de regresión como los siguientes:
1. Preparar datos: identifique las características y la etiqueta de un conjunto
de datos. Procese previamente o limpie y transforme los datos según sea
necesario.
2. Entrenar el modelo: divida los datos en dos grupos, un entrenamiento y
un conjunto de validación. Entrene un modelo de Machine Learning
mediante el conjunto de datos de entrenamiento. Pruebe el modelo de
Machine Learning para obtener un rendimiento mediante el conjunto de
datos de validación.
3. Evaluar el rendimiento: compare la proximidad de las predicciones del
modelo con las etiquetas conocidas.
4. Implementar un servicio predictivo: después de entrenar un modelo de
Machine Learning, debe convertir la canalización de entrenamiento en
una canalización de inferencia en tiempo real. A continuación, puede
implementar el modelo como una aplicación en un servidor o dispositivo
para que otros usuarios puedan usarlo.
Sigamos estos cuatro pasos a medida que aparecen en el diseñador de Azure.
Preparación de los datos
El diseñador de Azure Machine Learning tiene varios componentes creados
previamente que se pueden usar para preparar los datos para el entrenamiento.
Estos componentes permiten limpiar datos, normalizar características, combinar
tablas,
etc.
Entrenamiento de un modelo
Para entrenar un modelo de regresión, necesita un conjunto de datos que
incluya características históricas, características de la entidad para la que quiere
realizar una predicción y valores de etiqueta conocidos. La etiqueta es la
cantidad que quiere para entrenar un modelo que va a predecir.
Es habitual entrenar el modelo con un subconjunto de los datos, a la vez que se
retienen algunos con los que probar el modelo entrenado. Esto le permite
comparar las etiquetas que predice el modelo con las etiquetas conocidas reales
del conjunto de datos original.
Usará el componente Puntuar modelo del diseñador para generar el valor de
etiqueta de clase predicho. Una vez que conecte todos los componentes, querrá
ejecutar un experimento, que usará el recurso de datos en el lienzo para
entrenar y puntuar un modelo.
Evaluación del rendimiento
Después de entrenar un modelo, es importante evaluar su rendimiento. Hay
muchas métricas y metodologías de rendimiento para evaluar el rendimiento de
las predicciones de un modelo. Para revisar las métricas de evaluación en la
página de trabajo completado, haga clic con el botón derecho en el
componente Evaluar modelo.
Error medio absoluto (EAM): la diferencia media entre los valores
pronosticados y los reales. Este valor se basa en las mismas unidades que
la etiqueta, en este caso, dólares. Cuanto menor sea este valor, mejor será
la predicción del modelo.
Raíz del error cuadrático medio (RECM): raíz cuadrada de la diferencia
cuadrática media entre valores predichos y verdaderos. El resultado es
una métrica basada en la misma unidad que la etiqueta (dólares). En
comparación con el valor EAM (anterior), una diferencia mayor indica una
mayor desviación en los errores individuales (por ejemplo, algunos errores
son muy pequeños, mientras que otros son grandes).
Error cuadrático relativo (ESR): una métrica relativa entre 0 y 1 en
función del cuadrado de las diferencias entre los valores pronosticados y
los reales. Cuanto más cercano a 0 sea el valor de esta métrica, mejor
funciona el modelo. Como esta métrica es relativa, se puede usar para
comparar modelos en los que las etiquetas se encuentran en unidades
distintas.
Error absoluto relativo (EAR): una métrica relativa entre 0 y 1 en función
de las diferencias absolutas entre los valores pronosticados y los reales.
Cuanto más cercano a 0 sea el valor de esta métrica, mejor funciona el
modelo. Al igual que ESR, esta métrica se puede usar para comparar
modelos en los que las etiquetas se encuentran en unidades distintas.
Coeficiente de determinación (R2): esta métrica se suele denominar R
cuadrado y resume la cantidad de la varianza entre los valores reales y los
previstos que se explica en el modelo. Cuanto más cercano a 1 sea esta
valor, mejor funciona el modelo.
Implementación de un servicio predictivo
Tiene la capacidad de implementar un servicio que se puede usar en tiempo
real. Para automatizar el modelo en un servicio que realiza predicciones
continuas, debe crear e implementar una canalización de inferencia.
Canalización de inferencia
Para implementar la canalización, antes debe convertir la canalización de
entrenamiento en una canalización de inferencia en tiempo real. Este proceso
quita los componentes de entrenamiento y agrega entradas y salidas de
servicios web para administrar las solicitudes.
La canalización de inferencia realiza las mismas transformaciones de datos que
la primera canalización para los datos nuevos. Después, usa el modelo
entrenado para deducir o predecir valores de etiqueta en función de sus
características. Este modelo formará la base de un servicio predictivo que puede
publicar para que lo usen las aplicaciones.
Para crear una canalización de inferencia, seleccione el menú situado encima de
un trabajo
completado.
Implementación
Después de crear la canalización de inferencia, puede implementarla como
punto de conexión. En la página Puntos de conexión, puede ver los detalles de
implementación, probar el servicio de canalización con datos de ejemplo y
buscar credenciales para conectar el servicio de canalización a una aplicación
cliente.
El punto de conexión tardará un tiempo en implementarse. El estado de
implementación de la pestaña Detalles indicará Correcto cuando la
implementación se realice correctamente.
En la pestaña Prueba, puede probar el servicio implementado con datos de
ejemplo en un formato JSON. La pestaña Prueba es una herramienta que puede
usar para comprobar rápidamente si el modelo se comporta según lo previsto.
Normalmente, resulta útil probar el servicio antes de conectarlo a una
aplicación.
Puede encontrar credenciales para el servicio en la pestaña Consumir. Estas
credenciales se usan para conectar el modelo de aprendizaje automático
entrenado como servicio a una aplicación cliente.
Siguiente unidad: Ejercicio: Exploración de la
regresión con el diseñador de Azure Machine
Learning
Ejercicio: Exploración de la regresión
con el diseñador de Azure Machine
Learning
Completado100 XP
55 minutos
En este módulo, entrenará un modelo de regresión que predice el precio de un
automóvil en función de sus características.
Nota
Para completar este laboratorio, necesitará una suscripción de Azure en la que
tenga acceso administrativo.
Inicie el ejercicio y siga las instrucciones.
Introducción
Completado100 XP
2 minutos
La clasificación es un ejemplo de técnica de aprendizaje
automático supervisado en la que se entrena un modelo mediante datos que
incluyen tanto las características como los valores conocidos para la etiqueta, de
modo que el modelo aprenda a ajustar las combinaciones de características
para la etiqueta. Después de completar el entrenamiento, puede usar el modelo
entrenado para predecir etiquetas de nuevos elementos para los que la etiqueta
se desconoce.
Puede usar el diseñador de Microsoft Azure Machine Learning para crear
modelos de clasificación mediante una interfaz visual de arrastrar y colocar, sin
necesidad de escribir código.
En este módulo aprenderá a:
Identificación de escenarios de aprendizaje automático de clasificación.
Usar el diseñador de Azure Machine Learning para entrenar un modelo de
clasificación.
Usar un modelo de clasificación para la inferencia.
Implemente y pruebe un modelo de clasificación.
Para completar este módulo, necesitará una suscripción de Microsoft Azure. Si
aún no tiene una, puede solicitar una prueba gratuita
en [Link]
Siguiente unidad: Identificación de escenarios de
aprendizaje automático de clasificación
Identificación de escenarios de
aprendizaje automático de
clasificación
Completado100 XP
3 minutos
La clasificación es una forma de aprendizaje automático que se usa para
predecir a qué categoría o clase pertenece un objeto. Esta técnica de
aprendizaje automático se puede aplicar a escenarios binarios y de varias clases.
Por ejemplo, una clínica podría usar las características de un paciente (como
edad, peso, presión arterial, entre otras) para predecir si el paciente tiene riesgo
de padecer diabetes. En este caso, las características del paciente son
las funciones y la etiqueta es una clasificación de 0 o 1 que representa si es
diabético o no.
Al igual que la regresión, la clasificación es un ejemplo de técnica de
aprendizaje automático supervisado en la que se entrena un modelo mediante
datos que incluyen tanto las características como los valores conocidos para la
etiqueta, de modo que el modelo aprenda a ajustar las combinaciones de
características para la etiqueta. Después de completar el entrenamiento, puede
usar el modelo entrenado para predecir etiquetas de nuevos elementos para los
que la etiqueta se desconoce.
Escenarios para los modelos de aprendizaje
automático de clasificación
Los modelos de aprendizaje automático de clasificación se usan en muchos
sectores. Algunos escenarios son:
Uso de datos clínicos para predecir si un paciente se enfermará o
no.
El uso de datos históricos para predecir si la opinión de texto es
positiva, negativa o neutra.
Uso de características de pequeñas empresas para predecir si una
nueva empresa tendrá éxito.
¿Qué es Azure Machine Learning?
Completado100 XP
4 minutos
Entrenar e implementar un modelo de Machine Learning eficaz implica una gran
cantidad de trabajo, siendo buena parte de este intensivo en tiempo y en
recursos. Azure Machine Learning es un servicio basado en la nube que permite
simplificar algunas de las tareas para preparar los datos, entrenar un modelo e
implementar un servicio predictivo. Los modelos de aprendizaje automático de
clasificación se pueden crear mediante Azure Machine Learning.
Lo más importante es que Azure Machine Learning ayuda a los científicos de
datos a aumentar su eficiencia mediante la automatización de muchas de las
tareas que consumen mucho tiempo asociadas a los modelos de
entrenamiento. Les permite usar recursos de proceso basados en la nube que se
escalan de manera eficaz para manejar grandes volúmenes de datos,
incurriendo en costes solo cuando realmente se usan.
Área de trabajo de Azure Machine Learning
Para usar Azure Machine Learning, debe crear un área de trabajo en la
suscripción de Azure. Después, puede usar esta área de trabajo para administrar
datos, recursos de proceso, código, modelos y otros artefactos relacionados con
las cargas de trabajo de aprendizaje automático.
Después de crear un área de trabajo de Azure Machine Learning, puede
desarrollar soluciones con el servicio Azure Machine Learning, ya sea con
herramientas de desarrollo o con el portal web de Estudio de Azure Machine
Learning.
Azure Machine Learning Studio
Estudio de Azure Machine Learning es un portal web de soluciones de
aprendizaje automático en Azure. Incluye una amplia gama de características y
funcionalidades que ayudan a los científicos de datos a preparar datos, entrenar
modelos, publicar servicios predictivos y supervisar su uso. Para empezar a usar
el portal web, debe asignar el área de trabajo que creó en Azure Portal a Estudio
de Azure Machine Learning.
Proceso de Azure Machine Learning
En esencia, Azure Machine Learning es un servicio para entrenar y administrar
modelos de aprendizaje automático, para los que se necesita recursos de
proceso en los que ejecutar el proceso de entrenamiento. Los destinos de
proceso son recursos basados en la nube en los que se pueden ejecutar
procesos de entrenamiento de modelos y exploración de datos.
En Estudio de Azure Machine Learning, puede administrar los destinos de
proceso para las actividades de ciencia de datos. Puede crear cuatro tipos de
recursos de proceso:
Instancias de proceso: estaciones de trabajo de desarrollo que los
científicos de datos pueden usar para trabajar con datos y modelos.
Clústeres de proceso: clústeres escalables de máquinas virtuales para el
procesamiento a petición de código de experimento.
Clústeres de inferencia: destinos de implementación para servicios
predictivos que usan los modelos entrenados.
Proceso asociado: vínculos a recursos de proceso de Azure existentes,
como clústeres de Azure Virtual Machines o Azure Databricks.
Siguiente unidad: ¿Qué es el diseñador de Azure
Machine Learning?
¿Qué es el diseñador de Azure
Machine Learning?
Completado100 XP
6 minutos
En Azure Machine Learning Studio, hay varias maneras de crear modelos de
aprendizaje automático de clasificación. Una de ellas consiste en usar una
interfaz visual denominada diseñador, que puede usar para entrenar, probar e
implementar modelos de aprendizaje automático. La interfaz de arrastrar y
colocar usa entradas y salidas claramente definidas que se pueden compartir,
reutilizar y controlar la versión.
Cada proyecto de diseñador, conocido como canalización, tiene un panel
izquierdo para la navegación y un lienzo en el lado derecho. Para usar
el diseñador, identifique los bloques de creación o los componentes necesarios
para el modelo, colóquelos y conéctelos en el lienzo y ejecute un trabajo de
aprendizaje automático.
Pipelines
Las canalizaciones permiten organizar, administrar y reutilizar flujos de trabajo
de aprendizaje automático complejos entre proyectos y usuarios. Una
canalización se inicia con el conjunto de datos desde el que quiere entrenar el
modelo. Cada vez que se ejecuta una canalización, la configuración de esta y sus
resultados se almacenan en el área de trabajo como un trabajo de canalización.
Componentes
Un componente de Azure Machine Learning encapsula un paso en una
canalización de aprendizaje automático. Puede considerar un componente
como una función de programación y como un bloque de creación para las
canalizaciones de Azure Machine Learning. En un proyecto de canalización,
puede acceder a los componentes y recursos de datos desde la
pestaña Biblioteca de recursos del panel izquierdo.
Conjuntos de datos
Puede crear recursos de datos en la página Datos a partir de archivos locales,
un almacén de datos, archivos web y Open Datasets. Estos recursos de datos
aparecerán junto con los conjuntos de datos de ejemplo estándar en
la biblioteca de
recursos del diseñador.
Trabajos de Azure Machine Learning
Un trabajo de Azure Machine Learning (ML) ejecuta una tarea en un destino de
proceso especificado. Los trabajos permiten el seguimiento sistemático de los
flujos de trabajo y la experimentación de aprendizaje automático. Una vez
creado un trabajo, Azure ML mantiene un registro de ejecución del mismo.
Todos los registros de ejecución de los trabajos se pueden ver en Azure ML
Studio.
En el proyecto del diseñador, puede acceder al estado de un trabajo de
canalización mediante la pestaña Trabajos enviados del panel
izquierdo.
Puede encontrar todos los trabajos que ha ejecutado en un área de trabajo en
la página Trabajos.
Siguiente unidad: Descripción de los pasos para la
clasificación
Descripción de los pasos para la
clasificación
Completado100 XP
8 minutos
Puede pensar en los pasos para entrenar y evaluar un modelo de Machine
Learning de clasificación como los siguientes:
1. Preparar los datos: identifique las características y la etiqueta de un
conjunto de datos. Procese previamente o limpie y transforme los datos
según sea necesario.
2. Entrenar el modelo: divida los datos en dos grupos, un conjunto de
entrenamiento y uno de validación. Entrene un modelo de Machine
Learning con el conjunto de datos de entrenamiento. Pruebe el modelo
de Machine Learning en cuanto al rendimiento con el conjunto de datos
de validación.
3. Evaluar el rendimiento: compare la proximidad de las predicciones del
modelo con las etiquetas conocidas.
4. Implementar un servicio predictivo: después de entrenar un modelo de
Machine Learning, debe convertir la canalización de entrenamiento en
una canalización de inferencia en tiempo real. A continuación, puede
implementar el modelo como una aplicación en un servidor o un
dispositivo para que otros usuarios puedan usarlo.
Vamos a seguir estos cuatro pasos a medida que aparecen en el diseñador de
Azure.
Preparación de los datos
El diseñador de Azure Machine Learning tiene varios componentes integrados
que se pueden usar para preparar los datos para el entrenamiento. Estos
componentes permiten limpiar datos, normalizar características, combinar
tablas,
etc.
Entrenamiento de un modelo
Para entrenar un modelo de clasificación, necesita un conjunto de datos que
incluya características históricas, características de la entidad para la que quiere
realizar una predicción y valores de etiqueta conocidos. La etiqueta es el
indicador de clase que quiere para entrenar un modelo para predecir.
Es habitual entrenar el modelo con un subconjunto de los datos, a la vez que se
retienen algunos con los que probar el modelo entrenado. Esto le permite
comparar las etiquetas que predice el modelo con las etiquetas conocidas reales
del conjunto de datos original.
Usará el componente Puntuar modelo del diseñador para generar el valor de
etiqueta de clase predicho. Una vez que conecte todos los componentes, querrá
ejecutar un experimento, que usará el recurso de datos del lienzo para entrenar
y puntuar un modelo.
Evaluación del rendimiento
Después de entrenar un modelo, es importante evaluar su rendimiento. Hay
muchas métricas de rendimiento y metodologías para evaluar el rendimiento de
las predicciones de un modelo. Para revisar las métricas de evaluación en la
página del trabajo completado, haga clic con el botón derecho en el
componente Evaluar modelo.
Matriz de confusión
La matriz de confusión es una herramienta que se usa para evaluar la calidad de
las predicciones de un modelo de clasificación. Compara las etiquetas predichas
con las etiquetas reales.
En un modelo de clasificación binaria en el que se predice uno de dos valores
posibles, la matriz de confusión es una cuadrícula de 2x2 en la que se muestran
los recuentos de los valores previstos y reales de las clases 1 y 0. Clasifica los
resultados del modelo en cuatro tipos de resultados. Con nuestro ejemplo de
diabetes, estos resultados pueden ser similares a los siguientes:
Verdadero positivo: el modelo predice que el paciente tiene diabetes y el
paciente realmente la tiene.
Falso positivo: el modelo predice que el paciente tiene diabetes, pero el
paciente realmente no la tiene.
Falso negativo: el modelo predice que el paciente no tiene diabetes, pero
el paciente realmente la tiene.
Verdadero negativo: el modelo predice que el paciente no tiene diabetes y
el paciente realmente no la tiene.
Supongamos que tiene datos para 100 pacientes. Crea un modelo que predice
que un paciente no tiene diabetes el 15 % del tiempo, por lo que predice que 15
personas tienen diabetes y predice que 85 personas no tienen diabetes. En
realidad, supongamos que 25 personas realmente la tienen y 75
personas realmente no la tienen. Esta información se puede presentar en una
matriz de confusión como la siguiente:
En un modelo de clasificación de varias clases (donde hay más de dos clases
posibles), se usa el mismo enfoque para mostrar en formato de tabla cada
combinación posible de recuentos de valores reales y previstos; por tanto, un
modelo con tres clases posibles daría como resultado una matriz de 3x3 con
una línea diagonal de celdas en las que las etiquetas previstas y reales
coincidan.
Entre las métricas que se pueden derivar de la matriz de confusión, se
encuentran las siguientes:
Exactitud: el número de predicciones correctas (verdaderos positivos y
verdaderos negativos) dividido por el número total de predicciones.
Precisión: el número de casos clasificados como positivos que lo son
realmente (el número de verdaderos positivos dividido por el de
verdaderos positivos más los falsos positivos).
Coincidencia: la fracción de casos positivos identificados correctamente
(el número de verdaderos positivos dividido por el de verdaderos
positivos más los falsos negativos).
Puntuación F1: métrica general que básicamente combina la precisión y
la coincidencia.
De estas métricas, la exactitud puede ser la más intuitiva. Sin embargo, debe
tener cuidado al usar la precisión como medida del funcionamiento correcto de
un modelo. Con el modelo que predice que el 15 % de los pacientes tienen
diabetes cuando en realidad el 25 % de los pacientes la tienen podemos calcular
las métricas siguientes:
La precisión del modelo es la siguiente: (10+70)/ 100 = 80 %.
La precisión del modelo es la siguiente: 10/(10+5) = 67 %.
La coincidencia del modelo es 10/(10+15) = 40 %
Selección de un umbral
Un modelo de clasificación predice la probabilidad de cada clase posible. En
otras palabras, el modelo calcula una probabilidad para cada etiqueta predicha.
En el caso de un modelo de clasificación binaria, la probabilidad de una
predicción es un valor comprendido entre 0 y 1. De manera predeterminada,
una probabilidad de predicción igual o superior a 0,5 da como resultado una
predicción de clase de 1, mientras que una predicción por debajo de este umbral
significa que hay una mayor probabilidad de una predicción negativa (recuerde
que las probabilidades de todas las clases suman 1), por lo que la clase
pronosticada sería 0.
El diseñador tiene un control deslizante para el umbral que resulta útil para
revisar cómo cambiaría el rendimiento del modelo en función del umbral
establecido.
Curva ROC y métrica AUC
Otro término para la coincidencia es la tasa de verdaderos positivos, que tiene
una métrica correspondiente denominada tasa de falsos positivos, que mide el
número de casos negativos que se han identificado incorrectamente como
positivos en comparación con el número de casos negativos reales. Trazar estas
métricas entre sí para cada valor del umbral posible entre 0 y 1 da como
resultado una curva, conocida como curva ROC (ROC significa característica
operativa del receptor, pero la mayoría de los científicos de datos simplemente
la llaman curva ROC). En un modelo ideal, la curva ascendería por el lado
izquierdo y discurriría por la parte superior, para cubrir todo el área del gráfico.
Cuanto mayor sea el área bajo la curva de la métrica AUC (que puede ser
cualquier valor comprendido entre 0 y 1), mejor será el rendimiento del modelo.
Puede revisar la curva ROC en Resultados de la evaluación.
Implementación de un servicio predictivo
Tiene la capacidad de implementar un servicio que se puede usar en tiempo
real. Para automatizar el modelo en un servicio que realice predicciones
continuas, debe crear e implementar una canalización de inferencia.
Canalización de inferencia
Para implementar la canalización, antes debe convertir la canalización de
entrenamiento en una canalización de inferencia en tiempo real. Este proceso
quita los componentes de entrenamiento y agrega entradas y salidas de
servicios web para administrar las solicitudes.
La canalización de inferencia realiza las mismas transformaciones de datos que
la primera canalización para los datos nuevos. Después, usa el modelo
entrenado para deducir o predecir valores de etiqueta en función de sus
características. Este modelo formará la base de un servicio predictivo que puede
publicar para que lo usen las aplicaciones.
Para crear una canalización de inferencia, seleccione el menú situado encima de
un trabajo
completado.
Implementación
Después de crear la canalización de inferencia, puede implementarla como un
punto de conexión. En la página Puntos de conexión, puede ver los detalles de
implementación, probar el servicio de canalización con datos de ejemplo y
buscar credenciales para conectar el servicio de canalización a una aplicación
cliente.
El punto de conexión tardará un tiempo en implementarse. El estado de
implementación de la pestaña Detalles indicará Correcto cuando la
implementación se realice correctamente.
En la pestaña Prueba, puede probar el servicio implementado con datos de
ejemplo en formato JSON. La pestaña Prueba es una herramienta que puede
usar para comprobar rápidamente si el modelo se comporta según lo previsto.
Normalmente, resulta útil probar el servicio antes de conectarlo a una
aplicación.
Puede encontrar las credenciales para el servicio en la pestaña Consumir. Estas
credenciales se usan para conectar el modelo de Machine Learning entrenado
como un servicio a una aplicación cliente.
Siguiente unidad: Ejercicio: Exploración de la
clasificación con el diseñador de Azure Machine
Learning
Ejercicio: Exploración de la
clasificación con el diseñador de
Azure Machine Learning
Completado100 XP
60 minutos
En este ejercicio, creará un modelo de clasificación que predice si es probable
que un paciente contraiga diabetes en función de factores como su índica de
masa corporal, edad, niveles de glucosa y otros indicadores.
Nota
Para completar este laboratorio, necesitará una suscripción de Azure en la que
tenga acceso administrativo.
Inicie el ejercicio y siga las instrucciones.
Siguiente unidad: Comprobación de conocimiento