205 lines
38 KiB
Text
205 lines
38 KiB
Text
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 1,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# todo: export the model from train.ipynb\n",
|
|
"\n",
|
|
"# todo: copy import from train.ipynb\n",
|
|
"# todo: copy normalize() from train.ipynb\n",
|
|
"# todo: copy predict() from train.ipynb\n",
|
|
"\n",
|
|
"# todo: inject saved model into predict()\n",
|
|
"# todo: turn predict() into a GreatAI service\n",
|
|
"\n",
|
|
"# todo: log prediction into output trace"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"\u001b[38;5;226mEnvironment variable ENVIRONMENT is not set, defaulting to development mode ‼️\u001b[0m\n",
|
|
"\u001b[38;5;226mCannot find credentials files, defaulting to using ParallelTinyDbDriver\u001b[0m\n",
|
|
"\u001b[38;5;226mThe selected tracing database (ParallelTinyDbDriver) is not recommended for production\u001b[0m\n",
|
|
"\u001b[38;5;226mCannot find credentials files, defaulting to using LargeFileLocal\u001b[0m\n",
|
|
"\u001b[38;5;39mGreatAI (v0.1.10): configured ✅\u001b[0m\n",
|
|
"\u001b[38;5;39m 🔩 tracing_database: ParallelTinyDbDriver\u001b[0m\n",
|
|
"\u001b[38;5;39m 🔩 large_file_implementation: LargeFileLocal\u001b[0m\n",
|
|
"\u001b[38;5;39m 🔩 is_production: False\u001b[0m\n",
|
|
"\u001b[38;5;39m 🔩 should_log_exception_stack: True\u001b[0m\n",
|
|
"\u001b[38;5;39m 🔩 prediction_cache_size: 512\u001b[0m\n",
|
|
"\u001b[38;5;39m 🔩 dashboard_table_size: 50\u001b[0m\n",
|
|
"\u001b[38;5;226mYou still need to check whether you follow all best practices before trusting your deployment.\u001b[0m\n",
|
|
"\u001b[38;5;226m> Find out more at https://se-ml.github.io/practices\u001b[0m\n",
|
|
"\u001b[38;5;39mFetching cached versions of financial-sentiment\u001b[0m\n",
|
|
"\u001b[38;5;39mLatest version of financial-sentiment is 0 (from versions: 0)\u001b[0m\n",
|
|
"\u001b[38;5;39mFile financial-sentiment-0 found in cache\u001b[0m\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"from great_ai.utilities import clean\n",
|
|
"from great_ai import use_model, GreatAI, log_metric\n",
|
|
"import re\n",
|
|
"\n",
|
|
"def normalize(text: str) -> str:\n",
|
|
" cleaned = clean(text, convert_to_ascii=True).lower()\n",
|
|
" return re.sub(r\"[^a-z]+\", \" \", cleaned)\n",
|
|
"\n",
|
|
"@GreatAI.create\n",
|
|
"@use_model('financial-sentiment')\n",
|
|
"def predict_financial_sentiment(text: str, model):\n",
|
|
" \"\"\"Classify news articles into Negative, Neutral, or Positive classes using a linear SVM.\"\"\"\n",
|
|
" text = normalize(text)\n",
|
|
" features = model.named_steps[\"tfidfvectorizer\"].transform([text])\n",
|
|
" prediction = model.named_steps[\"sgdclassifier\"].predict(features)[0]\n",
|
|
"\n",
|
|
" explanation = [\n",
|
|
" (feature_name, weight)\n",
|
|
" for weight, feature_name in sorted(\n",
|
|
" (\n",
|
|
" (feature_weight * feature, feature_name)\n",
|
|
" for feature_name, feature_weight, feature in zip(\n",
|
|
" model.named_steps[\"tfidfvectorizer\"].get_feature_names_out(),\n",
|
|
" model.named_steps[\"sgdclassifier\"].coef_[list(model.named_steps[\"sgdclassifier\"].classes_).index(prediction)],\n",
|
|
" features.toarray()[0],\n",
|
|
" )\n",
|
|
" if feature * feature_weight != 0\n",
|
|
" ),\n",
|
|
" reverse=True,\n",
|
|
" )\n",
|
|
" ][:10]\n",
|
|
"\n",
|
|
" log_metric('prediction', prediction, disable_logging=True)\n",
|
|
"\n",
|
|
" return prediction, explanation"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 3,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"100%|██████████| 200/200 [00:28<00:00, 7.05it/s]\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
" precision recall f1-score support\n",
|
|
"\n",
|
|
" negative 0.72 0.38 0.50 34\n",
|
|
" neutral 0.72 0.90 0.80 100\n",
|
|
" positive 0.86 0.74 0.80 66\n",
|
|
"\n",
|
|
" accuracy 0.76 200\n",
|
|
" macro avg 0.77 0.67 0.70 200\n",
|
|
"weighted avg 0.77 0.76 0.75 200\n",
|
|
"\n"
|
|
]
|
|
},
|
|
{
|
|
"data": {
|
|
"image/png": "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",
|
|
"text/plain": [
|
|
"<Figure size 720x720 with 2 Axes>"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"needs_background": "light"
|
|
},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"# todo: add integration test (copy metric derivation from train.ipynb)\n",
|
|
"\n",
|
|
"if __name__ == '__main__':\n",
|
|
" from great_ai import query_ground_truth\n",
|
|
" import matplotlib.pyplot as plt\n",
|
|
" from sklearn import metrics\n",
|
|
"\n",
|
|
" test_split = query_ground_truth('test', return_max_count=200)\n",
|
|
"\n",
|
|
" traces = predict_financial_sentiment.process_batch([t.input for t in test_split])\n",
|
|
" y_predicted = [t.output[0] for t in traces]\n",
|
|
" y_test = [t.output for t in test_split]\n",
|
|
"\n",
|
|
" %matplotlib inline\n",
|
|
" plt.rcParams[\"figure.figsize\"] = (10, 10)\n",
|
|
" plt.rcParams[\"font.size\"] = 16\n",
|
|
"\n",
|
|
" print(metrics.classification_report(y_test, y_predicted))\n",
|
|
" metrics.ConfusionMatrixDisplay.from_predictions(\n",
|
|
" y_true=y_test,\n",
|
|
" y_pred=y_predicted,\n",
|
|
" xticks_rotation=\"vertical\",\n",
|
|
" normalize=\"pred\",\n",
|
|
" values_format=\".2f\",\n",
|
|
" )"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 8,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"\u001b[38;5;39m2022-08-08 13:16:05 | INFO | Converting notebook to Python script\u001b[0m\n",
|
|
"\u001b[38;5;196m2022-08-08 13:16:05 | ERROR | local variable 'app_name' referenced before assignment\u001b[0m\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"# todo: serve prediction model\n",
|
|
"# todo: open dashboard\n",
|
|
"\n",
|
|
"!great-ai deploy_done.ipynb"
|
|
]
|
|
}
|
|
],
|
|
"metadata": {
|
|
"kernelspec": {
|
|
"display_name": "Python 3.8.5 ('.env': venv)",
|
|
"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.8.5"
|
|
},
|
|
"orig_nbformat": 4,
|
|
"vscode": {
|
|
"interpreter": {
|
|
"hash": "e0dc90c18746bdc09777f769a185ca5580a11b02153b98d31c3fa7ad1694afce"
|
|
}
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 2
|
|
}
|