{"id":571933,"date":"2025-06-05T03:15:23","date_gmt":"2025-06-05T02:15:23","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=pycharm&#038;p=571933"},"modified":"2025-06-05T03:15:29","modified_gmt":"2025-06-05T02:15:29","slug":"deteccao-de-anomalias-em-aprendizado-de-maquina-usando-python","status":"publish","type":"pycharm","link":"https:\/\/blog.jetbrains.com\/pt-br\/pycharm\/2025\/06\/deteccao-de-anomalias-em-aprendizado-de-maquina-usando-python\/","title":{"rendered":"Detec\u00e7\u00e3o de anomalias em aprendizado de m\u00e1quina usando Python"},"content":{"rendered":"<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone wp-image-573175 size-full\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/05\/PC-social-BlogFeatured-1280x720-2x-22.png\" alt=\"\" width=\"2559\" height=\"1439\" \/><\/figure>\n<p>Nos \u00faltimos anos, muitas das nossas aplica\u00e7\u00f5es v\u00eam sendo orientadas pelo grande volume de dados que podemos coletar e processar. Pode-se dizer que estamos na era dos dados. Um dos aspectos essenciais de se lidar com um volume t\u00e3o grande de dados \u00e9 a <strong>detec\u00e7\u00e3o de anomalias<\/strong> \u2014 processos que nos permitem identificar valores at\u00edpicos, dados que est\u00e3o fora dos limites esperados e t\u00eam um comportamento fora da norma. Na pesquisa cient\u00edfica, pontos de dados an\u00f4malos podem causar problemas t\u00e9cnicos e talvez precisem ser descartados ao tirar conclus\u00f5es, mas tamb\u00e9m podem levar a novas descobertas.<\/p>\n<p>Nesta postagem de blog, veremos por que \u00e9 \u00fatil usar o aprendizado de m\u00e1quinas para detectar anomalias e exploraremos as principais t\u00e9cnicas de detec\u00e7\u00e3o de anomalias usando Python. Voc\u00ea aprender\u00e1 como implementar m\u00e9todos populares, como o OneClassSVM e o Isolation Forest, ver\u00e1 exemplos de como visualizar seus resultados e compreender\u00e1 como aplic\u00e1-los a problemas do mundo real.<\/p>\n<h2 class=\"wp-block-heading\">Onde se usa a detec\u00e7\u00e3o de anomalias?<\/h2>\n<p>A detec\u00e7\u00e3o de anomalias tamb\u00e9m tem sido uma parte crucial da intelig\u00eancia de neg\u00f3cios moderna, pois ela fornece insights sobre o que poderia dar errado e tamb\u00e9m pode identificar problemas em potencial. Veja alguns exemplos de usos atuais da detec\u00e7\u00e3o de anomalias nos neg\u00f3cios:<\/p>\n<p><strong>Alertas de seguran\u00e7a<\/strong><\/p>\n<p>Alguns ataques de seguran\u00e7a cibern\u00e9tica podem ser identificados atrav\u00e9s da detec\u00e7\u00e3o de anomalias; por exemplo, um pico no volume de solicita\u00e7\u00f5es pode indicar um <a href=\"https:\/\/en.wikipedia.org\/wiki\/Denial-of-service_attack\" target=\"_blank\" rel=\"noopener\">ataque de DDoS<\/a>, enquanto um comportamento suspeito de login, como v\u00e1rias tentativas fracassadas, pode indicar acesso n\u00e3o autorizado. Quando detectado, um comportamento suspeito por parte de usu\u00e1rios pode indicar amea\u00e7as em potencial \u00e0 seguran\u00e7a cibern\u00e9tica e as empresas podem reagir de acordo para evitar ou minimizar os danos.<\/p>\n<p><strong>Detec\u00e7\u00e3o de fraudes<\/strong><\/p>\n<p>Organiza\u00e7\u00f5es financeiras, como bancos, por exemplo, podem usar a detec\u00e7\u00e3o de anomalias para destacar atividades suspeitas em uma conta, que podem indicar atividades ilegais, como lavagem de dinheiro ou furto de identidade. Transa\u00e7\u00f5es suspeitas tamb\u00e9m podem ser um sinal de fraude com cart\u00f5es de cr\u00e9dito.<\/p>\n<p><strong>Observabilidade<\/strong><\/p>\n<p>Uma das pr\u00e1ticas comuns em servi\u00e7os de Web \u00e9 coletar m\u00e9tricas sobre o desempenho em tempo real do servi\u00e7o se ocorrer algum comportamento anormal no sistema. Por exemplo, um pico no uso de mem\u00f3ria pode indicar que algo n\u00e3o est\u00e1 funcionando adequadamente no sistema e os engenheiros podem precisar resolver isso imediatamente, para evitar uma interrup\u00e7\u00e3o do servi\u00e7o.<\/p>\n<h2 class=\"wp-block-heading\">Por que usar aprendizado de m\u00e1quina para detectar anomalias?<\/h2>\n<p>Embora os m\u00e9todos estat\u00edsticos tradicionais tamb\u00e9m possam ajudar a encontrar valores at\u00edpicos, o uso do aprendizado de m\u00e1quina para detectar anomalias mudou tudo. Com os algoritmos de aprendizado de m\u00e1quina, \u00e9 poss\u00edvel analisar mais dados complexos (por exemplo, com v\u00e1rios par\u00e2metros) de uma s\u00f3 vez. As t\u00e9cnicas de aprendizado de m\u00e1quina tamb\u00e9m fornecem um meio de analisar dados categ\u00f3ricos, que n\u00e3o s\u00e3o f\u00e1ceis de analisar com os m\u00e9todos estat\u00edsticos tradicionais, mais adequados para dados num\u00e9ricos.<\/p>\n<p>Muitas vezes, esses algoritmos de detec\u00e7\u00e3o de anomalias s\u00e3o programados e podem ser implementados como aplicativos (veja o nosso tuturial sobre <a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2024\/09\/how-to-use-fastapi-for-machine-learning\/\">FastAPI para aprendizado de m\u00e1quina<\/a>) e executados sob demanda ou a intervalos agendados para detectar quaisquer anomalias. Isso significa que eles podem desencadear a\u00e7\u00f5es imediatas dentro da empresa e tamb\u00e9m podem ser usados como ferramentas de gera\u00e7\u00e3o de relat\u00f3rios, para que equipes de intelig\u00eancia de neg\u00f3cios os revisem e ajustem suas estrat\u00e9gias.<\/p>\n<h2 class=\"wp-block-heading\">Tipos de t\u00e9cnicas e algoritmos de detec\u00e7\u00e3o de anomalias<\/h2>\n<p>Em linhas gerais, h\u00e1 dois tipos principais de detec\u00e7\u00e3o de anomalias: a detec\u00e7\u00e3o de valores at\u00edpicos e a de novidades.<\/p>\n<p><strong>Detec\u00e7\u00e3o de valores at\u00edpicos<\/strong><\/p>\n<p>\u00c0s vezes, a detec\u00e7\u00e3o de valores at\u00edpicos \u00e9 chamada de detec\u00e7\u00e3o <strong>n\u00e3o supervisionada<\/strong> de anomalias, pois se presume que nos dados de treinamento haja algumas anomalias n\u00e3o detectadas (portanto, n\u00e3o rotuladas) e a abordagem consiste em usar algoritmos n\u00e3o supervisionados de aprendizado de m\u00e1quina para identific\u00e1-las. Alguns desses algoritmos s\u00e3o as <a href=\"https:\/\/scikit-learn.org\/stable\/modules\/outlier_detection.html\" target=\"_blank\" rel=\"noopener\">m\u00e1quinas de vetor de suporte (SVMs) de classe \u00fanica, o Isolation Forest, o Local Outlier Factor e o Elliptic Envelope<\/a>.<\/p>\n<p><strong>Detec\u00e7\u00e3o de novidades<\/strong><\/p>\n<p>Por outro lado, \u00e0s vezes se chama a detec\u00e7\u00e3o de novidades de detec\u00e7\u00e3o de anomalias <strong>semissupervisionada<\/strong>. J\u00e1 que presumimos que nem todos os dados de treinamento consistem apenas de anomalias, eles s\u00e3o todos rotulados como nomais. O objetivo \u00e9 detectar se novos dados s\u00e3o ou n\u00e3o anomalias, o que costuma ser chamado de &#8220;novidade&#8221;. Os algoritmos usados para detectar valores at\u00edpicos tamb\u00e9m podem ser usados para detectar novidades, desde que n\u00e3o haja anomalias nos dados de treinamento.<\/p>\n<p>Al\u00e9m das j\u00e1 mencionadas detec\u00e7\u00f5es de valores at\u00edpicos e de novidades, tamb\u00e9m \u00e9 muito comum que seja necess\u00e1rio detectar anomalias em dados de s\u00e9ries temporais. Por\u00e9m, como a abordagem e as t\u00e9cnicas usadas nesses dados costumam ser diferentes dos algoritmos mencionados acima, n\u00f3s as discutiremos em detalhes em outra ocasi\u00e3o.<\/p>\n<h2 class=\"wp-block-heading\">Exemplo de c\u00f3digo: encontrando anomalias no conjunto de dados de colmeias de abelhas<\/h2>\n<p>Nesta postagem, usaremos este <a href=\"https:\/\/www.kaggle.com\/datasets\/vivovinco\/beehives\/data\" target=\"_blank\" rel=\"noopener\">conjunto de dados de colmeias de abelhas<\/a> como exemplo para detectar quaisquer anomalias nas colmeias. Este conjunto de dados fornece v\u00e1rias medi\u00e7\u00f5es da colmeia (incluindo a temperatura e a umidade relativa) em diferentes momentos.<\/p>\n<p>Aqui mostraremos dois m\u00e9todos muito diferentes para descobrir anomalias: o OneClassSVM, baseado na tecnologia de m\u00e1quinas de vetores de suporte, que usaremos para tra\u00e7ar limites de decis\u00e3o, e o Isolation Forest, um m\u00e9todo de conjunto semelhante ao Random Forest.<\/p>\n<h3 class=\"wp-block-heading\">Exemplo: OneClassSVM<\/h3>\n<p>Neste primeiro exemplo, usaremos os dados da colmeia 17, presumindo que as abelhas manter\u00e3o sua colmeia como um ambiente constantemente agrad\u00e1vel para a col\u00f4nia. Podemos ver se isso \u00e9 verdade ou se h\u00e1 momentos em que a colmeia tem n\u00edveis an\u00f4malos de temperatura e umidade relativa. Usaremos o <a href=\"https:\/\/scikit-learn.org\/stable\/modules\/generated\/sklearn.svm.OneClassSVM.html\" target=\"_blank\" rel=\"noopener\">OneClassSVM<\/a> para encaixar nossos dados e olharemos os limites de tomada de decis\u00e3o em um gr\u00e1fico de dispers\u00e3o.<\/p>\n<p>O &#8220;SVM&#8221; em &#8220;OneClassSVM&#8221; vem do ingl\u00eas <a href=\"https:\/\/scikit-learn.org\/stable\/modules\/svm.html#svm\" target=\"_blank\" rel=\"noopener\">support vector machine<\/a> (&#8220;m\u00e1quina de vetor de suporte&#8221;), um algoritmo popular de aprendizado de m\u00e1quina para classifica\u00e7\u00e3o e regress\u00f5es. Embora m\u00e1quinas de vetor de suporte possam ser usadas para <a href=\"https:\/\/scikit-learn.org\/stable\/modules\/svm.html#mathematical-formulation\" target=\"_blank\" rel=\"noopener\">classificar pontos de dados em dimens\u00f5es altas<\/a>, escolhendo um kernel e um par\u00e2metro escalar para definir um limite, podemos criar um limite de decis\u00e3o que inclui a maioria dos pontos de dados (dados normais), mas ret\u00e9m um pequeno n\u00famero de anomalias fora desse limite, representando a probabilidade (nu) de encontrar uma nova anomalia. O m\u00e9todo de usar m\u00e1quinas de vetor de suporte para detectar anomalias foi examinado em um artigo de Scholkopf et al., com o t\u00edtulo de <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> (&#8220;Estimando o suporte de uma distribui\u00e7\u00e3o de dimens\u00f5es altas&#8221;).<\/p>\n<h4 class=\"wp-block-heading\"><strong>1. Inicie um projeto do Jupyter<\/strong><\/h4>\n<p>Inicie um <a href=\"https:\/\/www.jetbrains.com\/help\/pycharm\/creating-and-running-your-first-python-project.html\" target=\"_blank\" rel=\"noopener\">novo projeto<\/a> no PyCharm (Professional 2024.2.2), selecionando <em>Jupyter<\/em> sob <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\">Comece a usar o PyCharm Pro gratuitamente<\/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=\"Inicie um projeto do Jupyter no PyCharm\" width=\"1592\" height=\"1292\" \/><\/figure>\n<p>O benef\u00edcio de usar um <a href=\"https:\/\/www.jetbrains.com\/help\/pycharm\/scientific-mode.html\" target=\"_blank\" rel=\"noopener\">projeto do Jupyter<\/a> (antes tamb\u00e9m conhecido como &#8220;projeto Scientific&#8221;) no PyCharm \u00e9 que isso gera uma estrutura de arquivos para voc\u00ea, incluindo uma pasta para armazenar os seus dados e outra para armazenar todos os <a href=\"https:\/\/www.jetbrains.com\/help\/pycharm\/jupyter-notebook-support.html\" target=\"_blank\" rel=\"noopener\">notebooks do Jupyter<\/a>, para que voc\u00ea possa manter todos os seus experimentos no mesmo 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=\"Projetos do Jupyter no PyCharm\" width=\"996\" height=\"886\" \/><\/figure>\n<p>Outro grande benef\u00edcio \u00e9 que podemos tra\u00e7ar gr\u00e1ficos muito facilmente com a <a href=\"https:\/\/matplotlib.org\/index.html\" target=\"_blank\" rel=\"noopener\">Matplotlib<\/a>. Voc\u00ea ver\u00e1 isso nas etapas abaixo.<\/p>\n<h4 class=\"wp-block-heading\"><strong>2. Instale as depend\u00eancias<\/strong><\/h4>\n<p>Baixe este arquivo <a href=\"https:\/\/github.com\/Cheukting\/anomaly-detection\/blob\/main\/requirements.txt\" target=\"_blank\" rel=\"noopener\">requirements.txt<\/a> do reposit\u00f3rio apropriado no GitHub. Depois de coloc\u00e1-lo no diret\u00f3rio do projeto e abri-lo no PyCharm, voc\u00ea ver\u00e1 um prompt pedindo que voc\u00ea instale as bibliotecas que faltam.<\/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=\"Instale as depend\u00eancias no PyCharm\" width=\"1600\" height=\"524\" \/><\/figure>\n<p>Clique em <em>Install requirements<\/em> e todos os requisitos ser\u00e3o instalados para voc\u00ea. Neste projeto, usaremos o Python 3.11.1.<\/p>\n<h4 class=\"wp-block-heading\"><strong>3. Importe e inspecione os dados<\/strong><\/h4>\n<p>Voc\u00ea pode baixar o <a href=\"https:\/\/www.kaggle.com\/datasets\/vivovinco\/beehives\/data\" target=\"_blank\" rel=\"noopener\">conjunto de dados &#8220;Beehives&#8221; do Kaggle<\/a> ou deste <a href=\"https:\/\/github.com\/Cheukting\/anomaly-detection\/tree\/main\/data\" target=\"_blank\" rel=\"noopener\">reposit\u00f3rio do GitHub<\/a>. Coloque todos os tr\u00eas arquivos em CSV na pasta <em>Data<\/em>. Depois, digite o c\u00f3digo a seguir no main.py:<\/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 fim, clique no bot\u00e3o <em>Run<\/em>, no canto superior direito da tela, e nosso c\u00f3digo ser\u00e1 executado no console do Python, dando-nos uma ideia geral da apar\u00eancia dos dados.<\/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=\"Importe os dados para o PyCharm\" width=\"1230\" height=\"938\" \/><\/figure>\n<h4 class=\"wp-block-heading\"><strong>4. Encaixe os pontos de dados e inspecione-os em um gr\u00e1fico<\/strong><\/h4>\n<p>Como estaremos usando o OneClassSVM do scikit-learn, vamos import\u00e1-lo, juntamente com DecisionBoundaryDisplay e Matplotlib, usando o c\u00f3digo abaixo:<\/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>Sabemos pela descri\u00e7\u00e3o dos dados que a coluna T17 representa a temperatura e RH17 representa a umidade relativa da colmeia. Vamos extrair o valor dessas duas colunas como nossa sa\u00edda:<\/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>Depois, vamos criar e encaixar o modelo. Observe que primeiro vamos experimentar a configura\u00e7\u00e3o-padr\u00e3o:<\/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>Em seguida, vamos mostrar o limite de decis\u00e3o, juntamente com os pontos de dados:<\/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>Agora, salve, clique novamente em <em>Run<\/em> e voc\u00ea ver\u00e1 que o gr\u00e1fico ser\u00e1 mostrado em uma janela separada para ser inspecionado.<\/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=\"Encaixe os pontos de dados e inspecione-os em um gr\u00e1fico no PyCharm\" width=\"1600\" height=\"1049\" \/><\/figure>\n<h4 class=\"wp-block-heading\"><strong>5. Fa\u00e7a o ajuste fino dos hiperpar\u00e2metros<\/strong><\/h4>\n<p>Como mostra o gr\u00e1fico acima, o limite de decis\u00e3o n\u00e3o se encaixa muito bem nos pontos de dados. Esses pontos consistem de umas formas irregulares, em vez de uma oval. Para fazermos o ajuste fino do nosso modelo, teremos que fornecer um valor espec\u00edfico de <a href=\"https:\/\/scikit-learn.org\/stable\/modules\/generated\/sklearn.linear_model.SGDOneClassSVM.html\" target=\"_blank\" rel=\"noopener\">&#8220;nu&#8221; e &#8220;gama&#8221; ao modelo OneClassSVM<\/a>. Voc\u00ea pode experimentar voc\u00ea mesmo, mas depois de alguns testes, parece que a combina\u00e7\u00e3o &#8220;nu=0,1, gama=0,05&#8221; d\u00e1 o melhor 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=\"Fa\u00e7a o ajuste fino dos hiperpar\u00e2metros no PyCharm\" width=\"1274\" height=\"957\" \/><\/figure>\n<h3 class=\"wp-block-heading\">Exemplo: Isolation Forest<\/h3>\n<p>O <a href=\"https:\/\/scikit-learn.org\/stable\/modules\/generated\/sklearn.ensemble.IsolationForest.html\" target=\"_blank\" rel=\"noopener\">Isolation Forest<\/a> \u00e9 um <a href=\"https:\/\/scikit-learn.org\/stable\/api\/sklearn.ensemble.html\" target=\"_blank\" rel=\"noopener\">m\u00e9todo baseado em conjunto<\/a>, semelhante a um m\u00e9todo de classifica\u00e7\u00e3o mais popular, o <a href=\"https:\/\/scikit-learn.org\/stable\/modules\/ensemble.html#forest\" target=\"_blank\" rel=\"noopener\">Random Forest<\/a>. Ele seleciona recursos e valores de separa\u00e7\u00e3o aleatoriamente e assim cria muitas \u00e1rvores de decis\u00e3o. Em seguida, \u00e9 calculada a m\u00e9dia do tamanho dos caminhos da raiz de cada \u00e1rvore ao n\u00f3 que toma aquela decis\u00e3o (por isso o nome de &#8220;Forest&#8221;, &#8220;floresta&#8221;). Um tamanho m\u00e9dio curto dos caminhos indica anomalias.<\/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>Geralmente, um caminho curto de decis\u00e3o indica dados muito diferentes dos demais.<\/em><\/figcaption>\n<\/figure>\n<p>Agora, vamos comparar os resultados do OneClassSVM com os do IsolationForest. Para isso, vamos criar dois gr\u00e1ficos dos limites de decis\u00e3o obtidos pelos dois algoritmos. Nas pr\u00f3ximas etapas, vamos modificar o script acima, usando os mesmos <a href=\"https:\/\/www.kaggle.com\/datasets\/vivovinco\/beehives\/data\" target=\"_blank\" rel=\"noopener\">dados da colmeia 17<\/a>.<\/p>\n<h4 class=\"wp-block-heading\"><strong>1. Importe o IsolationForest<\/strong><\/h4>\n<p>O IsolationForest pode ser importado das categorias de conjunto do 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. Refatore e adicione um novo estimador<\/strong><\/h4>\n<p>J\u00e1 que agora teremos dois estimadores diferentes, vamos coloc\u00e1-los em uma 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>Depois, vamos usar um loop &#8220;for&#8221; para iterar atrav\u00e9s de todos os 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, tamb\u00e9m vamos adicionar um t\u00edtulo a cada gr\u00e1fico, para facilitar a inspe\u00e7\u00e3o. Para isso, vamos adicionar o seguinte c\u00f3digo depois 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>Voc\u00ea deve achar muito f\u00e1cil refatorar com o PyCharm, com as sugest\u00f5es de complementa\u00e7\u00e3o autom\u00e1tica que ele oferece.<\/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=\"Refatora\u00e7\u00e3o usando complementa\u00e7\u00e3o autom\u00e1tica no 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=\"Complementa\u00e7\u00e3o autom\u00e1tica no PyCharm\" width=\"1520\" height=\"546\" \/><\/figure>\n<h4 class=\"wp-block-heading\"><strong>3. Execute o c\u00f3digo<\/strong><\/h4>\n<p>Como antes, para executar o c\u00f3digo, basta clicar no bot\u00e3o <em>Run<\/em>, no canto superior direito. Desta vez, depois de executarmos o c\u00f3digo, devemos obter dois 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=\"Execute o c\u00f3digo no PyCharm\" width=\"1056\" height=\"582\" \/><\/figure>\n<p>Voc\u00ea pode facilmente alternar entre os dois gr\u00e1ficos na pr\u00e9-visualiza\u00e7\u00e3o \u00e0 direita. Como voc\u00ea pode ver, o limite de decis\u00e3o fica muito diferente quando se usam diferentes algoritmos. Ao detectar anomalias, vale a pena experimentar v\u00e1rios algoritmos e par\u00e2metros at\u00e9 encontrar os mais adequados \u00e0quele caso de uso.<\/p>\n<h2 class=\"wp-block-heading\">Pr\u00f3xima etapa: detec\u00e7\u00e3o de anomalias em dados de s\u00e9ries temporais<\/h2>\n<p>Se os dados forem como os nossos das colmeias de abelhas, que s\u00e3o uma s\u00e9rie temporal, h\u00e1 ainda outros m\u00e9todos para identificar anomalias. Como s\u00e9ries temporais t\u00eam tend\u00eancias e per\u00edodos, qualquer coisa fora desse padr\u00e3o de tend\u00eancias e per\u00edodos pode ser considerada an\u00f4mala. Dois m\u00e9todos populares para detectar anomalias em s\u00e9ries temporais s\u00e3o a decomposi\u00e7\u00e3o de STL e a previs\u00e3o com LSTM.<\/p>\n<p>Saiba como usar esses m\u00e9todos para detectar anomalias em s\u00e9ries temporais <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\/\">nesta postagem no blog<\/a>.<\/p>\n<h2 class=\"wp-block-heading\">Resumo<\/h2>\n<p>A detec\u00e7\u00e3o de anomalias provou ser um aspecto importante da intelig\u00eancia de neg\u00f3cios. Em alguns setores de atividade, \u00e9 essencial poder identificar anomalias e fazer com que sejam tomadas a\u00e7\u00f5es imediatas. Usar um modelo adequado de aprendizado de m\u00e1quina para detectar anomalias automaticamente pode ajudar a analisar dados complicados e em altos volumes em pouco tempo. Nesta postagem de blog, demonstramos como identificar anomalias usando modelos como o OneClassSVM.<\/p>\n<p>Para saber mais sobre como usar o PyCharm no aprendizado de m\u00e1quina, confira &#8220;<a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2022\/06\/start-studying-machine-learning-with-pycharm\/\">Comece a estudar aprendizado de m\u00e1quina com o PyCharm<\/a>&#8221; e &#8220;<a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2024\/09\/how-to-use-jupyter-notebooks-in-pycharm\/\">Como usar notebooks do Jupyter no PyCharm<\/a>&#8220;.<\/p>\n<h2 class=\"wp-block-heading\">Detecte anomalias usando o PyCharm<\/h2>\n<p>Com um projeto do Jupyter no PyCharm Professional, voc\u00ea pode facilmente organizar projetos de detec\u00e7\u00e3o de anomalias com muitos arquivos de dados e notebooks. Pode ser gerada uma sa\u00edda na forma de gr\u00e1ficos para inspecionar anomalias, e gr\u00e1ficos s\u00e3o de muito f\u00e1cil acesso no PyCharm. Outros recursos, como sugest\u00f5es de complementa\u00e7\u00e3o autom\u00e1tica, tornam fac\u00edlimo navegar por todos os modelos do Scikit-learn e configura\u00e7\u00f5es de gr\u00e1ficos da Matplotlib.<\/p>\n<p>Incremente o seu projeto de ci\u00eancia de dados usando o PyCharm. Confira os <a href=\"https:\/\/www.jetbrains.com\/pycharm\/data-science\/\" target=\"_blank\" rel=\"noopener\">recursos de ci\u00eancia de dados<\/a> oferecidos para otimizar o seu fluxo de trabalho nessa \u00e1rea.<\/p>\n<div class=\"buttons\">\n<div class=\"buttons__row\"><a class=\"btn\" href=\"https:\/\/www.jetbrains.com\/pycharm\/data-science\/\" target=\"\" rel=\"noopener\">Comece a usar o PyCharm Pro gratuitamente<\/a><\/div>\n<\/div>\n\n\n<p><em>Artigo original em ingl\u00eas por:<\/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","protected":false},"author":1086,"featured_media":573175,"comment_status":"closed","ping_status":"closed","template":"","categories":[952,1401],"tags":[8670],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/pycharm\/571933"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/pycharm"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/types\/pycharm"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/users\/1086"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/comments?post=571933"}],"version-history":[{"count":4,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/pycharm\/571933\/revisions"}],"predecessor-version":[{"id":573188,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/pycharm\/571933\/revisions\/573188"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/media\/573175"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/media?parent=571933"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/categories?post=571933"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/tags?post=571933"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/cross-post-tag?post=571933"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}