{"id":26848,"date":"2019-04-23T21:29:00","date_gmt":"2019-04-23T21:29:00","guid":{"rendered":"https:\/\/building.nubank.com\/introducing-fklearn-nubanks-machine-learning-library-part-i\/"},"modified":"2024-10-02T00:49:02","modified_gmt":"2024-10-02T00:49:02","slug":"apresentando-fklearn-a-biblioteca-de-aprendizado-de-maquina-do-nubank-parte-i","status":"publish","type":"post","link":"https:\/\/building.nubank.com\/pt-br\/apresentando-fklearn-a-biblioteca-de-aprendizado-de-maquina-do-nubank-parte-i\/","title":{"rendered":"Apresentando fklearn: A biblioteca de aprendizado de m\u00e1quina do Nubank (Parte I)"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><em>Leia a Parte II da hist\u00f3ria <\/em><a href=\"https:\/\/building.nubank.com\/introducing-fklearn-nubanks-machine-learning-library-part-ii\/\"><em>aqui<\/em><\/a><em>.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">No Nubank, confiamos fortemente no aprendizado de m\u00e1quina para tomar decis\u00f5es escalon\u00e1veis e baseadas em dados. Embora existam muitas outras bibliotecas de aprendizado de m\u00e1quina por a\u00ed (usamos muito <a href=\"https:\/\/xgboost.readthedocs.io\/en\/latest\/\">Xgboost<\/a>, <a href=\"https:\/\/lightgbm.readthedocs.io\/en\/latest\/\">LGBM<\/a> e <a href=\"https:\/\/scikit-learn.org\/stable\/\">ScikitLearn<\/a>, por exemplo), sentimos a necessidade de <strong>uma abstra\u00e7\u00e3o de n\u00edvel mais alto<\/strong> que nos ajudasse a aplicar essas bibliotecas mais facilmente aos problemas que enfrentamos. A fklearn agrupa essas bibliotecas com efici\u00eancia em um formato que torna seu uso mais eficaz na produ\u00e7\u00e3o.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Atualmente, a fklearn capacita um amplo conjunto de modelos de aprendizado de m\u00e1quina no Nubank, resolvendo problemas que v\u00e3o desde pontua\u00e7\u00e3o de cr\u00e9dito at\u00e9 respostas automatizadas de chat de suporte ao cliente. N\u00f3s a criamos com os seguintes objetivos em mente:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>A valida\u00e7\u00e3o deve refletir situa\u00e7\u00f5es reais<\/li>\n\n\n\n<li>Os modelos de produ\u00e7\u00e3o devem corresponder a modelos validados<\/li>\n\n\n\n<li>Os modelos devem estar prontos para a produ\u00e7\u00e3o com poucas etapas extras<\/li>\n\n\n\n<li>A reprodutibilidade e a an\u00e1lise detalhada de resultados do modelo devem ser f\u00e1ceis de alcan\u00e7ar.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Logo no in\u00edcio, decidimos que a programa\u00e7\u00e3o funcional seria uma aliada poderosa na tentativa de atingir esses objetivos.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">F de Funcional<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Aqui no Nubank, somos grandes<a href=\"https:\/\/medium.com\/building-nubank\/demystifying-functional-programming-in-a-real-company-e954a2591504\">f\u00e3s da programa\u00e7\u00e3o funcional<\/a>, e isso n\u00e3o se limita \u00e0 divis\u00e3o de Engenharia. Mas como a programa\u00e7\u00e3o funcional ajuda os cientistas de dados?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">O aprendizado de m\u00e1quina muitas vezes \u00e9 feito usando c\u00f3digo Python orientado a objetos, e \u00e9 assim que costum\u00e1vamos fazer no Nubank tamb\u00e9m. Naquela \u00e9poca, o processo de constru\u00e7\u00e3o de modelos de aprendizado de m\u00e1quina e sua coloca\u00e7\u00e3o em produ\u00e7\u00e3o era cansativo, e muitas vezes cheio de bugs. Implement\u00e1vamos um modelo s\u00f3 para descobrir que as previs\u00f5es feitas na produ\u00e7\u00e3o n\u00e3o correspondiam ao que era visto durante a valida\u00e7\u00e3o. Pior ainda, a valida\u00e7\u00e3o muitas vezes era imposs\u00edvel de reproduzir, sendo frequentemente feita em Jupyter Notebooks com regras <em>stateful.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A programa\u00e7\u00e3o funcional ajuda a corrigir esses problemas:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>facilitando a constru\u00e7\u00e3o de pipelines onde as transforma\u00e7\u00f5es de dados que acontecem durante o treinamento correspondem aos modelos em produ\u00e7\u00e3o;<\/li>\n\n\n\n<li>permitindo itera\u00e7\u00f5es mais seguras em ambientes interativos (por exemplo, Jupyter Notebooks), evitando erros causados por c\u00f3digo <em>stateful<\/em> e tornando a pesquisa mais reproduz\u00edvel;<\/li>\n\n\n\n<li>permitindo-nos escrever c\u00f3digos muito gen\u00e9ricos de valida\u00e7\u00e3o, ajuste e sele\u00e7\u00e3o de recursos que funcionam em v\u00e1rios tipos de modelos e aplicativos, tornando-nos mais eficientes em geral.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Vejamos um exemplo para ver como a programa\u00e7\u00e3o funcional faz isso na pr\u00e1tica. Digamos que estamos tentando prever quanto algu\u00e9m gastar\u00e1 no cart\u00e3o de cr\u00e9dito com base em duas vari\u00e1veis: renda mensal e valor da fatura anterior. Como o resultado deste modelo ser\u00e1 usado para tomadas de decis\u00e3o sens\u00edveis, gostar\u00edamos de ter certeza de que ele \u00e9 robusto em rela\u00e7\u00e3o a valores discrepantes nas vari\u00e1veis de entrada, e \u00e9 por isso que decidimos:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Limitar a renda mensal para 50.000, uma vez que a renda \u00e9 declarada pelo pr\u00f3prio cliente, e \u00e0s vezes exagerada.<\/li>\n\n\n\n<li>Limitar a faixa de sa\u00edda do modelo ao intervalo [0, 20.000].<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">E ent\u00e3o usar um modelo de regress\u00e3o linear simples. O c\u00f3digo fica assim:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"from fklearn.training.pipeline import build_pipeline\nfrom fklearn.training.regression import linear_regression_learner\nfrom fklearn.training.transformation import capper, floorer, prediction_ranger\n\ndef fit(train_data):\n    capper_fn = capper(columns_to_cap=[&quot;income&quot;], precomputed_caps={&quot;income&quot;: 50,000})\n    regression_fn = linear_regression_learner(features=[&quot;income&quot;, &quot;bill_amount&quot;], target=&quot;spend&quot;)\n    ranger_fn = prediction_ranger(prediction_min=0.0,   prediction_max=20000.0)\n    \n    learner = build_pipeline(capper_fn, regression_fn, ranger_fn)\n    predict_fn, training_predictions, logs = learner(train_data)\n    \n    return predict_fn, logs\n\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D8DEE9\">from<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">fklearn<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9\">training<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9\">pipeline<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">import<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">build_pipeline<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">from<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">fklearn<\/span><span style=\"color: #D8DEE9FF\">.<\/span><span style=\"color: #8FBCBB\">training<\/span><span style=\"color: #D8DEE9FF\">.<\/span><span style=\"color: #8FBCBB\">regression<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">import<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">linear_regression_learner<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">from<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">fklearn<\/span><span style=\"color: #D8DEE9FF\">.<\/span><span style=\"color: #8FBCBB\">training<\/span><span style=\"color: #D8DEE9FF\">.<\/span><span style=\"color: #8FBCBB\">transformation<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">import<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">capper<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">floorer<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">prediction_ranger<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #8FBCBB\">def<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">fit<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #8FBCBB\">train_data<\/span><span style=\"color: #D8DEE9FF\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #8FBCBB\">capper_fn<\/span><span style=\"color: #D8DEE9FF\"> = <\/span><span style=\"color: #8FBCBB\">capper<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #8FBCBB\">columns_to_cap<\/span><span style=\"color: #D8DEE9FF\">=[<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">income<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #D8DEE9FF\">]<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">precomputed_caps<\/span><span style=\"color: #D8DEE9FF\">=<\/span><span style=\"color: #ECEFF4\">{<\/span><span style=\"color: #D8DEE9FF\">&quot;<\/span><span style=\"color: #8FBCBB\">income<\/span><span style=\"color: #D8DEE9FF\">&quot;: 50<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\">000<\/span><span style=\"color: #ECEFF4\">}<\/span><span style=\"color: #D8DEE9FF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #8FBCBB\">regression_fn<\/span><span style=\"color: #D8DEE9FF\"> = <\/span><span style=\"color: #8FBCBB\">linear_regression_learner<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #8FBCBB\">features<\/span><span style=\"color: #D8DEE9FF\">=[<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">income<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">bill_amount<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #D8DEE9FF\">]<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">target<\/span><span style=\"color: #D8DEE9FF\">=<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">spend<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #D8DEE9FF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #8FBCBB\">ranger_fn<\/span><span style=\"color: #D8DEE9FF\"> = <\/span><span style=\"color: #8FBCBB\">prediction_ranger<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #8FBCBB\">prediction_min<\/span><span style=\"color: #D8DEE9FF\">=0.0<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\">   <\/span><span style=\"color: #8FBCBB\">prediction_max<\/span><span style=\"color: #D8DEE9FF\">=20000.0)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #8FBCBB\">learner<\/span><span style=\"color: #D8DEE9FF\"> = <\/span><span style=\"color: #8FBCBB\">build_pipeline<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #8FBCBB\">capper_fn<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">regression_fn<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">ranger_fn<\/span><span style=\"color: #D8DEE9FF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #8FBCBB\">predict_fn<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">training_predictions<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">logs<\/span><span style=\"color: #D8DEE9FF\"> = <\/span><span style=\"color: #8FBCBB\">learner<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #8FBCBB\">train_data<\/span><span style=\"color: #D8DEE9FF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #8FBCBB\">return<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">predict_fn<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">logs<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">N\u00e3o se assuste! Vamos percorrer o c\u00f3digo passo a passo, explicando alguns conceitos importantes da fklearn.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Fun\u00e7\u00f5es de aprendizado<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Enquanto no scikit-learn a abstra\u00e7\u00e3o prim\u00e1ria para um modelo \u00e9 uma classe com m\u00e9todos <em>fit<\/em> e <em>transform<\/em>; no fklearn usamos o que chamamos de <strong><em>fun\u00e7\u00e3o de aprendizagem<\/em><\/strong> (<em>learner<\/em>).<em> <\/em>Uma fun\u00e7\u00e3o de aprendizagem recebe alguns dados de treinamento (al\u00e9m de outros par\u00e2metros), aprende algo com eles e retorna tr\u00eas coisas: uma <strong><em>fun\u00e7\u00e3o de previs\u00e3o<\/em><\/strong>, os <strong><em>dados de treinamento transformados<\/em><\/strong> e um <strong><em>registro<\/em><\/strong>.<strong> <\/strong>As tr\u00eas primeiras linhas do nosso exemplo inicializam tr\u00eas fun\u00e7\u00f5es de aprendizagem: <em>capper<\/em>, <em>linear_regression_learner<\/em> e <em>prediction_ranger<\/em>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para ilustrar melhor, aqui est\u00e1 uma defini\u00e7\u00e3o simplificada de <em>linear_regression_learner<\/em>:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"from typing import Any, Dict, List\nfrom sklearn.linear_model import LinearRegression\nfrom toolz import curry\nimport pandas as pd\n \n@curry\ndef linear_regression_learner(df: pd.DataFrame,\n                              features: List[str],\n                              target: str,\n                              params: Dict[str, Any] = None) -&gt; LearnerReturnType:\n \n   # initialize and fit the linear regression\n   reg = LinearRegression(**params) \n   reg.fit(df[features].values, df[target].values)\n \n   # define the prediction function\n   def p(new_df: pd.DataFrame) -&gt; pd.DataFrame:\n       # note that `reg` here refers to the linear regression fit above, via the function\u2019s closure.\n       return new_df.assign(prediction=reg.predict(new_df[features].values))\n \n   # the log can contain arbitrary information that helps inspect or debug the model\n   log = {'linear_regression_learner': {\n       'features': features,\n       'target': target,\n       'parameters': params,\n       'training_samples': len(df),\n       'feature_importance': dict(zip(features, reg.coef_.flatten()))\n   }\n \n   return p, p(df), log\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D8DEE9\">from<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">typing<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">import<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">Any<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">Dict<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">List<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">from<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">sklearn<\/span><span style=\"color: #D8DEE9FF\">.<\/span><span style=\"color: #8FBCBB\">linear_model<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">import<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">LinearRegression<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">from<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">toolz<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">import<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">curry<\/span><\/span>\n<span class=\"line\"><span style=\"color: #8FBCBB\">import<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">pandas<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">as<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">pd<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">@<\/span><span style=\"color: #8FBCBB\">curry<\/span><\/span>\n<span class=\"line\"><span style=\"color: #8FBCBB\">def<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">linear_regression_learner<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #8FBCBB\">df<\/span><span style=\"color: #D8DEE9FF\">: <\/span><span style=\"color: #8FBCBB\">pd<\/span><span style=\"color: #D8DEE9FF\">.<\/span><span style=\"color: #8FBCBB\">DataFrame<\/span><span style=\"color: #ECEFF4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                              <\/span><span style=\"color: #8FBCBB\">features<\/span><span style=\"color: #D8DEE9FF\">: <\/span><span style=\"color: #8FBCBB\">List<\/span><span style=\"color: #D8DEE9FF\">[<\/span><span style=\"color: #8FBCBB\">str<\/span><span style=\"color: #D8DEE9FF\">]<\/span><span style=\"color: #ECEFF4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                              <\/span><span style=\"color: #8FBCBB\">target<\/span><span style=\"color: #D8DEE9FF\">: <\/span><span style=\"color: #8FBCBB\">str<\/span><span style=\"color: #ECEFF4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                              <\/span><span style=\"color: #8FBCBB\">params<\/span><span style=\"color: #D8DEE9FF\">: <\/span><span style=\"color: #8FBCBB\">Dict<\/span><span style=\"color: #D8DEE9FF\">[<\/span><span style=\"color: #8FBCBB\">str<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">Any<\/span><span style=\"color: #D8DEE9FF\">] = <\/span><span style=\"color: #8FBCBB\">None<\/span><span style=\"color: #D8DEE9FF\">) -&gt; <\/span><span style=\"color: #8FBCBB\">LearnerReturnType<\/span><span style=\"color: #D8DEE9FF\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">   # <\/span><span style=\"color: #8FBCBB\">initialize<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">and<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">fit<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">the<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">linear<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">regression<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">   <\/span><span style=\"color: #8FBCBB\">reg<\/span><span style=\"color: #D8DEE9FF\"> = <\/span><span style=\"color: #8FBCBB\">LinearRegression<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #81A1C1\">**<\/span><span style=\"color: #8FBCBB\">params<\/span><span style=\"color: #D8DEE9FF\">) <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">   <\/span><span style=\"color: #8FBCBB\">reg<\/span><span style=\"color: #D8DEE9FF\">.<\/span><span style=\"color: #8FBCBB\">fit<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #8FBCBB\">df<\/span><span style=\"color: #D8DEE9FF\">[<\/span><span style=\"color: #8FBCBB\">features<\/span><span style=\"color: #D8DEE9FF\">].<\/span><span style=\"color: #8FBCBB\">values<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">df<\/span><span style=\"color: #D8DEE9FF\">[<\/span><span style=\"color: #8FBCBB\">target<\/span><span style=\"color: #D8DEE9FF\">].<\/span><span style=\"color: #8FBCBB\">values<\/span><span style=\"color: #D8DEE9FF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">   # <\/span><span style=\"color: #8FBCBB\">define<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">the<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">prediction<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">function<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">   <\/span><span style=\"color: #8FBCBB\">def<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">p<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #8FBCBB\">new_df<\/span><span style=\"color: #D8DEE9FF\">: <\/span><span style=\"color: #8FBCBB\">pd<\/span><span style=\"color: #D8DEE9FF\">.<\/span><span style=\"color: #8FBCBB\">DataFrame<\/span><span style=\"color: #D8DEE9FF\">) -&gt; <\/span><span style=\"color: #8FBCBB\">pd<\/span><span style=\"color: #D8DEE9FF\">.<\/span><span style=\"color: #8FBCBB\">DataFrame<\/span><span style=\"color: #D8DEE9FF\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">       # <\/span><span style=\"color: #8FBCBB\">note<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">that<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">`<\/span><span style=\"color: #A3BE8C\">reg<\/span><span style=\"color: #ECEFF4\">`<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">here<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">refers<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">to<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">the<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">linear<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">regression<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">fit<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">above<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">via<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">the<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">function<\/span><span style=\"color: #D8DEE9FF\">\u2019<\/span><span style=\"color: #8FBCBB\">s<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">closure<\/span><span style=\"color: #D8DEE9FF\">.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">       <\/span><span style=\"color: #8FBCBB\">return<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">new_df<\/span><span style=\"color: #D8DEE9FF\">.<\/span><span style=\"color: #8FBCBB\">assign<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #8FBCBB\">prediction<\/span><span style=\"color: #D8DEE9FF\">=<\/span><span style=\"color: #8FBCBB\">reg<\/span><span style=\"color: #D8DEE9FF\">.<\/span><span style=\"color: #8FBCBB\">predict<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #8FBCBB\">new_df<\/span><span style=\"color: #D8DEE9FF\">[<\/span><span style=\"color: #8FBCBB\">features<\/span><span style=\"color: #D8DEE9FF\">].<\/span><span style=\"color: #8FBCBB\">values<\/span><span style=\"color: #D8DEE9FF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">   # <\/span><span style=\"color: #8FBCBB\">the<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">log<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">can<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">contain<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">arbitrary<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">information<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">that<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">helps<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">inspect<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">or<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">debug<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">the<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">model<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">   <\/span><span style=\"color: #8FBCBB\">log<\/span><span style=\"color: #D8DEE9FF\"> = <\/span><span style=\"color: #ECEFF4\">{<\/span><span style=\"color: #D8DEE9FF\">&#39;<\/span><span style=\"color: #8FBCBB\">linear_regression_learner<\/span><span style=\"color: #D8DEE9FF\">&#39;: {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">       &#39;<\/span><span style=\"color: #8FBCBB\">features<\/span><span style=\"color: #D8DEE9FF\">&#39;: <\/span><span style=\"color: #8FBCBB\">features<\/span><span style=\"color: #ECEFF4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">       &#39;<\/span><span style=\"color: #8FBCBB\">target<\/span><span style=\"color: #D8DEE9FF\">&#39;: <\/span><span style=\"color: #8FBCBB\">target<\/span><span style=\"color: #ECEFF4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">       &#39;<\/span><span style=\"color: #8FBCBB\">parameters<\/span><span style=\"color: #D8DEE9FF\">&#39;: <\/span><span style=\"color: #8FBCBB\">params<\/span><span style=\"color: #ECEFF4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">       &#39;<\/span><span style=\"color: #8FBCBB\">training_samples<\/span><span style=\"color: #D8DEE9FF\">&#39;: <\/span><span style=\"color: #8FBCBB\">len<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #8FBCBB\">df<\/span><span style=\"color: #D8DEE9FF\">)<\/span><span style=\"color: #ECEFF4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">       &#39;<\/span><span style=\"color: #8FBCBB\">feature_importance<\/span><span style=\"color: #D8DEE9FF\">&#39;: <\/span><span style=\"color: #8FBCBB\">dict<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #8FBCBB\">zip<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #8FBCBB\">features<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">reg<\/span><span style=\"color: #D8DEE9FF\">.<\/span><span style=\"color: #8FBCBB\">coef_<\/span><span style=\"color: #D8DEE9FF\">.<\/span><span style=\"color: #8FBCBB\">flatten<\/span><span style=\"color: #D8DEE9FF\">()))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">   <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">   <\/span><span style=\"color: #8FBCBB\">return<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">p<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">p<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #8FBCBB\">df<\/span><span style=\"color: #D8DEE9FF\">)<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">log<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Observe o uso de vari\u00e1veis tipadas! Elas ajudam a deixar a programa\u00e7\u00e3o funcional em Python menos complicada, especialmente em conjunto com a biblioteca <a href=\"https:\/\/toolz.readthedocs.io\">toolz<\/a>, que \u00e9 extremamente \u00fatil.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Como mencionamos, uma <strong>fun\u00e7\u00e3o de aprendizagem<\/strong> retorna tr\u00eas coisas (uma <em>function<\/em>, um <em>DataFrame<\/em> e um <em>dictionary<\/em>), conforme descrita pela defini\u00e7\u00e3o <strong>LearnerReturnType<\/strong>:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"from typing import Any, Callable, Dict, Tuple\nimport pandas as pd\n\nLearnerReturnType = Tuple[PredictFnType, pd.DataFrame, LearnerLogType]\nPredictFnType = Callable[[pd.DataFrame], pd.DataFrame]\nLearnerLogType = Dict[str, Any]\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D8DEE9\">from<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">typing<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">import<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">Any<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">Callable<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">Dict<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">Tuple<\/span><\/span>\n<span class=\"line\"><span style=\"color: #8FBCBB\">import<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">pandas<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">as<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">pd<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #8FBCBB\">LearnerReturnType<\/span><span style=\"color: #D8DEE9FF\"> = <\/span><span style=\"color: #8FBCBB\">Tuple<\/span><span style=\"color: #D8DEE9FF\">[<\/span><span style=\"color: #8FBCBB\">PredictFnType<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">pd<\/span><span style=\"color: #D8DEE9FF\">.<\/span><span style=\"color: #8FBCBB\">DataFrame<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">LearnerLogType<\/span><span style=\"color: #D8DEE9FF\">]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #8FBCBB\">PredictFnType<\/span><span style=\"color: #D8DEE9FF\"> = <\/span><span style=\"color: #8FBCBB\">Callable<\/span><span style=\"color: #D8DEE9FF\">[[<\/span><span style=\"color: #8FBCBB\">pd<\/span><span style=\"color: #D8DEE9FF\">.<\/span><span style=\"color: #8FBCBB\">DataFrame<\/span><span style=\"color: #D8DEE9FF\">]<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">pd<\/span><span style=\"color: #D8DEE9FF\">.<\/span><span style=\"color: #8FBCBB\">DataFrame<\/span><span style=\"color: #D8DEE9FF\">]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #8FBCBB\">LearnerLogType<\/span><span style=\"color: #D8DEE9FF\"> = <\/span><span style=\"color: #8FBCBB\">Dict<\/span><span style=\"color: #D8DEE9FF\">[<\/span><span style=\"color: #8FBCBB\">str<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">Any<\/span><span style=\"color: #D8DEE9FF\">]<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A <strong>fun\u00e7\u00e3o de previs\u00e3o<\/strong> sempre tem a mesma assinatura: ela pega um <em>DataFrame<\/em> e retorna um <em>DataFrame<\/em> (usamos <a href=\"https:\/\/pandas.pydata.org\/\">Pandas<\/a>). Ela deve ser capaz de receber qualquer novo <em>DataFrame<\/em> (desde que contenha as colunas necess\u00e1rias) e transform\u00e1-lo (\u00e9 equivalente ao m\u00e9todo <em>transform<\/em> de um objeto do scikit-learn). Neste caso, a fun\u00e7\u00e3o de previs\u00e3o simplesmente cria uma nova coluna com as previs\u00f5es do modelo de regress\u00e3o linear que foi treinado.<\/li>\n\n\n\n<li>Os <strong>dados de treinamento transformado<\/strong>s geralmente s\u00e3o apenas a fun\u00e7\u00e3o de previs\u00e3o aplicada aos dados de treinamento. S\u00e3o \u00fateis quando voc\u00ea deseja previs\u00f5es em seu conjunto de treinamento ou para construir pipelines, como veremos depois.<\/li>\n\n\n\n<li>O <strong>registro<\/strong> \u00e9 um dicion\u00e1rio e pode incluir qualquer informa\u00e7\u00e3o que seja relevante para inspecionar ou depurar a fun\u00e7\u00e3o de aprendizagem (por exemplo, quais recursos foram usados, quantas amostras havia no conjunto de treinamento, import\u00e2ncia das caracter\u00edsticas ou coeficientes).<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">As <strong><em>fun\u00e7\u00f5es de aprendizagem<\/em><\/strong> mostram algumas propriedades comuns de programa\u00e7\u00e3o funcional:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Elas s\u00e3o <a href=\"https:\/\/en.wikipedia.org\/wiki\/Pure_function\">fun\u00e7\u00f5es puras<\/a>, o que significa que sempre retornam o mesmo resultado com a mesma entrada, e n\u00e3o t\u00eam efeitos colaterais. Na pr\u00e1tica, isso significa que voc\u00ea pode chamar a fun\u00e7\u00e3o de aprendizado quantas vezes quiser sem se preocupar em obter resultados inconsistentes. Este nem sempre \u00e9 o caso ao chamar <em>fit<\/em> em um objeto do scikit-learn, por exemplo, pois os objetos podem sofrer muta\u00e7\u00e3o.<\/li>\n\n\n\n<li>Elas s\u00e3o <a href=\"https:\/\/en.wikipedia.org\/wiki\/Higher-order_function\"><em>fun\u00e7\u00f5es de ordem superior<\/em><\/a><em>, <\/em>pois retornam outra fun\u00e7\u00e3o (a fun\u00e7\u00e3o de previs\u00e3o). Como a fun\u00e7\u00e3o de previs\u00e3o \u00e9 definida dentro da pr\u00f3pria fun\u00e7\u00e3o de aprendizagem, ela pode acessar vari\u00e1veis no escopo da fun\u00e7\u00e3o de aprendizagem por meio de sua<a href=\"https:\/\/en.wikipedia.org\/wiki\/Closure_(computer_programming)\"><em>clausura<\/em><\/a>.<\/li>\n\n\n\n<li>Por terem assinaturas consistentes, as fun\u00e7\u00f5es de aprendizagem (e fun\u00e7\u00f5es de previs\u00e3o) podem ser <a href=\"https:\/\/en.wikipedia.org\/wiki\/Function_composition_(computer_science)\"><em>compostas<\/em><\/a>. Isso significa que \u00e9 f\u00e1cil criar pipelines inteiros a partir delas, como veremos em breve.<\/li>\n\n\n\n<li>Elas s\u00e3o pass\u00edveis de <a href=\"https:\/\/stackoverflow.com\/questions\/36314\/what-is-currying\"><em>currying<\/em><\/a>, o que significa que voc\u00ea pode inicializ\u00e1-las em etapas, passando apenas alguns argumentos por vez (isso \u00e9 o que realmente est\u00e1 acontecendo nas tr\u00eas primeiras linhas do nosso exemplo). Isso ser\u00e1 \u00fatil ao definir pipelines e aplicar um \u00fanico modelo a diferentes conjuntos de dados, ao mesmo tempo que obt\u00e9m resultados consistentes.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Pode levar algum tempo para entender tudo isso, mas n\u00e3o se preocupe, pois n\u00e3o precisa ser um especialista em programa\u00e7\u00e3o funcional para usar a fklearn de maneira eficaz. O principal \u00e9 compreender que os modelos (e outras transforma\u00e7\u00f5es de dados) podem ser definidos como fun\u00e7\u00f5es seguindo a abstra\u00e7\u00e3o da fun\u00e7\u00e3o de aprendizagem.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Pipelines<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">No entanto, os modelos de aprendizado de m\u00e1quina raramente existem isolados. Ao focar apenas no modelo, os cientistas de dados tendem a esquecer quais transforma\u00e7\u00f5es os dados est\u00e3o passando antes e depois da parte de aprendizado de m\u00e1quina. Muitas vezes, essas transforma\u00e7\u00f5es precisam ser exatamente as mesmas durante o treinamento e a implanta\u00e7\u00e3o de modelos, e os cientistas de dados podem tentar recriar manualmente suas etapas de pr\u00e9 e p\u00f3s-processamento de treinamento na produ\u00e7\u00e3o, o que leva a uma duplicidade de c\u00f3digo que \u00e9 dif\u00edcil de lidar.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">As fun\u00e7\u00f5es de aprendizado podem ser <em>compostas<\/em>, o que significa que duas ou mais delas combinadas podem ser vistas como uma fun\u00e7\u00e3o nova e mais complexa. Isso significa que n\u00e3o importa quantas etapas voc\u00ea tenha em seu pipeline, seu modelo final se comportar\u00e1 da mesma forma que um \u00fanico modelo, e fazer previs\u00f5es ser\u00e1 t\u00e3o simples quanto chamar a fun\u00e7\u00e3o de previs\u00e3o final em novos dados. Ter todas as etapas do pipeline de modelagem contidas em uma \u00fanica fun\u00e7\u00e3o pura tamb\u00e9m ajuda na valida\u00e7\u00e3o e no ajuste, pois podemos pass\u00e1-lo para outras fun\u00e7\u00f5es sem medo de efeitos colaterais.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Em nosso exemplo, nosso pipeline consiste em tr\u00eas etapas: <strong>limitar a vari\u00e1vel de renda<\/strong>, <strong>executar a regress\u00e3o<\/strong> e, em seguida, <strong>restringir a sa\u00edda da regress\u00e3o<\/strong> ao intervalo [0, 20.000]. Depois que cada fun\u00e7\u00e3o de aprendizagem \u00e9 inicializada, criamos o pipeline e o aplicamos ao conjunto de treinamento usando estas duas linhas de c\u00f3digo:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"  ...\n  learner = build_pipeline(capper_fn, regression_fn, ranger_fn)\n  predict_fn, training_predictions, logs = learner(train_data)\n  ...\n\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #81A1C1\">...<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #D8DEE9\">learner<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">build_pipeline<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">capper_fn<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">regression_fn<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">ranger_fn<\/span><span style=\"color: #D8DEE9FF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #D8DEE9\">predict_fn<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">training_predictions<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">logs<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">learner<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">train_data<\/span><span style=\"color: #D8DEE9FF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #81A1C1\">...<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">A <em>vari\u00e1vel de aprendizagem<\/em> agora cont\u00e9m o pipeline resultante da composi\u00e7\u00e3o das tr\u00eas fun\u00e7\u00f5es de aprendizagem, e \u00e9 aplicada aos dados de treinamento para produzir a fun\u00e7\u00e3o de previs\u00e3o final. Essa fun\u00e7\u00e3o aplicar\u00e1 todas as etapas equivalentes do pipeline aos dados de teste, conforme ilustra a imagem abaixo:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"644\" src=\"https:\/\/i0.wp.com\/building.nubank.com\/wp-content\/uploads\/2019\/04\/image.png?resize=1024%2C644&#038;ssl=1\" alt=\"\" class=\"wp-image-30209\" srcset=\"https:\/\/i0.wp.com\/building.nubank.com\/wp-content\/uploads\/2019\/04\/image.png?resize=1024%2C644&amp;ssl=1 1024w, https:\/\/i0.wp.com\/building.nubank.com\/wp-content\/uploads\/2019\/04\/image.png?resize=300%2C189&amp;ssl=1 300w, https:\/\/i0.wp.com\/building.nubank.com\/wp-content\/uploads\/2019\/04\/image.png?resize=768%2C483&amp;ssl=1 768w, https:\/\/i0.wp.com\/building.nubank.com\/wp-content\/uploads\/2019\/04\/image.png?resize=1536%2C965&amp;ssl=1 1536w, https:\/\/i0.wp.com\/building.nubank.com\/wp-content\/uploads\/2019\/04\/image.png?resize=1200%2C754&amp;ssl=1 1200w, https:\/\/i0.wp.com\/building.nubank.com\/wp-content\/uploads\/2019\/04\/image.png?w=2000&amp;ssl=1 2000w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Exemplo de como os dados fluem atrav\u00e9s de um pipeline durante o treinamento e atrav\u00e9s de uma fun\u00e7\u00e3o de previs\u00e3o durante a previs\u00e3o. A pr\u00f3pria fun\u00e7\u00e3o de previs\u00e3o \u00e9 retornada pelo pipeline; ela \u00e9 a composi\u00e7\u00e3o das tr\u00eas fun\u00e7\u00f5es de previs\u00e3o geradas por cada fun\u00e7\u00e3o de aprendizagem quando o pipeline foi chamado pela primeira vez nos dados de treinamento. Os registros s\u00e3o uma combina\u00e7\u00e3o dos registros provenientes de todas as fun\u00e7\u00f5es de aprendizado no pipeline.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Qual \u00e9 o pr\u00f3ximo passo?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Vimos como modelos e etapas de transforma\u00e7\u00e3o de dados podem ser escritos como <em>fun\u00e7\u00f5es de aprendizagem<\/em>, e como pipelines funcionais na fklearn nos ajudam a garantir que as transforma\u00e7\u00f5es feitas durante o treinamento e a valida\u00e7\u00e3o correspondam \u00e0s feitas na produ\u00e7\u00e3o.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Na <a href=\"https:\/\/building.nubank.com\/introducing-fklearn-nubanks-machine-learning-library-part-ii\/\">Parte II<\/a> dessa postagem, falamos sobre valida\u00e7\u00e3o e an\u00e1lise de modelo, e as ferramentas que a fklearn fornece para tornar essas etapas mais eficazes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Enquanto isso, convidamos voc\u00ea a experimentar a<a href=\"https:\/\/github.com\/nubank\/fklearn\">fklearn<\/a> voc\u00ea mesmo! N\u00e3o esperamos que a fklearn substitua os padr\u00f5es atuais de aprendizado de m\u00e1quina, mas esperamos que ele inicie conversas interessantes sobre os benef\u00edcios da programa\u00e7\u00e3o funcional para aprendizado de m\u00e1quina.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Em abril de 2019, o Nubank abriu o c\u00f3digo-fonte da fklearn, nossa biblioteca Python de aprendizado de m\u00e1quina. E foi uma \u00f3tima decis\u00e3o!<\/p>\n","protected":false},"author":178110060,"featured_media":21626,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_wpcom_ai_launchpad_first_post":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[2503,2502],"tags":[2504,3078,2540],"class_list":["post-26848","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-data-analytics","category-data-science-machine-learning-pt-br","tag-ciencia-de-dados","tag-fklearn-pt-br","tag-machine-learning-pt-br"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Fklearn: Nubank\u2019s machine learning library (Part 1) - Building Nubank<\/title>\n<meta name=\"description\" content=\"Em abril de 2019, o Nubank abriu o c\u00f3digo-fonte da fklearn, nossa biblioteca Python de aprendizado de m\u00e1quina. E foi uma \u00f3tima decis\u00e3o!\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/building.nubank.com\/pt-br\/apresentando-fklearn-a-biblioteca-de-aprendizado-de-maquina-do-nubank-parte-i\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Fklearn: Nubank\u2019s machine learning library (Part 1) - Building Nubank\" \/>\n<meta property=\"og:description\" content=\"Em abril de 2019, o Nubank abriu o c\u00f3digo-fonte da fklearn, nossa biblioteca Python de aprendizado de m\u00e1quina. E foi uma \u00f3tima decis\u00e3o!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/building.nubank.com\/pt-br\/apresentando-fklearn-a-biblioteca-de-aprendizado-de-maquina-do-nubank-parte-i\/\" \/>\n<meta property=\"og:site_name\" content=\"Building Nubank\" \/>\n<meta property=\"article:published_time\" content=\"2019-04-23T21:29:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-10-02T00:49:02+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/i0.wp.com\/building.nubank.com\/wp-content\/uploads\/2020\/04\/fklearn-nubank-machine-learning-library-Header.jpg?fit=1440%2C600&ssl=1\" \/>\n\t<meta property=\"og:image:width\" content=\"1440\" \/>\n\t<meta property=\"og:image:height\" content=\"600\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Lucas Estevam - Director of Data Science\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Lucas Estevam - Director of Data Science\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/building.nubank.com\\\/pt-br\\\/apresentando-fklearn-a-biblioteca-de-aprendizado-de-maquina-do-nubank-parte-i\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/building.nubank.com\\\/pt-br\\\/apresentando-fklearn-a-biblioteca-de-aprendizado-de-maquina-do-nubank-parte-i\\\/\"},\"author\":{\"name\":\"Lucas Estevam - Director of Data Science\",\"@id\":\"https:\\\/\\\/building.nubank.com\\\/pt-br\\\/#\\\/schema\\\/person\\\/56d8f32ed78416e0568e09af1be3f6de\"},\"headline\":\"Apresentando fklearn: A biblioteca de aprendizado de m\u00e1quina do Nubank (Parte I)\",\"datePublished\":\"2019-04-23T21:29:00+00:00\",\"dateModified\":\"2024-10-02T00:49:02+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/building.nubank.com\\\/pt-br\\\/apresentando-fklearn-a-biblioteca-de-aprendizado-de-maquina-do-nubank-parte-i\\\/\"},\"wordCount\":1730,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/building.nubank.com\\\/pt-br\\\/apresentando-fklearn-a-biblioteca-de-aprendizado-de-maquina-do-nubank-parte-i\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/building.nubank.com\\\/wp-content\\\/uploads\\\/2020\\\/04\\\/fklearn-nubank-machine-learning-library-Header.jpg?fit=1440%2C600&ssl=1\",\"keywords\":[\"ci\u00eancia de dados\",\"fklearn\",\"machine learning\"],\"articleSection\":[\"Data &amp; Analytics\",\"Data science &amp; Machine Learning\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/building.nubank.com\\\/pt-br\\\/apresentando-fklearn-a-biblioteca-de-aprendizado-de-maquina-do-nubank-parte-i\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/building.nubank.com\\\/pt-br\\\/apresentando-fklearn-a-biblioteca-de-aprendizado-de-maquina-do-nubank-parte-i\\\/\",\"url\":\"https:\\\/\\\/building.nubank.com\\\/pt-br\\\/apresentando-fklearn-a-biblioteca-de-aprendizado-de-maquina-do-nubank-parte-i\\\/\",\"name\":\"Fklearn: Nubank\u2019s machine learning library (Part 1) - Building Nubank\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/building.nubank.com\\\/pt-br\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/building.nubank.com\\\/pt-br\\\/apresentando-fklearn-a-biblioteca-de-aprendizado-de-maquina-do-nubank-parte-i\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/building.nubank.com\\\/pt-br\\\/apresentando-fklearn-a-biblioteca-de-aprendizado-de-maquina-do-nubank-parte-i\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/building.nubank.com\\\/wp-content\\\/uploads\\\/2020\\\/04\\\/fklearn-nubank-machine-learning-library-Header.jpg?fit=1440%2C600&ssl=1\",\"datePublished\":\"2019-04-23T21:29:00+00:00\",\"dateModified\":\"2024-10-02T00:49:02+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/building.nubank.com\\\/pt-br\\\/#\\\/schema\\\/person\\\/56d8f32ed78416e0568e09af1be3f6de\"},\"description\":\"Em abril de 2019, o Nubank abriu o c\u00f3digo-fonte da fklearn, nossa biblioteca Python de aprendizado de m\u00e1quina. E foi uma \u00f3tima decis\u00e3o!\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/building.nubank.com\\\/pt-br\\\/apresentando-fklearn-a-biblioteca-de-aprendizado-de-maquina-do-nubank-parte-i\\\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/building.nubank.com\\\/pt-br\\\/apresentando-fklearn-a-biblioteca-de-aprendizado-de-maquina-do-nubank-parte-i\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/building.nubank.com\\\/pt-br\\\/apresentando-fklearn-a-biblioteca-de-aprendizado-de-maquina-do-nubank-parte-i\\\/#primaryimage\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/building.nubank.com\\\/wp-content\\\/uploads\\\/2020\\\/04\\\/fklearn-nubank-machine-learning-library-Header.jpg?fit=1440%2C600&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/building.nubank.com\\\/wp-content\\\/uploads\\\/2020\\\/04\\\/fklearn-nubank-machine-learning-library-Header.jpg?fit=1440%2C600&ssl=1\",\"width\":1440,\"height\":600},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/building.nubank.com\\\/pt-br\\\/apresentando-fklearn-a-biblioteca-de-aprendizado-de-maquina-do-nubank-parte-i\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/building.nubank.com\\\/pt-br\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Apresentando fklearn: A biblioteca de aprendizado de m\u00e1quina do Nubank (Parte I)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/building.nubank.com\\\/pt-br\\\/#website\",\"url\":\"https:\\\/\\\/building.nubank.com\\\/pt-br\\\/\",\"name\":\"Building Nubank\",\"description\":\"We make the extraordinary happen\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/building.nubank.com\\\/pt-br\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/building.nubank.com\\\/pt-br\\\/#\\\/schema\\\/person\\\/56d8f32ed78416e0568e09af1be3f6de\",\"name\":\"Lucas Estevam - Director of Data Science\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/51820345b99d37bf5757c8974c4306c1f6415116c9d053613f7abc8afb30f77a?s=96&d=identicon&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/51820345b99d37bf5757c8974c4306c1f6415116c9d053613f7abc8afb30f77a?s=96&d=identicon&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/51820345b99d37bf5757c8974c4306c1f6415116c9d053613f7abc8afb30f77a?s=96&d=identicon&r=g\",\"caption\":\"Lucas Estevam - Director of Data Science\"},\"description\":\"Lucas is the Director of Data Science at Nubank, where he's worked for the past four years. He currently leads multi-functional teams of Data Scientists, Analysts, and Engineers, focusing mainly on improving Nubank\u2019s credit business by using data in innovative ways. He studied Computer Engineering and Operations Research.\",\"url\":\"https:\\\/\\\/building.nubank.com\\\/pt-br\\\/author\\\/estevam\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Fklearn: Nubank\u2019s machine learning library (Part 1) - Building Nubank","description":"Em abril de 2019, o Nubank abriu o c\u00f3digo-fonte da fklearn, nossa biblioteca Python de aprendizado de m\u00e1quina. E foi uma \u00f3tima decis\u00e3o!","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/building.nubank.com\/pt-br\/apresentando-fklearn-a-biblioteca-de-aprendizado-de-maquina-do-nubank-parte-i\/","og_locale":"pt_BR","og_type":"article","og_title":"Fklearn: Nubank\u2019s machine learning library (Part 1) - Building Nubank","og_description":"Em abril de 2019, o Nubank abriu o c\u00f3digo-fonte da fklearn, nossa biblioteca Python de aprendizado de m\u00e1quina. E foi uma \u00f3tima decis\u00e3o!","og_url":"https:\/\/building.nubank.com\/pt-br\/apresentando-fklearn-a-biblioteca-de-aprendizado-de-maquina-do-nubank-parte-i\/","og_site_name":"Building Nubank","article_published_time":"2019-04-23T21:29:00+00:00","article_modified_time":"2024-10-02T00:49:02+00:00","og_image":[{"width":1440,"height":600,"url":"https:\/\/i0.wp.com\/building.nubank.com\/wp-content\/uploads\/2020\/04\/fklearn-nubank-machine-learning-library-Header.jpg?fit=1440%2C600&ssl=1","type":"image\/jpeg"}],"author":"Lucas Estevam - Director of Data Science","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"Lucas Estevam - Director of Data Science","Est. tempo de leitura":"8 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/building.nubank.com\/pt-br\/apresentando-fklearn-a-biblioteca-de-aprendizado-de-maquina-do-nubank-parte-i\/#article","isPartOf":{"@id":"https:\/\/building.nubank.com\/pt-br\/apresentando-fklearn-a-biblioteca-de-aprendizado-de-maquina-do-nubank-parte-i\/"},"author":{"name":"Lucas Estevam - Director of Data Science","@id":"https:\/\/building.nubank.com\/pt-br\/#\/schema\/person\/56d8f32ed78416e0568e09af1be3f6de"},"headline":"Apresentando fklearn: A biblioteca de aprendizado de m\u00e1quina do Nubank (Parte I)","datePublished":"2019-04-23T21:29:00+00:00","dateModified":"2024-10-02T00:49:02+00:00","mainEntityOfPage":{"@id":"https:\/\/building.nubank.com\/pt-br\/apresentando-fklearn-a-biblioteca-de-aprendizado-de-maquina-do-nubank-parte-i\/"},"wordCount":1730,"commentCount":0,"image":{"@id":"https:\/\/building.nubank.com\/pt-br\/apresentando-fklearn-a-biblioteca-de-aprendizado-de-maquina-do-nubank-parte-i\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/building.nubank.com\/wp-content\/uploads\/2020\/04\/fklearn-nubank-machine-learning-library-Header.jpg?fit=1440%2C600&ssl=1","keywords":["ci\u00eancia de dados","fklearn","machine learning"],"articleSection":["Data &amp; Analytics","Data science &amp; Machine Learning"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/building.nubank.com\/pt-br\/apresentando-fklearn-a-biblioteca-de-aprendizado-de-maquina-do-nubank-parte-i\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/building.nubank.com\/pt-br\/apresentando-fklearn-a-biblioteca-de-aprendizado-de-maquina-do-nubank-parte-i\/","url":"https:\/\/building.nubank.com\/pt-br\/apresentando-fklearn-a-biblioteca-de-aprendizado-de-maquina-do-nubank-parte-i\/","name":"Fklearn: Nubank\u2019s machine learning library (Part 1) - Building Nubank","isPartOf":{"@id":"https:\/\/building.nubank.com\/pt-br\/#website"},"primaryImageOfPage":{"@id":"https:\/\/building.nubank.com\/pt-br\/apresentando-fklearn-a-biblioteca-de-aprendizado-de-maquina-do-nubank-parte-i\/#primaryimage"},"image":{"@id":"https:\/\/building.nubank.com\/pt-br\/apresentando-fklearn-a-biblioteca-de-aprendizado-de-maquina-do-nubank-parte-i\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/building.nubank.com\/wp-content\/uploads\/2020\/04\/fklearn-nubank-machine-learning-library-Header.jpg?fit=1440%2C600&ssl=1","datePublished":"2019-04-23T21:29:00+00:00","dateModified":"2024-10-02T00:49:02+00:00","author":{"@id":"https:\/\/building.nubank.com\/pt-br\/#\/schema\/person\/56d8f32ed78416e0568e09af1be3f6de"},"description":"Em abril de 2019, o Nubank abriu o c\u00f3digo-fonte da fklearn, nossa biblioteca Python de aprendizado de m\u00e1quina. E foi uma \u00f3tima decis\u00e3o!","breadcrumb":{"@id":"https:\/\/building.nubank.com\/pt-br\/apresentando-fklearn-a-biblioteca-de-aprendizado-de-maquina-do-nubank-parte-i\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/building.nubank.com\/pt-br\/apresentando-fklearn-a-biblioteca-de-aprendizado-de-maquina-do-nubank-parte-i\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/building.nubank.com\/pt-br\/apresentando-fklearn-a-biblioteca-de-aprendizado-de-maquina-do-nubank-parte-i\/#primaryimage","url":"https:\/\/i0.wp.com\/building.nubank.com\/wp-content\/uploads\/2020\/04\/fklearn-nubank-machine-learning-library-Header.jpg?fit=1440%2C600&ssl=1","contentUrl":"https:\/\/i0.wp.com\/building.nubank.com\/wp-content\/uploads\/2020\/04\/fklearn-nubank-machine-learning-library-Header.jpg?fit=1440%2C600&ssl=1","width":1440,"height":600},{"@type":"BreadcrumbList","@id":"https:\/\/building.nubank.com\/pt-br\/apresentando-fklearn-a-biblioteca-de-aprendizado-de-maquina-do-nubank-parte-i\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/building.nubank.com\/pt-br\/"},{"@type":"ListItem","position":2,"name":"Apresentando fklearn: A biblioteca de aprendizado de m\u00e1quina do Nubank (Parte I)"}]},{"@type":"WebSite","@id":"https:\/\/building.nubank.com\/pt-br\/#website","url":"https:\/\/building.nubank.com\/pt-br\/","name":"Building Nubank","description":"We make the extraordinary happen","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/building.nubank.com\/pt-br\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Person","@id":"https:\/\/building.nubank.com\/pt-br\/#\/schema\/person\/56d8f32ed78416e0568e09af1be3f6de","name":"Lucas Estevam - Director of Data Science","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/secure.gravatar.com\/avatar\/51820345b99d37bf5757c8974c4306c1f6415116c9d053613f7abc8afb30f77a?s=96&d=identicon&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/51820345b99d37bf5757c8974c4306c1f6415116c9d053613f7abc8afb30f77a?s=96&d=identicon&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/51820345b99d37bf5757c8974c4306c1f6415116c9d053613f7abc8afb30f77a?s=96&d=identicon&r=g","caption":"Lucas Estevam - Director of Data Science"},"description":"Lucas is the Director of Data Science at Nubank, where he's worked for the past four years. He currently leads multi-functional teams of Data Scientists, Analysts, and Engineers, focusing mainly on improving Nubank\u2019s credit business by using data in innovative ways. He studied Computer Engineering and Operations Research.","url":"https:\/\/building.nubank.com\/pt-br\/author\/estevam\/"}]}},"jetpack_shortlink":"https:\/\/wp.me\/pbKBB5-6Z2","jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/i0.wp.com\/building.nubank.com\/wp-content\/uploads\/2020\/04\/fklearn-nubank-machine-learning-library-Header.jpg?fit=1440%2C600&ssl=1","_links":{"self":[{"href":"https:\/\/building.nubank.com\/pt-br\/wp-json\/wp\/v2\/posts\/26848","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/building.nubank.com\/pt-br\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/building.nubank.com\/pt-br\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/building.nubank.com\/pt-br\/wp-json\/wp\/v2\/users\/178110060"}],"replies":[{"embeddable":true,"href":"https:\/\/building.nubank.com\/pt-br\/wp-json\/wp\/v2\/comments?post=26848"}],"version-history":[{"count":7,"href":"https:\/\/building.nubank.com\/pt-br\/wp-json\/wp\/v2\/posts\/26848\/revisions"}],"predecessor-version":[{"id":30220,"href":"https:\/\/building.nubank.com\/pt-br\/wp-json\/wp\/v2\/posts\/26848\/revisions\/30220"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/building.nubank.com\/pt-br\/wp-json\/wp\/v2\/media\/21626"}],"wp:attachment":[{"href":"https:\/\/building.nubank.com\/pt-br\/wp-json\/wp\/v2\/media?parent=26848"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/building.nubank.com\/pt-br\/wp-json\/wp\/v2\/categories?post=26848"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/building.nubank.com\/pt-br\/wp-json\/wp\/v2\/tags?post=26848"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}