867 lines
81 KiB
Plaintext
867 lines
81 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 5,
|
|
"id": "8354ba29-0c6f-41d8-86ab-76f296355a6a",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"/Users/user/TA/confivoice3/ml/features.py:70: UserWarning: PySoundFile failed. Trying audioread instead.\n",
|
|
" y, sr = librosa.load(file_path, sr=sample_rate, mono=True)\n",
|
|
"/Users/user/TA/confivoice3/cv_app/.venv/lib/python3.10/site-packages/librosa/core/audio.py:184: FutureWarning: librosa.core.audio.__audioread_load\n",
|
|
"\tDeprecated as of librosa version 0.10.0.\n",
|
|
"\tIt will be removed in librosa version 1.0.\n",
|
|
" y, sr_native = __audioread_load(path, offset, duration, dtype)\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"\n",
|
|
"=== Distribusi Label Dataset ===\n",
|
|
"PD : 43\n",
|
|
"TPD: 43\n",
|
|
"Total data: 86\n",
|
|
"Distribusi label: {'PD': 43, 'TPD': 43}\n",
|
|
"Jumlah fitur: 78\n",
|
|
"Fitting 5 folds for each of 16 candidates, totalling 80 fits\n",
|
|
"Best params: {'svm__C': 10, 'svm__gamma': 'scale', 'svm__kernel': 'rbf'}\n",
|
|
"Best CV f1_macro: 0.6554293822792274\n",
|
|
"Urutan kelas: ['PD', 'TPD']\n",
|
|
"Urutan label: ['PD', 'TPD']\n",
|
|
"[[29 14]\n",
|
|
" [15 28]]\n"
|
|
]
|
|
},
|
|
{
|
|
"data": {
|
|
"image/png": "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o0cPWb16tS3biNDghvd8yueY3qTvbc8XC8+8fPnySY0aNeT111/3rkfX77k/V65cUqRIEWnUqJHZX9qMCvtGP1k2/fNXfHy81KlTR6ZOnXrF5RYtWiSbNm3K0hmWCWqQrdq1aydHjhyRn3/+WR5//HEZPXq0vPrqq+kue/78edset2jRouZyFHbQUQSFCxfOdLnY2Fg5fPiwvP/++/LDDz+YbyiXLl3y3q8f1rovdLlZs2aZdd52223y0ksv2bKdCA1Of89rwKPPzzOpGTNmeG9/88033mUfeOABM+/HH380QfyAAQNk7ty53vt1FI3ef+jQIdmwYYM8+OCD5m+jbt265m8JOVv79u3lxRdflC5dumS4zK+//iqDBg2S9957T/LkyeP3YxDUINvPiVGqVCmpUKGCPPLII+YgvnTp0lTpcz2oa4RetWpVM1+vy6QfgPqhqh/UnTp1kn379nnXqYHCsGHDzP3FihWTESNGXHa127Tlp7TefPNN8/uff/65ub1w4UKpXbu2yaLoOnU79VtGyu3MTIkSJaR06dLSvHlzefbZZ80H+e7du7336wFH90X58uXNMm+88YaMGjXKLKuBDpzB6e95DXj0+Xkmpev13L7mmmu8yxYoUMDMu/baa01wV6VKFe++UJql0fv176Z69erSv39/E9ycOXPGPEfYM/rJsmmyW1JSktxzzz0yfPhwqVmzZpbWQVCDoNIP0JTfTvUDVg/oq1atkmXLlsmFCxekbdu2JgBYt26dfPnll1KwYEHz7dfzexMmTDCp67ffflvWr18vJ06cMOlLX40bN05GjhwpK1eulNatW5tvij179pR+/frJzp07TTmpa9eulx00/H2evnwTf+yxx8zjLFmyJMuPhdDmlvd8VvZFRl8OevfubYKflJlOZO3cMnE2TumtMzExMcsvzT/+8Q/JnTu3DB48OMvr4Dw1CAr9sNQP808//dSkGj0iIiLMN0jtP1CzZ8820bvO81zJXFPb+k1QP3jbtGljGsmeeuop8yGspk+fbtbriyeffFLeffddWbt2rfebgX7Aa8+Drk+/XSv9BptVur7x48dL2bJlvd/EM6LfyvVDPOW3cjiDm97zmdHgRMtO27dvNyWmzFSrVs1cxfr48ePm7wP+yZs3r8mAVakUbeuu02A7Ojr1OvUM7ZqF89eWLVtMKfPbb7/1vu+zgqAG2Uq/ieofgn4b1Q/uXr16pfoD0A9Sz4e7+u6770zJJm1vQEJCguzZs8c0EOoHsjYUemikf+ONN2b6LVO/7Wp6ffPmzSYd7qGNbPrtVbdFvzHrQaR79+6mcdEfegV23YazZ8+adX7wwQepnltG9Heu5o8aocVN7/nMaGOwBmuandFm4KFDh5qSXGY8z4u/i6zJly+f7N2719aeLc/rkvY1yeolZzQreezYMVOOTxn8ah+aBvG+ftEjqEG2atWqlUybNs18iGsPgX4Yp6TfWlPSWnqDBg1M01haKWv1WdGsWTNZvny5LFiwwKTiPfTDVksBWsvX9PzkyZPl6aeflq+++koqVark1x+pNj7qN0tfGzb1m+hvv/3m1+MgtLnpPZ8ZLSPperXspH0zYWG+dUBoSUz/lrTXB1kPbPLlyxeyu097abSPKyUNsHX+fffd5/N6CGqQrfQDXIe1+qp+/foyf/58ExhkdH0R/XDUD19ttlWaRtdUpv7uldx0000ycOBA06ugB5onnnjCe59++2jSpImZtHFXU/Las6DNmb7Sg4Evo6RS0vSrftBzHhzncNN7PjPaVOzPvlD67X3OnDnmb8LXIAihSQP2lIMlNHu0bds2U3bXDE3aoFVHP2nZLLOyfUoENQhp+s1Oh7/q6A8dAq0lnf3795tzcOhoCL2tzbWvvPKKGUmhtffXXntNTp486dP6GzduLB9//LEZaqgf8jpaRA8W2vugKXg9sOhtzZ7oaAw7aY/A0aNHTVlC/7i1l0JT82PHjvX7gx/O4eT3vC/lDP2b0J/6fDZu3Cgvv/yyCYb0+SJn27x5s8lcengC5j59+lzx3F/+IKhBSNMhoHoWSm1u1CZGDQS04Vbr/55vsVpz1R4D/cPQb3I6gkPPg+DrCbuaNm1qUvIdOnQwaXhNgepjah1Xu/n1G6v2IuhBwE76bVgnTxPfzTffbA4sKf/o4T5Ofs9nRh9bs1CaNdLnqt/Q9TlqEBdKV4JG1uhpBvwZUZeVARNWcqDH7AEAAGQDCpQAAMARCGoAAIAjENQAAABHIKgBAACOQFADAAAcgaAGAAA4AkENAABwBIIaAEHXt2/fVJeG0JN06ZluPSpWrGhODGfHugE4F2cUBnDFgOCdd97xXodFr89y7733yt///vfLLsxoJ70kgD6eHfR6WpxjFHAHghoAV6QXP5wxY4YkJiaaawYNGDDABBxPPfVUquXOnz9vLvlgB73AnV30ukEA3IHyE4ArCg8PN9em0usBPfLII+Y6QUuXLvWWdV566SUpU6aM90q6Bw8elB49epgrlGtwohdmTHkNl0uXLpkL2en9elVevUhj2kxK2vJTWnrhT/19vVaWWrhwodSuXVvy589v1qnbGB8fb+6j/AS4B0ENAL9o4KBZGaVBRWxsrKxatUqWLVtmrjjetm1bKVSokKxbt06+/PJLKViwoMn2eH5HL5SoV+R9++23Zf369XLixAlZtGiRz48/btw4GTlypKxcudJc5FEv7NizZ09zUcedO3fKmjVrzIUgKTkB7kP5CYBPNEjQIObTTz+VQYMGyW+//SYREREma+IpO82ePVuSkpLMPL3SstLSlWZVNNho06aNafjV0pUGHmr69Olmnb7QK1e/++67snbtWqlZs6aZp0HNxYsXzfo0m6Q0awPAfQhqAFyRZmA026JZGA1YevXqJaNHjza9NRo8pOyj+e6772T37t0mU5NSQkKC7NmzR06dOmWCkEaNGv3vQyh3brnxxhszzaxohkdLSps3b5Zrr73WO79OnTomY6PbolkiDZy6d+8uRYoU4ZUFXIbyE4AratWqlWzbtk1+/vlnOXfunBkNpRka5fnpcebMGWnQoIFZPuX0008/mWDoajRr1sz04yxYsCDV/Fy5cpny1yeffCI1atSQyZMnm/6evXv38soCLkNQA+CKNHCpXLmyGc6d2TDu+vXrm+CnRIkS5ndSTjoKSafSpUvLV1995f0dLR1t2bIl01fhpptuMoHLyy+/LOPHj091n5a6mjRpImPGjJGtW7ea7JE/fToAnIGgBoBtevfuLcWLFzcjnrRRWLMl2kszePBgOXTokFnmsccek1deeUUWL14su3btkkcffVROnjzp0/obN25shpVr8OI5GZ8GSBroaFnqwIED5hw32u9TvXp1XlnAZeipAWCbAgUKSExMjGno1cbd06dPS9myZU3PS2RkpFnm8ccfN301ffr0kbCwMDNqqUuXLqbfxhdNmzaV5cuXS4cOHUzpSYdv62NqkBMXF2eahbX/pn379ryygMtYyYx7BAAADkD5CQAAOAJBDQAAcASCGgAA4AgENQAAwBEIagAAgCMQ1AAAAEcgqAEAAI5AUAMAAByBoAYAADgCQQ0AAHAEghoAAOAIBDUAAECc4P8BgnQY+rzykeAAAAAASUVORK5CYII=",
|
|
"text/plain": [
|
|
"<Figure size 600x500 with 2 Axes>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"from collections import Counter\n",
|
|
"\n",
|
|
"from train_model import DATA_DIR, build_cv, build_grid_search\n",
|
|
"from features import load_dataset\n",
|
|
"from sklearn.model_selection import cross_val_predict\n",
|
|
"from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay\n",
|
|
"import matplotlib.pyplot as plt\n",
|
|
"\n",
|
|
"# 1. Load dataset\n",
|
|
"X, y, files = load_dataset(DATA_DIR)\n",
|
|
"\n",
|
|
"print(\"Total data:\", len(files))\n",
|
|
"print(\"Distribusi label:\", dict(Counter(y)))\n",
|
|
"print(\"Jumlah fitur:\", X.shape[1])\n",
|
|
"\n",
|
|
"# 2. Buat cross-validation dan model\n",
|
|
"cv = build_cv(y)\n",
|
|
"grid_search = build_grid_search(cv)\n",
|
|
"\n",
|
|
"# 3. Training GridSearch\n",
|
|
"grid_search.fit(X, y)\n",
|
|
"\n",
|
|
"best_model = grid_search.best_estimator_\n",
|
|
"\n",
|
|
"print(\"Best params:\", grid_search.best_params_)\n",
|
|
"print(\"Best CV f1_macro:\", grid_search.best_score_)\n",
|
|
"print(\"Urutan kelas:\", list(best_model.classes_))\n",
|
|
"\n",
|
|
"# 4. Prediksi cross-validation\n",
|
|
"y_pred = cross_val_predict(best_model, X, y, cv=cv, n_jobs=1)\n",
|
|
"\n",
|
|
"# 5. Confusion matrix\n",
|
|
"labels = [\"PD\", \"TPD\"]\n",
|
|
"cm = confusion_matrix(y, y_pred, labels=labels)\n",
|
|
"\n",
|
|
"print(\"Urutan label:\", labels)\n",
|
|
"print(cm)\n",
|
|
"\n",
|
|
"# 6. Tampilkan gambar confusion matrix\n",
|
|
"disp = ConfusionMatrixDisplay(\n",
|
|
" confusion_matrix=cm,\n",
|
|
" display_labels=[\"PD\", \"TPD\"]\n",
|
|
")\n",
|
|
"\n",
|
|
"fig, ax = plt.subplots(figsize=(6, 5))\n",
|
|
"disp.plot(cmap=\"Blues\", values_format=\"d\", ax=ax, colorbar=True)\n",
|
|
"\n",
|
|
"ax.set_title(\"Confusion Matrix Model SVM\")\n",
|
|
"ax.set_xlabel(\"Prediksi\")\n",
|
|
"ax.set_ylabel(\"Label Asli\")\n",
|
|
"ax.set_xticklabels([\"Prediksi PD\", \"Prediksi TPD\"])\n",
|
|
"ax.set_yticklabels([\"Asli PD\", \"Asli TPD\"])\n",
|
|
"\n",
|
|
"plt.tight_layout()\n",
|
|
"plt.show()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "d509eed5-2719-4c11-98cd-67c157034f07",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"from sklearn.metrics import accuracy_score, balanced_accuracy_score, precision_score, recall_score, f1_score, classification_report\n",
|
|
"\n",
|
|
"print(\"Accuracy :\", accuracy_score(y, y_pred))\n",
|
|
"print(\"Balanced Accuracy :\", balanced_accuracy_score(y, y_pred))\n",
|
|
"print(\"Precision Macro :\", precision_score(y, y_pred, average=\"macro\", zero_division=0))\n",
|
|
"print(\"Recall Macro :\", recall_score(y, y_pred, average=\"macro\", zero_division=0))\n",
|
|
"print(\"F1 Macro :\", f1_score(y, y_pred, average=\"macro\", zero_division=0))\n",
|
|
"\n",
|
|
"print(classification_report(\n",
|
|
" y,\n",
|
|
" y_pred,\n",
|
|
" labels=labels,\n",
|
|
" target_names=[\"PD - Percaya Diri\", \"TPD - Tidak Percaya Diri\"],\n",
|
|
" zero_division=0\n",
|
|
"))"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 3,
|
|
"id": "6d7215c2-6d9b-4233-921b-d79e262912a1",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Fitting 5 folds for each of 16 candidates, totalling 80 fits\n"
|
|
]
|
|
},
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<style>#sk-container-id-1 {\n",
|
|
" /* Definition of color scheme common for light and dark mode */\n",
|
|
" --sklearn-color-text: black;\n",
|
|
" --sklearn-color-line: gray;\n",
|
|
" /* Definition of color scheme for unfitted estimators */\n",
|
|
" --sklearn-color-unfitted-level-0: #fff5e6;\n",
|
|
" --sklearn-color-unfitted-level-1: #f6e4d2;\n",
|
|
" --sklearn-color-unfitted-level-2: #ffe0b3;\n",
|
|
" --sklearn-color-unfitted-level-3: chocolate;\n",
|
|
" /* Definition of color scheme for fitted estimators */\n",
|
|
" --sklearn-color-fitted-level-0: #f0f8ff;\n",
|
|
" --sklearn-color-fitted-level-1: #d4ebff;\n",
|
|
" --sklearn-color-fitted-level-2: #b3dbfd;\n",
|
|
" --sklearn-color-fitted-level-3: cornflowerblue;\n",
|
|
"\n",
|
|
" /* Specific color for light theme */\n",
|
|
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
|
|
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
|
|
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
|
|
" --sklearn-color-icon: #696969;\n",
|
|
"\n",
|
|
" @media (prefers-color-scheme: dark) {\n",
|
|
" /* Redefinition of color scheme for dark theme */\n",
|
|
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
|
|
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
|
|
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
|
|
" --sklearn-color-icon: #878787;\n",
|
|
" }\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 {\n",
|
|
" color: var(--sklearn-color-text);\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 pre {\n",
|
|
" padding: 0;\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 input.sk-hidden--visually {\n",
|
|
" border: 0;\n",
|
|
" clip: rect(1px 1px 1px 1px);\n",
|
|
" clip: rect(1px, 1px, 1px, 1px);\n",
|
|
" height: 1px;\n",
|
|
" margin: -1px;\n",
|
|
" overflow: hidden;\n",
|
|
" padding: 0;\n",
|
|
" position: absolute;\n",
|
|
" width: 1px;\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 div.sk-dashed-wrapped {\n",
|
|
" border: 1px dashed var(--sklearn-color-line);\n",
|
|
" margin: 0 0.4em 0.5em 0.4em;\n",
|
|
" box-sizing: border-box;\n",
|
|
" padding-bottom: 0.4em;\n",
|
|
" background-color: var(--sklearn-color-background);\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 div.sk-container {\n",
|
|
" /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
|
|
" but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
|
|
" so we also need the `!important` here to be able to override the\n",
|
|
" default hidden behavior on the sphinx rendered scikit-learn.org.\n",
|
|
" See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
|
|
" display: inline-block !important;\n",
|
|
" position: relative;\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 div.sk-text-repr-fallback {\n",
|
|
" display: none;\n",
|
|
"}\n",
|
|
"\n",
|
|
"div.sk-parallel-item,\n",
|
|
"div.sk-serial,\n",
|
|
"div.sk-item {\n",
|
|
" /* draw centered vertical line to link estimators */\n",
|
|
" background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
|
|
" background-size: 2px 100%;\n",
|
|
" background-repeat: no-repeat;\n",
|
|
" background-position: center center;\n",
|
|
"}\n",
|
|
"\n",
|
|
"/* Parallel-specific style estimator block */\n",
|
|
"\n",
|
|
"#sk-container-id-1 div.sk-parallel-item::after {\n",
|
|
" content: \"\";\n",
|
|
" width: 100%;\n",
|
|
" border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
|
|
" flex-grow: 1;\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 div.sk-parallel {\n",
|
|
" display: flex;\n",
|
|
" align-items: stretch;\n",
|
|
" justify-content: center;\n",
|
|
" background-color: var(--sklearn-color-background);\n",
|
|
" position: relative;\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 div.sk-parallel-item {\n",
|
|
" display: flex;\n",
|
|
" flex-direction: column;\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 div.sk-parallel-item:first-child::after {\n",
|
|
" align-self: flex-end;\n",
|
|
" width: 50%;\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 div.sk-parallel-item:last-child::after {\n",
|
|
" align-self: flex-start;\n",
|
|
" width: 50%;\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 div.sk-parallel-item:only-child::after {\n",
|
|
" width: 0;\n",
|
|
"}\n",
|
|
"\n",
|
|
"/* Serial-specific style estimator block */\n",
|
|
"\n",
|
|
"#sk-container-id-1 div.sk-serial {\n",
|
|
" display: flex;\n",
|
|
" flex-direction: column;\n",
|
|
" align-items: center;\n",
|
|
" background-color: var(--sklearn-color-background);\n",
|
|
" padding-right: 1em;\n",
|
|
" padding-left: 1em;\n",
|
|
"}\n",
|
|
"\n",
|
|
"\n",
|
|
"/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
|
|
"clickable and can be expanded/collapsed.\n",
|
|
"- Pipeline and ColumnTransformer use this feature and define the default style\n",
|
|
"- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
|
|
"*/\n",
|
|
"\n",
|
|
"/* Pipeline and ColumnTransformer style (default) */\n",
|
|
"\n",
|
|
"#sk-container-id-1 div.sk-toggleable {\n",
|
|
" /* Default theme specific background. It is overwritten whether we have a\n",
|
|
" specific estimator or a Pipeline/ColumnTransformer */\n",
|
|
" background-color: var(--sklearn-color-background);\n",
|
|
"}\n",
|
|
"\n",
|
|
"/* Toggleable label */\n",
|
|
"#sk-container-id-1 label.sk-toggleable__label {\n",
|
|
" cursor: pointer;\n",
|
|
" display: block;\n",
|
|
" width: 100%;\n",
|
|
" margin-bottom: 0;\n",
|
|
" padding: 0.5em;\n",
|
|
" box-sizing: border-box;\n",
|
|
" text-align: center;\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 label.sk-toggleable__label-arrow:before {\n",
|
|
" /* Arrow on the left of the label */\n",
|
|
" content: \"▸\";\n",
|
|
" float: left;\n",
|
|
" margin-right: 0.25em;\n",
|
|
" color: var(--sklearn-color-icon);\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {\n",
|
|
" color: var(--sklearn-color-text);\n",
|
|
"}\n",
|
|
"\n",
|
|
"/* Toggleable content - dropdown */\n",
|
|
"\n",
|
|
"#sk-container-id-1 div.sk-toggleable__content {\n",
|
|
" max-height: 0;\n",
|
|
" max-width: 0;\n",
|
|
" overflow: hidden;\n",
|
|
" text-align: left;\n",
|
|
" /* unfitted */\n",
|
|
" background-color: var(--sklearn-color-unfitted-level-0);\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 div.sk-toggleable__content.fitted {\n",
|
|
" /* fitted */\n",
|
|
" background-color: var(--sklearn-color-fitted-level-0);\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 div.sk-toggleable__content pre {\n",
|
|
" margin: 0.2em;\n",
|
|
" border-radius: 0.25em;\n",
|
|
" color: var(--sklearn-color-text);\n",
|
|
" /* unfitted */\n",
|
|
" background-color: var(--sklearn-color-unfitted-level-0);\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 div.sk-toggleable__content.fitted pre {\n",
|
|
" /* unfitted */\n",
|
|
" background-color: var(--sklearn-color-fitted-level-0);\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
|
|
" /* Expand drop-down */\n",
|
|
" max-height: 200px;\n",
|
|
" max-width: 100%;\n",
|
|
" overflow: auto;\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
|
|
" content: \"▾\";\n",
|
|
"}\n",
|
|
"\n",
|
|
"/* Pipeline/ColumnTransformer-specific style */\n",
|
|
"\n",
|
|
"#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
|
" color: var(--sklearn-color-text);\n",
|
|
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
|
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
|
"}\n",
|
|
"\n",
|
|
"/* Estimator-specific style */\n",
|
|
"\n",
|
|
"/* Colorize estimator box */\n",
|
|
"#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
|
" /* unfitted */\n",
|
|
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
|
" /* fitted */\n",
|
|
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 div.sk-label label.sk-toggleable__label,\n",
|
|
"#sk-container-id-1 div.sk-label label {\n",
|
|
" /* The background is the default theme color */\n",
|
|
" color: var(--sklearn-color-text-on-default-background);\n",
|
|
"}\n",
|
|
"\n",
|
|
"/* On hover, darken the color of the background */\n",
|
|
"#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {\n",
|
|
" color: var(--sklearn-color-text);\n",
|
|
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
|
"}\n",
|
|
"\n",
|
|
"/* Label box, darken color on hover, fitted */\n",
|
|
"#sk-container-id-1 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
|
|
" color: var(--sklearn-color-text);\n",
|
|
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
|
"}\n",
|
|
"\n",
|
|
"/* Estimator label */\n",
|
|
"\n",
|
|
"#sk-container-id-1 div.sk-label label {\n",
|
|
" font-family: monospace;\n",
|
|
" font-weight: bold;\n",
|
|
" display: inline-block;\n",
|
|
" line-height: 1.2em;\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 div.sk-label-container {\n",
|
|
" text-align: center;\n",
|
|
"}\n",
|
|
"\n",
|
|
"/* Estimator-specific */\n",
|
|
"#sk-container-id-1 div.sk-estimator {\n",
|
|
" font-family: monospace;\n",
|
|
" border: 1px dotted var(--sklearn-color-border-box);\n",
|
|
" border-radius: 0.25em;\n",
|
|
" box-sizing: border-box;\n",
|
|
" margin-bottom: 0.5em;\n",
|
|
" /* unfitted */\n",
|
|
" background-color: var(--sklearn-color-unfitted-level-0);\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 div.sk-estimator.fitted {\n",
|
|
" /* fitted */\n",
|
|
" background-color: var(--sklearn-color-fitted-level-0);\n",
|
|
"}\n",
|
|
"\n",
|
|
"/* on hover */\n",
|
|
"#sk-container-id-1 div.sk-estimator:hover {\n",
|
|
" /* unfitted */\n",
|
|
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 div.sk-estimator.fitted:hover {\n",
|
|
" /* fitted */\n",
|
|
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
|
"}\n",
|
|
"\n",
|
|
"/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
|
|
"\n",
|
|
"/* Common style for \"i\" and \"?\" */\n",
|
|
"\n",
|
|
".sk-estimator-doc-link,\n",
|
|
"a:link.sk-estimator-doc-link,\n",
|
|
"a:visited.sk-estimator-doc-link {\n",
|
|
" float: right;\n",
|
|
" font-size: smaller;\n",
|
|
" line-height: 1em;\n",
|
|
" font-family: monospace;\n",
|
|
" background-color: var(--sklearn-color-background);\n",
|
|
" border-radius: 1em;\n",
|
|
" height: 1em;\n",
|
|
" width: 1em;\n",
|
|
" text-decoration: none !important;\n",
|
|
" margin-left: 1ex;\n",
|
|
" /* unfitted */\n",
|
|
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
|
|
" color: var(--sklearn-color-unfitted-level-1);\n",
|
|
"}\n",
|
|
"\n",
|
|
".sk-estimator-doc-link.fitted,\n",
|
|
"a:link.sk-estimator-doc-link.fitted,\n",
|
|
"a:visited.sk-estimator-doc-link.fitted {\n",
|
|
" /* fitted */\n",
|
|
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
|
|
" color: var(--sklearn-color-fitted-level-1);\n",
|
|
"}\n",
|
|
"\n",
|
|
"/* On hover */\n",
|
|
"div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
|
|
".sk-estimator-doc-link:hover,\n",
|
|
"div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
|
|
".sk-estimator-doc-link:hover {\n",
|
|
" /* unfitted */\n",
|
|
" background-color: var(--sklearn-color-unfitted-level-3);\n",
|
|
" color: var(--sklearn-color-background);\n",
|
|
" text-decoration: none;\n",
|
|
"}\n",
|
|
"\n",
|
|
"div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
|
|
".sk-estimator-doc-link.fitted:hover,\n",
|
|
"div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
|
|
".sk-estimator-doc-link.fitted:hover {\n",
|
|
" /* fitted */\n",
|
|
" background-color: var(--sklearn-color-fitted-level-3);\n",
|
|
" color: var(--sklearn-color-background);\n",
|
|
" text-decoration: none;\n",
|
|
"}\n",
|
|
"\n",
|
|
"/* Span, style for the box shown on hovering the info icon */\n",
|
|
".sk-estimator-doc-link span {\n",
|
|
" display: none;\n",
|
|
" z-index: 9999;\n",
|
|
" position: relative;\n",
|
|
" font-weight: normal;\n",
|
|
" right: .2ex;\n",
|
|
" padding: .5ex;\n",
|
|
" margin: .5ex;\n",
|
|
" width: min-content;\n",
|
|
" min-width: 20ex;\n",
|
|
" max-width: 50ex;\n",
|
|
" color: var(--sklearn-color-text);\n",
|
|
" box-shadow: 2pt 2pt 4pt #999;\n",
|
|
" /* unfitted */\n",
|
|
" background: var(--sklearn-color-unfitted-level-0);\n",
|
|
" border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
|
|
"}\n",
|
|
"\n",
|
|
".sk-estimator-doc-link.fitted span {\n",
|
|
" /* fitted */\n",
|
|
" background: var(--sklearn-color-fitted-level-0);\n",
|
|
" border: var(--sklearn-color-fitted-level-3);\n",
|
|
"}\n",
|
|
"\n",
|
|
".sk-estimator-doc-link:hover span {\n",
|
|
" display: block;\n",
|
|
"}\n",
|
|
"\n",
|
|
"/* \"?\"-specific style due to the `<a>` HTML tag */\n",
|
|
"\n",
|
|
"#sk-container-id-1 a.estimator_doc_link {\n",
|
|
" float: right;\n",
|
|
" font-size: 1rem;\n",
|
|
" line-height: 1em;\n",
|
|
" font-family: monospace;\n",
|
|
" background-color: var(--sklearn-color-background);\n",
|
|
" border-radius: 1rem;\n",
|
|
" height: 1rem;\n",
|
|
" width: 1rem;\n",
|
|
" text-decoration: none;\n",
|
|
" /* unfitted */\n",
|
|
" color: var(--sklearn-color-unfitted-level-1);\n",
|
|
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 a.estimator_doc_link.fitted {\n",
|
|
" /* fitted */\n",
|
|
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
|
|
" color: var(--sklearn-color-fitted-level-1);\n",
|
|
"}\n",
|
|
"\n",
|
|
"/* On hover */\n",
|
|
"#sk-container-id-1 a.estimator_doc_link:hover {\n",
|
|
" /* unfitted */\n",
|
|
" background-color: var(--sklearn-color-unfitted-level-3);\n",
|
|
" color: var(--sklearn-color-background);\n",
|
|
" text-decoration: none;\n",
|
|
"}\n",
|
|
"\n",
|
|
"#sk-container-id-1 a.estimator_doc_link.fitted:hover {\n",
|
|
" /* fitted */\n",
|
|
" background-color: var(--sklearn-color-fitted-level-3);\n",
|
|
"}\n",
|
|
"</style><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>GridSearchCV(cv=StratifiedKFold(n_splits=5, random_state=42, shuffle=True),\n",
|
|
" estimator=Pipeline(steps=[('scaler', StandardScaler()),\n",
|
|
" ('svm',\n",
|
|
" SVC(class_weight='balanced',\n",
|
|
" probability=True,\n",
|
|
" random_state=42))]),\n",
|
|
" n_jobs=1,\n",
|
|
" param_grid={'svm__C': [0.1, 1, 10, 100],\n",
|
|
" 'svm__gamma': ['scale', 0.01, 0.001, 0.0001],\n",
|
|
" 'svm__kernel': ['rbf']},\n",
|
|
" scoring='f1_macro', verbose=1)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" ><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\"> GridSearchCV<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.5/modules/generated/sklearn.model_selection.GridSearchCV.html\">?<span>Documentation for GridSearchCV</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>GridSearchCV(cv=StratifiedKFold(n_splits=5, random_state=42, shuffle=True),\n",
|
|
" estimator=Pipeline(steps=[('scaler', StandardScaler()),\n",
|
|
" ('svm',\n",
|
|
" SVC(class_weight='balanced',\n",
|
|
" probability=True,\n",
|
|
" random_state=42))]),\n",
|
|
" n_jobs=1,\n",
|
|
" param_grid={'svm__C': [0.1, 1, 10, 100],\n",
|
|
" 'svm__gamma': ['scale', 0.01, 0.001, 0.0001],\n",
|
|
" 'svm__kernel': ['rbf']},\n",
|
|
" scoring='f1_macro', verbose=1)</pre></div> </div></div><div class=\"sk-parallel\"><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-2\" type=\"checkbox\" ><label for=\"sk-estimator-id-2\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">best_estimator_: Pipeline</label><div class=\"sk-toggleable__content fitted\"><pre>Pipeline(steps=[('scaler', StandardScaler()),\n",
|
|
" ('svm',\n",
|
|
" SVC(C=10, class_weight='balanced', probability=True,\n",
|
|
" random_state=42))])</pre></div> </div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-3\" type=\"checkbox\" ><label for=\"sk-estimator-id-3\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\"> StandardScaler<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.5/modules/generated/sklearn.preprocessing.StandardScaler.html\">?<span>Documentation for StandardScaler</span></a></label><div class=\"sk-toggleable__content fitted\"><pre>StandardScaler()</pre></div> </div></div><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-4\" type=\"checkbox\" ><label for=\"sk-estimator-id-4\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\"> SVC<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.5/modules/generated/sklearn.svm.SVC.html\">?<span>Documentation for SVC</span></a></label><div class=\"sk-toggleable__content fitted\"><pre>SVC(C=10, class_weight='balanced', probability=True, random_state=42)</pre></div> </div></div></div></div></div></div></div></div></div></div></div>"
|
|
],
|
|
"text/plain": [
|
|
"GridSearchCV(cv=StratifiedKFold(n_splits=5, random_state=42, shuffle=True),\n",
|
|
" estimator=Pipeline(steps=[('scaler', StandardScaler()),\n",
|
|
" ('svm',\n",
|
|
" SVC(class_weight='balanced',\n",
|
|
" probability=True,\n",
|
|
" random_state=42))]),\n",
|
|
" n_jobs=1,\n",
|
|
" param_grid={'svm__C': [0.1, 1, 10, 100],\n",
|
|
" 'svm__gamma': ['scale', 0.01, 0.001, 0.0001],\n",
|
|
" 'svm__kernel': ['rbf']},\n",
|
|
" scoring='f1_macro', verbose=1)"
|
|
]
|
|
},
|
|
"execution_count": 3,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"cv = build_cv(y)\n",
|
|
"grid_search = build_grid_search(cv)\n",
|
|
"\n",
|
|
"grid_search.fit(X, y)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 4,
|
|
"id": "83e533a4-bb17-477f-9566-d765fbbf7cc7",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Best params: {'svm__C': 10, 'svm__gamma': 'scale', 'svm__kernel': 'rbf'}\n",
|
|
"Best CV f1_macro: 0.6554293822792274\n",
|
|
"Urutan kelas: ['PD', 'TPD']\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"best_model = grid_search.best_estimator_\n",
|
|
"\n",
|
|
"print(\"Best params:\", grid_search.best_params_)\n",
|
|
"print(\"Best CV f1_macro:\", grid_search.best_score_)\n",
|
|
"print(\"Urutan kelas:\", list(best_model.classes_))"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 5,
|
|
"id": "e2279016-05d5-4a05-b199-d99c3ad2cf21",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"\n",
|
|
"=== Evaluasi Cross-Validation ===\n",
|
|
"Accuracy : 0.6628\n",
|
|
"Balanced Accuracy : 0.6628\n",
|
|
"Precision Macro : 0.6629\n",
|
|
"Recall Macro : 0.6628\n",
|
|
"F1 Macro : 0.6627\n",
|
|
"\n",
|
|
"=== Classification Report ===\n",
|
|
" precision recall f1-score support\n",
|
|
"\n",
|
|
" PD - Percaya Diri 0.66 0.67 0.67 43\n",
|
|
"TPD - Tidak Percaya Diri 0.67 0.65 0.66 43\n",
|
|
"\n",
|
|
" accuracy 0.66 86\n",
|
|
" macro avg 0.66 0.66 0.66 86\n",
|
|
" weighted avg 0.66 0.66 0.66 86\n",
|
|
"\n",
|
|
"=== Confusion Matrix ===\n",
|
|
"Urutan label: ['PD', 'TPD']\n",
|
|
"[[29 14]\n",
|
|
" [15 28]]\n",
|
|
"\n",
|
|
"=== Ringkasan Benar/Salah per Kelas ===\n",
|
|
"PD: benar=29, salah=14, total=43\n",
|
|
"TPD: benar=28, salah=15, total=43\n",
|
|
"\n",
|
|
"=== File yang Salah Prediksi ===\n",
|
|
"c_pd.wav | PD | TPD\n",
|
|
"c_tpd.wav | TPD | PD\n",
|
|
"f_tpd.wav | TPD | PD\n",
|
|
"h_tpd.wav | TPD | PD\n",
|
|
"j_pd.wav | PD | TPD\n",
|
|
"j_tpd.wav | TPD | PD\n",
|
|
"k_tpd.wav | TPD | PD\n",
|
|
"m_pd.wav | PD | TPD\n",
|
|
"p10_pd.wav | PD | TPD\n",
|
|
"p10_tpd.wav | TPD | PD\n",
|
|
"p2_pd.wav | PD | TPD\n",
|
|
"p3_pd.wav | PD | TPD\n",
|
|
"p4_pd.wav | PD | TPD\n",
|
|
"p5_tpd.wav | TPD | PD\n",
|
|
"p6_tpd.wav | TPD | PD\n",
|
|
"p8_pd.wav | PD | TPD\n",
|
|
"p_pd.wav | PD | TPD\n",
|
|
"q_pd.wav | PD | TPD\n",
|
|
"s_tpd.wav | TPD | PD\n",
|
|
"w3_pd.wav | PD | TPD\n",
|
|
"w3_tpd.wav | TPD | PD\n",
|
|
"w4_pd.wav | PD | TPD\n",
|
|
"w5_pd.wav | PD | TPD\n",
|
|
"w5_tpd.wav | TPD | PD\n",
|
|
"w6_tpd.wav | TPD | PD\n",
|
|
"w7_tpd.wav | TPD | PD\n",
|
|
"w8_pd.wav | PD | TPD\n",
|
|
"w8_tpd.wav | TPD | PD\n",
|
|
"w_tpd.wav | TPD | PD\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"evaluate_model(best_model, X, y, files, cv)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 7,
|
|
"id": "03747dfc-acbf-42aa-9814-efa02e1d1d5f",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"import matplotlib.pyplot as plt\n",
|
|
"import seaborn as sns\n",
|
|
"\n",
|
|
"from sklearn.metrics import confusion_matrix\n",
|
|
"from sklearn.model_selection import cross_val_predict\n",
|
|
"from features import LABEL_PD, LABEL_TPD"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 3,
|
|
"id": "a4e120f6-e45e-4a57-ab29-3cf80ee91cf5",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"/Users/user/TA/confivoice3/ml/features.py:70: UserWarning: PySoundFile failed. Trying audioread instead.\n",
|
|
" y, sr = librosa.load(file_path, sr=sample_rate, mono=True)\n",
|
|
"/Users/user/TA/confivoice3/cv_app/.venv/lib/python3.10/site-packages/librosa/core/audio.py:184: FutureWarning: librosa.core.audio.__audioread_load\n",
|
|
"\tDeprecated as of librosa version 0.10.0.\n",
|
|
"\tIt will be removed in librosa version 1.0.\n",
|
|
" y, sr_native = __audioread_load(path, offset, duration, dtype)\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"\n",
|
|
"=== Distribusi Label Dataset ===\n",
|
|
"PD : 43\n",
|
|
"TPD: 43\n",
|
|
"Total data: 86\n",
|
|
"Distribusi label: {'PD': 43, 'TPD': 43}\n",
|
|
"Jumlah fitur: 78\n",
|
|
"Fitting 5 folds for each of 16 candidates, totalling 80 fits\n",
|
|
"Best params: {'svm__C': 10, 'svm__gamma': 'scale', 'svm__kernel': 'rbf'}\n",
|
|
"Best CV f1_macro: 0.6554293822792274\n",
|
|
"Urutan kelas: ['PD', 'TPD']\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"from collections import Counter\n",
|
|
"\n",
|
|
"from train_model import DATA_DIR, build_cv, build_grid_search\n",
|
|
"from features import load_dataset\n",
|
|
"\n",
|
|
"X, y, files = load_dataset(DATA_DIR)\n",
|
|
"\n",
|
|
"print(\"Total data:\", len(files))\n",
|
|
"print(\"Distribusi label:\", dict(Counter(y)))\n",
|
|
"print(\"Jumlah fitur:\", X.shape[1])\n",
|
|
"\n",
|
|
"cv = build_cv(y)\n",
|
|
"grid_search = build_grid_search(cv)\n",
|
|
"\n",
|
|
"grid_search.fit(X, y)\n",
|
|
"\n",
|
|
"best_model = grid_search.best_estimator_\n",
|
|
"\n",
|
|
"print(\"Best params:\", grid_search.best_params_)\n",
|
|
"print(\"Best CV f1_macro:\", grid_search.best_score_)\n",
|
|
"print(\"Urutan kelas:\", list(best_model.classes_))"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 4,
|
|
"id": "6b93e357-b6b5-474a-a020-fc7c925d172a",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Urutan label: ['PD', 'TPD']\n",
|
|
"[[29 14]\n",
|
|
" [15 28]]\n"
|
|
]
|
|
},
|
|
{
|
|
"data": {
|
|
"image/png": "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o0cPWb16tS3biNDghvd8yueY3qTvbc8XC8+8fPnySY0aNeT111/3rkfX77k/V65cUqRIEWnUqJHZX9qMCvtGP1k2/fNXfHy81KlTR6ZOnXrF5RYtWiSbNm3K0hmWCWqQrdq1aydHjhyRn3/+WR5//HEZPXq0vPrqq+kue/78edset2jRouZyFHbQUQSFCxfOdLnY2Fg5fPiwvP/++/LDDz+YbyiXLl3y3q8f1rovdLlZs2aZdd52223y0ksv2bKdCA1Of89rwKPPzzOpGTNmeG9/88033mUfeOABM+/HH380QfyAAQNk7ty53vt1FI3ef+jQIdmwYYM8+OCD5m+jbt265m8JOVv79u3lxRdflC5dumS4zK+//iqDBg2S9957T/LkyeP3YxDUINvPiVGqVCmpUKGCPPLII+YgvnTp0lTpcz2oa4RetWpVM1+vy6QfgPqhqh/UnTp1kn379nnXqYHCsGHDzP3FihWTESNGXHa127Tlp7TefPNN8/uff/65ub1w4UKpXbu2yaLoOnU79VtGyu3MTIkSJaR06dLSvHlzefbZZ80H+e7du7336wFH90X58uXNMm+88YaMGjXKLKuBDpzB6e95DXj0+Xkmpev13L7mmmu8yxYoUMDMu/baa01wV6VKFe++UJql0fv176Z69erSv39/E9ycOXPGPEfYM/rJsmmyW1JSktxzzz0yfPhwqVmzZpbWQVCDoNIP0JTfTvUDVg/oq1atkmXLlsmFCxekbdu2JgBYt26dfPnll1KwYEHz7dfzexMmTDCp67ffflvWr18vJ06cMOlLX40bN05GjhwpK1eulNatW5tvij179pR+/frJzp07TTmpa9eulx00/H2evnwTf+yxx8zjLFmyJMuPhdDmlvd8VvZFRl8OevfubYKflJlOZO3cMnE2TumtMzExMcsvzT/+8Q/JnTu3DB48OMvr4Dw1CAr9sNQP808//dSkGj0iIiLMN0jtP1CzZ8820bvO81zJXFPb+k1QP3jbtGljGsmeeuop8yGspk+fbtbriyeffFLeffddWbt2rfebgX7Aa8+Drk+/XSv9BptVur7x48dL2bJlvd/EM6LfyvVDPOW3cjiDm97zmdHgRMtO27dvNyWmzFSrVs1cxfr48ePm7wP+yZs3r8mAVakUbeuu02A7Ojr1OvUM7ZqF89eWLVtMKfPbb7/1vu+zgqAG2Uq/ieofgn4b1Q/uXr16pfoD0A9Sz4e7+u6770zJJm1vQEJCguzZs8c0EOoHsjYUemikf+ONN2b6LVO/7Wp6ffPmzSYd7qGNbPrtVbdFvzHrQaR79+6mcdEfegV23YazZ8+adX7wwQepnltG9Heu5o8aocVN7/nMaGOwBmuandFm4KFDh5qSXGY8z4u/i6zJly+f7N2719aeLc/rkvY1yeolZzQreezYMVOOTxn8ah+aBvG+ftEjqEG2atWqlUybNs18iGsPgX4Yp6TfWlPSWnqDBg1M01haKWv1WdGsWTNZvny5LFiwwKTiPfTDVksBWsvX9PzkyZPl6aeflq+++koqVark1x+pNj7qN0tfGzb1m+hvv/3m1+MgtLnpPZ8ZLSPperXspH0zYWG+dUBoSUz/lrTXB1kPbPLlyxeyu097abSPKyUNsHX+fffd5/N6CGqQrfQDXIe1+qp+/foyf/58ExhkdH0R/XDUD19ttlWaRtdUpv7uldx0000ycOBA06ugB5onnnjCe59++2jSpImZtHFXU/Las6DNmb7Sg4Evo6RS0vSrftBzHhzncNN7PjPaVOzPvlD67X3OnDnmb8LXIAihSQP2lIMlNHu0bds2U3bXDE3aoFVHP2nZLLOyfUoENQhp+s1Oh7/q6A8dAq0lnf3795tzcOhoCL2tzbWvvPKKGUmhtffXXntNTp486dP6GzduLB9//LEZaqgf8jpaRA8W2vugKXg9sOhtzZ7oaAw7aY/A0aNHTVlC/7i1l0JT82PHjvX7gx/O4eT3vC/lDP2b0J/6fDZu3Cgvv/yyCYb0+SJn27x5s8lcengC5j59+lzx3F/+IKhBSNMhoHoWSm1u1CZGDQS04Vbr/55vsVpz1R4D/cPQb3I6gkPPg+DrCbuaNm1qUvIdOnQwaXhNgepjah1Xu/n1G6v2IuhBwE76bVgnTxPfzTffbA4sKf/o4T5Ofs9nRh9bs1CaNdLnqt/Q9TlqEBdKV4JG1uhpBvwZUZeVARNWcqDH7AEAAGQDCpQAAMARCGoAAIAjENQAAABHIKgBAACOQFADAAAcgaAGAAA4AkENAABwBIIaAEHXt2/fVJeG0JN06ZluPSpWrGhODGfHugE4F2cUBnDFgOCdd97xXodFr89y7733yt///vfLLsxoJ70kgD6eHfR6WpxjFHAHghoAV6QXP5wxY4YkJiaaawYNGDDABBxPPfVUquXOnz9vLvlgB73AnV30ukEA3IHyE4ArCg8PN9em0usBPfLII+Y6QUuXLvWWdV566SUpU6aM90q6Bw8elB49epgrlGtwohdmTHkNl0uXLpkL2en9elVevUhj2kxK2vJTWnrhT/19vVaWWrhwodSuXVvy589v1qnbGB8fb+6j/AS4B0ENAL9o4KBZGaVBRWxsrKxatUqWLVtmrjjetm1bKVSokKxbt06+/PJLKViwoMn2eH5HL5SoV+R9++23Zf369XLixAlZtGiRz48/btw4GTlypKxcudJc5FEv7NizZ09zUcedO3fKmjVrzIUgKTkB7kP5CYBPNEjQIObTTz+VQYMGyW+//SYREREma+IpO82ePVuSkpLMPL3SstLSlWZVNNho06aNafjV0pUGHmr69Olmnb7QK1e/++67snbtWqlZs6aZp0HNxYsXzfo0m6Q0awPAfQhqAFyRZmA026JZGA1YevXqJaNHjza9NRo8pOyj+e6772T37t0mU5NSQkKC7NmzR06dOmWCkEaNGv3vQyh3brnxxhszzaxohkdLSps3b5Zrr73WO79OnTomY6PbolkiDZy6d+8uRYoU4ZUFXIbyE4AratWqlWzbtk1+/vlnOXfunBkNpRka5fnpcebMGWnQoIFZPuX0008/mWDoajRr1sz04yxYsCDV/Fy5cpny1yeffCI1atSQyZMnm/6evXv38soCLkNQA+CKNHCpXLmyGc6d2TDu+vXrm+CnRIkS5ndSTjoKSafSpUvLV1995f0dLR1t2bIl01fhpptuMoHLyy+/LOPHj091n5a6mjRpImPGjJGtW7ea7JE/fToAnIGgBoBtevfuLcWLFzcjnrRRWLMl2kszePBgOXTokFnmsccek1deeUUWL14su3btkkcffVROnjzp0/obN25shpVr8OI5GZ8GSBroaFnqwIED5hw32u9TvXp1XlnAZeipAWCbAgUKSExMjGno1cbd06dPS9myZU3PS2RkpFnm8ccfN301ffr0kbCwMDNqqUuXLqbfxhdNmzaV5cuXS4cOHUzpSYdv62NqkBMXF2eahbX/pn379ryygMtYyYx7BAAADkD5CQAAOAJBDQAAcASCGgAA4AgENQAAwBEIagAAgCMQ1AAAAEcgqAEAAI5AUAMAAByBoAYAADgCQQ0AAHAEghoAAOAIBDUAAECc4P8BgnQY+rzykeAAAAAASUVORK5CYII=",
|
|
"text/plain": [
|
|
"<Figure size 600x500 with 2 Axes>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"from sklearn.model_selection import cross_val_predict\n",
|
|
"from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay\n",
|
|
"import matplotlib.pyplot as plt\n",
|
|
"\n",
|
|
"labels = [\"PD\", \"TPD\"]\n",
|
|
"\n",
|
|
"y_pred = cross_val_predict(best_model, X, y, cv=cv, n_jobs=1)\n",
|
|
"\n",
|
|
"cm = confusion_matrix(y, y_pred, labels=labels)\n",
|
|
"\n",
|
|
"print(\"Urutan label:\", labels)\n",
|
|
"print(cm)\n",
|
|
"\n",
|
|
"disp = ConfusionMatrixDisplay(\n",
|
|
" confusion_matrix=cm,\n",
|
|
" display_labels=[\"PD\", \"TPD\"]\n",
|
|
")\n",
|
|
"\n",
|
|
"fig, ax = plt.subplots(figsize=(6, 5))\n",
|
|
"disp.plot(cmap=\"Blues\", values_format=\"d\", ax=ax, colorbar=True)\n",
|
|
"\n",
|
|
"ax.set_title(\"Confusion Matrix Model SVM\")\n",
|
|
"ax.set_xlabel(\"Prediksi\")\n",
|
|
"ax.set_ylabel(\"Label Asli\")\n",
|
|
"ax.set_xticklabels([\"Prediksi PD\", \"Prediksi TPD\"])\n",
|
|
"ax.set_yticklabels([\"Asli PD\", \"Asli TPD\"])\n",
|
|
"\n",
|
|
"plt.tight_layout()\n",
|
|
"plt.show()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "db2c5b18-fb32-426a-b704-d21b0aae65cf",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": []
|
|
}
|
|
],
|
|
"metadata": {
|
|
"kernelspec": {
|
|
"display_name": "Python (ConfiVoice)",
|
|
"language": "python",
|
|
"name": "confivoice"
|
|
},
|
|
"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.10.20"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 5
|
|
}
|