Last active
July 16, 2022 02:44
-
-
Save LeaveNhA/323dbea11513623d5a87227c7dc11bff to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "cells": [ | |
| { | |
| "cell_type": "code", | |
| "execution_count": 1, | |
| "id": "a340d205", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "from time import time\n", | |
| "\n", | |
| "import numpy as np\n", | |
| "import pandas as pd\n", | |
| "import plotly.express as px\n", | |
| "from plotly.subplots import make_subplots\n", | |
| "import plotly.graph_objs as go\n", | |
| "from sklearn import svm, datasets\n", | |
| "from sklearn.model_selection import train_test_split\n", | |
| "from mlxtend.feature_selection import SequentialFeatureSelector as sfs\n", | |
| "from mlxtend.feature_selection import ColumnSelector\n", | |
| "from pprint import pprint\n", | |
| "import warnings\n", | |
| "import os\n", | |
| "\n", | |
| "import pandas as pd\n", | |
| "import numpy as np\n", | |
| "import matplotlib.pyplot as plt\n", | |
| "from sklearn.model_selection import train_test_split\n", | |
| "from sklearn.svm import SVC\n", | |
| "from sklearn.multiclass import OneVsRestClassifier\n", | |
| "from sklearn.ensemble import BaggingClassifier\n", | |
| "from sklearn.model_selection import cross_val_score\n", | |
| "from sklearn.metrics import classification_report, confusion_matrix, accuracy_score, mean_squared_error, roc_auc_score, roc_curve, f1_score\n", | |
| "from sklearn import preprocessing\n", | |
| "from sklearn.preprocessing import StandardScaler\n", | |
| "from sklearn.linear_model import LogisticRegression\n", | |
| "from sklearn.model_selection import TimeSeriesSplit\n", | |
| "import seaborn as sns\n", | |
| "import matplotlib\n", | |
| "from multiprocessing import Pool\n", | |
| "from pymonad.maybe import Maybe, Just, Nothing\n", | |
| "from functools import partial\n", | |
| "from joblib import parallel_backend, Parallel, delayed\n", | |
| "from sklearn.pipeline import Pipeline\n", | |
| " \n", | |
| "import defs\n", | |
| "\n", | |
| "from functools import reduce\n", | |
| "\n", | |
| "matplotlib.rcParams['figure.figsize'] = [15, 15]\n", | |
| "\n", | |
| "\n", | |
| "# Uyarıları bastırıyoruz:\n", | |
| "warnings.filterwarnings('ignore')" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 2, | |
| "id": "3f714cf3", | |
| "metadata": { | |
| "scrolled": true | |
| }, | |
| "outputs": [ | |
| { | |
| "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>question_id</th>\n", | |
| " <th>bundle_id</th>\n", | |
| " <th>explanation_id</th>\n", | |
| " <th>correct_answer</th>\n", | |
| " <th>part</th>\n", | |
| " <th>tags</th>\n", | |
| " <th>deployed_at</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>0</th>\n", | |
| " <td>q1</td>\n", | |
| " <td>b1</td>\n", | |
| " <td>e1</td>\n", | |
| " <td>b</td>\n", | |
| " <td>1</td>\n", | |
| " <td>1;2;179;181</td>\n", | |
| " <td>1558093217098</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>1</th>\n", | |
| " <td>q2</td>\n", | |
| " <td>b2</td>\n", | |
| " <td>e2</td>\n", | |
| " <td>a</td>\n", | |
| " <td>1</td>\n", | |
| " <td>15;2;182</td>\n", | |
| " <td>1558093219720</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>2</th>\n", | |
| " <td>q3</td>\n", | |
| " <td>b3</td>\n", | |
| " <td>e3</td>\n", | |
| " <td>b</td>\n", | |
| " <td>1</td>\n", | |
| " <td>14;2;179;183</td>\n", | |
| " <td>1558093222784</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>3</th>\n", | |
| " <td>q4</td>\n", | |
| " <td>b4</td>\n", | |
| " <td>e4</td>\n", | |
| " <td>b</td>\n", | |
| " <td>1</td>\n", | |
| " <td>9;2;179;184</td>\n", | |
| " <td>1558093225357</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>4</th>\n", | |
| " <td>q5</td>\n", | |
| " <td>b5</td>\n", | |
| " <td>e5</td>\n", | |
| " <td>c</td>\n", | |
| " <td>1</td>\n", | |
| " <td>8;2;179;181</td>\n", | |
| " <td>1558093228439</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>...</th>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>13164</th>\n", | |
| " <td>q18139</td>\n", | |
| " <td>b12202</td>\n", | |
| " <td>e12202</td>\n", | |
| " <td>b</td>\n", | |
| " <td>2</td>\n", | |
| " <td>24;26;183;182</td>\n", | |
| " <td>1571733814684</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>13165</th>\n", | |
| " <td>q18140</td>\n", | |
| " <td>b12203</td>\n", | |
| " <td>e12203</td>\n", | |
| " <td>a</td>\n", | |
| " <td>2</td>\n", | |
| " <td>24;33;183;182</td>\n", | |
| " <td>1571733815331</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>13166</th>\n", | |
| " <td>q18141</td>\n", | |
| " <td>b12204</td>\n", | |
| " <td>e12204</td>\n", | |
| " <td>a</td>\n", | |
| " <td>2</td>\n", | |
| " <td>24;26;183;182</td>\n", | |
| " <td>1571733815951</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>13167</th>\n", | |
| " <td>q18142</td>\n", | |
| " <td>b12205</td>\n", | |
| " <td>e12205</td>\n", | |
| " <td>a</td>\n", | |
| " <td>2</td>\n", | |
| " <td>24;26;183;182</td>\n", | |
| " <td>1571733816585</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>13168</th>\n", | |
| " <td>q18143</td>\n", | |
| " <td>b12206</td>\n", | |
| " <td>e12206</td>\n", | |
| " <td>c</td>\n", | |
| " <td>2</td>\n", | |
| " <td>27;24;26;183;182</td>\n", | |
| " <td>1571733817400</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "<p>13169 rows × 7 columns</p>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " question_id bundle_id explanation_id correct_answer part \\\n", | |
| "0 q1 b1 e1 b 1 \n", | |
| "1 q2 b2 e2 a 1 \n", | |
| "2 q3 b3 e3 b 1 \n", | |
| "3 q4 b4 e4 b 1 \n", | |
| "4 q5 b5 e5 c 1 \n", | |
| "... ... ... ... ... ... \n", | |
| "13164 q18139 b12202 e12202 b 2 \n", | |
| "13165 q18140 b12203 e12203 a 2 \n", | |
| "13166 q18141 b12204 e12204 a 2 \n", | |
| "13167 q18142 b12205 e12205 a 2 \n", | |
| "13168 q18143 b12206 e12206 c 2 \n", | |
| "\n", | |
| " tags deployed_at \n", | |
| "0 1;2;179;181 1558093217098 \n", | |
| "1 15;2;182 1558093219720 \n", | |
| "2 14;2;179;183 1558093222784 \n", | |
| "3 9;2;179;184 1558093225357 \n", | |
| "4 8;2;179;181 1558093228439 \n", | |
| "... ... ... \n", | |
| "13164 24;26;183;182 1571733814684 \n", | |
| "13165 24;33;183;182 1571733815331 \n", | |
| "13166 24;26;183;182 1571733815951 \n", | |
| "13167 24;26;183;182 1571733816585 \n", | |
| "13168 27;24;26;183;182 1571733817400 \n", | |
| "\n", | |
| "[13169 rows x 7 columns]" | |
| ] | |
| }, | |
| "execution_count": 2, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "questions_data_path = 'https://gist.githubusercontent.com/LeaveNhA/fbb8c6ce2a6422fab97f66ffdb7a7852/raw/d022e4a53f1bbb35435d82f9371c5a4a328aeb13/ednet-kt1.questions.csv' # fill the path for the question.csv\n", | |
| "questions = pd.read_csv(questions_data_path, encoding = \"ISO-8859-15\")\n", | |
| "\n", | |
| "questions" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 3, | |
| "id": "a9d60959", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "# Bazı yardımcı fonksiyonlar tanımlanıyor:\n", | |
| "def apply_with(d, fn=lambda x: x):\n", | |
| " res = d.copy() # \"= dict(d1)\" for lists of tuples\n", | |
| " for key, val in res.items():\n", | |
| " if type(res[key]) is dict:\n", | |
| " res[key] = apply_with(res[key], fn)\n", | |
| " else:\n", | |
| " res[key] = fn(res[key])\n", | |
| " return res\n", | |
| "\n", | |
| "def merge_with(d1, d2, fn=lambda x, y: x + y):\n", | |
| " # print(\"---------merging---------\")\n", | |
| " # print('d1: {}, d2: {}'.format(d1, d2))\n", | |
| " res = d1.copy() # \"= dict(d1)\" for lists of tuples\n", | |
| " for key, val in d2.items(): # \".. in d2\" for lists of tuples\n", | |
| " try:\n", | |
| " if type(res[key]) is dict:\n", | |
| " #print('dict')\n", | |
| " #print(key)\n", | |
| " #print(res[key])\n", | |
| " res[key] = merge_with(res[key], val, fn)\n", | |
| " else:\n", | |
| " #print('scaler')\n", | |
| " #print(key)\n", | |
| " res[key] = fn(res[key], val)\n", | |
| " #print(res[key])\n", | |
| " except: #KeyError:res[key] = val\n", | |
| " pass\n", | |
| " #print(\"res: {}\".format(res))\n", | |
| " #print(\"--------------------\")\n", | |
| " return res" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 4, | |
| "id": "fd4dd6f0", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "# KT-1 verilerinin yolu:\n", | |
| "kt1_path = r'/Users/sckn/projects/academic/OMU-DS/paper/kt1/kt1'\n", | |
| "standart_drop_fields = ['user_answer',\n", | |
| " 'explanation_id',\n", | |
| " 'correct_answer',\n", | |
| " 'part',\n", | |
| " 'deployed_at',\n", | |
| " 'user_answer_flag']" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 5, | |
| "id": "83762d99", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "# Öğrenici gezinimi için bazı ara-evrensel değişkenler.\n", | |
| "s = pd.Series(os.listdir(kt1_path))\n", | |
| "all_student_files = s.to_numpy()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 6, | |
| "id": "fa8c593c", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "# for the sake of functional composition!\n", | |
| "import functools\n", | |
| "\n", | |
| "def c(*fs):\n", | |
| " return functools.reduce(compose2, fs)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 7, | |
| "id": "8e13e180", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "from pymonad.tools import curry\n", | |
| "\n", | |
| "@curry(2)\n", | |
| "def filename_to_fullpath(path, filename):\n", | |
| " return Just(path + '/' + filename)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 8, | |
| "id": "f8b82262", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "def filename_to_pd(filefullpath):\n", | |
| " try:\n", | |
| " return Just(pd.read_csv(filefullpath, encoding = \"ISO-8859-15\"))\n", | |
| " except:\n", | |
| " return Nothing" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 9, | |
| "id": "c3e0dbdc", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "@curry(2)\n", | |
| "def studentfile_to_pd(answer_limit, file_name):\n", | |
| " # Öğrenici verisi okunuyor:\n", | |
| " data_raw = pd.read_csv(file_name, encoding = \"ISO-8859-15\")\n", | |
| " # Bazı kısıtlar var.\n", | |
| " # Herhangi bir kayıp verisi varsa, öğrenici pas geçiliyor:\n", | |
| " if data_raw.isnull().values.any():\n", | |
| " return Nothing\n", | |
| " # Öğrenici cevap sayısı, belirlenen limitin altındaysa,\n", | |
| " # öğrenci pas geçiliyor.\n", | |
| " if data_raw.shape[0] < answer_limit:\n", | |
| " return Nothing\n", | |
| " \n", | |
| " return Just(pd.DataFrame(data_raw))" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 10, | |
| "id": "47842b3e", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "@curry(3)\n", | |
| "def merge_with_another_pd(another_pd_, common_key_, pd_):\n", | |
| " try:\n", | |
| " return Just(pd.merge(pd_, another_pd_, left_on = common_key_, right_on = common_key_))\n", | |
| " except:\n", | |
| " return Nothing" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 11, | |
| "id": "d51f8476", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "def generate_user_answer_flag(data):\n", | |
| " try:\n", | |
| " data['user_answer_flag'] = data['user_answer'] == data['correct_answer']\n", | |
| " data['user_answer_flag'] = data['user_answer_flag'].apply(lambda f: int(f))\n", | |
| " return Just(data)\n", | |
| " except:\n", | |
| " return Nothing" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 12, | |
| "id": "334ca8c9", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "def prepare_input_structered_data(data):\n", | |
| " return Just({'data': data})" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 13, | |
| "id": "4745d70f", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "@curry(2)\n", | |
| "def generate_X_y_data(drop_fields, sdata):\n", | |
| " try:\n", | |
| " # Veri Setimiz birleşimden sonra daha da farklı bir şekil alıyor,\n", | |
| " # Bağımlı değişkenleri modele girmeden önce bazı sütunları ayıklıyoruz:\n", | |
| " X = sdata['data'].drop(drop_fields, axis = 1)\n", | |
| " # Hedef değişkenimizi ayırıyoruz:\n", | |
| " y = sdata['data']['user_answer_flag']\n", | |
| " \n", | |
| " sdata['X'] = X\n", | |
| " sdata['y'] = y\n", | |
| " \n", | |
| " return Just(sdata)\n", | |
| " except:\n", | |
| " return Nothing" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 14, | |
| "id": "93c4090f", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "def mutate_X_data(sdata):\n", | |
| " try:\n", | |
| " # Çıkarımlar:\n", | |
| " X = sdata['X']\n", | |
| " # Etiket kodlama yöntemiyle, kategorik değerleri işliyoruz:\n", | |
| " tags_to_identity_number = dict(zip(np.unique(X['tags']), range(1, len(np.unique(X['tags'])) + 1)))\n", | |
| " X['tags'] = X['tags'].apply(lambda ui: tags_to_identity_number[ui])\n", | |
| "\n", | |
| " question_id_to_identity_number = dict(zip(np.unique(X['question_id']), range(1, len(np.unique(X['question_id'])) + 1)))\n", | |
| " X['question_id'] = X['question_id'].apply(lambda ui: question_id_to_identity_number[ui])\n", | |
| "\n", | |
| " bundle_id_to_identity_number = dict(zip(np.unique(X['bundle_id']), range(1, len(np.unique(X['bundle_id'])) + 1)))\n", | |
| " X['bundle_id'] = X['bundle_id'].apply(lambda ui: bundle_id_to_identity_number[ui])\n", | |
| "\n", | |
| " # Sürede geçirilen süre milisaniye cinsinden,\n", | |
| " # Bunu, saniye cinsine dönüştürerek iyileştirme yapıyoruz:\n", | |
| " X['elapsed_time'] = X['elapsed_time'].apply(lambda et: et / 1000)\n", | |
| " \n", | |
| " sdata['X'] = X\n", | |
| " \n", | |
| " return Just(sdata)\n", | |
| " except:\n", | |
| " return Nothing" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 15, | |
| "id": "7c76f4b5", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "def split_user_data(sdata):\n", | |
| " try:\n", | |
| " # Çıkarımlar:\n", | |
| " X = sdata['X']\n", | |
| " y = sdata['y']\n", | |
| " # Verinin ayrıştırılması için ilkleme yapıyoruz:\n", | |
| " tscv = TimeSeriesSplit()\n", | |
| "\n", | |
| " # Verinin ayrıştırılması için ayrıştırıcıdan sağlanan değerlerle,\n", | |
| " # veriyi ayırıyoruz:\n", | |
| " for train_index, test_index in tscv.split(X):\n", | |
| " X_train, X_test = X.iloc[train_index], X.iloc[test_index]\n", | |
| " y_train, y_test = y.iloc[train_index], y.iloc[test_index]\n", | |
| " \n", | |
| " sdata['X_train'] = X_train\n", | |
| " sdata['X_test'] = X_test\n", | |
| " sdata['y_train'] = y_train\n", | |
| " sdata['y_test'] = y_test\n", | |
| " \n", | |
| " return Just(sdata)\n", | |
| " except:\n", | |
| " return Nothing" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 16, | |
| "id": "a9fd063d", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "def generate_model_data(sdata):\n", | |
| " try:\n", | |
| " sdata['model'] = Pipeline([('scaler', StandardScaler()),\n", | |
| " ('logreg', LogisticRegression(\n", | |
| " fit_intercept=True, \n", | |
| " penalty = 'l1',\n", | |
| " solver = 'saga',\n", | |
| " tol = 0.00001,\n", | |
| " max_iter = 1000,\n", | |
| " random_state = 0,\n", | |
| " n_jobs = -1))])\n", | |
| " \n", | |
| " return Just(sdata)\n", | |
| " except:\n", | |
| " return Nothing" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 17, | |
| "id": "37fb0a68", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "def train_model_data(sdata):\n", | |
| " try:\n", | |
| " sdata['model'].fit(sdata['X_train'], sdata['y_train'])\n", | |
| " return Just(sdata)\n", | |
| " except:\n", | |
| " return Nothing" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 18, | |
| "id": "983d2f2d", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "def test_model_data(sdata):\n", | |
| " try:\n", | |
| " # Tahminde bulunuyoruz:\n", | |
| " sdata['y_train_pred'] = sdata['model'].predict(sdata['X_train'])\n", | |
| " sdata['y_test_pred'] = sdata['model'].predict(sdata['X_test'])\n", | |
| " \n", | |
| " return Just(sdata)\n", | |
| " except BaseException as e:\n", | |
| " print(e)\n", | |
| " return Nothing" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 19, | |
| "id": "a90b37a7", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "def generate_roc_and_auc_data(sdata):\n", | |
| " try:\n", | |
| " # Tahmin olasılıkları:\n", | |
| " y_pred_proba = sdata['model'].predict_proba(sdata['X_test'])[::,1]\n", | |
| " # ROC için bazı değerler toplanıyor ve depolanıyor:\n", | |
| " [fpr, tpr, _] = roc_curve(sdata['y_test'], y_pred_proba)\n", | |
| "\n", | |
| " # Eğer tahmin birim, ikilik değilse, AUC hesaplanamaz.\n", | |
| " # Bunu önlemek için, hata fırlatılması durumunda,\n", | |
| " # Öğreniciyi ve modeli, yine de atlıyoruz:\n", | |
| " try:\n", | |
| " auc = roc_auc_score(sdata['y_test'], y_pred_proba)\n", | |
| " except:\n", | |
| " return Nothing\n", | |
| " \n", | |
| " sdata['roc'] = [fpr, tpr]\n", | |
| " \n", | |
| " # Ortalama ROC için temel FPR değeri:\n", | |
| " base_fpr = np.linspace(0, 1, 101)\n", | |
| " # Temel FPR değeri ve ilgili FPR, TPR değeri işlenerek,\n", | |
| " # indirgeme yapılıyor:\n", | |
| " tpr = np.interp(base_fpr, fpr, tpr)\n", | |
| " # Basit bir düzeltme ile,\n", | |
| " # başlangıç değeri sıfırlanıyor.\n", | |
| " tpr[0] = 0.0\n", | |
| "\n", | |
| " sdata['auc_score'] = auc\n", | |
| " sdata['tpr'] = tpr\n", | |
| " \n", | |
| " return Just(sdata)\n", | |
| " except:\n", | |
| " return Nothing" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 20, | |
| "id": "21783f7f", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "def generate_classification_report_data(sdata):\n", | |
| " try:\n", | |
| " # Sınıflandırma raporu hesaplanıyor:\n", | |
| " clf_report = classification_report(sdata['y_test'], sdata['y_test_pred'],\n", | |
| " output_dict=True)\n", | |
| " \n", | |
| " sdata['clf'] = clf_report\n", | |
| " \n", | |
| " return Just(sdata)\n", | |
| " except BaseException as e:\n", | |
| " print(e)\n", | |
| " return Nothing" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 21, | |
| "id": "9d89a10e", | |
| "metadata": { | |
| "scrolled": true | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "with parallel_backend('threading'):\n", | |
| " filtered_students = Parallel()(\n", | |
| " delayed(filename_to_fullpath(kt1_path))(f) for f in all_student_files\n", | |
| " )" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 22, | |
| "id": "f39a8780", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "with parallel_backend('threading', n_jobs=12): \n", | |
| " pd_students = Parallel()(\n", | |
| " delayed(lambda sfn_: sfn_.then(studentfile_to_pd(1_000)))(sfn) for sfn in filtered_students\n", | |
| " )" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 23, | |
| "id": "dd37abdd", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "with parallel_backend('threading', n_jobs=12): \n", | |
| " students_pd_with_questions = Parallel()(\n", | |
| " delayed(lambda sfn_: sfn_.then(merge_with_another_pd(questions, 'question_id')))(sfn) for sfn in pd_students\n", | |
| " )" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 24, | |
| "id": "a582ae8a", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "with parallel_backend('threading', n_jobs=12): \n", | |
| " user_answer_generated = Parallel()(\n", | |
| " delayed(lambda sfn_: sfn_.then(generate_user_answer_flag))(sfn) for sfn in students_pd_with_questions\n", | |
| " )" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 25, | |
| "id": "4741ba49", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "with parallel_backend('threading', n_jobs=12): \n", | |
| " user_inputs = Parallel()(\n", | |
| " delayed(lambda sfn_: sfn_.then(prepare_input_structered_data))(sfn) for sfn in user_answer_generated\n", | |
| " )" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 26, | |
| "id": "a8927ffb", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "with parallel_backend('threading', n_jobs=12): \n", | |
| " user_X_y_sdata = Parallel()(\n", | |
| " delayed(lambda sfn_: sfn_.then(generate_X_y_data(standart_drop_fields)))(sfn) for sfn in user_inputs\n", | |
| " )" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 27, | |
| "id": "f1f363b6", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "with parallel_backend('threading', n_jobs=12): \n", | |
| " mutated_user_data = Parallel()(\n", | |
| " delayed(lambda sfn_: sfn_.then(mutate_X_data))(sfn) for sfn in user_X_y_sdata\n", | |
| " )" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 28, | |
| "id": "a53d7d72", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "with parallel_backend('threading', n_jobs=12): \n", | |
| " splitted_user_data = Parallel()(\n", | |
| " delayed(lambda sfn_: sfn_.then(split_user_data))(sfn) for sfn in mutated_user_data\n", | |
| " )" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 29, | |
| "id": "d9b72a14", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "with parallel_backend('threading', n_jobs=12): \n", | |
| " modelled_user_data = Parallel()(\n", | |
| " delayed(lambda sfn_: sfn_.then(generate_model_data))(sfn) for sfn in splitted_user_data\n", | |
| " )" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 30, | |
| "id": "621b78f3", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "with parallel_backend('threading', n_jobs=12): \n", | |
| " trained_user_data = Parallel()(\n", | |
| " delayed(lambda sfn_: sfn_.then(train_model_data))(sfn) for sfn in modelled_user_data\n", | |
| " )" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 31, | |
| "id": "d8a4304c", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "with parallel_backend('threading', n_jobs=12): \n", | |
| " roc_and_auc_generated_user = Parallel()(\n", | |
| " delayed(lambda sfn_: sfn_.then(generate_roc_and_auc_data))(sfn) for sfn in trained_user_data\n", | |
| " )" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 32, | |
| "id": "995650fc", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "with parallel_backend('threading', n_jobs=12): \n", | |
| " predicted_data_generated_user = Parallel()(\n", | |
| " delayed(lambda sfn_: sfn_.then(test_model_data))(sfn) for sfn in roc_and_auc_generated_user\n", | |
| " )" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 33, | |
| "id": "5aa4b8af", | |
| "metadata": { | |
| "scrolled": true | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "with parallel_backend('threading', n_jobs=12): \n", | |
| " clf_generated_user = Parallel()(\n", | |
| " delayed(lambda sfn_: sfn_.then(generate_classification_report_data))(sfn) for sfn in predicted_data_generated_user\n", | |
| " )" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 34, | |
| "id": "a05f69a0", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "with parallel_backend('threading', n_jobs=12): \n", | |
| " filtered_users_data = Parallel()(\n", | |
| " delayed(lambda sfn_: sfn_.maybe(Nothing, lambda x: x))(sfn) for sfn in clf_generated_user if sfn is not Nothing\n", | |
| " )" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 35, | |
| "id": "15f384b7", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "19761" | |
| ] | |
| }, | |
| "execution_count": 35, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "len(filtered_users_data)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 37, | |
| "id": "484bebc1", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "# Sınıflandırma Raporu özeti için,\n", | |
| "# listedeki raporlar toplanıyor:\n", | |
| "summed_clf = reduce(\n", | |
| " lambda acc, e: merge_with(acc, e['clf']), filtered_users_data[1:], filtered_users_data[0]['clf']\n", | |
| ")" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 38, | |
| "id": "87b966c6", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "{'0': {'precision': 5746.981650494418,\n", | |
| " 'recall': 2004.3128037991346,\n", | |
| " 'f1-score': 2177.153094992772,\n", | |
| " 'support': 2475281},\n", | |
| " '1': {'precision': 13547.317214748677,\n", | |
| " 'recall': 18140.06600184442,\n", | |
| " 'f1-score': 15323.03995543767,\n", | |
| " 'support': 5623494},\n", | |
| " 'accuracy': 13507.197226535462,\n", | |
| " 'macro avg': {'precision': 9647.149432621609,\n", | |
| " 'recall': 10072.189402821763,\n", | |
| " 'f1-score': 8750.096525215278,\n", | |
| " 'support': 8098775},\n", | |
| " 'weighted avg': {'precision': 11590.080158093126,\n", | |
| " 'recall': 13507.197226535462,\n", | |
| " 'f1-score': 11653.137163800235,\n", | |
| " 'support': 8098775}}" | |
| ] | |
| }, | |
| "execution_count": 38, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "summed_clf" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 39, | |
| "id": "147be365", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "# Toplanan değerli rapor, birim sayısına bölünerek ortalama alınıyor:\n", | |
| "averaged_clf = apply_with(summed_clf, lambda x: x / len(filtered_users_data))" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 40, | |
| "id": "174b6f43", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "image/png": "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\n", | |
| "text/plain": [ | |
| "<Figure size 1080x1080 with 2 Axes>" | |
| ] | |
| }, | |
| "metadata": { | |
| "needs_background": "light" | |
| }, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "# Grafiksel çıktı için figür ilklemesi:\n", | |
| "fig = plt.figure()\n", | |
| "# Isı haritası, ortalanan Sınıflandırma Raporu üzerinden hazırlanıyor:\n", | |
| "sns.heatmap(pd.DataFrame(averaged_clf).iloc[:-1, :].T, annot=True)\n", | |
| "\n", | |
| "# Isı haritası kaydediliyor:\n", | |
| "fig.savefig('clf.compiled.png', dpi = 500)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 41, | |
| "id": "6ab1be83", | |
| "metadata": { | |
| "scrolled": false | |
| }, | |
| "outputs": [ | |
| { | |
| "name": "stderr", | |
| "output_type": "stream", | |
| "text": [ | |
| "No artists with labels found to put in legend. Note that artists whose label start with an underscore are ignored when legend() is called with no argument.\n" | |
| ] | |
| }, | |
| { | |
| "data": { |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment