{"id":571935,"date":"2025-06-05T03:21:49","date_gmt":"2025-06-05T02:21:49","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=pycharm&#038;p=571935"},"modified":"2025-06-05T03:21:55","modified_gmt":"2025-06-05T02:21:55","slug":"deteccion-de-anomalias-en-el-aprendizaje-automatico-utilizando-python","status":"publish","type":"pycharm","link":"https:\/\/blog.jetbrains.com\/es\/pycharm\/2025\/06\/deteccion-de-anomalias-en-el-aprendizaje-automatico-utilizando-python\/","title":{"rendered":"Detecci\u00f3n de anomal\u00edas en el aprendizaje autom\u00e1tico utilizando Python"},"content":{"rendered":"<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone wp-image-573189 size-full\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/06\/PC-social-BlogFeatured-1280x720-2x-3.png\" alt=\"\" width=\"2559\" height=\"1439\" \/><\/figure>\n<p>En los \u00faltimos a\u00f1os, muchas de nuestras aplicaciones se han visto impulsadas por el gran volumen de datos que somos capaces de recopilar y procesar. Se podr\u00eda decir que estamos en la era de los datos. Uno de los aspectos esenciales del manejo de una cantidad tan ingente de datos es la <strong>detecci\u00f3n de anomal\u00edas<\/strong>: procesos que nos permiten identificar valores at\u00edpicos, datos que se salen de los l\u00edmites de lo esperado y demuestran un comportamiento fuera de la norma. En la investigaci\u00f3n cient\u00edfica, los puntos de datos an\u00f3malos podr\u00edan ser causa de problemas t\u00e9cnicos y habr\u00eda que descartarlos a la hora de sacar conclusiones, o podr\u00edan conducir a nuevos descubrimientos.<\/p>\n<p>En este art\u00edculo del blog, veremos por qu\u00e9 es \u00fatil emplear el aprendizaje autom\u00e1tico para la detecci\u00f3n de anomal\u00edas y exploraremos t\u00e9cnicas clave para detectar anomal\u00edas utilizando Python. Aprender\u00e1 a implementar m\u00e9todos populares como OneClassSVM y Isolation Forest, ver\u00e1 ejemplos de c\u00f3mo visualizar estos resultados y comprender\u00e1 c\u00f3mo aplicarlos a problemas del mundo real.<\/p>\n<h2 class=\"wp-block-heading\">\u00bfD\u00f3nde se utiliza la detecci\u00f3n de anomal\u00edas?<\/h2>\n<p>La detecci\u00f3n de anomal\u00edas tambi\u00e9n ha formado una parte crucial de la inteligencia empresarial moderna, ya que proporciona informaci\u00f3n sobre lo que podr\u00eda ir mal y tambi\u00e9n puede identificar problemas potenciales. He aqu\u00ed algunos ejemplos del uso de la detecci\u00f3n de anomal\u00edas en la empresa actual.<\/p>\n<p><strong>Alertas de seguridad<\/strong><\/p>\n<p>Hay algunos ataques de ciberseguridad que pueden detectarse mediante la detecci\u00f3n de anomal\u00edas; por ejemplo, un pico en el volumen de solicitudes puede indicar un <a href=\"https:\/\/en.wikipedia.org\/wiki\/Denial-of-service_attack\" target=\"_blank\" rel=\"noopener\">ataque DDoS<\/a>, mientras que un comportamiento sospechoso de inicio de sesi\u00f3n, como varios intentos fallidos, puede indicar un acceso no autorizado. La detecci\u00f3n de comportamientos sospechosos de los usuarios puede indicar posibles amenazas a la ciberseguridad, y las empresas pueden actuar en consecuencia para prevenir o minimizar los da\u00f1os.<\/p>\n<p><strong>Detecci\u00f3n del fraude<\/strong><\/p>\n<p>En las organizaciones financieras, por ejemplo, los bancos pueden utilizar la detecci\u00f3n de anomal\u00edas para destacar actividades sospechosas en las cuentas, que pueden ser un indicio de actividades ilegales como el blanqueo de dinero o la usurpaci\u00f3n de identidad. Las transacciones sospechosas tambi\u00e9n pueden ser un signo de fraude con tarjeta de cr\u00e9dito.<\/p>\n<p><strong>Observabilidad<\/strong><\/p>\n<p>Una de las pr\u00e1cticas habituales para los servicios web es recopilar m\u00e9tricas del rendimiento en tiempo real del servicio si se produce un comportamiento an\u00f3malo en el sistema. Por ejemplo, un pico en el uso de la memoria puede mostrar que algo en el sistema no est\u00e1 funcionando correctamente, y puede que los ingenieros deban solucionarlo inmediatamente para evitar una interrupci\u00f3n del servicio.<\/p>\n<h2 class=\"wp-block-heading\">\u00bfPor qu\u00e9 utilizar el aprendizaje autom\u00e1tico para la detecci\u00f3n de anomal\u00edas?<\/h2>\n<p>Aunque los m\u00e9todos estad\u00edsticos tradicionales tambi\u00e9n pueden ayudar a encontrar valores at\u00edpicos, el uso del aprendizaje autom\u00e1tico para la detecci\u00f3n de anomal\u00edas ha supuesto un cambio en las reglas del juego. Con los algoritmos de aprendizaje autom\u00e1tico se pueden analizar datos m\u00e1s complejos (por ejemplo, con m\u00faltiples par\u00e1metros) de una sola vez. Las t\u00e9cnicas de aprendizaje autom\u00e1tico tambi\u00e9n proporcionan un medio para analizar datos categ\u00f3ricos que no son f\u00e1ciles de analizar utilizando m\u00e9todos estad\u00edsticos tradicionales, que son m\u00e1s adecuados para datos num\u00e9ricos.<\/p>\n<p>Muchas veces, estos algoritmos de detecci\u00f3n de anomal\u00edas se programan y pueden implementarse como una aplicaci\u00f3n (consulte nuestro tutorial <a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2024\/09\/how-to-use-fastapi-for-machine-learning\/\">FastAPI para el aprendizaje autom\u00e1tico<\/a>) y ejecutarse seg\u00fan se solicite o a intervalos programados para detectar cualquier anomal\u00eda. Esto significa que pueden impulsar acciones inmediatas dentro de la empresa y tambi\u00e9n pueden utilizarse como herramientas de informaci\u00f3n para que los equipos de inteligencia empresarial revisen y ajusten las estrategias.<\/p>\n<h2 class=\"wp-block-heading\">Tipos de t\u00e9cnicas y algoritmos de detecci\u00f3n de anomal\u00edas<\/h2>\n<p>En general, existen dos tipos principales de detecci\u00f3n de anomal\u00edas: la detecci\u00f3n de valores at\u00edpicos y la detecci\u00f3n de novedades.<\/p>\n<p><strong>Detecci\u00f3n de valores at\u00edpicos<\/strong><\/p>\n<p>La detecci\u00f3n de valores at\u00edpicos se denomina a veces detecci\u00f3n de anomal\u00edas <strong>no supervisada<\/strong>, ya que se supone que en los datos de entrenamiento existen algunas anomal\u00edas no detectadas (por tanto, no etiquetadas), y el enfoque consiste en utilizar algoritmos de aprendizaje autom\u00e1tico no supervisados para seleccionarlas. Algunos de estos algoritmos son <a href=\"https:\/\/scikit-learn.org\/stable\/modules\/outlier_detection.html\" target=\"_blank\" rel=\"noopener\">las m\u00e1quinas de vectores de apoyo (SVM) de una clase, Isolation Forest, Local Outlier Factor y Elliptic Envelope<\/a>.<\/p>\n<p><strong>Detecci\u00f3n de novedades<\/strong><\/p>\n<p>Por otro lado, la detecci\u00f3n de novedades se denomina a veces detecci\u00f3n de anomal\u00edas <strong>semisupervisada<\/strong>. Puesto que suponemos que todos los datos de entrenamiento no consisten \u00fanicamente en anomal\u00edas, todos se etiquetan como normales. El objetivo es detectar si los nuevos datos son una anomal\u00eda o no, lo que a veces se denomina una novedad. Los algoritmos utilizados en la detecci\u00f3n de valores at\u00edpicos tambi\u00e9n pueden emplearse para la detecci\u00f3n de novedades, siempre que no haya anomal\u00edas en los datos de entrenamiento.<\/p>\n<p>Aparte de la detecci\u00f3n de valores at\u00edpicos y la detecci\u00f3n de novedades mencionadas, tambi\u00e9n es muy com\u00fan requerir la detecci\u00f3n de anomal\u00edas en los datos de series temporales. Sin embargo, dado que el enfoque y la t\u00e9cnica utilizados para los datos de series temporales suelen ser diferentes de los algoritmos mencionados anteriormente, hablaremos de ellos en detalle m\u00e1s adelante.<\/p>\n<h2 class=\"wp-block-heading\">Ejemplo de c\u00f3digo: b\u00fasqueda de anomal\u00edas en el conjunto de datos de colmenas<\/h2>\n<p>En este art\u00edculo del blog, utilizaremos este <a href=\"https:\/\/www.kaggle.com\/datasets\/vivovinco\/beehives\/data\" target=\"_blank\" rel=\"noopener\">conjunto de datos de colmenas<\/a> como ejemplo para detectar cualquier anomal\u00eda en las colmenas. Este conjunto de datos proporciona varias mediciones de la colmena (incluidas la temperatura y la humedad relativa) en varios momentos.<\/p>\n<p>Aqu\u00ed mostraremos dos m\u00e9todos muy diferentes para descubrir anomal\u00edas. Son OneClassSVM, que se basa en la tecnolog\u00eda de m\u00e1quina de vectores de soporte, que utilizaremos para trazar los l\u00edmites de decisi\u00f3n, y Isolation Forest, que es un m\u00e9todo de conjunto similar a Random Forest.<\/p>\n<h3 class=\"wp-block-heading\">Ejemplo: OneClassSVM<\/h3>\n<p>En este primer ejemplo, utilizaremos los datos de la colmena 17, suponiendo que las abejas mantendr\u00e1n su colmena en un entorno agradable constante para la colonia; podemos observar si esto es cierto y si hay momentos en los que la colmena sufre anomal\u00edas en los niveles de temperatura y humedad relativa. Utilizaremos <a href=\"https:\/\/scikit-learn.org\/stable\/modules\/generated\/sklearn.svm.OneClassSVM.html\" target=\"_blank\" rel=\"noopener\">OneClassSVM<\/a> para ajustar nuestros datos y observar los l\u00edmites de la toma de decisiones en un gr\u00e1fico de dispersi\u00f3n.<\/p>\n<p>\u00abSVM\u00bb en OneClassSVM son las siglas de <a href=\"https:\/\/scikit-learn.org\/stable\/modules\/svm.html#svm\" target=\"_blank\" rel=\"noopener\">support vector machine<\/a> (m\u00e1quina de vectores de soporte), que es un algoritmo popular de aprendizaje autom\u00e1tico para la clasificaci\u00f3n y las regresiones. Mientras que las m\u00e1quinas de vectores soporte pueden utilizarse para <a href=\"https:\/\/scikit-learn.org\/stable\/modules\/svm.html#mathematical-formulation\" target=\"_blank\" rel=\"noopener\">clasificar puntos de datos en dimensiones elevadas<\/a>, al elegir un n\u00facleo y un par\u00e1metro escalar para definir una frontera podemos crear una frontera de decisi\u00f3n que incluya la mayor\u00eda de los puntos de datos (datos normales), al tiempo que retenemos un peque\u00f1o n\u00famero de anomal\u00edas fuera de las fronteras para representar la probabilidad (nu) de encontrar una nueva anomal\u00eda. El m\u00e9todo de utilizar m\u00e1quinas de vectores de soporte para la detecci\u00f3n de anomal\u00edas se trata en un art\u00edculo de Scholkopf et al. titulado <a href=\"https:\/\/www.microsoft.com\/en-us\/research\/wp-content\/uploads\/2016\/02\/tr-99-87.pdf\" target=\"_blank\" rel=\"noopener\"><em>Estimating the Support of a High-Dimensional Distribution<\/em><\/a>.<\/p>\n<h4 class=\"wp-block-heading\"><strong>1. Inicie un proyecto de Jupyter<\/strong><\/h4>\n<p>Al iniciar un <a href=\"https:\/\/www.jetbrains.com\/help\/pycharm\/creating-and-running-your-first-python-project.html\" target=\"_blank\" rel=\"noopener\">nuevo proyecto<\/a> en PyCharm (Professional 2024.2.2), seleccione <em>Jupyter<\/em> en <em>Python<\/em>.<\/p>\n<div class=\"buttons\">\n<div class=\"buttons__row\"><a class=\"btn\" href=\"https:\/\/www.jetbrains.com\/pycharm\/data-science\/\" target=\"\" rel=\"noopener\">Comience con PyCharm Pro de forma gratuita<\/a><\/div>\n<\/div>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-537600\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/01\/image-34.png\" alt=\"Iniciar un proyecto de Jupyter en PyCharm\" width=\"1592\" height=\"1292\" \/><\/figure>\n<p>La ventaja de utilizar un <a href=\"https:\/\/www.jetbrains.com\/help\/pycharm\/scientific-mode.html\" target=\"_blank\" rel=\"noopener\">proyecto Jupyter<\/a> (antes tambi\u00e9n conocido como proyecto cient\u00edfico) en PyCharm es que se genera una estructura de archivos para usted, que incluye una carpeta para almacenar sus datos y una carpeta para almacenar todos los <a href=\"https:\/\/www.jetbrains.com\/help\/pycharm\/jupyter-notebook-support.html\" target=\"_blank\" rel=\"noopener\">notebooks de Jupyter<\/a>, de modo que pueda guardar todos sus experimentos en un \u00fanico lugar.\u00a0<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-537611\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/01\/image-35.png\" alt=\"Proyectos Jupyter en PyCharm\" width=\"996\" height=\"886\" \/><\/figure>\n<p>Otra gran ventaja es que podemos representar gr\u00e1ficos muy f\u00e1cilmente con <a href=\"https:\/\/matplotlib.org\/index.html\" target=\"_blank\" rel=\"noopener\">Matplotlib<\/a>. Lo ver\u00e1 en los pasos siguientes.<\/p>\n<h4 class=\"wp-block-heading\"><strong>2. Instale dependencias<\/strong><\/h4>\n<p>Descargue <a href=\"https:\/\/github.com\/Cheukting\/anomaly-detection\/blob\/main\/requirements.txt\" target=\"_blank\" rel=\"noopener\">requirements.txt<\/a> del repositorio GitHub correspondiente. Una vez que lo sit\u00fae en el directorio del proyecto y lo abra en PyCharm, ver\u00e1 un aviso pidi\u00e9ndole que instale las bibliotecas que faltan.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-537625\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/01\/dependencies.png\" alt=\"Instalar dependencias en PyCharm\" width=\"1600\" height=\"524\" \/><\/figure>\n<p>Haga clic en <em>Install requirements<\/em> y se instalar\u00e1n todos los requisitos autom\u00e1ticamente. En este proyecto utilizamos Python 3.11.1.<\/p>\n<h4 class=\"wp-block-heading\"><strong>3. Importe e inspeccione los datos<\/strong><\/h4>\n<p>Puede descargar el <a href=\"https:\/\/www.kaggle.com\/datasets\/vivovinco\/beehives\/data\" target=\"_blank\" rel=\"noopener\">conjunto de datos \u00abBeehives\u00bb (Colmenas) de Kaggle<\/a> o de este <a href=\"https:\/\/github.com\/Cheukting\/anomaly-detection\/tree\/main\/data\" target=\"_blank\" rel=\"noopener\">repositorio de GitHub<\/a>. Coloque los tres CSV en la carpeta <em>Data<\/em>. A continuaci\u00f3n, en main.py, introduzca el siguiente c\u00f3digo:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import pandas as pd\n\ndf = pd.read_csv('data\/Hive17.csv', sep=\";\")\ndf = df.dropna()\nprint(df.head())<\/pre>\n<p>Por \u00faltimo, pulse el bot\u00f3n <em>Run<\/em> de la esquina superior derecha de la pantalla y nuestro c\u00f3digo se ejecutar\u00e1 en la consola de Python, lo que nos dar\u00e1 una idea del aspecto de nuestros datos.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-537636\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/01\/image-1.gif\" alt=\"Importar datos en PyCharm\" width=\"1230\" height=\"938\" \/><\/figure>\n<h4 class=\"wp-block-heading\"><strong>4. Ajuste los puntos de datos e inspecci\u00f3nelos en un gr\u00e1fico<\/strong><\/h4>\n<p>Puesto que utilizaremos el OneClassSVM de scikit-learn, lo importaremos junto con DecisionBoundaryDisplay y Matplotlib utilizando el c\u00f3digo siguiente:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from sklearn.svm import OneClassSVM\nfrom sklearn.inspection import DecisionBoundaryDisplay\n\nimport matplotlib.pyplot as plt<\/pre>\n<p>Seg\u00fan la descripci\u00f3n de los datos, sabemos que la columna T17 representa la temperatura de la colmena, y RH17 representa la humedad relativa de la colmena. Extraeremos el valor de estas dos columnas como entrada:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">X = df[[\"T17\", \"RH17\"]].values<\/pre>\n<p>A continuaci\u00f3n, crearemos y ajustaremos el modelo. Tenga en cuenta que primero probaremos la configuraci\u00f3n predeterminada:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">estimator = OneClassSVM().fit(X)<\/pre>\n<p>A continuaci\u00f3n, mostraremos el l\u00edmite de decisi\u00f3n junto con los puntos de datos:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">disp = DecisionBoundaryDisplay.from_estimator(\n    estimator,\n    X,\n    response_method=\"decision_function\",\n    plot_method=\"contour\",\n    xlabel=\"Temperature\", ylabel=\"Humidity\",\n    levels=[0],\n)\ndisp.ax_.scatter(X[:, 0], X[:, 1])\nplt.show()<\/pre>\n<p>Ahora, guarde y pulse <em>Run<\/em> de nuevo, y ver\u00e1 que el gr\u00e1fico se muestra en una ventana aparte para su inspecci\u00f3n.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-537647\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/01\/image-36.png\" alt=\"Ajuste los puntos de datos e inspecci\u00f3nelos en un gr\u00e1fico en PyCharm\" width=\"1600\" height=\"1049\" \/><\/figure>\n<h4 class=\"wp-block-heading\"><strong>5. Refina los hiperpar\u00e1metros<\/strong><\/h4>\n<p>Como muestra el gr\u00e1fico anterior, el l\u00edmite de decisi\u00f3n no se ajusta muy bien a los puntos de datos. Los puntos de datos consisten en un par de formas irregulares en lugar de un \u00f3valo. Para refinar nuestro modelo, tenemos que proporcionar un valor espec\u00edfico de <a href=\"https:\/\/scikit-learn.org\/stable\/modules\/generated\/sklearn.linear_model.SGDOneClassSVM.html\" target=\"_blank\" rel=\"noopener\">\u00abnu\u00bb y \u00abgamma\u00bb al modelo OneClassSVM<\/a>. Puede probarlo usted mismo, pero tras un par de pruebas, parece que \u00abnu=0,1, gamma=0,05\u00bb da el mejor resultado.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-537777\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/01\/fine-tune-hyperparameters.png\" alt=\"Refinado de los hiperpar\u00e1metros en PyCharm\" width=\"1274\" height=\"957\" \/><\/figure>\n<h3 class=\"wp-block-heading\">Ejemplo: Isolation Forest<\/h3>\n<p><a href=\"https:\/\/scikit-learn.org\/stable\/modules\/generated\/sklearn.ensemble.IsolationForest.html\" target=\"_blank\" rel=\"noopener\">Isolation Forest<\/a> es un <a href=\"https:\/\/scikit-learn.org\/stable\/api\/sklearn.ensemble.html\" target=\"_blank\" rel=\"noopener\">m\u00e9todo basado en conjuntos<\/a>, similar al m\u00e9todo de clasificaci\u00f3n m\u00e1s popular <a href=\"https:\/\/scikit-learn.org\/stable\/modules\/ensemble.html#forest\" target=\"_blank\" rel=\"noopener\"> Random Forest<\/a>. Seleccionando aleatoriamente caracter\u00edsticas y valores de separaci\u00f3n, crear\u00e1 muchos \u00e1rboles de decisi\u00f3n, y la longitud de la ruta desde la ra\u00edz del \u00e1rbol hasta el nodo que toma la decisi\u00f3n se promediar\u00e1 sobre todos los \u00e1rboles (de ah\u00ed lo de \u00abForest\u00bb, bosque). Una longitud media de la ruta corta indica anomal\u00edas.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-537669\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/01\/isolation-forest.png\" alt=\"Isolation Forest\" width=\"1600\" height=\"900\" \/>\n<figcaption class=\"wp-element-caption\"><em>Una ruta de decisi\u00f3n corta suele indicar datos muy diferentes de los dem\u00e1s<\/em><\/figcaption>\n.<\/figure>\n<p>Ahora, comparemos el resultado de OneClassSVM con IsolationForest. Para ello, haremos dos gr\u00e1ficos de los l\u00edmites de decisi\u00f3n tomados por los dos algoritmos. En los pasos siguientes, nos basaremos en el script anterior utilizando los mismos <a href=\"https:\/\/www.kaggle.com\/datasets\/vivovinco\/beehives\/data\" target=\"_blank\" rel=\"noopener\">datos de la colmena 17<\/a>.<\/p>\n<h4 class=\"wp-block-heading\"><strong>1. Importe IsolationForest<\/strong><\/h4>\n<p>IsolationForest se puede importar desde las categor\u00edas de conjuntos en Scikit-learn:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from sklearn.ensemble import IsolationForest<\/pre>\n<h4 class=\"wp-block-heading\"><strong>2. Refactorice y a\u00f1ada un nuevo estimador<\/strong><\/h4>\n<p>Como ahora tendremos dos estimadores diferentes, pong\u00e1moslos en una lista:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">estimators = [\n    OneClassSVM(nu=0.1, gamma=0.05).fit(X),\n    IsolationForest(n_estimators=100).fit(X)\n]<\/pre>\n<p>Despu\u00e9s, utilizaremos un bucle \u00abfor\u00bb para iterar por todos los estimadores.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">for estimator in estimators:\n    disp = DecisionBoundaryDisplay.from_estimator(\n        estimator,\n        X,\n        response_method=\"decision_function\",\n        plot_method=\"contour\",\n        xlabel=\"Temperature\", ylabel=\"Humidity\",\n        levels=[0],\n    )\n    disp.ax_.scatter(X[:, 0], X[:, 1])\n    plt.show()<\/pre>\n<p>Como toque final, tambi\u00e9n a\u00f1adiremos un t\u00edtulo a cada uno de los gr\u00e1ficos para facilitar su inspecci\u00f3n. Para ello, a\u00f1adiremos lo siguiente despu\u00e9s de disp.ax_.scatter:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">disp.ax_.set_title(\n        f\"Decision boundary using {estimator.__class__.__name__}\"\n    )<\/pre>\n<p>Descubrir\u00e1 que refactorizar utilizando PyCharm es muy f\u00e1cil con las sugerencias de autocompletado que proporciona.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-537733\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/01\/image-40.png\" alt=\"Refactorizaci\u00f3n mediante autocompletado en PyCharm\" width=\"1600\" height=\"628\" \/><\/figure>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-537711\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/01\/image-39.png\" alt=\"Autocompletado en PyCharm\" width=\"1520\" height=\"546\" \/><\/figure>\n<h4 class=\"wp-block-heading\"><strong>3. Ejecute el c\u00f3digo<\/strong><\/h4>\n<p>Como antes, ejecutar el c\u00f3digo es tan f\u00e1cil como pulsar el bot\u00f3n <em>Run<\/em> de la esquina superior derecha. Tras ejecutar el c\u00f3digo esta vez, deber\u00edamos obtener dos gr\u00e1ficos.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-537722\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/01\/run-the-code.gif\" alt=\"Ejecutar el c\u00f3digo en PyCharm\" width=\"1056\" height=\"582\" \/><\/figure>\n<p>Puede ojear f\u00e1cilmente los dos gr\u00e1ficos con la vista previa de la derecha. Como puede ver, el l\u00edmite de decisi\u00f3n es bastante diferente si se utilizan distintos algoritmos. Al realizar la detecci\u00f3n de anomal\u00edas, merece la pena experimentar con varios algoritmos y par\u00e1metros para encontrar el que mejor se adapte al caso.<\/p>\n<h2 class=\"wp-block-heading\">Siguiente paso: detecci\u00f3n de anomal\u00edas en datos de series temporales<\/h2>\n<p>Si los datos son como los de nuestra colmena de abejas, que es una serie temporal, existen m\u00e9todos adicionales para distinguir las anomal\u00edas. Como las series temporales tienen tendencias y periodos, todo aquello que se salga de este patr\u00f3n de tendencias y periodos puede considerarse una anomal\u00eda. Entre los m\u00e9todos m\u00e1s populares para detectar anomal\u00edas en las series temporales se encuentran la descomposici\u00f3n STL y la predicci\u00f3n LSTM.<\/p>\n<p>Aprenda a utilizar estos m\u00e9todos para detectar anomal\u00edas en las series temporales <a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2025\/01\/anomaly-detection-in-time-series\/\" data-type=\"link\" data-id=\"https:\/\/blog.jetbrains.com\/pycharm\/2025\/01\/anomaly-detection-in-time-series\/\">en este art\u00edculo del blog<\/a>.<\/p>\n<h2 class=\"wp-block-heading\">Resumen<\/h2>\n<p>La detecci\u00f3n de anomal\u00edas ha demostrado ser un aspecto importante de la inteligencia empresarial, y ser capaz de identificar anomal\u00edas y solicitar que se tomen medidas inmediatas es esencial en algunos sectores empresariales. Utilizar el modelo de aprendizaje autom\u00e1tico adecuado para detectar autom\u00e1ticamente las anomal\u00edas puede ayudar a analizar vol\u00famenes de datos complicados y elevados en poco tiempo. En este art\u00edculo del blog, hemos demostrado c\u00f3mo identificar anomal\u00edas utilizando modelos estad\u00edsticos como OneClassSVM.<\/p>\n<p>Para saber m\u00e1s sobre el uso de PyCharm para el aprendizaje autom\u00e1tico, consulte <a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2022\/06\/start-studying-machine-learning-with-pycharm\/\">Start Studying Machine Learning With PyCharm<\/a> y <a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2024\/09\/how-to-use-jupyter-notebooks-in-pycharm\/\">How to Use Jupyter Notebooks in PyCharm<\/a>.<\/p>\n<h2 class=\"wp-block-heading\">Detectar anomal\u00edas utilizando PyCharm<\/h2>\n<p>Con el proyecto Jupyter de PyCharm Professional, puede organizar f\u00e1cilmente su proyecto de detecci\u00f3n de anomal\u00edas con muchos archivos de datos y notebooks. Se pueden generar gr\u00e1ficos de salida para inspeccionar las anomal\u00edas y los diagramas son muy accesibles en PyCharm. Otras funciones, como las sugerencias de autocompletado, hacen que navegar por todos los modelos de Scikit-learn y los ajustes de trazado de Matplotlib sea facil\u00edsimo.<\/p>\n<p>D\u00e9 un nuevo impulso a su proyecto de ciencia de datos utilizando PyCharm; eche un vistazo a las <a href=\"https:\/\/www.jetbrains.com\/pycharm\/data-science\/\" target=\"_blank\" rel=\"noopener\">funciones de ciencia de datos<\/a> que se ofrecen para agilizar su flujo de trabajo de ciencia de datos.<\/p>\n<div class=\"buttons\">\n<div class=\"buttons__row\"><a class=\"btn\" href=\"https:\/\/www.jetbrains.com\/pycharm\/data-science\/\" target=\"\" rel=\"noopener\">Comience con PyCharm Pro de forma gratuita<\/a><\/div>\n<\/div>\n\n\n<p>A<em>rt\u00edculo original en ingl\u00e9s de:<\/em><\/p>\n\n\n    <div class=\"about-author \">\n        <div class=\"about-author__box\">\n            <div class=\"row\">\n                <div class=\"about-author__box-img\">\n                    <img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/01\/CheukTingHo-Kimono-e1738750639162-200x200.jpg\" width=\"200\" height=\"200\" alt=\"Cheuk Ting Ho\" loading=\"lazy\"  class=\"avatar avatar-200 wp-user-avatar wp-user-avatar-200 photo avatar-default\">\n                <\/div>\n                <div class=\"about-author__box-text\">\n                                            <h4>Cheuk Ting Ho<\/h4>\n                                                        <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n\n\n","protected":false},"author":1086,"featured_media":573189,"comment_status":"closed","ping_status":"closed","template":"","categories":[952,1401],"tags":[8670],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/pycharm\/571935"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/pycharm"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/types\/pycharm"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/users\/1086"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/comments?post=571935"}],"version-history":[{"count":4,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/pycharm\/571935\/revisions"}],"predecessor-version":[{"id":573202,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/pycharm\/571935\/revisions\/573202"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/media\/573189"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/media?parent=571935"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/categories?post=571935"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/tags?post=571935"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/cross-post-tag?post=571935"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}