{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " income_k debt_k employment_years credit_score approved\n", "0 122.0 58.0 4.0 594.0 1\n", "1 112.0 26.0 4.0 523.0 0\n", "2 34.0 48.0 5.0 824.0 0\n", "3 126.0 76.0 29.0 345.0 0\n", "4 91.0 32.0 8.0 412.0 0\n", "\n", "Approval rate: 33.0%\n", "\n", "Accuracy: 0.9400\n", " precision recall f1-score support\n", "\n", " Denied 0.93 0.98 0.95 64\n", " Approved 0.97 0.86 0.91 36\n", "\n", " accuracy 0.94 100\n", " macro avg 0.95 0.92 0.93 100\n", "weighted avg 0.94 0.94 0.94 100\n", "\n", "\n", "Sample (income=$65k, debt=$15k, 5yrs, score=710): Approved (conf: 98%)\n" ] } ], "source": [ "import numpy as np\n", "import pandas as pd\n", "from sklearn.ensemble import RandomForestClassifier\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.metrics import accuracy_score, classification_report\n", "\n", "np.random.seed(42)\n", "n = 500\n", "\n", "income_k = np.random.randint(20, 150, n).astype(float)\n", "debt_k = np.random.randint(0, 80, n).astype(float)\n", "employment_years = np.random.randint(0, 31, n).astype(float)\n", "credit_score = np.random.randint(300, 851, n).astype(float)\n", "\n", "# Approval logic: good credit + income > debt + stable employment\n", "approved = (\n", " (credit_score > 620)\n", " & (income_k > debt_k * 1.4)\n", " & (employment_years >= 1)\n", ").astype(int)\n", "# Add some noise\n", "noise_idx = np.random.choice(n, size=int(n * 0.05), replace=False)\n", "approved[noise_idx] = 1 - approved[noise_idx]\n", "\n", "df = pd.DataFrame({\n", " 'income_k': income_k,\n", " 'debt_k': debt_k,\n", " 'employment_years': employment_years,\n", " 'credit_score': credit_score,\n", " 'approved': approved\n", "})\n", "\n", "print(df.head())\n", "print(f'\\nApproval rate: {approved.mean():.1%}')\n", "\n", "X = df[['income_k', 'debt_k', 'employment_years', 'credit_score']]\n", "y = df['approved']\n", "\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n", "\n", "model = RandomForestClassifier(n_estimators=100, random_state=42)\n", "model.fit(X_train, y_train)\n", "\n", "y_pred = model.predict(X_test)\n", "print(f'\\nAccuracy: {accuracy_score(y_test, y_pred):.4f}')\n", "print(classification_report(y_test, y_pred, target_names=['Denied', 'Approved']))\n", "\n", "sample = pd.DataFrame([[65, 15, 5, 710]], columns=['income_k', 'debt_k', 'employment_years', 'credit_score'])\n", "pred = model.predict(sample)[0]\n", "proba = model.predict_proba(sample)[0]\n", "print(f'\\nSample (income=$65k, debt=$15k, 5yrs, score=710): {\"Approved\" if pred == 1 else \"Denied\"} (conf: {max(proba):.0%})')" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/usr/local/lib/python3.12/dist-packages/huggingface_hub/utils/_auth.py:122: UserWarning: \n", "Error while fetching `HF_TOKEN` secret value from your vault: 'Requesting secret HF_TOKEN timed out. Secrets can only be fetched when running from the Colab UI.'.\n", "You are not authenticated with the Hugging Face Hub in this notebook.\n", "If the error persists, please let us know by opening an issue on GitHub (https://github.com/huggingface/huggingface_hub/issues/new).\n", " warnings.warn(\n" ] } ], "source": [ "from huggingface_hub import notebook_login\n", "notebook_login()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Model saved locally: /content/ML_RandomForestClassifier_CreditApproval.joblib\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "d59417dad04b4f17ae129b9509c675f9", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Processing Files (0 / 0) : | | 0.00B / 0.00B " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "969e7417b01e46649d7d951031cfe566", "version_major": 2, "version_minor": 0 }, "text/plain": [ "New Data Upload : | | 0.00B / 0.00B " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "7954622246754ccf9a6ccc8ebf1175fe", "version_major": 2, "version_minor": 0 }, "text/plain": [ " ...ier_CreditApproval.joblib: 100%|##########| 619kB / 619kB " ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Uploaded to https://huggingface.co/looh2/model\n" ] } ], "source": [ "import joblib\n", "from pathlib import Path\n", "from huggingface_hub import HfApi\n", "\n", "repo_id = \"looh2/model\"\n", "model_path = Path(\"ML_RandomForestClassifier_CreditApproval.joblib\")\n", "\n", "joblib.dump(model, model_path)\n", "print(f\"Model saved locally: {model_path.resolve()}\")\n", "\n", "api = HfApi()\n", "api.create_repo(repo_id=repo_id, repo_type=\"model\", exist_ok=True)\n", "api.upload_file(\n", " path_or_fileobj=str(model_path),\n", " path_in_repo=model_path.name,\n", " repo_id=repo_id,\n", " repo_type=\"model\",\n", ")\n", "print(f\"Uploaded to https://huggingface.co/{repo_id}\")" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "39eca9fa406f4adca687b11b9fd06e91", "version_major": 2, "version_minor": 0 }, "text/plain": [ "ML_RandomForestClassifier_CreditApproval(…): 0%| | 0.00/619k [00:00