"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "[20:47:10] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n",
- "Parameters: { silent } might not be used.\n",
- "\n",
- " This may not be accurate due to some parameters are only used in language bindings but\n",
- " passed down to XGBoost core. Or some parameters are not used but slip through this\n",
- " verification. Please open an issue if you find above cases.\n",
- "\n",
- "\n",
- "[20:47:12] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n",
- "Parameters: { silent } might not be used.\n",
- "\n",
- " This may not be accurate due to some parameters are only used in language bindings but\n",
- " passed down to XGBoost core. Or some parameters are not used but slip through this\n",
- " verification. Please open an issue if you find above cases.\n",
- "\n",
- "\n",
- "[20:47:13] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n",
- "Parameters: { silent } might not be used.\n",
- "\n",
- " This may not be accurate due to some parameters are only used in language bindings but\n",
- " passed down to XGBoost core. Or some parameters are not used but slip through this\n",
- " verification. Please open an issue if you find above cases.\n",
- "\n",
- "\n",
- "[20:47:14] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n",
- "Parameters: { silent } might not be used.\n",
- "\n",
- " This may not be accurate due to some parameters are only used in language bindings but\n",
- " passed down to XGBoost core. Or some parameters are not used but slip through this\n",
- " verification. Please open an issue if you find above cases.\n",
- "\n",
- "\n",
- "[20:47:16] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n",
- "Parameters: { silent } might not be used.\n",
- "\n",
- " This may not be accurate due to some parameters are only used in language bindings but\n",
- " passed down to XGBoost core. Or some parameters are not used but slip through this\n",
- " verification. Please open an issue if you find above cases.\n",
- "\n",
- "\n",
- "[20:47:17] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n",
- "Parameters: { silent } might not be used.\n",
- "\n",
- " This may not be accurate due to some parameters are only used in language bindings but\n",
- " passed down to XGBoost core. Or some parameters are not used but slip through this\n",
- " verification. Please open an issue if you find above cases.\n",
- "\n",
- "\n",
- "[20:47:18] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n",
- "Parameters: { silent } might not be used.\n",
- "\n",
- " This may not be accurate due to some parameters are only used in language bindings but\n",
- " passed down to XGBoost core. Or some parameters are not used but slip through this\n",
- " verification. Please open an issue if you find above cases.\n",
- "\n",
- "\n",
- "[20:47:19] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n",
- "Parameters: { silent } might not be used.\n",
- "\n",
- " This may not be accurate due to some parameters are only used in language bindings but\n",
- " passed down to XGBoost core. Or some parameters are not used but slip through this\n",
- " verification. Please open an issue if you find above cases.\n",
- "\n",
- "\n",
- "[20:47:20] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n",
- "Parameters: { silent } might not be used.\n",
- "\n",
- " This may not be accurate due to some parameters are only used in language bindings but\n",
- " passed down to XGBoost core. Or some parameters are not used but slip through this\n",
- " verification. Please open an issue if you find above cases.\n",
- "\n",
- "\n",
- "[20:47:21] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n",
- "Parameters: { silent } might not be used.\n",
- "\n",
- " This may not be accurate due to some parameters are only used in language bindings but\n",
- " passed down to XGBoost core. Or some parameters are not used but slip through this\n",
- " verification. Please open an issue if you find above cases.\n",
- "\n",
- "\n",
- "[20:47:23] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n",
- "Parameters: { silent } might not be used.\n",
- "\n",
- " This may not be accurate due to some parameters are only used in language bindings but\n",
- " passed down to XGBoost core. Or some parameters are not used but slip through this\n",
- " verification. Please open an issue if you find above cases.\n",
- "\n",
- "\n",
- "[20:47:24] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n",
- "Parameters: { silent } might not be used.\n",
- "\n",
- " This may not be accurate due to some parameters are only used in language bindings but\n",
- " passed down to XGBoost core. Or some parameters are not used but slip through this\n",
- " verification. Please open an issue if you find above cases.\n",
- "\n",
- "\n",
- "[20:47:25] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n",
- "Parameters: { silent } might not be used.\n",
- "\n",
- " This may not be accurate due to some parameters are only used in language bindings but\n",
- " passed down to XGBoost core. Or some parameters are not used but slip through this\n",
- " verification. Please open an issue if you find above cases.\n",
- "\n",
- "\n",
- "[20:47:26] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n",
- "Parameters: { silent } might not be used.\n",
- "\n",
- " This may not be accurate due to some parameters are only used in language bindings but\n",
- " passed down to XGBoost core. Or some parameters are not used but slip through this\n",
- " verification. Please open an issue if you find above cases.\n",
- "\n",
- "\n",
- "[20:47:28] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n",
- "Parameters: { silent } might not be used.\n",
- "\n",
- " This may not be accurate due to some parameters are only used in language bindings but\n",
- " passed down to XGBoost core. Or some parameters are not used but slip through this\n",
- " verification. Please open an issue if you find above cases.\n",
- "\n",
- "\n",
- "[20:47:29] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n",
- "Parameters: { silent } might not be used.\n",
- "\n",
- " This may not be accurate due to some parameters are only used in language bindings but\n",
- " passed down to XGBoost core. Or some parameters are not used but slip through this\n",
- " verification. Please open an issue if you find above cases.\n",
- "\n",
- "\n",
- "[20:47:30] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n",
- "Parameters: { silent } might not be used.\n",
- "\n",
- " This may not be accurate due to some parameters are only used in language bindings but\n",
- " passed down to XGBoost core. Or some parameters are not used but slip through this\n",
- " verification. Please open an issue if you find above cases.\n",
- "\n",
- "\n",
- "[20:47:32] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n",
- "Parameters: { silent } might not be used.\n",
- "\n",
- " This may not be accurate due to some parameters are only used in language bindings but\n",
- " passed down to XGBoost core. Or some parameters are not used but slip through this\n",
- " verification. Please open an issue if you find above cases.\n",
- "\n",
- "\n",
- "[20:47:33] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n",
- "Parameters: { silent } might not be used.\n",
- "\n",
- " This may not be accurate due to some parameters are only used in language bindings but\n",
- " passed down to XGBoost core. Or some parameters are not used but slip through this\n",
- " verification. Please open an issue if you find above cases.\n",
- "\n",
- "\n",
- "[20:47:34] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n",
- "Parameters: { silent } might not be used.\n",
- "\n",
- " This may not be accurate due to some parameters are only used in language bindings but\n",
- " passed down to XGBoost core. Or some parameters are not used but slip through this\n",
- " verification. Please open an issue if you find above cases.\n",
- "\n",
- "\n",
- "[20:47:36] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n",
- "Parameters: { silent } might not be used.\n",
- "\n",
- " This may not be accurate due to some parameters are only used in language bindings but\n",
- " passed down to XGBoost core. Or some parameters are not used but slip through this\n",
- " verification. Please open an issue if you find above cases.\n",
- "\n",
- "\n",
- "[20:47:37] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n",
- "Parameters: { silent } might not be used.\n",
- "\n",
- " This may not be accurate due to some parameters are only used in language bindings but\n",
- " passed down to XGBoost core. Or some parameters are not used but slip through this\n",
- " verification. Please open an issue if you find above cases.\n",
- "\n",
- "\n",
- "[20:47:39] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n",
- "Parameters: { silent } might not be used.\n",
- "\n",
- " This may not be accurate due to some parameters are only used in language bindings but\n",
- " passed down to XGBoost core. Or some parameters are not used but slip through this\n",
- " verification. Please open an issue if you find above cases.\n",
- "\n",
- "\n",
- "[20:47:40] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n",
- "Parameters: { silent } might not be used.\n",
- "\n",
- " This may not be accurate due to some parameters are only used in language bindings but\n",
- " passed down to XGBoost core. Or some parameters are not used but slip through this\n",
- " verification. Please open an issue if you find above cases.\n",
- "\n",
- "\n",
- "[20:47:41] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n",
- "Parameters: { silent } might not be used.\n",
- "\n",
- " This may not be accurate due to some parameters are only used in language bindings but\n",
- " passed down to XGBoost core. Or some parameters are not used but slip through this\n",
- " verification. Please open an issue if you find above cases.\n",
- "\n",
- "\n",
- "[20:47:43] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n",
- "Parameters: { silent } might not be used.\n",
- "\n",
- " This may not be accurate due to some parameters are only used in language bindings but\n",
- " passed down to XGBoost core. Or some parameters are not used but slip through this\n",
- " verification. Please open an issue if you find above cases.\n",
- "\n",
- "\n",
- "[20:47:44] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n",
- "Parameters: { silent } might not be used.\n",
- "\n",
- " This may not be accurate due to some parameters are only used in language bindings but\n",
- " passed down to XGBoost core. Or some parameters are not used but slip through this\n",
- " verification. Please open an issue if you find above cases.\n",
- "\n",
- "\n",
- "[20:47:46] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n",
- "Parameters: { silent } might not be used.\n",
- "\n",
- " This may not be accurate due to some parameters are only used in language bindings but\n",
- " passed down to XGBoost core. Or some parameters are not used but slip through this\n",
- " verification. Please open an issue if you find above cases.\n",
- "\n",
- "\n",
- "[20:47:47] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n",
- "Parameters: { silent } might not be used.\n",
- "\n",
- " This may not be accurate due to some parameters are only used in language bindings but\n",
- " passed down to XGBoost core. Or some parameters are not used but slip through this\n",
- " verification. Please open an issue if you find above cases.\n",
- "\n",
- "\n",
- "[20:47:48] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n",
- "Parameters: { silent } might not be used.\n",
- "\n",
- " This may not be accurate due to some parameters are only used in language bindings but\n",
- " passed down to XGBoost core. Or some parameters are not used but slip through this\n",
- " verification. Please open an issue if you find above cases.\n",
- "\n",
- "\n",
- "[20:47:49] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n",
- "Parameters: { silent } might not be used.\n",
- "\n",
- " This may not be accurate due to some parameters are only used in language bindings but\n",
- " passed down to XGBoost core. Or some parameters are not used but slip through this\n",
- " verification. Please open an issue if you find above cases.\n",
- "\n",
- "\n",
- "[20:47:51] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n",
- "Parameters: { silent } might not be used.\n",
- "\n",
- " This may not be accurate due to some parameters are only used in language bindings but\n",
- " passed down to XGBoost core. Or some parameters are not used but slip through this\n",
- " verification. Please open an issue if you find above cases.\n",
- "\n",
- "\n",
- "[20:47:52] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n",
- "Parameters: { silent } might not be used.\n",
- "\n",
- " This may not be accurate due to some parameters are only used in language bindings but\n",
- " passed down to XGBoost core. Or some parameters are not used but slip through this\n",
- " verification. Please open an issue if you find above cases.\n",
- "\n",
- "\n",
- "[20:47:53] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n",
- "Parameters: { silent } might not be used.\n",
- "\n",
- " This may not be accurate due to some parameters are only used in language bindings but\n",
- " passed down to XGBoost core. Or some parameters are not used but slip through this\n",
- " verification. Please open an issue if you find above cases.\n",
- "\n",
- "\n",
- "[20:47:54] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n",
- "Parameters: { silent } might not be used.\n",
- "\n",
- " This may not be accurate due to some parameters are only used in language bindings but\n",
- " passed down to XGBoost core. Or some parameters are not used but slip through this\n",
- " verification. Please open an issue if you find above cases.\n",
- "\n",
- "\n",
- "[20:47:55] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n",
- "Parameters: { silent } might not be used.\n",
- "\n",
- " This may not be accurate due to some parameters are only used in language bindings but\n",
- " passed down to XGBoost core. Or some parameters are not used but slip through this\n",
- " verification. Please open an issue if you find above cases.\n",
- "\n",
- "\n",
- "[20:47:57] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n",
- "Parameters: { silent } might not be used.\n",
- "\n",
- " This may not be accurate due to some parameters are only used in language bindings but\n",
- " passed down to XGBoost core. Or some parameters are not used but slip through this\n",
- " verification. Please open an issue if you find above cases.\n",
- "\n",
- "\n",
- "[20:47:58] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n",
- "Parameters: { silent } might not be used.\n",
- "\n",
- " This may not be accurate due to some parameters are only used in language bindings but\n",
- " passed down to XGBoost core. Or some parameters are not used but slip through this\n",
- " verification. Please open an issue if you find above cases.\n",
- "\n",
- "\n",
- "[20:47:59] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n",
- "Parameters: { silent } might not be used.\n",
- "\n",
- " This may not be accurate due to some parameters are only used in language bindings but\n",
- " passed down to XGBoost core. Or some parameters are not used but slip through this\n",
- " verification. Please open an issue if you find above cases.\n",
- "\n",
- "\n",
- "[20:48:01] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n",
- "Parameters: { silent } might not be used.\n",
- "\n",
- " This may not be accurate due to some parameters are only used in language bindings but\n",
- " passed down to XGBoost core. Or some parameters are not used but slip through this\n",
- " verification. Please open an issue if you find above cases.\n",
- "\n",
- "\n",
- "[20:48:02] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n",
- "Parameters: { silent } might not be used.\n",
- "\n",
- " This may not be accurate due to some parameters are only used in language bindings but\n",
- " passed down to XGBoost core. Or some parameters are not used but slip through this\n",
- " verification. Please open an issue if you find above cases.\n",
- "\n",
- "\n",
- "[20:48:03] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n",
- "Parameters: { silent } might not be used.\n",
- "\n",
- " This may not be accurate due to some parameters are only used in language bindings but\n",
- " passed down to XGBoost core. Or some parameters are not used but slip through this\n",
- " verification. Please open an issue if you find above cases.\n",
- "\n",
- "\n",
- "[20:48:05] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n",
- "Parameters: { silent } might not be used.\n",
- "\n",
- " This may not be accurate due to some parameters are only used in language bindings but\n",
- " passed down to XGBoost core. Or some parameters are not used but slip through this\n",
- " verification. Please open an issue if you find above cases.\n",
- "\n",
- "\n",
- "[20:48:06] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n",
- "Parameters: { silent } might not be used.\n",
- "\n",
- " This may not be accurate due to some parameters are only used in language bindings but\n",
- " passed down to XGBoost core. Or some parameters are not used but slip through this\n",
- " verification. Please open an issue if you find above cases.\n",
- "\n",
- "\n",
- "[20:48:07] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n",
- "Parameters: { silent } might not be used.\n",
- "\n",
- " This may not be accurate due to some parameters are only used in language bindings but\n",
- " passed down to XGBoost core. Or some parameters are not used but slip through this\n",
- " verification. Please open an issue if you find above cases.\n",
- "\n",
- "\n",
- "[20:48:08] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n",
- "Parameters: { silent } might not be used.\n",
- "\n",
- " This may not be accurate due to some parameters are only used in language bindings but\n",
- " passed down to XGBoost core. Or some parameters are not used but slip through this\n",
- " verification. Please open an issue if you find above cases.\n",
- "\n",
- "\n",
- "[20:48:09] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n",
- "Parameters: { silent } might not be used.\n",
- "\n",
- " This may not be accurate due to some parameters are only used in language bindings but\n",
- " passed down to XGBoost core. Or some parameters are not used but slip through this\n",
- " verification. Please open an issue if you find above cases.\n",
- "\n",
- "\n",
- "[20:48:10] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n",
- "Parameters: { silent } might not be used.\n",
- "\n",
- " This may not be accurate due to some parameters are only used in language bindings but\n",
- " passed down to XGBoost core. Or some parameters are not used but slip through this\n",
- " verification. Please open an issue if you find above cases.\n",
- "\n",
- "\n",
- "[20:48:12] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n",
- "Parameters: { silent } might not be used.\n",
- "\n",
- " This may not be accurate due to some parameters are only used in language bindings but\n",
- " passed down to XGBoost core. Or some parameters are not used but slip through this\n",
- " verification. Please open an issue if you find above cases.\n",
- "\n",
- "\n",
- "[20:48:13] WARNING: /Users/travis/build/dmlc/xgboost/src/learner.cc:480: \n",
- "Parameters: { silent } might not be used.\n",
- "\n",
- " This may not be accurate due to some parameters are only used in language bindings but\n",
- " passed down to XGBoost core. Or some parameters are not used but slip through this\n",
- " verification. Please open an issue if you find above cases.\n",
- "\n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "/Users/user/venv/local-feast/lib/python3.7/site-packages/yellowbrick/base.py:259: DeprecationWarning:\n",
- "\n",
- "this method is deprecated, please use show() instead\n",
- "\n"
- ]
- },
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- "
"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "text/plain": [
- ""
- ]
- },
- "execution_count": 10,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "coefficients = pd.DataFrame(model.feature_importances_)\n",
- "column_df = pd.DataFrame(cols)\n",
- "coef_sumry = (pd.merge(coefficients, column_df, left_index=True,\n",
- " right_index=True, how=\"left\"))\n",
- "coef_sumry.columns = [\"coefficients\", \"features\"]\n",
- "coef_sumry = coef_sumry.sort_values(by=\"coefficients\", ascending=False)\n",
- "\n",
- "print(model)\n",
- "print(\"\\n Classification report : \\n\", classification_report(testing_y, predictions))\n",
- "print(\"Accuracy Score : \", accuracy_score(testing_y, predictions))\n",
- "# confusion matrix\n",
- "conf_matrix = confusion_matrix(testing_y, predictions)\n",
- "# roc_auc_score\n",
- "model_roc_auc = roc_auc_score(testing_y, predictions)\n",
- "print(\"Area under curve : \", model_roc_auc, \"\\n\")\n",
- "fpr, tpr, thresholds = roc_curve(testing_y, probabilities[:, 1])\n",
- "\n",
- "# plot confusion matrix\n",
- "trace1 = go.Heatmap(z=conf_matrix,\n",
- " x=[\"Not churn\", \"Churn\"],\n",
- " y=[\"Not churn\", \"Churn\"],\n",
- " showscale=False, colorscale=\"Picnic\",\n",
- " name=\"matrix\")\n",
- "\n",
- "# plot roc curve\n",
- "trace2 = go.Scatter(x=fpr, y=tpr,\n",
- " name=\"Roc : \" + str(model_roc_auc),\n",
- " line=dict(color=('rgb(22, 96, 167)'), width=2))\n",
- "trace3 = go.Scatter(x=[0, 1], y=[0, 1],\n",
- " line=dict(color=('rgb(205, 12, 24)'), width=2,\n",
- " dash='dot'))\n",
- "\n",
- "# plot coeffs\n",
- "trace4 = go.Bar(x=coef_sumry[\"features\"], y=coef_sumry[\"coefficients\"],\n",
- " name=\"coefficients\",\n",
- " marker=dict(color=coef_sumry[\"coefficients\"],\n",
- " colorscale=\"Picnic\",\n",
- " line=dict(width=.6, color=\"black\")))\n",
- "\n",
- "# subplots\n",
- "fig = tls.make_subplots(rows=2, cols=2, specs=[[{}, {}], [{'colspan': 2}, None]],\n",
- " subplot_titles=('Confusion Matrix',\n",
- " 'Receiver operating characteristic',\n",
- " 'Feature Importances'))\n",
- "\n",
- "fig.append_trace(trace1, 1, 1)\n",
- "fig.append_trace(trace2, 1, 2)\n",
- "fig.append_trace(trace3, 1, 2)\n",
- "fig.append_trace(trace4, 2, 1)\n",
- "\n",
- "fig['layout'].update(showlegend=False, title=\"Model performance\",\n",
- " autosize=False, height=900, width=800,\n",
- " plot_bgcolor='rgba(240,240,240, 0.95)',\n",
- " paper_bgcolor='rgba(240,240,240, 0.95)',\n",
- " margin=dict(b=195))\n",
- "fig[\"layout\"][\"xaxis2\"].update(dict(title=\"false positive rate\"))\n",
- "fig[\"layout\"][\"yaxis2\"].update(dict(title=\"true positive rate\"))\n",
- "fig[\"layout\"][\"xaxis3\"].update(dict(showgrid=True, tickfont=dict(size=10),\n",
- " tickangle=90))\n",
- "py.iplot(fig)\n",
- "\n",
- "visualizer = DiscriminationThreshold(model)\n",
- "visualizer.fit(training_x, training_y)\n",
- "visualizer.poof()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## 2. Churn Modelling (with Feast)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "In the rest of the tutorial we will\n",
- "1. Use our already processed feature data to define feature schemas (through a feature set)\n",
- "1. Load/ingest the feature data into Feast\n",
- "1. Create a training dataset based on an entity dataframe and train an XGBoost model\n",
- "1. Make online predictions for our model using Feast for online serving"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### 2.1 Configure Feast"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 11,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Feast Core acts as the central feature registry\n",
- "FEAST_CORE_URL = os.getenv('FEAST_CORE_URL', 'localhost:6565')\n",
- "\n",
- "# Feast Online Serving allows for the retrieval of real-time feature data\n",
- "FEAST_ONLINE_SERVING_URL = os.getenv('FEAST_ONLINE_SERVING_URL', 'localhost:6566')\n",
- "\n",
- "# Feast Batch Serving allows for the retrieval of historical feature data\n",
- "FEAST_HISTORICAL_SERVING_URL = os.getenv('FEAST_HISTORICAL_SERVING_URL', 'localhost:6567')"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Create the Feast client we will use to register our feature set"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 12,
- "metadata": {},
- "outputs": [],
- "source": [
- "client = Client(core_url=FEAST_CORE_URL)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### 2.2 Create a Feature Set"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "First we define a `customer_churn` feature set. A feature set is a storage level grouping of features. It is used when loading and ingesting data into Feast, and to describe the properties of features. \n",
- "\n",
- "During retrieval, features can be directly accessed from any feature sets."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 13,
- "metadata": {},
- "outputs": [],
- "source": [
- "customer_churn_fs = FeatureSet('customer_churn')"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "All data loaded into Feast must have a time dimension. This allows us to ensure point-in-time correctness."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 14,
- "metadata": {},
- "outputs": [],
- "source": [
- "telcom['datetime'] = pd.Series([dt.datetime.now()] * len(telcom))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Next we will infer the schema of the data from the Pandas DataFrame of features"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 15,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Entity customer_id(ValueType.STRING) manually updated (replacing an existing field).\n",
- "Feature gender (ValueType.INT64) added from dataframe.\n",
- "Feature seniorcitizen (ValueType.INT64) added from dataframe.\n",
- "Feature partner (ValueType.INT64) added from dataframe.\n",
- "Feature dependents (ValueType.INT64) added from dataframe.\n",
- "Feature phoneservice (ValueType.INT64) added from dataframe.\n",
- "Feature onlinesecurity (ValueType.INT64) added from dataframe.\n",
- "Feature onlinebackup (ValueType.INT64) added from dataframe.\n",
- "Feature deviceprotection (ValueType.INT64) added from dataframe.\n",
- "Feature techsupport (ValueType.INT64) added from dataframe.\n",
- "Feature streamingtv (ValueType.INT64) added from dataframe.\n",
- "Feature streamingmovies (ValueType.INT64) added from dataframe.\n",
- "Feature paperlessbilling (ValueType.INT64) added from dataframe.\n",
- "Feature churn (ValueType.INT64) added from dataframe.\n",
- "Feature multiplelines_no (ValueType.INT64) added from dataframe.\n",
- "Feature multiplelines_no_phone_service (ValueType.INT64) added from dataframe.\n",
- "Feature multiplelines_yes (ValueType.INT64) added from dataframe.\n",
- "Feature internetservice_dsl (ValueType.INT64) added from dataframe.\n",
- "Feature internetservice_fiber_optic (ValueType.INT64) added from dataframe.\n",
- "Feature internetservice_no (ValueType.INT64) added from dataframe.\n",
- "Feature contract_month_to_month (ValueType.INT64) added from dataframe.\n",
- "Feature contract_one_year (ValueType.INT64) added from dataframe.\n",
- "Feature contract_two_year (ValueType.INT64) added from dataframe.\n",
- "Feature paymentmethod_bank_transfer_automatic (ValueType.INT64) added from dataframe.\n",
- "Feature paymentmethod_credit_card_automatic (ValueType.INT64) added from dataframe.\n",
- "Feature paymentmethod_electronic_check (ValueType.INT64) added from dataframe.\n",
- "Feature paymentmethod_mailed_check (ValueType.INT64) added from dataframe.\n",
- "Feature tenure_group_tenure_0_12 (ValueType.INT64) added from dataframe.\n",
- "Feature tenure_group_tenure_12_24 (ValueType.INT64) added from dataframe.\n",
- "Feature tenure_group_tenure_24_48 (ValueType.INT64) added from dataframe.\n",
- "Feature tenure_group_tenure_48_60 (ValueType.INT64) added from dataframe.\n",
- "Feature tenure_group_tenure_gt_60 (ValueType.INT64) added from dataframe.\n",
- "Feature tenure (ValueType.DOUBLE) added from dataframe.\n",
- "Feature monthlycharges (ValueType.DOUBLE) added from dataframe.\n",
- "Feature totalcharges (ValueType.DOUBLE) added from dataframe.\n",
- "\n"
- ]
- }
- ],
- "source": [
- "customer_churn_fs.infer_fields_from_df(telcom, entities=[Entity(name='customer_id', dtype=ValueType.STRING)])"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Now we will register our feature set with Feast. This will create the necessary tables in our historical store as well as start any ingestion jobs that populate the stores (BigQuery, Redis) with data that is ingested."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 16,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Feature set created: \"customer_churn\"\n"
- ]
- }
- ],
- "source": [
- "client.apply(customer_churn_fs)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Next we will confirm that our feature set schema looks correct and that it is in a READY state"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 17,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "{\n",
- " \"spec\": {\n",
- " \"name\": \"customer_churn\",\n",
- " \"entities\": [\n",
- " {\n",
- " \"name\": \"customer_id\",\n",
- " \"valueType\": \"STRING\"\n",
- " }\n",
- " ],\n",
- " \"features\": [\n",
- " {\n",
- " \"name\": \"tenure\",\n",
- " \"valueType\": \"DOUBLE\"\n",
- " },\n",
- " {\n",
- " \"name\": \"churn\",\n",
- " \"valueType\": \"INT64\"\n",
- " },\n",
- " {\n",
- " \"name\": \"monthlycharges\",\n",
- " \"valueType\": \"DOUBLE\"\n",
- " },\n",
- " {\n",
- " \"name\": \"paymentmethod_credit_card_automatic\",\n",
- " \"valueType\": \"INT64\"\n",
- " },\n",
- " {\n",
- " \"name\": \"paymentmethod_electronic_check\",\n",
- " \"valueType\": \"INT64\"\n",
- " },\n",
- " {\n",
- " \"name\": \"dependents\",\n",
- " \"valueType\": \"INT64\"\n",
- " },\n",
- " {\n",
- " \"name\": \"internetservice_no\",\n",
- " \"valueType\": \"INT64\"\n",
- " },\n",
- " {\n",
- " \"name\": \"onlinesecurity\",\n",
- " \"valueType\": \"INT64\"\n",
- " },\n",
- " {\n",
- " \"name\": \"streamingtv\",\n",
- " \"valueType\": \"INT64\"\n",
- " },\n",
- " {\n",
- " \"name\": \"multiplelines_no_phone_service\",\n",
- " \"valueType\": \"INT64\"\n",
- " },\n",
- " {\n",
- " \"name\": \"contract_two_year\",\n",
- " \"valueType\": \"INT64\"\n",
- " },\n",
- " {\n",
- " \"name\": \"totalcharges\",\n",
- " \"valueType\": \"DOUBLE\"\n",
- " },\n",
- " {\n",
- " \"name\": \"streamingmovies\",\n",
- " \"valueType\": \"INT64\"\n",
- " },\n",
- " {\n",
- " \"name\": \"internetservice_dsl\",\n",
- " \"valueType\": \"INT64\"\n",
- " },\n",
- " {\n",
- " \"name\": \"contract_one_year\",\n",
- " \"valueType\": \"INT64\"\n",
- " },\n",
- " {\n",
- " \"name\": \"tenure_group_tenure_24_48\",\n",
- " \"valueType\": \"INT64\"\n",
- " },\n",
- " {\n",
- " \"name\": \"multiplelines_no\",\n",
- " \"valueType\": \"INT64\"\n",
- " },\n",
- " {\n",
- " \"name\": \"techsupport\",\n",
- " \"valueType\": \"INT64\"\n",
- " },\n",
- " {\n",
- " \"name\": \"paperlessbilling\",\n",
- " \"valueType\": \"INT64\"\n",
- " },\n",
- " {\n",
- " \"name\": \"phoneservice\",\n",
- " \"valueType\": \"INT64\"\n",
- " },\n",
- " {\n",
- " \"name\": \"tenure_group_tenure_12_24\",\n",
- " \"valueType\": \"INT64\"\n",
- " },\n",
- " {\n",
- " \"name\": \"gender\",\n",
- " \"valueType\": \"INT64\"\n",
- " },\n",
- " {\n",
- " \"name\": \"partner\",\n",
- " \"valueType\": \"INT64\"\n",
- " },\n",
- " {\n",
- " \"name\": \"paymentmethod_mailed_check\",\n",
- " \"valueType\": \"INT64\"\n",
- " },\n",
- " {\n",
- " \"name\": \"contract_month_to_month\",\n",
- " \"valueType\": \"INT64\"\n",
- " },\n",
- " {\n",
- " \"name\": \"tenure_group_tenure_48_60\",\n",
- " \"valueType\": \"INT64\"\n",
- " },\n",
- " {\n",
- " \"name\": \"tenure_group_tenure_0_12\",\n",
- " \"valueType\": \"INT64\"\n",
- " },\n",
- " {\n",
- " \"name\": \"onlinebackup\",\n",
- " \"valueType\": \"INT64\"\n",
- " },\n",
- " {\n",
- " \"name\": \"seniorcitizen\",\n",
- " \"valueType\": \"INT64\"\n",
- " },\n",
- " {\n",
- " \"name\": \"multiplelines_yes\",\n",
- " \"valueType\": \"INT64\"\n",
- " },\n",
- " {\n",
- " \"name\": \"deviceprotection\",\n",
- " \"valueType\": \"INT64\"\n",
- " },\n",
- " {\n",
- " \"name\": \"paymentmethod_bank_transfer_automatic\",\n",
- " \"valueType\": \"INT64\"\n",
- " },\n",
- " {\n",
- " \"name\": \"internetservice_fiber_optic\",\n",
- " \"valueType\": \"INT64\"\n",
- " },\n",
- " {\n",
- " \"name\": \"tenure_group_tenure_gt_60\",\n",
- " \"valueType\": \"INT64\"\n",
- " }\n",
- " ],\n",
- " \"source\": {\n",
- " \"type\": \"KAFKA\",\n",
- " \"kafkaSourceConfig\": {\n",
- " \"bootstrapServers\": \"localhost:9094\",\n",
- " \"topic\": \"feast-features\"\n",
- " }\n",
- " },\n",
- " \"project\": \"default\"\n",
- " },\n",
- " \"meta\": {\n",
- " \"createdTimestamp\": \"2020-06-26T12:48:29Z\",\n",
- " \"status\": \"STATUS_PENDING\"\n",
- " }\n",
- "}\n"
- ]
- }
- ],
- "source": [
- "customer_churn_fs = client.get_feature_set('customer_churn')\n",
- "print(client.get_feature_set('customer_churn'))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### 2.3 Load Features Into Feast"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "The ingest method pushes data to Feast for storage. All stores (online, historical) will be updated with this feature data"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 18,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Waiting for feature set to be ready for ingestion...\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "100%|██████████| 7032/7032 [00:04<00:00, 1735.70rows/s]"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Ingestion complete!\n",
- "\n",
- "Ingestion statistics:\n",
- "Success: 7032/7032\n",
- "Removing temporary file(s)...\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "\n"
- ]
- },
- {
- "data": {
- "text/plain": [
- "'ca7c1deb-4cdd-3989-8173-3a5c1f37adfb'"
- ]
- },
- "execution_count": 18,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "client.ingest(customer_churn_fs, telcom)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### 2.4 (Optional) Create a Model Class"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "The following is a wrapper class that we have created for this tutorial. It neatly wraps a Feast Client as well as model training and serving into a single object. \n",
- "\n",
- "This ChurnModel object can be used to\n",
- "* Train a model\n",
- "* Serve the model in production\n",
- "\n",
- "Do note that the use of this class is not a requirement. The Feast retrieval methods below can be used in a standalone manner as well."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 19,
- "metadata": {},
- "outputs": [],
- "source": [
- "import joblib\n",
- "import os\n",
- "\n",
- "from feast import Client\n",
- "from feast.serving.ServingService_pb2 import GetOnlineFeaturesRequest\n",
- "from feast.types.Value_pb2 import Value\n",
- "from sklearn.model_selection import train_test_split\n",
- "from xgboost import XGBClassifier\n",
- "from pandas import DataFrame\n",
- "\n",
- "\n",
- "class ChurnModel:\n",
- " def __init__(self, features, target, model_path=None):\n",
- " # Set up Feast clients to retrieve training and online serving data\n",
- " self._feast_online_client = Client(serving_url=os.environ['FEAST_ONLINE_SERVING_URL'])\n",
- " self._feast_batch_client = Client(serving_url=os.environ['FEAST_HISTORICAL_SERVING_URL'],\n",
- " core_url=os.environ['FEAST_CORE_URL'])\n",
- " \n",
- " # Path to either save models after training or load models for serving\n",
- " self._model = None\n",
- " self._model_path = model_path\n",
- " self._features = features\n",
- " self._target = target\n",
- "\n",
- " def train(self, entity_df):\n",
- " # Initialize a new XGBoost model\n",
- " self._model = XGBClassifier(base_score=0.5, booster='gbtree', colsample_bylevel=1,\n",
- " colsample_bytree=1, gamma=0, learning_rate=0.1, max_delta_step=0,\n",
- " max_depth=7, min_child_weight=1, missing=None, n_estimators=50,\n",
- " n_jobs=1, nthread=None, objective='binary:logistic', random_state=0,\n",
- " reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=None,\n",
- " silent=True, subsample=1)\n",
- "\n",
- " # Get training dataset from Feast\n",
- " train_x, test_x, train_y, test_y = self._get_training_data(entity_df)\n",
- "\n",
- " # Train model\n",
- " self._model.fit(train_x, train_y, early_stopping_rounds=40, eval_set=[(test_x, test_y)])\n",
- "\n",
- " def _get_training_data(self, entity_df):\n",
- " # Add the target variable to our feature list\n",
- " features = self._features + [self._target]\n",
- "\n",
- " # Retrieve training dataset from Feast\n",
- " dataset = self._feast_batch_client.get_historical_features(\n",
- " feature_refs=features,\n",
- " entity_rows=entity_df).to_dataframe()\n",
- "\n",
- " # Split into a train and test set\n",
- " return train_test_split(dataset[self._features], dataset[self._target],\n",
- " test_size=0.25, random_state=111)\n",
- "\n",
- " def predict(self, customer_ids):\n",
- " # Load external model if no model exists\n",
- " if not self._model:\n",
- " self._model = joblib.load(self._model_path)\n",
- "\n",
- " # Get online features from Feast for the list of customers\n",
- " prediction = self._model.predict(data=self._get_online_features(customer_ids))\n",
- "\n",
- " # Return churn predictions\n",
- " return prediction\n",
- "\n",
- " def _get_online_features(self, customer_ids):\n",
- " # Build request out of entities (customer ids)\n",
- " entity_rows = []\n",
- " for customer_id in customer_ids:\n",
- " entity_rows.append(\n",
- " {'customer_id': customer_id}\n",
- " )\n",
- "\n",
- " # Retrieve online features from Feast for given entities\n",
- " data = self._feast_online_client.get_online_features(feature_refs=self._features,\n",
- " entity_rows=entity_rows)\n",
- " # Convert to Pandas dataframe\n",
- " features_dict = dict.fromkeys(self._features)\n",
- " for row in data.field_values:\n",
- " for feature in features_dict.keys():\n",
- " if features_dict[feature] is None:\n",
- " features_dict[feature] = []\n",
- " features_dict[feature].append(row.fields[feature].int64_val)\n",
- " return DataFrame.from_dict(features_dict)\n",
- "\n",
- " def save_model(self, model_path=None):\n",
- " # Export trained model to local path\n",
- " if not model_path:\n",
- " model_path = self._model_path\n",
- " joblib.dump(self._model, model_path)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### 2.5 Define Features and Target"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Next we will create our list of features and target variable"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 20,
- "metadata": {},
- "outputs": [],
- "source": [
- "features = [\n",
- " 'gender',\n",
- " 'seniorcitizen',\n",
- " 'partner',\n",
- " 'dependents',\n",
- " 'phoneservice',\n",
- " 'onlinesecurity',\n",
- " 'onlinebackup',\n",
- " 'deviceprotection',\n",
- " 'techsupport',\n",
- " 'streamingtv',\n",
- " 'streamingmovies',\n",
- " 'paperlessbilling',\n",
- " 'multiplelines_no',\n",
- " 'multiplelines_no_phone_service',\n",
- " 'multiplelines_yes',\n",
- " 'internetservice_dsl',\n",
- " 'internetservice_fiber_optic',\n",
- " 'internetservice_no',\n",
- " 'contract_month_to_month',\n",
- " 'contract_one_year',\n",
- " 'contract_two_year',\n",
- " 'paymentmethod_bank_transfer_automatic',\n",
- " 'paymentmethod_credit_card_automatic',\n",
- " 'paymentmethod_electronic_check',\n",
- " 'paymentmethod_mailed_check',\n",
- " 'tenure_group_tenure_0_12',\n",
- " 'tenure_group_tenure_12_24',\n",
- " 'tenure_group_tenure_24_48',\n",
- " 'tenure_group_tenure_48_60',\n",
- " 'tenure_group_tenure_gt_60',\n",
- " 'tenure',\n",
- " 'monthlycharges',\n",
- " 'totalcharges']\n",
- "\n",
- "target = 'churn'"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "We create an instance of our ChurnModel class. This will also initialize the Feast clients"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 21,
- "metadata": {},
- "outputs": [],
- "source": [
- "cm = ChurnModel(features=features, target=target)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### 2.6 Train Model"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "The entity DataFrame here is used to retrieve features. Each row in this dataframe represents some `customer_id` and timestamp on which we want to make a prediction. This DataFrame will be loaded into Feast, after which Feast will join features onto the DataFrame in a point-in-time correct way, and return it to the user for training their model."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 22,
- "metadata": {},
- "outputs": [],
- "source": [
- "entity_df = telcom[['customer_id']].copy()\n",
- "entity_df['datetime'] = pd.Series([dt.datetime.now()] * len(entity_df))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Next we train our model"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 23,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "[04:13:07] WARNING: /workspace/src/learner.cc:480: \n",
- "Parameters: { silent } might not be used.\n",
- "\n",
- " This may not be accurate due to some parameters are only used in language bindings but\n",
- " passed down to XGBoost core. Or some parameters are not used but slip through this\n",
- " verification. Please open an issue if you find above cases.\n",
- "\n",
- "\n",
- "[0]\tvalidation_0-error:0.21388\n",
- "Will train until validation_0-error hasn't improved in 40 rounds.\n",
- "[1]\tvalidation_0-error:0.21786\n",
- "[2]\tvalidation_0-error:0.21388\n",
- "[3]\tvalidation_0-error:0.20876\n",
- "[4]\tvalidation_0-error:0.21331\n",
- "[5]\tvalidation_0-error:0.20762\n",
- "[6]\tvalidation_0-error:0.20762\n",
- "[7]\tvalidation_0-error:0.21217\n",
- "[8]\tvalidation_0-error:0.21445\n",
- "[9]\tvalidation_0-error:0.21047\n",
- "[10]\tvalidation_0-error:0.21160\n",
- "[11]\tvalidation_0-error:0.21502\n",
- "[12]\tvalidation_0-error:0.21616\n",
- "[13]\tvalidation_0-error:0.21274\n",
- "[14]\tvalidation_0-error:0.21388\n",
- "[15]\tvalidation_0-error:0.21331\n",
- "[16]\tvalidation_0-error:0.21502\n",
- "[17]\tvalidation_0-error:0.21672\n",
- "[18]\tvalidation_0-error:0.21843\n",
- "[19]\tvalidation_0-error:0.21786\n",
- "[20]\tvalidation_0-error:0.21900\n",
- "[21]\tvalidation_0-error:0.21729\n",
- "[22]\tvalidation_0-error:0.21502\n",
- "[23]\tvalidation_0-error:0.21729\n",
- "[24]\tvalidation_0-error:0.21559\n",
- "[25]\tvalidation_0-error:0.21502\n",
- "[26]\tvalidation_0-error:0.21616\n",
- "[27]\tvalidation_0-error:0.21672\n",
- "[28]\tvalidation_0-error:0.21331\n",
- "[29]\tvalidation_0-error:0.21445\n",
- "[30]\tvalidation_0-error:0.21388\n",
- "[31]\tvalidation_0-error:0.21331\n",
- "[32]\tvalidation_0-error:0.21331\n",
- "[33]\tvalidation_0-error:0.21445\n",
- "[34]\tvalidation_0-error:0.21502\n",
- "[35]\tvalidation_0-error:0.21445\n",
- "[36]\tvalidation_0-error:0.21616\n",
- "[37]\tvalidation_0-error:0.21616\n",
- "[38]\tvalidation_0-error:0.21616\n",
- "[39]\tvalidation_0-error:0.21559\n",
- "[40]\tvalidation_0-error:0.21616\n",
- "[41]\tvalidation_0-error:0.21616\n",
- "[42]\tvalidation_0-error:0.21502\n",
- "[43]\tvalidation_0-error:0.21616\n",
- "[44]\tvalidation_0-error:0.21616\n",
- "[45]\tvalidation_0-error:0.21616\n",
- "Stopping. Best iteration:\n",
- "[5]\tvalidation_0-error:0.20762\n",
- "\n"
- ]
- }
- ],
- "source": [
- "cm.train(entity_df)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### 2.7 Predict"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Once the model is trained we can use it to make predictions using Feast Online Serving"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 24,
- "metadata": {},
- "outputs": [],
- "source": [
- "churn_prediction = cm.predict(['9237-HQITU', '9305-CDSKC', '7892-POOKP', '4190-MFLUW', '6467-CHFZW', '8665-UTDHZ'])"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 25,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "[0 0 0 1 1 1]\n"
- ]
- }
- ],
- "source": [
- "print(churn_prediction)"
- ]
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "local-feast",
- "language": "python",
- "name": "local-feast"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.7.6"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 4
-}
diff --git a/examples/statistics/Historical Feature Statistics with Feast, TFDV and Facets.ipynb b/examples/statistics/Historical Feature Statistics with Feast, TFDV and Facets.ipynb
deleted file mode 100644
index c4d91340cf..0000000000
--- a/examples/statistics/Historical Feature Statistics with Feast, TFDV and Facets.ipynb
+++ /dev/null
@@ -1,690 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# Historical Feature Statistics with Feast, TFDV and Facets\n",
- "\n",
- "This tutorial covers how Feast can be used in conjunction with TFDV and Facets to retrieve statistics about feature datasets. \n",
- "\n",
- "The notebook showcases how Feast's integration with TFDV allows users to:\n",
- "\n",
- "1. Define TFX feature schemas and persist these properties in the Feature Store\n",
- "2. Validate new data against the defined schema\n",
- "3. Validate data already in Feast against the defined schema\n",
- "\n",
- "**Prerequisites**:\n",
- "\n",
- "- Feast running with at least 1 BigQuery warehouse store. This example uses a bigquery store with the name `historical`."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "setting project to statistics...\n"
- ]
- }
- ],
- "source": [
- "import pandas as pd\n",
- "import pytest\n",
- "import pytz\n",
- "import uuid\n",
- "import time\n",
- "from datetime import datetime, timedelta\n",
- "\n",
- "from feast.client import Client\n",
- "from feast.entity import Entity\n",
- "from feast.feature import Feature\n",
- "from feast.feature_set import FeatureSet\n",
- "from feast.type_map import ValueType\n",
- "from google.protobuf import json_format\n",
- "from google.protobuf.duration_pb2 import Duration\n",
- "from tensorflow_metadata.proto.v0 import statistics_pb2\n",
- "from tensorflow_metadata.proto.v0 import schema_pb2\n",
- "import tensorflow_data_validation as tfdv\n",
- "\n",
- "PROJECT_NAME = \"statistics\"\n",
- "IRIS_DATASET = \"http://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data\"\n",
- "BIGQUERY_STORE_NAME = \"historical\"\n",
- "client = Client(core_url=\"localhost:6565\")\n",
- "print(f\"setting project to {PROJECT_NAME}...\")\n",
- "client.set_project(PROJECT_NAME)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "In this example, we are using the iris dataset. More information about this dataset can be found [here](http://archive.ics.uci.edu/ml/datasets/iris)."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "
\n",
- "\n",
- "
\n",
- " \n",
- "
\n",
- "
\n",
- "
sepal_length
\n",
- "
sepal_width
\n",
- "
petal_length
\n",
- "
petal_width
\n",
- "
class
\n",
- "
datetime
\n",
- "
\n",
- " \n",
- " \n",
- "
\n",
- "
0
\n",
- "
5.1
\n",
- "
3.5
\n",
- "
1.4
\n",
- "
0.2
\n",
- "
Iris-setosa
\n",
- "
2020-05-25 07:31:28.230582+00:00
\n",
- "
\n",
- "
\n",
- "
1
\n",
- "
4.9
\n",
- "
3.0
\n",
- "
1.4
\n",
- "
0.2
\n",
- "
Iris-setosa
\n",
- "
2020-05-25 07:31:28.230582+00:00
\n",
- "
\n",
- "
\n",
- "
2
\n",
- "
4.7
\n",
- "
3.2
\n",
- "
1.3
\n",
- "
0.2
\n",
- "
Iris-setosa
\n",
- "
2020-05-25 07:31:28.230582+00:00
\n",
- "
\n",
- "
\n",
- "
3
\n",
- "
4.6
\n",
- "
3.1
\n",
- "
1.5
\n",
- "
0.2
\n",
- "
Iris-setosa
\n",
- "
2020-05-25 07:31:28.230582+00:00
\n",
- "
\n",
- "
\n",
- "
4
\n",
- "
5.0
\n",
- "
3.6
\n",
- "
1.4
\n",
- "
0.2
\n",
- "
Iris-setosa
\n",
- "
2020-05-25 07:31:28.230582+00:00
\n",
- "
\n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " sepal_length sepal_width petal_length petal_width class \\\n",
- "0 5.1 3.5 1.4 0.2 Iris-setosa \n",
- "1 4.9 3.0 1.4 0.2 Iris-setosa \n",
- "2 4.7 3.2 1.3 0.2 Iris-setosa \n",
- "3 4.6 3.1 1.5 0.2 Iris-setosa \n",
- "4 5.0 3.6 1.4 0.2 Iris-setosa \n",
- "\n",
- " datetime \n",
- "0 2020-05-25 07:31:28.230582+00:00 \n",
- "1 2020-05-25 07:31:28.230582+00:00 \n",
- "2 2020-05-25 07:31:28.230582+00:00 \n",
- "3 2020-05-25 07:31:28.230582+00:00 \n",
- "4 2020-05-25 07:31:28.230582+00:00 "
- ]
- },
- "execution_count": 2,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "iris_feature_names = [\"sepal_length\",\"sepal_width\",\"petal_length\",\"petal_width\"]\n",
- "df = pd.read_csv(IRIS_DATASET, names=iris_feature_names + [\"class\"])\n",
- "\n",
- "# Add datetime to satisfy Feast\n",
- "current_datetime = datetime.utcnow().replace(tzinfo=pytz.utc)\n",
- "df['datetime'] = current_datetime - timedelta(days=1)\n",
- "\n",
- "df.head()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## TFDV schema as part of the feature set definition\n",
- "\n",
- "An integral part of TFDV is the feature [schemas](https://github.com/tensorflow/metadata/blob/master/tensorflow_metadata/proto/v0/schema.proto) that describe the expected properties of the data in a dataset, such as:\n",
- "- expected feature presence\n",
- "- type\n",
- "- expected domains of features\n",
- "\n",
- "These schemas, which can be [manually defined or generated by TFDV](https://www.tensorflow.org/tfx/data_validation/get_started#inferring_a_schema_over_the_data), can be then used to extend the definition of features within the feature set. As part of the spec, the schema is persisted within Feast, and is used for both in-flight data validation, as well as offline integration with TFDV.\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {
- "scrolled": true
- },
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "WARNING:root:Ignoring feature datetime of type datetime64[ns, UTC]\n",
- "/Users/zhiling/.pyenv/versions/3.7.2/envs/test-feast/lib/python3.7/site-packages/tensorflow_data_validation/arrow/arrow_util.py:236: FutureWarning: Calling .data on ChunkedArray is provided for compatibility after Column was removed, simply drop this attribute\n",
- " types.FeaturePath([column_name]), column.data.chunk(0), weights):\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Entity class(ValueType.STRING) manually updated (replacing an existing field).\n",
- "Feature sepal_length (ValueType.DOUBLE) added from dataframe.\n",
- "Feature sepal_width (ValueType.DOUBLE) added from dataframe.\n",
- "Feature petal_length (ValueType.DOUBLE) added from dataframe.\n",
- "Feature petal_width (ValueType.DOUBLE) added from dataframe.\n",
- "\n",
- "{\n",
- " \"spec\": {\n",
- " \"name\": \"iris\",\n",
- " \"entities\": [\n",
- " {\n",
- " \"name\": \"class\",\n",
- " \"valueType\": \"STRING\"\n",
- " }\n",
- " ],\n",
- " \"features\": [\n",
- " {\n",
- " \"name\": \"sepal_length\",\n",
- " \"valueType\": \"DOUBLE\",\n",
- " \"presence\": {\n",
- " \"minFraction\": 1.0,\n",
- " \"minCount\": \"1\"\n",
- " },\n",
- " \"shape\": {\n",
- " \"dim\": [\n",
- " {\n",
- " \"size\": \"1\"\n",
- " }\n",
- " ]\n",
- " }\n",
- " },\n",
- " {\n",
- " \"name\": \"sepal_width\",\n",
- " \"valueType\": \"DOUBLE\",\n",
- " \"presence\": {\n",
- " \"minFraction\": 1.0,\n",
- " \"minCount\": \"1\"\n",
- " },\n",
- " \"shape\": {\n",
- " \"dim\": [\n",
- " {\n",
- " \"size\": \"1\"\n",
- " }\n",
- " ]\n",
- " }\n",
- " },\n",
- " {\n",
- " \"name\": \"petal_length\",\n",
- " \"valueType\": \"DOUBLE\",\n",
- " \"presence\": {\n",
- " \"minFraction\": 1.0,\n",
- " \"minCount\": \"1\"\n",
- " },\n",
- " \"shape\": {\n",
- " \"dim\": [\n",
- " {\n",
- " \"size\": \"1\"\n",
- " }\n",
- " ]\n",
- " }\n",
- " },\n",
- " {\n",
- " \"name\": \"petal_width\",\n",
- " \"valueType\": \"DOUBLE\",\n",
- " \"presence\": {\n",
- " \"minFraction\": 1.0,\n",
- " \"minCount\": \"1\"\n",
- " },\n",
- " \"shape\": {\n",
- " \"dim\": [\n",
- " {\n",
- " \"size\": \"1\"\n",
- " }\n",
- " ]\n",
- " },\n",
- " \"floatDomain\": {\n",
- " \"min\": 0.0\n",
- " }\n",
- " }\n",
- " ]\n",
- " },\n",
- " \"meta\": {}\n",
- "}\n"
- ]
- }
- ],
- "source": [
- "# Infer a schema over the iris dataset. These values can be tweaked as necessary.\n",
- "stats = tfdv.generate_statistics_from_dataframe(df)\n",
- "schema = tfdv.infer_schema(statistics=stats)\n",
- "width_domain = schema_pb2.FloatDomain(min=0)\n",
- "tfdv.set_domain(schema, 'petal_width', width_domain)\n",
- "\n",
- "# Create a new FeatureSet or retrieve an existing FeatureSet in Feast\n",
- "feature_set = FeatureSet(name=\"iris\")\n",
- "feature_set.infer_fields_from_df(df[['datetime'] + iris_feature_names], \n",
- " entities=[Entity(name=\"class\", dtype=ValueType.STRING)])\n",
- "\n",
- "# Update the entities and features with constraints defined in the schema\n",
- "feature_set.import_tfx_schema(schema)\n",
- "print(feature_set)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Computing statistics over an ingested dataset\n",
- "\n",
- "Feast is able to compute statistics for any data that has been ingested into the system. Statistics can be computed over either discrete datasets using *dataset_ids* or periods of time using a specified time range.\n",
- "\n",
- "These statistics are computed at a historical store (caveat: only BQ is supported at the moment). The feature statistics returned in the form of TFX's `DatasetFeatureStatisticsList`, which can then be directly fed back into TFDV methods to either visualise the data statistics, or validate the dataset."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Feature set created: \"iris\"\n",
- "Waiting for feature set to be ready for ingestion...\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "100%|██████████| 150/150 [00:01<00:00, 122.33rows/s]"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Ingestion complete!\n",
- "\n",
- "Ingestion statistics:\n",
- "Success: 150/150\n",
- "Removing temporary file(s)...\n",
- "\n",
- "ingestion id: 73ed84b1-1218-3702-b4c6-673503233264\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "\n"
- ]
- }
- ],
- "source": [
- "# Apply the featureset\n",
- "client.apply(feature_set)\n",
- "\n",
- "# When a dataset is ingested into Feast, a unique ingestion id referencing the ingested dataset is returned. \n",
- "ingestion_id = client.ingest(feature_set, df)\n",
- "print(\"\\ningestion id: \" + ingestion_id)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Get statistics from Feast for the ingested dataset.\n",
- "# The statistics are calculated over the data in the store specified.\n",
- "stats = client.get_statistics(\n",
- " feature_set_id='iris', \n",
- " store=BIGQUERY_STORE_NAME, \n",
- " features=iris_feature_names, \n",
- " ingestion_ids=[ingestion_id])"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# Visualising statistics with facets\n",
- "\n",
- "Since Feast outputs statistics in a format compatible with the TFDV API, the stats object can be directly passed to `tfdv.visualize_statistics()` to visualise, in-line, the output statistics on [Facets](https://pair-code.github.io/facets/), allowing for easy and interactive exploration of the shape and distribution of the data inside Feast."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "metadata": {
- "scrolled": false
- },
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- " "
- ],
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "tfdv.visualize_statistics(stats)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# Validating correctness of subsequent datasets \n",
- "\n",
- "While it is useful to explore dataset statistics using facets, since we have already defined a schema that specifies a dataset's bounds of correctness, we can leverage TFDV's `validate_statistics` to validate if subsequent datasets are problematic or not. "
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "It is possible to validate correctness of a new dataset prior to ingestion by retrieving the schema from the feature set, and comparing computed statistics against that schema. \n",
- "\n",
- "This can be useful if we want to avoid ingesting problematic data into Feast."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 8,
- "metadata": {},
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "WARNING:root:Ignoring feature datetime of type datetime64[ns, UTC]\n"
- ]
- },
- {
- "data": {
- "text/html": [
- "
\n",
- "\n",
- "
\n",
- " \n",
- "
\n",
- "
\n",
- "
Anomaly short description
\n",
- "
Anomaly long description
\n",
- "
\n",
- "
\n",
- "
Feature name
\n",
- "
\n",
- "
\n",
- "
\n",
- " \n",
- " \n",
- "
\n",
- "
'petal_width'
\n",
- "
Out-of-range values
\n",
- "
Unexpectedly low values: -1<-1(upto six significant digits)
\n",
- "
\n",
- "
\n",
- "
'class'
\n",
- "
New column
\n",
- "
New column (column in data but not in schema)
\n",
- "
\n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " Anomaly short description \\\n",
- "Feature name \n",
- "'petal_width' Out-of-range values \n",
- "'class' New column \n",
- "\n",
- " Anomaly long description \n",
- "Feature name \n",
- "'petal_width' Unexpectedly low values: -1<-1(upto six significant digits) \n",
- "'class' New column (column in data but not in schema) "
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "# Ingest a new dataset with obviously incorrect data\n",
- "df_2 = pd.DataFrame(\n",
- " {\n",
- " \"datetime\": current_datetime,\n",
- " \"class\": [\"Iris-setosa\", \"Iris-virginica\", \"Iris-nonsensica\"],\n",
- " \"sepal_length\": [4.3, 6.9, 12],\n",
- " \"sepal_width\": [3.0, 2.8, 1.1],\n",
- " \"petal_length\": [1.2, 4.9, 2.2],\n",
- " \"petal_width\": [0.1, 1.8, -1.0]\n",
- " }\n",
- ")\n",
- "\n",
- "# Validate correctness\n",
- "stats_2 = tfdv.generate_statistics_from_dataframe(df_2)\n",
- "anomalies = tfdv.validate_statistics(statistics=stats_2, schema=feature_set.export_tfx_schema())\n",
- "tfdv.display_anomalies(anomalies)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Alternatively, the data can be ingested into Feast, and the statistics computed at the store. This has the benefit of offloading statistics computation for large datasets to Feast."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 9,
- "metadata": {
- "scrolled": false
- },
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "\r",
- " 0%| | 0/3 [00:00, ?rows/s]"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Waiting for feature set to be ready for ingestion...\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "100%|██████████| 3/3 [00:01<00:00, 2.85rows/s]\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Ingestion complete!\n",
- "\n",
- "Ingestion statistics:\n",
- "Success: 3/3\n",
- "Removing temporary file(s)...\n"
- ]
- },
- {
- "data": {
- "text/html": [
- "
\n",
- "\n",
- "
\n",
- " \n",
- "
\n",
- "
\n",
- "
Anomaly short description
\n",
- "
Anomaly long description
\n",
- "
\n",
- "
\n",
- "
Feature name
\n",
- "
\n",
- "
\n",
- "
\n",
- " \n",
- " \n",
- "
\n",
- "
'petal_width'
\n",
- "
Out-of-range values
\n",
- "
Unexpectedly low values: -1<-1(upto six significant digits)
\n",
- "
\n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " Anomaly short description \\\n",
- "Feature name \n",
- "'petal_width' Out-of-range values \n",
- "\n",
- " Anomaly long description \n",
- "Feature name \n",
- "'petal_width' Unexpectedly low values: -1<-1(upto six significant digits) "
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "# Ingest the data into Feast\n",
- "ingestion_id_2 = client.ingest(feature_set, df_2)\n",
- "time.sleep(10) # Sleep is not necessary if not using DirectRunner\n",
- "\n",
- "# Compute statistics over the new dataset\n",
- "stats_2 = client.get_statistics(\n",
- " feature_set_id='iris', \n",
- " store=BIGQUERY_STORE_NAME, \n",
- " features=iris_feature_names, \n",
- " ingestion_ids=[ingestion_id_2])\n",
- "\n",
- "# Detect anomalies in the dataset\n",
- "anomalies = tfdv.validate_statistics(statistics=stats_2, schema=feature_set.export_tfx_schema())\n",
- "tfdv.display_anomalies(anomalies)"
- ]
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.7.2"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 2
-}
\ No newline at end of file