LearnMood/Model Algoritma/Model-Training.ipynb

854 lines
90 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "5cd83bae-8836-44e0-96fd-3fbae94120d2",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import joblib\n",
"\n",
"from sklearn.preprocessing import LabelEncoder\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn.tree import DecisionTreeClassifier\n",
"from sklearn.metrics import accuracy_score, classification_report"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "c5c8cd0e-69d9-47bb-90a6-f37f2cf2c560",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Jumlah data: 2000\n",
"\n",
"Distribusi label:\n",
"label\n",
"Ringan 780\n",
"Sedang 675\n",
"Intensif 545\n",
"Name: count, dtype: int64\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>mood</th>\n",
" <th>durasi_belajar</th>\n",
" <th>durasi_tidur</th>\n",
" <th>label</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Lumayan</td>\n",
" <td>72</td>\n",
" <td>7.2</td>\n",
" <td>Intensif</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Biasa Saja</td>\n",
" <td>59</td>\n",
" <td>4.8</td>\n",
" <td>Ringan</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Bagus</td>\n",
" <td>110</td>\n",
" <td>8.9</td>\n",
" <td>Intensif</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Lumayan</td>\n",
" <td>64</td>\n",
" <td>5.6</td>\n",
" <td>Sedang</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Biasa Saja</td>\n",
" <td>26</td>\n",
" <td>6.9</td>\n",
" <td>Ringan</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" mood durasi_belajar durasi_tidur label\n",
"0 Lumayan 72 7.2 Intensif\n",
"1 Biasa Saja 59 4.8 Ringan\n",
"2 Bagus 110 8.9 Intensif\n",
"3 Lumayan 64 5.6 Sedang\n",
"4 Biasa Saja 26 6.9 Ringan"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = pd.read_csv(\"data_final_2000_dengan_label.csv\")\n",
"\n",
"print(\"Jumlah data:\", len(df))\n",
"print(\"\\nDistribusi label:\")\n",
"print(df['label'].value_counts())\n",
"\n",
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "6efb255f-89dd-4299-9ee2-5c391ead35d1",
"metadata": {},
"outputs": [],
"source": [
"df_encoded = df.copy()\n",
"\n",
"le_mood = LabelEncoder()\n",
"le_label = LabelEncoder()\n",
"\n",
"df_encoded['mood'] = le_mood.fit_transform(df_encoded['mood'])\n",
"df_encoded['label'] = le_label.fit_transform(df_encoded['label'])\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "85b42598-f28a-47af-a21e-7a0b9d02a25b",
"metadata": {},
"outputs": [],
"source": [
"X = df_encoded[['mood', 'durasi_belajar', 'durasi_tidur']]\n",
"y = df_encoded['label']\n",
"\n",
"X_train, X_test, y_train, y_test = train_test_split(\n",
" X, y,\n",
" test_size=0.2,\n",
" random_state=42,\n",
" stratify=y # penting supaya distribusi seimbang\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "8b04960c-576d-4bdd-ab29-504d38ba5d2e",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<style>#sk-container-id-1 {\n",
" /* Definition of color scheme common for light and dark mode */\n",
" --sklearn-color-text: #000;\n",
" --sklearn-color-text-muted: #666;\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: flex;\n",
" width: 100%;\n",
" margin-bottom: 0;\n",
" padding: 0.5em;\n",
" box-sizing: border-box;\n",
" text-align: center;\n",
" align-items: start;\n",
" justify-content: space-between;\n",
" gap: 0.5em;\n",
"}\n",
"\n",
"#sk-container-id-1 label.sk-toggleable__label .caption {\n",
" font-size: 0.6rem;\n",
" font-weight: lighter;\n",
" color: var(--sklearn-color-text-muted);\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: 0.5em;\n",
" text-align: center;\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>DecisionTreeClassifier(max_depth=6, min_samples_leaf=3, min_samples_split=5,\n",
" random_state=42)</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\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" checked><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>DecisionTreeClassifier</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.6/modules/generated/sklearn.tree.DecisionTreeClassifier.html\">?<span>Documentation for DecisionTreeClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></div></label><div class=\"sk-toggleable__content fitted\"><pre>DecisionTreeClassifier(max_depth=6, min_samples_leaf=3, min_samples_split=5,\n",
" random_state=42)</pre></div> </div></div></div></div>"
],
"text/plain": [
"DecisionTreeClassifier(max_depth=6, min_samples_leaf=3, min_samples_split=5,\n",
" random_state=42)"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"model = DecisionTreeClassifier(\n",
" max_depth=6, # batasi depth supaya tidak overfit\n",
" min_samples_split=5,\n",
" min_samples_leaf=3,\n",
" random_state=42\n",
")\n",
"\n",
"model.fit(X_train, y_train)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "b7df854f-7784-47f4-afc2-afc0ddc31baa",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"Accuracy: 0.995\n",
"\n",
"Classification Report:\n",
"\n",
" precision recall f1-score support\n",
"\n",
" 0 1.00 1.00 1.00 109\n",
" 1 0.99 1.00 0.99 156\n",
" 2 1.00 0.99 0.99 135\n",
"\n",
" accuracy 0.99 400\n",
" macro avg 1.00 1.00 1.00 400\n",
"weighted avg 1.00 0.99 0.99 400\n",
"\n"
]
}
],
"source": [
"y_pred = model.predict(X_test)\n",
"\n",
"print(\"\\nAccuracy:\", accuracy_score(y_test, y_pred))\n",
"print(\"\\nClassification Report:\\n\")\n",
"print(classification_report(y_test, y_pred))"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "48b6dcb9-1432-461e-8dd6-b89db2f81594",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Training Accuracy : 0.99875\n",
"Testing Accuracy : 0.995\n",
"\n",
"Selisih : 0.003750000000000031\n"
]
}
],
"source": [
"# ==============================\n",
"# Cek Overfitting\n",
"# ==============================\n",
"\n",
"# Akurasi Training\n",
"train_pred = model.predict(X_train)\n",
"train_acc = accuracy_score(y_train, train_pred)\n",
"\n",
"# Akurasi Testing\n",
"test_pred = model.predict(X_test)\n",
"test_acc = accuracy_score(y_test, test_pred)\n",
"\n",
"print(\"Training Accuracy :\", train_acc)\n",
"print(\"Testing Accuracy :\", test_acc)\n",
"\n",
"print(\"\\nSelisih :\", train_acc - test_acc)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "999b3bae-5837-43e6-b24e-bad7ce08440e",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Cross Validation Scores: [1. 0.995 1. 0.9925 1. ]\n",
"Rata-rata CV Accuracy: 0.9975000000000002\n"
]
}
],
"source": [
"from sklearn.model_selection import cross_val_score\n",
"\n",
"cv_scores = cross_val_score(model, X, y, cv=5)\n",
"\n",
"print(\"Cross Validation Scores:\", cv_scores)\n",
"print(\"Rata-rata CV Accuracy:\", cv_scores.mean())"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "6e7c3745-ccc5-4aa4-8c6b-35e718c5f274",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 800x600 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Confusion Matrix:\n",
"[[109 0 0]\n",
" [ 0 156 0]\n",
" [ 0 2 133]]\n",
"Akurasi: 0.99\n"
]
}
],
"source": [
"import seaborn as sns\n",
"import matplotlib.pyplot as plt\n",
"from sklearn.metrics import confusion_matrix, accuracy_score\n",
"\n",
"# Prediksi pada data test\n",
"y_pred = model.predict(X_test)\n",
"\n",
"# Buat confusion matrix\n",
"cm = confusion_matrix(y_test, y_pred)\n",
"\n",
"# Visualisasi confusion matrix\n",
"plt.figure(figsize=(8, 6))\n",
"sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', \n",
" xticklabels=le_label.classes_, \n",
" yticklabels=le_label.classes_)\n",
"\n",
"plt.xlabel('Predicted Labels', fontsize=12)\n",
"plt.ylabel('True Labels', fontsize=12)\n",
"plt.title(f'Confusion Matrix\\nAccuracy: {accuracy_score(y_test, y_pred):.2f}', fontsize=14)\n",
"\n",
"plt.tight_layout()\n",
"plt.show()\n",
"\n",
"# Print teksnya juga\n",
"print(\"Confusion Matrix:\")\n",
"print(cm)\n",
"print(f\"Akurasi: {accuracy_score(y_test, y_pred):.2f}\")"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "4d1de5f2-72bb-46b2-86e5-e19233b48dfe",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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t3zNrl27mns4T5gwQXbv3i3Tpk0z59WgUW/Zp7QdJ06ckPfff9+sa4A4Z84ccx/onTt3St++feXxxx+XH3/80RPMtm/fXlq3bi1bt26Vp556Sl599VUff3oA4H/obgZwWzTbp0HhypUr5fnnn5czZ85ISEiIfPTRR55u5nnz5pkMnm7TrJ7SrmrNGmrt4H//+18ZP3686arWAE1pEKfnvJl9+/bJ559/bgJR9/2b77zzTkvXdIECBczruDOPo0aNktWrV0vdunU9z9GgVAPMhg0bypQpU+Suu+4yQavSTOiOHTvk7bff9tEnCAD+iSARQLJohlCzdpol1ADwsccek9dff93UJlaqVMmrDnHbtm1y4MABk0mMKzIyUv7880+5ePGiyfbVqVPHsy9jxoxSs2ZNS5ezm2b5MmTIYAK7xNI2XL16VR544AGv7ZrNrFatmnmsGcm47VDugBIAnIQgEUCyaK2eZt00GNTaQw3q3DSTGFdERITUqFFD5s+fbzlP/vz5k929nVTaDvXNN99I0aJFvfZpTSMA4H8IEgEkiwaCOlAkMapXry6fffaZ6frNkSNHgscULlxYNmzYIPfdd59Z1+l0Nm/ebJ6bEM1WagZTawnd3c1xuTOZOiDGrXz58iYYPHr06E0zkOXKlTMDcOJav359ot4nAKQnDFwB4HOdO3eWfPnymRHNOnDl0KFDphaxT58+8tdff5ljXnjhBXnrrbdkyZIlsmfPHnn22WdvOcdhyZIlJTQ0VLp162ae4z6n1ikqHXWt9Y/aLa51kppF1O7ul156yQxWmT17tunq3rJli3zwwQdmXT3zzDOyf/9+efnll82glwULFpgBNQDgNASJAHwua9assm7dOilevLgZmKLZuu7du5uaRHdmsX///tKlSxcT+GkNoAZ0Dz744C3Pq93dDz30kAkoy5YtKz169JArV66YfdqdPHz4cDMyuWDBgtK7d2+zXSfjHjJkiBnlrO3QEdba/axT4ihto46M1sBTp8fRATQ62AUAnCbAdbOqcAAAADgWmUQAAABYECQCAADAgiARAAAAFgSJAAAAsCBIBAAAgAVBIgAAACwIEgEAAGBBkAgAAAALgkQAAABYECQCAADAgiARAAAAEt//A4/IMYD2dPqoAAAAAElFTkSuQmCC",
"text/plain": [
"<Figure size 800x600 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import seaborn as sns\n",
"import matplotlib.pyplot as plt\n",
"\n",
"# Visualisasi confusion matrix\n",
"plt.figure(figsize=(8, 6))\n",
"sns.heatmap(confusion_matrix(y_test, model.predict(X_test)), \n",
" annot=True, fmt='d', cmap='Blues',\n",
" xticklabels=le_label.classes_,\n",
" yticklabels=le_label.classes_)\n",
"plt.xlabel('Predicted')\n",
"plt.ylabel('Actual')\n",
"plt.title('Confusion Matrix')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "d0de124c-f99b-4800-bfd6-0ccee34a251d",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['encoder_label.pkl']"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"joblib.dump(model, \"model_harian.pkl\")\n",
"joblib.dump(le_mood, \"encoder_mood.pkl\")\n",
"joblib.dump(le_label, \"encoder_label.pkl\")\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "fef83e44-80e3-4724-a94c-e3be55407892",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3.12",
"language": "python",
"name": "python312"
},
"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.12.6"
}
},
"nbformat": 4,
"nbformat_minor": 5
}