{"id":26850,"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:48:59","modified_gmt":"2024-10-02T00:48:59","slug":"presentando-fklearn-biblioteca-de-aprendizaje-automatico-de-nubank-parte-i","status":"publish","type":"post","link":"https:\/\/building.nubank.com\/es\/presentando-fklearn-biblioteca-de-aprendizaje-automatico-de-nubank-parte-i\/","title":{"rendered":"Presentando fklearn: Biblioteca de aprendizaje autom\u00e1tico de Nubank (Parte I)"},"content":{"rendered":"\n<p><em>Lea la Parte II de esta historia <\/em><a href=\"https:\/\/building.nubank.com\/introducing-fklearn-nubanks-machine-learning-library-part-ii\/\"><em>aqu\u00ed<\/em><\/a><em>.<\/em><\/p>\n\n\n\n<p>En Nubank, dependemos en gran medida del aprendizaje autom\u00e1tico para tomar decisiones escalables basadas en datos. Si bien existen muchas otras bibliotecas de ML (usamos ampliamente <a href=\"https:\/\/xgboost.readthedocs.io\/en\/latest\/\">Xgboost<\/a>, <a href=\"https:\/\/lightgbm.readthedocs.io\/en\/latest\/\">LGBM<\/a> y <a href=\"https:\/\/scikit-learn.org\/stable\/\">ScikitLearn<\/a> por ejemplo), sentimos la necesidad de una <strong>abstracci\u00f3n de nivel superior<\/strong> que nos ayudara a aplicar estas bibliotecas m\u00e1s f\u00e1cilmente a los problemas que enfrentamos. Fklearn empaqueta eficientemente estas bibliotecas en un formato que hace que su uso en producci\u00f3n sea m\u00e1s efectivo.<\/p>\n\n\n\n<p>Actualmente, Fklearn impulsa un amplio conjunto de modelos de aprendizaje autom\u00e1tico en Nubank, resolviendo problemas que van desde la calificaci\u00f3n crediticia hasta respuestas automatizadas por chat de atenci\u00f3n al cliente. Lo construimos con los siguientes objetivos en mente:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>La validaci\u00f3n debe reflejar situaciones de la vida real<\/li>\n\n\n\n<li>Los modelos de producci\u00f3n deben coincidir con los modelos validados<\/li>\n\n\n\n<li>Los modelos deber\u00edan estar listos para producci\u00f3n con unos pocos pasos adicionales<\/li>\n\n\n\n<li>La reproducibilidad y el an\u00e1lisis en profundidad de los resultados del modelo deber\u00edan ser f\u00e1ciles de lograr<\/li>\n<\/ol>\n\n\n\n<p>Desde el principio, decidimos que la programaci\u00f3n funcional ser\u00eda un poderoso aliado para intentar lograr estos objetivos.<\/p>\n\n\n\n<p><strong>F es de Funcional<\/strong><\/p>\n\n\n\n<p>Aqu\u00ed en Nubank, somos grandes <a href=\"https:\/\/medium.com\/building-nubank\/demystifying-functional-programming-in-a-real-company-e954a2591504\">admiradores de la programaci\u00f3n funcional<\/a>, y eso no se limita al cap\u00edtulo de Ingenier\u00eda. Pero, \u00bfc\u00f3mo ayuda la programaci\u00f3n funcional a los cient\u00edficos de datos?<\/p>\n\n\n\n<p>El aprendizaje autom\u00e1tico se realiza frecuentemente mediante el uso de c\u00f3digo Python orientado a objetos, y esa es la forma en que sol\u00edamos hacerlo tambi\u00e9n en Nubank. En aquel entonces, el proceso de crear modelos de aprendizaje autom\u00e1tico y ponerlos en producci\u00f3n era tedioso y, a menudo, lleno de errores. Implementar\u00edamos un modelo solo para descubrir que las predicciones hechas en producci\u00f3n no coincid\u00edan con las observadas durante la validaci\u00f3n. Es m\u00e1s, la validaci\u00f3n a menudo era imposible de reproducir, y con frecuencia se realizaba en Jupyter Notebooks con estado.<\/p>\n\n\n\n<p>La programaci\u00f3n funcional ayuda a solucionar estos problemas al:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>facilitar la creaci\u00f3n de canales donde las transformaciones de datos que ocurren durante el entrenamiento coincidan con los modelos en producci\u00f3n;<\/li>\n\n\n\n<li>permitir una iteraci\u00f3n m\u00e1s segura en entornos interactivos (por ejemplo, Jupyter Notebooks), prevenir errores causados por c\u00f3digo con estado y hacer que la investigaci\u00f3n sea m\u00e1s reproducible;<\/li>\n\n\n\n<li>permiti\u00e9ndonos escribir c\u00f3digo de validaci\u00f3n, ajuste y selecci\u00f3n de caracter\u00edsticas muy gen\u00e9rico que funciona en todos los tipos de modelos y aplicaciones, lo que nos hace m\u00e1s eficientes en general.<\/li>\n<\/ul>\n\n\n\n<p>Veamos un ejemplo para ver c\u00f3mo la programaci\u00f3n funcional hace esto en la pr\u00e1ctica. Digamos que estamos tratando de predecir cu\u00e1nto gastar\u00e1 alguien en su tarjeta de cr\u00e9dito en funci\u00f3n de dos variables: ingresos mensuales y monto de la factura anterior. Como el resultado de este modelo se utilizar\u00e1 para la toma de decisiones sensibles, nos gustar\u00eda asegurarnos de que sea robusto frente a valores at\u00edpicos en las variables de entrada, raz\u00f3n por la cual decidimos:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Limitar los ingresos mensuales a 50,000, ya que los ingresos se autoreportan y a veces son exagerados.<\/li>\n\n\n\n<li>Limitar el rango de salida del modelo al intervalo [0, 20,000].<\/li>\n<\/ol>\n\n\n\n<p>Y luego usar un modelo de regresi\u00f3n lineal simple. As\u00ed es como se ve el 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=\"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>\u00a1No se alarme! Revisaremos el c\u00f3digo paso a paso y explicaremos algunos conceptos importantes de fklearn.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Funciones<strong> de aprendizaje<\/strong><\/h2>\n\n\n\n<p>Mientras que en scikit-learn, la abstracci\u00f3n principal de un modelo es una clase con m\u00e9todos de <em>ajuste<\/em> y <em>transformaci\u00f3n<\/em>; en fklearn, usamos lo que llamamos <strong><em>funci\u00f3n de aprendizaje.<\/em><\/strong><em> <\/em>Una funci\u00f3n de aprendizaje toma algunos datos de entrenamiento (m\u00e1s otros par\u00e1metros), aprende algo de ellos y devuelve tres cosas: una <strong><em>funci\u00f3n de predicci\u00f3n, <\/em><\/strong><em>los<\/em><strong><em>datos de entrenamiento transformados <\/em><\/strong><em>y un <\/em><strong><em>registro.<\/em><\/strong><strong> <\/strong>Las primeras tres l\u00edneas de nuestro ejemplo inicializan tres funciones de aprendizaje: <em>capper, linear_regression_learner <\/em>y <em>prediction_ranger.<\/em><\/p>\n\n\n\n<p>Para ilustrarlo mejor, aqu\u00ed hay una definici\u00f3n 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>\u00a1Observe el uso de sugerencias! Ayudan a que la programaci\u00f3n funcional en Python sea menos complicada, junto con la inmensamente \u00fatil biblioteca <a href=\"https:\/\/toolz.readthedocs.io\">toolz<\/a>.<\/p>\n\n\n\n<p>Como mencionamos, una <strong>funci\u00f3n de aprendizaje<\/strong> devuelve tres cosas (una <em>funci\u00f3n<\/em>, un <em>Marco de Datos<\/em>, y un <em>diccionario<\/em>), como lo describe la definici\u00f3n <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>La <strong>funci\u00f3n de predicci\u00f3n<\/strong> siempre tiene la misma firma: toma un Marco de Datos y devuelve un Marco de Datos (usamos <a href=\"https:\/\/pandas.pydata.org\/\">Pandas<\/a>). Deber\u00eda poder aceptar cualquier Marco de Datos nuevo (siempre que contenga las columnas requeridas) y transformarlo (es equivalente al m\u00e9todo de <em>transformaci\u00f3n <\/em>de un objeto scikit-learn). En este caso, la funci\u00f3n de predicci\u00f3n simplemente crea una nueva columna con las predicciones del modelo de regresi\u00f3n lineal que se entren\u00f3.<\/li>\n\n\n\n<li>Los <strong>datos de entrenamiento transformados<\/strong> suelen ser solo la funci\u00f3n de predicci\u00f3n aplicada a los datos de entrenamiento. Es \u00fatil cuando desea realizar predicciones sobre su conjunto de entrenamiento o para crear canales, como veremos m\u00e1s adelante.<\/li>\n\n\n\n<li>El <strong>registro <\/strong>es un diccionario y puede incluir cualquier informaci\u00f3n que sea relevante para inspeccionar o depurar al aprendizaje (por ejemplo, qu\u00e9 funciones se utilizaron, cu\u00e1ntas muestras hab\u00eda en el conjunto de entrenamiento, importancia de las funciones o coeficientes).<\/li>\n<\/ul>\n\n\n\n<p>Las <strong><em>funciones de aprendizaje <\/em><\/strong>muestran algunas propiedades de programaci\u00f3n funcional comunes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Son <a href=\"https:\/\/en.wikipedia.org\/wiki\/Pure_function\">funciones puras<\/a>, lo que significa que siempre devuelven el mismo resultado dada la misma entrada y no tienen efectos secundarios. En la pr\u00e1ctica, esto significa que puedes llamar al aprendizaje tantas veces como quieras sin preocuparte por obtener resultados inconsistentes. Este no es siempre el caso cuando se llama a <em>fit<\/em> en un objeto scikit-learn, por ejemplo, ya que los objetos pueden mutar.<\/li>\n\n\n\n<li>Son <a href=\"https:\/\/en.wikipedia.org\/wiki\/Higher-order_function\"><em>funciones de orden superior<\/em><\/a><em>, <\/em>ya que devuelven otra funci\u00f3n (la funci\u00f3n de predicci\u00f3n). Dado que la funci\u00f3n de predicci\u00f3n se define dentro del propio aprendizaje, puede acceder a variables en el alcance de la funci\u00f3n del aprendizaje a trav\u00e9s de su <a href=\"https:\/\/en.wikipedia.org\/wiki\/Closure_(computer_programming)\"><em>closure<\/em><\/a>.<\/li>\n\n\n\n<li>Al tener firmas coherentes, las funciones de aprendizaje (y las funciones de predicci\u00f3n) se pueden <a href=\"https:\/\/en.wikipedia.org\/wiki\/Function_composition_(computer_science)\"><em>componer<\/em><\/a>. Significa que construir canales enteros a partir de ellos es sencillo, como veremos pronto.<\/li>\n\n\n\n<li>Son <a href=\"https:\/\/stackoverflow.com\/questions\/36314\/what-is-currying\"><em>currables<\/em><\/a>, lo que significa que puede inicializarlos en pasos, pasando solo unos pocos argumentos a la vez (esto es lo que realmente sucede en las primeras tres l\u00edneas de nuestro ejemplo). Esto ser\u00e1 \u00fatil al definir canalizaciones y aplicar un modelo \u00fanico a diferentes conjuntos de datos mientras se obtienen resultados consistentes.<\/li>\n<\/ul>\n\n\n\n<p>Puede que le lleve alg\u00fan tiempo comprender todo esto, pero no se preocupe, no necesita ser un experto en programaci\u00f3n funcional para utilizar fklearn de forma eficaz. La clave es comprender que los modelos (y otras transformaciones de datos) se pueden definir como funciones que siguen la abstracci\u00f3n del <em>aprendizaje<\/em>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Canales<\/h2>\n\n\n\n<p>Sin embargo, los modelos de aprendizaje autom\u00e1tico rara vez existen por s\u00ed solos. Al centrarse \u00fanicamente en el modelo, los cient\u00edficos de datos tienden a olvidar las transformaciones que atraviesan los datos antes y despu\u00e9s de la parte de ML. Estas transformaciones a menudo deben ser exactamente las mismas cuando se entrenan e implementan modelos, y los cient\u00edficos de datos pueden intentar recrear manualmente sus pasos de pre y posprocesamiento de entrenamiento en producci\u00f3n, lo que conduce a una duplicaci\u00f3n de c\u00f3digo que es dif\u00edcil de mantener.<\/p>\n\n\n\n<p>Las funciones del aprendizaje son <em>componibles<\/em>, lo que significa que dos o m\u00e1s alumnos combinados pueden verse como un aprendizaje nuevo y m\u00e1s complejo. Esto significa que no importa cu\u00e1ntos pasos tenga en su proceso, su modelo final se comportar\u00e1 igual que uno solo, y hacer predicciones es tan simple como llamar a la funci\u00f3n de predicci\u00f3n final sobre nuevos datos. Tener todos los pasos de su proceso de modelado contenidos en una \u00fanica funci\u00f3n pura tambi\u00e9n ayuda con la validaci\u00f3n y el ajuste, ya que podemos pasarlo a otras funciones sin temor a efectos secundarios.<\/p>\n\n\n\n<p>En nuestro ejemplo, nuestra canalizaci\u00f3n consta de tres pasos: <strong>limitar la variable de ingresos<\/strong>, <strong>ejecutar la regresi\u00f3n<\/strong> y luego <strong>restringir el resultado de la regresi\u00f3n<\/strong> al rango <em>[0, 20,000]<\/em>. Despu\u00e9s de inicializar a cada aprendizaje, creamos la canalizaci\u00f3n y la aplicamos al conjunto de capacitaci\u00f3n utilizando estas dos l\u00edneas 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>La variable de <em>aprendizaje<\/em> ahora contiene la canalizaci\u00f3n resultante de la composici\u00f3n de las tres funciones de aprendizaje y se aplica a los datos de entrenamiento para producir la funci\u00f3n de predicci\u00f3n final. Esta funci\u00f3n aplicar\u00e1 todos los pasos equivalentes en la canalizaci\u00f3n a los datos de prueba, como lo ilustra la siguiente imagen:<\/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>Ejemplo de c\u00f3mo los datos fluyen a trav\u00e9s de una canalizaci\u00f3n durante el entrenamiento y a trav\u00e9s de una funci\u00f3n de predicci\u00f3n al realizar predicciones. La funci\u00f3n de predicci\u00f3n en s\u00ed es devuelta por la canalizaci\u00f3n; es la composici\u00f3n de las tres funciones de predicci\u00f3n generadas por cada alumno cuando se llam\u00f3 por primera vez a la canalizaci\u00f3n con los datos de entrenamiento. Los registros son una combinaci\u00f3n de los registros provenientes de todas las funciones del alumno en proceso.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u00bfQu\u00e9 sigue?<\/h2>\n\n\n\n<p>Hemos visto c\u00f3mo los modelos y los pasos de transformaci\u00f3n de datos se pueden escribir como <em>funciones de aprendizaje<\/em> y c\u00f3mo los canales funcionales en fklearn nos ayudan a garantizar que las transformaciones realizadas durante el entrenamiento y la validaci\u00f3n coincidan con las realizadas en producci\u00f3n.<\/p>\n\n\n\n<p>En la <a href=\"https:\/\/building.nubank.com\/introducing-fklearn-nubanks-machine-learning-library-part-ii\/\">Parte II<\/a> de esta publicaci\u00f3n de blog, hablamos sobre la validaci\u00f3n y el an\u00e1lisis de modelos y las herramientas que proporciona fklearn para que esos pasos sean m\u00e1s efectivos.<\/p>\n\n\n\n<p>Mientras tanto, \u00a1le invitamos a probar <a href=\"https:\/\/github.com\/nubank\/fklearn\">fklearn<\/a> por si mismo! No esperamos que fklearn reemplace los est\u00e1ndares actuales en ML, pero esperamos que inicie conversaciones interesantes sobre los beneficios de la programaci\u00f3n funcional para el aprendizaje autom\u00e1tico.<\/p>\n\n\n\n<p><\/p>\n\n\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>En abril de 2019, Nubank lanz\u00f3 fklearn de c\u00f3digo abierto, nuestra biblioteca Python de aprendizaje autom\u00e1tico. \u00a1Y tiene un dulce y ben\u00e9volo veneno!<\/p>\n","protected":false},"author":178110060,"featured_media":21627,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[2509,2508],"tags":[2510,3079,2543],"ppma_author":[2337],"class_list":["post-26850","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-data-analytics-es","category-data-science-machine-learning-es","tag-ciencia-de-los-datos","tag-fklearn-es","tag-machine-learning-es"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - 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=\"En abril de 2019, Nubank lanz\u00f3 fklearn de c\u00f3digo abierto, nuestra biblioteca Python de aprendizaje autom\u00e1tico. \u00a1Y tiene un dulce y ben\u00e9volo veneno!\" \/>\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\/es\/presentando-fklearn-biblioteca-de-aprendizaje-automatico-de-nubank-parte-i\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\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=\"En abril de 2019, Nubank lanz\u00f3 fklearn de c\u00f3digo abierto, nuestra biblioteca Python de aprendizaje autom\u00e1tico. \u00a1Y tiene un dulce y ben\u00e9volo veneno!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/building.nubank.com\/es\/presentando-fklearn-biblioteca-de-aprendizaje-automatico-de-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:48:59+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=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"15 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/building.nubank.com\\\/es\\\/presentando-fklearn-biblioteca-de-aprendizaje-automatico-de-nubank-parte-i\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/building.nubank.com\\\/es\\\/presentando-fklearn-biblioteca-de-aprendizaje-automatico-de-nubank-parte-i\\\/\"},\"author\":{\"name\":\"Lucas Estevam - Director of Data Science\",\"@id\":\"https:\\\/\\\/building.nubank.com\\\/es\\\/#\\\/schema\\\/person\\\/56d8f32ed78416e0568e09af1be3f6de\"},\"headline\":\"Presentando fklearn: Biblioteca de aprendizaje autom\u00e1tico de Nubank (Parte I)\",\"datePublished\":\"2019-04-23T21:29:00+00:00\",\"dateModified\":\"2024-10-02T00:48:59+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/building.nubank.com\\\/es\\\/presentando-fklearn-biblioteca-de-aprendizaje-automatico-de-nubank-parte-i\\\/\"},\"wordCount\":1722,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/building.nubank.com\\\/es\\\/presentando-fklearn-biblioteca-de-aprendizaje-automatico-de-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\":[\"ciencia de los datos\",\"fklearn\",\"machine learning\"],\"articleSection\":[\"Data &amp; Analytics\",\"Data Science &amp; Machine Learning\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/building.nubank.com\\\/es\\\/presentando-fklearn-biblioteca-de-aprendizaje-automatico-de-nubank-parte-i\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/building.nubank.com\\\/es\\\/presentando-fklearn-biblioteca-de-aprendizaje-automatico-de-nubank-parte-i\\\/\",\"url\":\"https:\\\/\\\/building.nubank.com\\\/es\\\/presentando-fklearn-biblioteca-de-aprendizaje-automatico-de-nubank-parte-i\\\/\",\"name\":\"Fklearn: Nubank\u2019s machine learning library (Part 1) - Building Nubank\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/building.nubank.com\\\/es\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/building.nubank.com\\\/es\\\/presentando-fklearn-biblioteca-de-aprendizaje-automatico-de-nubank-parte-i\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/building.nubank.com\\\/es\\\/presentando-fklearn-biblioteca-de-aprendizaje-automatico-de-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:48:59+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/building.nubank.com\\\/es\\\/#\\\/schema\\\/person\\\/56d8f32ed78416e0568e09af1be3f6de\"},\"description\":\"En abril de 2019, Nubank lanz\u00f3 fklearn de c\u00f3digo abierto, nuestra biblioteca Python de aprendizaje autom\u00e1tico. \u00a1Y tiene un dulce y ben\u00e9volo veneno!\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/building.nubank.com\\\/es\\\/presentando-fklearn-biblioteca-de-aprendizaje-automatico-de-nubank-parte-i\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/building.nubank.com\\\/es\\\/presentando-fklearn-biblioteca-de-aprendizaje-automatico-de-nubank-parte-i\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/building.nubank.com\\\/es\\\/presentando-fklearn-biblioteca-de-aprendizaje-automatico-de-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\\\/es\\\/presentando-fklearn-biblioteca-de-aprendizaje-automatico-de-nubank-parte-i\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/building.nubank.com\\\/es\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Presentando fklearn: Biblioteca de aprendizaje autom\u00e1tico de Nubank (Parte I)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/building.nubank.com\\\/es\\\/#website\",\"url\":\"https:\\\/\\\/building.nubank.com\\\/es\\\/\",\"name\":\"Building Nubank\",\"description\":\"We make the extraordinary happen\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/building.nubank.com\\\/es\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/building.nubank.com\\\/es\\\/#\\\/schema\\\/person\\\/56d8f32ed78416e0568e09af1be3f6de\",\"name\":\"Lucas Estevam - Director of Data Science\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/51820345b99d37bf5757c8974c4306c1f6415116c9d053613f7abc8afb30f77a?s=96&d=identicon&r=g14f6731b68e14c0fe53e4871677de694\",\"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\\\/es\\\/author\\\/estevam\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Fklearn: Nubank\u2019s machine learning library (Part 1) - Building Nubank","description":"En abril de 2019, Nubank lanz\u00f3 fklearn de c\u00f3digo abierto, nuestra biblioteca Python de aprendizaje autom\u00e1tico. \u00a1Y tiene un dulce y ben\u00e9volo veneno!","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\/es\/presentando-fklearn-biblioteca-de-aprendizaje-automatico-de-nubank-parte-i\/","og_locale":"es_ES","og_type":"article","og_title":"Fklearn: Nubank\u2019s machine learning library (Part 1) - Building Nubank","og_description":"En abril de 2019, Nubank lanz\u00f3 fklearn de c\u00f3digo abierto, nuestra biblioteca Python de aprendizaje autom\u00e1tico. \u00a1Y tiene un dulce y ben\u00e9volo veneno!","og_url":"https:\/\/building.nubank.com\/es\/presentando-fklearn-biblioteca-de-aprendizaje-automatico-de-nubank-parte-i\/","og_site_name":"Building Nubank","article_published_time":"2019-04-23T21:29:00+00:00","article_modified_time":"2024-10-02T00:48:59+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","Tiempo de lectura":"15 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/building.nubank.com\/es\/presentando-fklearn-biblioteca-de-aprendizaje-automatico-de-nubank-parte-i\/#article","isPartOf":{"@id":"https:\/\/building.nubank.com\/es\/presentando-fklearn-biblioteca-de-aprendizaje-automatico-de-nubank-parte-i\/"},"author":{"name":"Lucas Estevam - Director of Data Science","@id":"https:\/\/building.nubank.com\/es\/#\/schema\/person\/56d8f32ed78416e0568e09af1be3f6de"},"headline":"Presentando fklearn: Biblioteca de aprendizaje autom\u00e1tico de Nubank (Parte I)","datePublished":"2019-04-23T21:29:00+00:00","dateModified":"2024-10-02T00:48:59+00:00","mainEntityOfPage":{"@id":"https:\/\/building.nubank.com\/es\/presentando-fklearn-biblioteca-de-aprendizaje-automatico-de-nubank-parte-i\/"},"wordCount":1722,"commentCount":0,"image":{"@id":"https:\/\/building.nubank.com\/es\/presentando-fklearn-biblioteca-de-aprendizaje-automatico-de-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":["ciencia de los datos","fklearn","machine learning"],"articleSection":["Data &amp; Analytics","Data Science &amp; Machine Learning"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/building.nubank.com\/es\/presentando-fklearn-biblioteca-de-aprendizaje-automatico-de-nubank-parte-i\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/building.nubank.com\/es\/presentando-fklearn-biblioteca-de-aprendizaje-automatico-de-nubank-parte-i\/","url":"https:\/\/building.nubank.com\/es\/presentando-fklearn-biblioteca-de-aprendizaje-automatico-de-nubank-parte-i\/","name":"Fklearn: Nubank\u2019s machine learning library (Part 1) - Building Nubank","isPartOf":{"@id":"https:\/\/building.nubank.com\/es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/building.nubank.com\/es\/presentando-fklearn-biblioteca-de-aprendizaje-automatico-de-nubank-parte-i\/#primaryimage"},"image":{"@id":"https:\/\/building.nubank.com\/es\/presentando-fklearn-biblioteca-de-aprendizaje-automatico-de-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:48:59+00:00","author":{"@id":"https:\/\/building.nubank.com\/es\/#\/schema\/person\/56d8f32ed78416e0568e09af1be3f6de"},"description":"En abril de 2019, Nubank lanz\u00f3 fklearn de c\u00f3digo abierto, nuestra biblioteca Python de aprendizaje autom\u00e1tico. \u00a1Y tiene un dulce y ben\u00e9volo veneno!","breadcrumb":{"@id":"https:\/\/building.nubank.com\/es\/presentando-fklearn-biblioteca-de-aprendizaje-automatico-de-nubank-parte-i\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/building.nubank.com\/es\/presentando-fklearn-biblioteca-de-aprendizaje-automatico-de-nubank-parte-i\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/building.nubank.com\/es\/presentando-fklearn-biblioteca-de-aprendizaje-automatico-de-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\/es\/presentando-fklearn-biblioteca-de-aprendizaje-automatico-de-nubank-parte-i\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/building.nubank.com\/es\/"},{"@type":"ListItem","position":2,"name":"Presentando fklearn: Biblioteca de aprendizaje autom\u00e1tico de Nubank (Parte I)"}]},{"@type":"WebSite","@id":"https:\/\/building.nubank.com\/es\/#website","url":"https:\/\/building.nubank.com\/es\/","name":"Building Nubank","description":"We make the extraordinary happen","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/building.nubank.com\/es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Person","@id":"https:\/\/building.nubank.com\/es\/#\/schema\/person\/56d8f32ed78416e0568e09af1be3f6de","name":"Lucas Estevam - Director of Data Science","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/secure.gravatar.com\/avatar\/51820345b99d37bf5757c8974c4306c1f6415116c9d053613f7abc8afb30f77a?s=96&d=identicon&r=g14f6731b68e14c0fe53e4871677de694","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\/es\/author\/estevam\/"}]}},"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","jetpack_shortlink":"https:\/\/wp.me\/pbKBB5-6Z4","jetpack_sharing_enabled":true,"authors":[{"term_id":2337,"user_id":178110060,"is_guest":0,"slug":"estevam","display_name":"Lucas Estevam - Director of Data Science","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/51820345b99d37bf5757c8974c4306c1f6415116c9d053613f7abc8afb30f77a?s=96&d=identicon&r=g","0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""}],"_links":{"self":[{"href":"https:\/\/building.nubank.com\/es\/wp-json\/wp\/v2\/posts\/26850","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/building.nubank.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/building.nubank.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/building.nubank.com\/es\/wp-json\/wp\/v2\/users\/178110060"}],"replies":[{"embeddable":true,"href":"https:\/\/building.nubank.com\/es\/wp-json\/wp\/v2\/comments?post=26850"}],"version-history":[{"count":4,"href":"https:\/\/building.nubank.com\/es\/wp-json\/wp\/v2\/posts\/26850\/revisions"}],"predecessor-version":[{"id":30219,"href":"https:\/\/building.nubank.com\/es\/wp-json\/wp\/v2\/posts\/26850\/revisions\/30219"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/building.nubank.com\/es\/wp-json\/wp\/v2\/media\/21627"}],"wp:attachment":[{"href":"https:\/\/building.nubank.com\/es\/wp-json\/wp\/v2\/media?parent=26850"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/building.nubank.com\/es\/wp-json\/wp\/v2\/categories?post=26850"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/building.nubank.com\/es\/wp-json\/wp\/v2\/tags?post=26850"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/building.nubank.com\/es\/wp-json\/wp\/v2\/ppma_author?post=26850"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}