Skip to content

Instantly share code, notes, and snippets.

@anasAlsalol
Last active June 6, 2020 07:47
Show Gist options
  • Select an option

  • Save anasAlsalol/fd1056dc686f8ad25f1d313042106189 to your computer and use it in GitHub Desktop.

Select an option

Save anasAlsalol/fd1056dc686f8ad25f1d313042106189 to your computer and use it in GitHub Desktop.
FirstDSArabicClassification.ipynb
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "Copy of FirstDSArabicClassification.ipynb",
"provenance": [],
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/anasAlsalol/fd1056dc686f8ad25f1d313042106189/copy-of-firstdsarabicclassification.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "code",
"metadata": {
"id": "G82daw0gkO3g",
"colab_type": "code",
"outputId": "d82dcc41-9e13-450e-bf77-ec201515a670",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 459
}
},
"source": [
"# Import PyDrive and associated libraries.\n",
"# https://www.kaggle.com/muhammedfathi/mutli-class-arabic-news-classifictation-with-dl/data\n",
"!wget 'https://storage.googleapis.com/kaggle-data-sets/422485%2F806087%2Fcompressed%2Farabic_categorization_data.csv.zip?GoogleAccessId=gcp-kaggle-com@kaggle-161607.iam.gserviceaccount.com&Expires=1591214331&Signature=V1dMO9XvxJGQ8FbumHfUOGPlsVAYmgaRGiPPXT3Xck8LLteUQLtLdIOL7CZTRvtFqCWGrCmgimhQJW7EYuFjq%2FdT1RaqN4g%2FnNgGxSbe3cbkwY2dcL%2FhlgWaMYLmh2a%2FbNUT1JYk1qezDddwiD1O3QRyzBZooPeZ84gkwyH5N3JbFhlJEfYdVlxgUp6dlyqQXhS5LymT09YfYK8KcasIhng2g08UCJY2l%2F5%2FOWZqSfMELTTZv1o2DMJutbw48PXSRFa7%2FuhQMeHRu2Eg328DcUkwJtzwgpJl5GAstIg2rUN%2FerBWl9m7HJ%2B2YEU5RkmyHlsUEeutmVErAJGM1%2BJJEw%3D%3D' -O arabic_dataset_classifiction.csv.zip\n",
"!unzip arabic_dataset_classifiction.csv.zip \n",
"!head arabic_categorization_data.csv"
],
"execution_count": 0,
"outputs": [
{
"output_type": "stream",
"text": [
"--2020-05-31 19:59:36-- https://storage.googleapis.com/kaggle-data-sets/422485%2F806087%2Fcompressed%2Farabic_categorization_data.csv.zip?GoogleAccessId=gcp-kaggle-com@kaggle-161607.iam.gserviceaccount.com&Expires=1591214331&Signature=V1dMO9XvxJGQ8FbumHfUOGPlsVAYmgaRGiPPXT3Xck8LLteUQLtLdIOL7CZTRvtFqCWGrCmgimhQJW7EYuFjq%2FdT1RaqN4g%2FnNgGxSbe3cbkwY2dcL%2FhlgWaMYLmh2a%2FbNUT1JYk1qezDddwiD1O3QRyzBZooPeZ84gkwyH5N3JbFhlJEfYdVlxgUp6dlyqQXhS5LymT09YfYK8KcasIhng2g08UCJY2l%2F5%2FOWZqSfMELTTZv1o2DMJutbw48PXSRFa7%2FuhQMeHRu2Eg328DcUkwJtzwgpJl5GAstIg2rUN%2FerBWl9m7HJ%2B2YEU5RkmyHlsUEeutmVErAJGM1%2BJJEw%3D%3D\n",
"Resolving storage.googleapis.com (storage.googleapis.com)... 64.233.189.128, 2404:6800:4008:c02::80\n",
"Connecting to storage.googleapis.com (storage.googleapis.com)|64.233.189.128|:443... connected.\n",
"HTTP request sent, awaiting response... 200 OK\n",
"Length: 3764777 (3.6M) [application/zip]\n",
"Saving to: ‘arabic_dataset_classifiction.csv.zip’\n",
"\n",
"arabic_dataset_clas 100%[===================>] 3.59M --.-KB/s in 0.02s \n",
"\n",
"2020-05-31 19:59:37 (201 MB/s) - ‘arabic_dataset_classifiction.csv.zip’ saved [3764777/3764777]\n",
"\n",
"Archive: arabic_dataset_classifiction.csv.zip\n",
" inflating: arabic_categorization_data.csv \n",
",text,type\n",
"0,\"\n",
"أشرف رئيس الجمهورية الباجي قايد السبسي اليوم بقصر قرطاج على موكب منح الوسام الوطني للاستحقاق الثقافي لثلّة من الفنانين والمبدعين و ذلك بمناسبة انعقاد أيام قرطاج السينمائية.\n",
"والفنانون هم : *الصنف الأوّل: - عبد الرحمان سيساكو (موريتانيا) - جميل راتب (مصر) - ميشال خليفي (فلسطين) - ادريسا ودراغو (بوركينا فاسو) - محمد ملص (سوريا) - رضا الباهي (تونس: تعذّر عليه الحضور) - عمر الخليفي (تونس) *الصنف الثاني: - عبد العزيز بن ملوكة (تونس) - نجيب عيّاد (تونس) - منصف شرف الدين (تونس: تعذّر عليه الحضور) *الصنف الثالث: - ابراهيم اللطيّف (تونس) - خميس الخياطي (تونس: تعذّر عليه الحضور) - درّة زرّوق (تونس: تعذّر عليها الحضور) - شوقي الماجري (تونس) *الصنف الرابع: - كوثر بن هنيّة (تونس)\n",
"\",culture\n",
"1,\"\n",
"تحصل كتاب \"\"المصحف وقراءاته\"\" الذي ألفه باحثون تونسيون متخصصون، على جائزة عربية على هامش افتتاح معرض بيروت العربي الدولي للكتاب الذي افتتح امس ويتواصل إلى يوم 14 ديسمبر الحالي.\n",
"وأسند النادي الثقافي العربي الجائزة الثالثة لـ: \"\"المصحف وقراءاته\"\"، الذي جاء في خمسة مجلدات وتم تصنيفه من طرف مجموعة من الباحثين بإشراف الباحث التونسي في الحضارة الاسلامية عبد المجيد الشرقي ونشره من قبل مؤسسة \"\"مؤمنون بلا حدود للدراسات والنشر\"\". ع ب م \n",
"\",culture\n",
"2,\"\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "A2mBja1RkoSw",
"colab_type": "code",
"outputId": "fcccbe10-e199-46d0-ff78-9627c6e10804",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 54
}
},
"source": [
"import nltk\n",
"nltk.download('stopwords')\n",
"import seaborn as sns\n",
"%matplotlib inline\n",
"import pandas.util.testing as tm"
],
"execution_count": 0,
"outputs": [
{
"output_type": "stream",
"text": [
"[nltk_data] Downloading package stopwords to /root/nltk_data...\n",
"[nltk_data] Package stopwords is already up-to-date!\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "qlI2DqOvk9i9",
"colab_type": "code",
"colab": {}
},
"source": [
"import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n",
"from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer\n",
"from sklearn.model_selection import train_test_split, KFold\n",
"import re\n",
"from string import punctuation\n",
"from nltk.corpus import stopwords\n",
"from nltk.stem.snowball import SnowballStemmer\n",
"from sklearn.ensemble import AdaBoostClassifier\n",
"from sklearn.svm import SVC\n",
"from sklearn.neural_network import MLPClassifier \n",
"from sklearn.tree import DecisionTreeClassifier \n",
"from sklearn.ensemble import BaggingClassifier\n",
"from sklearn.ensemble import VotingClassifier\n",
"from sklearn.naive_bayes import GaussianNB \n",
"from sklearn.feature_extraction.text import TfidfVectorizer\n",
"from sklearn.ensemble import RandomForestClassifier\n",
"from sklearn.linear_model import SGDClassifier\n",
"from sklearn.naive_bayes import MultinomialNB, BernoulliNB\n",
"from sklearn.neighbors import KNeighborsClassifier\n",
"from sklearn.pipeline import Pipeline\n",
"from sklearn.svm import LinearSVC\n",
"from sklearn.linear_model import LogisticRegression\n",
"\n",
"\n",
"# metric\n",
"from sklearn.metrics import classification_report,confusion_matrix , accuracy_score\n",
"import warnings\n",
"warnings.filterwarnings('ignore')\n",
"\n",
"stemmer = SnowballStemmer(\"arabic\")\n",
"_stopwords = set(stopwords.words('arabic') + list(punctuation))\n"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "mDc-9KhllC49",
"colab_type": "code",
"colab": {}
},
"source": [
"def stopwords(text):\n",
" '''a function for removing the stopword'''\n",
" # removing the stop words and lowercasing the selected words\n",
" text = [word.lower() for word in text.split() if word.lower() not in _stopwords]\n",
" # joining the list of words with space separator\n",
" return \" \".join(text)\n",
"\n",
"\n",
"def _processNews(news):\n",
" news = news.lower() # convert text to lower-case\n",
" news = re.sub('((www\\.[^\\s]+)|(https?://[^\\s]+))', 'URL', news) # remove URLs\n",
" news = re.sub(r'#([^\\s]+)', r'\\1', news) # remove the # in #hashtag\n",
" news = re.sub('[a-zA-Z]', ' ', news)\n",
" news = re.sub('[^0-9\\u0600-\\u06ff\\u0750-\\u077f\\ufb50-\\ufbc1\\ufbd3-\\ufd3f\\ufd50-\\ufd8f\\ufd50-\\ufd8f\\ufe70-\\ufefc\\uFDF0-\\uFDFD]', ' ', news)\n",
" return news\n",
"\n",
"\n",
"def stemming(text):\n",
" '''a function which stems each word in the given text'''\n",
" try:\n",
" text = [stemmer.stem(word) for word in text.split()]\n",
" except:\n",
" text = text \n",
" return \" \".join(text)\n",
"\n",
"def evaluate_classification(X, y):\n",
" X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2,random_state=0)\n",
" model_name_list = ['LinearSVC', 'MultinomialNB',\n",
" 'BernoulliNB', 'SGDClassifier', 'DecisionTreeClassifier',\n",
" 'RandomForestClassifier',\n",
" 'AdaBoostClassifier', 'KNeighborsClassifier', 'ensemble-Learning' , 'scikit_log_reg'] \n",
"\n",
" # Instantiate the models\n",
" adaboost = AdaBoostClassifier(base_estimator=LinearSVC() , n_estimators=10,\n",
" learning_rate=0.01 , algorithm='SAMME')\n",
" scikit_log_reg = LogisticRegression(verbose=1, solver='liblinear',random_state=0, C=5, penalty='l2',max_iter=1000)\n",
" voting = VotingClassifier(estimators=[('dt' , scikit_log_reg),('knn' , SGDClassifier()),( 'mlp' , LinearSVC()) , ( 'MB', MultinomialNB()) , ('Be',BernoulliNB())],voting='hard',n_jobs=-1)\n",
"\n",
" # Dataframe for results\n",
" results = pd.DataFrame(columns=['accuracy'], index=model_name_list)\n",
"\n",
" # Train and predict with each model \n",
"\n",
" for i, model in enumerate([LinearSVC(), MultinomialNB(),\n",
" BernoulliNB(), SGDClassifier(), DecisionTreeClassifier(max_depth=5),\n",
" RandomForestClassifier(max_depth=5, n_estimators=10, max_features=1),adaboost,\n",
" KNeighborsClassifier(3,n_jobs=-1), voting,scikit_log_reg]):\n",
" model.fit(X_train, y_train)\n",
" predictions = model.predict(X_test)\n",
"\n",
" # Metrics\n",
" model_name = model_name_list[i]\n",
" print('Result For ', model_name)\n",
" acc = accuracy_score(y_test, predictions)\n",
" confusion = confusion_matrix(y_test, predictions)\n",
" report = classification_report(y_test, predictions)\n",
"\n",
" print(\"Accuracy:\", acc)\n",
" print(\"Confusion Matrix:\\n\", confusion)\n",
" print(\"Classification Report:\\n\", report)\n",
" # Metrics\n",
" acc = accuracy_score(y_test, predictions)\n",
" # Insert results into the dataframe\n",
" model_name = model_name_list[i]\n",
" results.loc[model_name, :] = [acc]\n",
" return results \n",
"\n",
"\n",
"def single_calssifier(X, y):\n",
" \n",
" X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2,random_state=0)\n",
" model_name_list = ['single']\n",
" scikit_log_reg = LogisticRegression(verbose=1, solver='liblinear',random_state=0, C=5, penalty='l2',max_iter=1000) \n",
" dt = DecisionTreeClassifier(min_samples_split=40 , criterion=\"gini\")\n",
"\n",
" voting = VotingClassifier(estimators=[('dt' , scikit_log_reg),('knn' , SGDClassifier()),( 'mlp' , LinearSVC()) , ( 'MB', MultinomialNB()) , ('Be',BernoulliNB())],voting='hard',n_jobs=-1)\n",
" bagging = BaggingClassifier(SGDClassifier(),n_estimators=8,max_samples=1000,bootstrap=True,n_jobs=-1)\n",
" adaboost = AdaBoostClassifier(base_estimator=LinearSVC() , n_estimators=10,\n",
" learning_rate=0.1 , algorithm='SAMME' )\n",
" # Dataframe for results\n",
" results = pd.DataFrame(columns=['accuracy'], index=model_name_list)\n",
"\n",
" # Train and predict with each model\n",
" for i, model in enumerate([adaboost]):\n",
" model.fit(X_train, y_train)\n",
" predictions = model.predict(X_test)\n",
"\n",
" # Metrics\n",
" model_name = model_name_list[i]\n",
" print('Result For ', model_name)\n",
" acc = accuracy_score(y_test, predictions)\n",
" confusion = confusion_matrix(y_test, predictions)\n",
" report = classification_report(y_test, predictions)\n",
"\n",
" print(\"Accuracy:\", acc)\n",
" print(\"Confusion Matrix:\\n\", confusion)\n",
" print(\"Classification Report:\\n\", report)\n",
"\n",
" # Metrics\n",
" acc = accuracy_score(y_test, predictions)\n",
" # Insert results into the dataframe\n",
" model_name = model_name_list[i]\n",
" results.loc[model_name, :] = [acc]"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "uv0Snu0-lHyR",
"colab_type": "code",
"outputId": "b877c928-ab89-41b5-eeb1-593e16653ca7",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 206
}
},
"source": [
"trainingData = pd.read_csv(\"arabic_categorization_data.csv\")\n",
"trainingData.head()\n",
"trainingData.rename(columns={'type':'label'}, inplace=True)\n",
"trainingData = trainingData.drop(trainingData.columns[0], axis=1)\n",
"trainingData.head()"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"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>text</th>\n",
" <th>label</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>\\nأشرف رئيس الجمهورية الباجي قايد السبسي اليوم...</td>\n",
" <td>culture</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>\\nتحصل كتاب \"المصحف وقراءاته\" الذي ألفه باحثون...</td>\n",
" <td>culture</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>\\nاستنكرت إدارة المسرح الوطني التونسي الحملة ا...</td>\n",
" <td>culture</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>\\nاحتضن جناح تونس في القرية الدولية للأفلام بم...</td>\n",
" <td>culture</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>\\nشهدت برلين أمس الجمعة افتتاح مسجد فريد من نو...</td>\n",
" <td>culture</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" text label\n",
"0 \\nأشرف رئيس الجمهورية الباجي قايد السبسي اليوم... culture\n",
"1 \\nتحصل كتاب \"المصحف وقراءاته\" الذي ألفه باحثون... culture\n",
"2 \\nاستنكرت إدارة المسرح الوطني التونسي الحملة ا... culture\n",
"3 \\nاحتضن جناح تونس في القرية الدولية للأفلام بم... culture\n",
"4 \\nشهدت برلين أمس الجمعة افتتاح مسجد فريد من نو... culture"
]
},
"metadata": {
"tags": []
},
"execution_count": 10
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "Ha3hNMTnlMwf",
"colab_type": "code",
"colab": {}
},
"source": [
"trainingData['text'] [0]\n",
"trainingData = trainingData[trainingData['text'].notnull()]\n",
"#!pip install --upgrade nltk"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "XZ8pWmhFlP-1",
"colab_type": "code",
"colab": {}
},
"source": [
"trainingData['text'] = trainingData['text'].apply(stopwords)\n",
"trainingData['text'] = trainingData['text'].apply(_processNews)\n",
"#trainingData['text'] = trainingData['text'].apply(stemming)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "Mk9FHcCrlTLt",
"colab_type": "code",
"outputId": "b2a4c12f-6307-4f8e-ad32-4d9db64af89f",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 363
}
},
"source": [
"trainingData.head(10)"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"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>text</th>\n",
" <th>label</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>أشرف رئيس الجمهورية الباجي قايد السبسي اليوم ب...</td>\n",
" <td>culture</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>تحصل كتاب المصحف وقراءاته ألفه باحثون تونسيو...</td>\n",
" <td>culture</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>استنكرت إدارة المسرح الوطني التونسي الحملة شنه...</td>\n",
" <td>culture</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>احتضن جناح تونس القرية الدولية للأفلام بمدينة ...</td>\n",
" <td>culture</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>شهدت برلين أمس الجمعة افتتاح مسجد فريد نوعه ال...</td>\n",
" <td>culture</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>نعت وزارة الشّؤون الثّقافيّة المنشد الصّوفي عز...</td>\n",
" <td>culture</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>أعلنت وزارة الشؤون الثقافية بلاغ اليوم الاثنين...</td>\n",
" <td>culture</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>استضاف برنامج سينما سينما الأربعاء 18 جانفي ...</td>\n",
" <td>culture</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>تنطلق فعاليات التظاهرة الموسيقية الالكترونية ص...</td>\n",
" <td>culture</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>ينطلق مهرجان القيروان للشعر العربي ببيت الشعر ...</td>\n",
" <td>culture</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" text label\n",
"0 أشرف رئيس الجمهورية الباجي قايد السبسي اليوم ب... culture\n",
"1 تحصل كتاب المصحف وقراءاته ألفه باحثون تونسيو... culture\n",
"2 استنكرت إدارة المسرح الوطني التونسي الحملة شنه... culture\n",
"3 احتضن جناح تونس القرية الدولية للأفلام بمدينة ... culture\n",
"4 شهدت برلين أمس الجمعة افتتاح مسجد فريد نوعه ال... culture\n",
"5 نعت وزارة الشّؤون الثّقافيّة المنشد الصّوفي عز... culture\n",
"6 أعلنت وزارة الشؤون الثقافية بلاغ اليوم الاثنين... culture\n",
"7 استضاف برنامج سينما سينما الأربعاء 18 جانفي ... culture\n",
"8 تنطلق فعاليات التظاهرة الموسيقية الالكترونية ص... culture\n",
"9 ينطلق مهرجان القيروان للشعر العربي ببيت الشعر ... culture"
]
},
"metadata": {
"tags": []
},
"execution_count": 13
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "Z4GfpaxZlW9q",
"colab_type": "code",
"colab": {}
},
"source": [
"# create a count vectorizer object\n",
"count_vectorizer = CountVectorizer(max_features=1000)\n",
"# fit the count vectorizer using the text data\n",
"feature_count = count_vectorizer.fit(trainingData['text'])\n",
"x_count = feature_count.transform(trainingData['text']).toarray()\n",
"y_count = trainingData.iloc[:,1].values\n",
"#x_count\n"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "8VzLOIMQladR",
"colab_type": "code",
"colab": {}
},
"source": [
"# tfidf \n",
"vectorizer = TfidfVectorizer(max_features=1000)\n",
"feature_tfidi = vectorizer.fit(trainingData['text'])\n",
"x_tfidf = feature_tfidi.transform(trainingData['text']).toarray()\n",
"y_tfidf = trainingData.iloc[:,1].values\n",
"#x"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "OZAmjLWeledj",
"colab_type": "code",
"outputId": "f4621dca-a87e-4d89-fb2e-c3b058b0e541",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 1000
}
},
"source": [
"print('======= count vectorizer results =================')\n",
"results = pd.DataFrame(columns=['LinearSVC', 'MultinomialNB',\n",
" 'BernoulliNB', 'SGDClassifier', 'DecisionTreeClassifier',\n",
" 'RandomForestClassifier',\n",
" 'AdaBoostClassifier', 'KNeighborsClassifier', 'ensemble-Learning' , 'scikit_log_reg'], index=['result'])\n",
"results.loc['result'] = evaluate_classification(x_count ,y_count).accuracy"
],
"execution_count": 0,
"outputs": [
{
"output_type": "stream",
"text": [
"======= count vectorizer results =================\n",
"Result For LinearSVC\n",
"Accuracy: 0.7319189971070396\n",
"Confusion Matrix:\n",
" [[ 5 1 1 0 8 1 0 2 1]\n",
" [ 2 65 0 19 9 2 4 1 4]\n",
" [ 0 4 18 0 22 0 2 0 0]\n",
" [ 1 14 4 185 21 11 4 6 2]\n",
" [ 7 15 29 43 757 49 85 8 2]\n",
" [ 0 1 0 1 48 98 1 0 0]\n",
" [ 1 2 2 2 86 1 120 0 0]\n",
" [ 0 4 0 2 3 1 0 264 0]\n",
" [ 2 7 1 1 5 0 0 1 6]]\n",
"Classification Report:\n",
" precision recall f1-score support\n",
"\n",
" culture 0.28 0.26 0.27 19\n",
" diverse 0.58 0.61 0.59 106\n",
" economy 0.33 0.39 0.36 46\n",
"internationalNews 0.73 0.75 0.74 248\n",
" localnews 0.79 0.76 0.77 995\n",
" politic 0.60 0.66 0.63 149\n",
" society 0.56 0.56 0.56 214\n",
" sport 0.94 0.96 0.95 274\n",
" technology 0.40 0.26 0.32 23\n",
"\n",
" accuracy 0.73 2074\n",
" macro avg 0.58 0.58 0.58 2074\n",
" weighted avg 0.73 0.73 0.73 2074\n",
"\n",
"Result For MultinomialNB\n",
"Accuracy: 0.6899710703953713\n",
"Confusion Matrix:\n",
" [[ 9 1 0 0 8 0 0 0 1]\n",
" [ 3 76 1 18 0 0 1 2 5]\n",
" [ 1 2 32 0 8 0 2 0 1]\n",
" [ 6 13 3 209 3 7 4 1 2]\n",
" [ 26 9 43 28 542 128 209 2 8]\n",
" [ 2 0 0 5 14 128 0 0 0]\n",
" [ 2 3 1 0 35 1 172 0 0]\n",
" [ 6 3 1 2 5 2 0 253 2]\n",
" [ 1 6 2 1 3 0 0 0 10]]\n",
"Classification Report:\n",
" precision recall f1-score support\n",
"\n",
" culture 0.16 0.47 0.24 19\n",
" diverse 0.67 0.72 0.69 106\n",
" economy 0.39 0.70 0.50 46\n",
"internationalNews 0.79 0.84 0.82 248\n",
" localnews 0.88 0.54 0.67 995\n",
" politic 0.48 0.86 0.62 149\n",
" society 0.44 0.80 0.57 214\n",
" sport 0.98 0.92 0.95 274\n",
" technology 0.34 0.43 0.38 23\n",
"\n",
" accuracy 0.69 2074\n",
" macro avg 0.57 0.70 0.60 2074\n",
" weighted avg 0.77 0.69 0.70 2074\n",
"\n",
"Result For BernoulliNB\n",
"Accuracy: 0.6822565091610414\n",
"Confusion Matrix:\n",
" [[ 8 1 1 0 5 0 1 2 1]\n",
" [ 1 78 1 21 0 0 0 3 2]\n",
" [ 1 2 34 0 7 0 2 0 0]\n",
" [ 3 14 3 211 4 7 3 3 0]\n",
" [ 23 14 53 37 519 131 202 9 7]\n",
" [ 1 0 1 4 17 125 0 1 0]\n",
" [ 1 4 1 3 30 0 173 2 0]\n",
" [ 3 1 0 2 2 1 0 264 1]\n",
" [ 1 13 3 1 2 0 0 0 3]]\n",
"Classification Report:\n",
" precision recall f1-score support\n",
"\n",
" culture 0.19 0.42 0.26 19\n",
" diverse 0.61 0.74 0.67 106\n",
" economy 0.35 0.74 0.48 46\n",
"internationalNews 0.76 0.85 0.80 248\n",
" localnews 0.89 0.52 0.66 995\n",
" politic 0.47 0.84 0.61 149\n",
" society 0.45 0.81 0.58 214\n",
" sport 0.93 0.96 0.95 274\n",
" technology 0.21 0.13 0.16 23\n",
"\n",
" accuracy 0.68 2074\n",
" macro avg 0.54 0.67 0.57 2074\n",
" weighted avg 0.76 0.68 0.69 2074\n",
"\n",
"Result For SGDClassifier\n",
"Accuracy: 0.73625843780135\n",
"Confusion Matrix:\n",
" [[ 3 2 1 0 8 0 1 3 1]\n",
" [ 1 61 0 28 10 1 0 2 3]\n",
" [ 1 4 19 0 20 0 2 0 0]\n",
" [ 0 9 3 209 17 6 1 3 0]\n",
" [ 7 17 32 45 747 42 99 5 1]\n",
" [ 0 1 2 2 56 88 0 0 0]\n",
" [ 0 2 2 3 73 1 133 0 0]\n",
" [ 0 3 0 4 3 0 0 264 0]\n",
" [ 2 7 1 1 7 0 1 1 3]]\n",
"Classification Report:\n",
" precision recall f1-score support\n",
"\n",
" culture 0.21 0.16 0.18 19\n",
" diverse 0.58 0.58 0.58 106\n",
" economy 0.32 0.41 0.36 46\n",
"internationalNews 0.72 0.84 0.77 248\n",
" localnews 0.79 0.75 0.77 995\n",
" politic 0.64 0.59 0.61 149\n",
" society 0.56 0.62 0.59 214\n",
" sport 0.95 0.96 0.96 274\n",
" technology 0.38 0.13 0.19 23\n",
"\n",
" accuracy 0.74 2074\n",
" macro avg 0.57 0.56 0.56 2074\n",
" weighted avg 0.74 0.74 0.74 2074\n",
"\n",
"Result For DecisionTreeClassifier\n",
"Accuracy: 0.5814850530376084\n",
"Confusion Matrix:\n",
" [[ 0 0 0 0 19 0 0 0 0]\n",
" [ 0 0 0 11 95 0 0 0 0]\n",
" [ 0 0 0 0 44 0 2 0 0]\n",
" [ 0 0 0 33 215 0 0 0 0]\n",
" [ 0 0 0 6 943 18 28 0 0]\n",
" [ 0 0 0 0 122 27 0 0 0]\n",
" [ 0 0 0 0 156 0 58 0 0]\n",
" [ 0 0 0 3 126 0 0 145 0]\n",
" [ 0 0 0 0 23 0 0 0 0]]\n",
"Classification Report:\n",
" precision recall f1-score support\n",
"\n",
" culture 0.00 0.00 0.00 19\n",
" diverse 0.00 0.00 0.00 106\n",
" economy 0.00 0.00 0.00 46\n",
"internationalNews 0.62 0.13 0.22 248\n",
" localnews 0.54 0.95 0.69 995\n",
" politic 0.60 0.18 0.28 149\n",
" society 0.66 0.27 0.38 214\n",
" sport 1.00 0.53 0.69 274\n",
" technology 0.00 0.00 0.00 23\n",
"\n",
" accuracy 0.58 2074\n",
" macro avg 0.38 0.23 0.25 2074\n",
" weighted avg 0.58 0.58 0.51 2074\n",
"\n",
"Result For RandomForestClassifier\n",
"Accuracy: 0.4802314368370299\n",
"Confusion Matrix:\n",
" [[ 0 0 0 0 19 0 0 0 0]\n",
" [ 0 0 0 0 106 0 0 0 0]\n",
" [ 0 0 0 0 46 0 0 0 0]\n",
" [ 0 0 0 0 248 0 0 0 0]\n",
" [ 0 0 0 0 995 0 0 0 0]\n",
" [ 0 0 0 0 149 0 0 0 0]\n",
" [ 0 0 0 0 214 0 0 0 0]\n",
" [ 0 0 0 0 273 0 0 1 0]\n",
" [ 0 0 0 0 23 0 0 0 0]]\n",
"Classification Report:\n",
" precision recall f1-score support\n",
"\n",
" culture 0.00 0.00 0.00 19\n",
" diverse 0.00 0.00 0.00 106\n",
" economy 0.00 0.00 0.00 46\n",
"internationalNews 0.00 0.00 0.00 248\n",
" localnews 0.48 1.00 0.65 995\n",
" politic 0.00 0.00 0.00 149\n",
" society 0.00 0.00 0.00 214\n",
" sport 1.00 0.00 0.01 274\n",
" technology 0.00 0.00 0.00 23\n",
"\n",
" accuracy 0.48 2074\n",
" macro avg 0.16 0.11 0.07 2074\n",
" weighted avg 0.36 0.48 0.31 2074\n",
"\n",
"Result For AdaBoostClassifier\n",
"Accuracy: 0.6634522661523626\n",
"Confusion Matrix:\n",
" [[ 0 0 0 0 18 0 0 1 0]\n",
" [ 0 5 0 32 69 0 0 0 0]\n",
" [ 0 0 4 0 42 0 0 0 0]\n",
" [ 0 0 0 119 126 1 0 2 0]\n",
" [ 0 0 1 7 972 2 12 1 0]\n",
" [ 0 0 0 0 137 12 0 0 0]\n",
" [ 0 0 0 0 186 0 28 0 0]\n",
" [ 0 0 0 0 38 0 0 236 0]\n",
" [ 0 0 0 1 21 0 0 1 0]]\n",
"Classification Report:\n",
" precision recall f1-score support\n",
"\n",
" culture 0.00 0.00 0.00 19\n",
" diverse 1.00 0.05 0.09 106\n",
" economy 0.80 0.09 0.16 46\n",
"internationalNews 0.75 0.48 0.58 248\n",
" localnews 0.60 0.98 0.75 995\n",
" politic 0.80 0.08 0.15 149\n",
" society 0.70 0.13 0.22 214\n",
" sport 0.98 0.86 0.92 274\n",
" technology 0.00 0.00 0.00 23\n",
"\n",
" accuracy 0.66 2074\n",
" macro avg 0.63 0.30 0.32 2074\n",
" weighted avg 0.71 0.66 0.59 2074\n",
"\n",
"Result For KNeighborsClassifier\n",
"Accuracy: 0.5607521697203471\n",
"Confusion Matrix:\n",
" [[ 2 1 1 1 11 0 0 2 1]\n",
" [ 2 31 1 11 55 0 0 4 2]\n",
" [ 1 2 13 1 23 1 2 3 0]\n",
" [ 0 37 2 83 109 3 0 13 1]\n",
" [ 6 70 26 43 735 28 49 38 0]\n",
" [ 0 11 1 6 77 54 0 0 0]\n",
" [ 1 11 0 4 136 0 61 1 0]\n",
" [ 1 16 0 7 69 0 0 181 0]\n",
" [ 0 5 3 1 11 0 0 0 3]]\n",
"Classification Report:\n",
" precision recall f1-score support\n",
"\n",
" culture 0.15 0.11 0.12 19\n",
" diverse 0.17 0.29 0.21 106\n",
" economy 0.28 0.28 0.28 46\n",
"internationalNews 0.53 0.33 0.41 248\n",
" localnews 0.60 0.74 0.66 995\n",
" politic 0.63 0.36 0.46 149\n",
" society 0.54 0.29 0.37 214\n",
" sport 0.75 0.66 0.70 274\n",
" technology 0.43 0.13 0.20 23\n",
"\n",
" accuracy 0.56 2074\n",
" macro avg 0.45 0.35 0.38 2074\n",
" weighted avg 0.57 0.56 0.55 2074\n",
"\n",
"Result For ensemble-Learning\n",
"Accuracy: 0.7671166827386693\n",
"Confusion Matrix:\n",
" [[ 7 0 1 0 8 0 0 2 1]\n",
" [ 2 69 1 17 9 2 2 2 2]\n",
" [ 0 3 22 0 19 0 2 0 0]\n",
" [ 1 11 3 208 15 8 1 1 0]\n",
" [ 7 13 29 37 766 46 94 2 1]\n",
" [ 0 1 1 2 39 106 0 0 0]\n",
" [ 0 3 2 1 67 1 140 0 0]\n",
" [ 0 4 0 1 2 0 0 267 0]\n",
" [ 2 7 2 1 4 0 0 1 6]]\n",
"Classification Report:\n",
" precision recall f1-score support\n",
"\n",
" culture 0.37 0.37 0.37 19\n",
" diverse 0.62 0.65 0.64 106\n",
" economy 0.36 0.48 0.41 46\n",
"internationalNews 0.78 0.84 0.81 248\n",
" localnews 0.82 0.77 0.80 995\n",
" politic 0.65 0.71 0.68 149\n",
" society 0.59 0.65 0.62 214\n",
" sport 0.97 0.97 0.97 274\n",
" technology 0.60 0.26 0.36 23\n",
"\n",
" accuracy 0.77 2074\n",
" macro avg 0.64 0.63 0.63 2074\n",
" weighted avg 0.77 0.77 0.77 2074\n",
"\n",
"[LibLinear]Result For scikit_log_reg\n",
"Accuracy: 0.7492767598842816\n",
"Confusion Matrix:\n",
" [[ 4 0 1 0 11 0 0 2 1]\n",
" [ 3 62 0 19 14 1 3 1 3]\n",
" [ 0 2 20 0 22 0 2 0 0]\n",
" [ 1 14 3 192 27 9 1 1 0]\n",
" [ 4 10 23 39 797 42 77 2 1]\n",
" [ 0 0 1 2 57 89 0 0 0]\n",
" [ 0 2 2 2 89 1 118 0 0]\n",
" [ 0 3 0 1 3 0 0 267 0]\n",
" [ 2 7 0 1 7 0 0 1 5]]\n",
"Classification Report:\n",
" precision recall f1-score support\n",
"\n",
" culture 0.29 0.21 0.24 19\n",
" diverse 0.62 0.58 0.60 106\n",
" economy 0.40 0.43 0.42 46\n",
"internationalNews 0.75 0.77 0.76 248\n",
" localnews 0.78 0.80 0.79 995\n",
" politic 0.63 0.60 0.61 149\n",
" society 0.59 0.55 0.57 214\n",
" sport 0.97 0.97 0.97 274\n",
" technology 0.50 0.22 0.30 23\n",
"\n",
" accuracy 0.75 2074\n",
" macro avg 0.61 0.57 0.59 2074\n",
" weighted avg 0.75 0.75 0.75 2074\n",
"\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "c1i0vYSplifv",
"colab_type": "code",
"outputId": "8b53ffe4-636a-44fb-ebf4-57704fa1ffda",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 118
}
},
"source": [
"results"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"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>LinearSVC</th>\n",
" <th>MultinomialNB</th>\n",
" <th>BernoulliNB</th>\n",
" <th>SGDClassifier</th>\n",
" <th>DecisionTreeClassifier</th>\n",
" <th>RandomForestClassifier</th>\n",
" <th>AdaBoostClassifier</th>\n",
" <th>KNeighborsClassifier</th>\n",
" <th>ensemble-Learning</th>\n",
" <th>scikit_log_reg</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>result</th>\n",
" <td>0.731919</td>\n",
" <td>0.689971</td>\n",
" <td>0.682257</td>\n",
" <td>0.736258</td>\n",
" <td>0.581485</td>\n",
" <td>0.480231</td>\n",
" <td>0.663452</td>\n",
" <td>0.560752</td>\n",
" <td>0.767117</td>\n",
" <td>0.749277</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" LinearSVC MultinomialNB ... ensemble-Learning scikit_log_reg\n",
"result 0.731919 0.689971 ... 0.767117 0.749277\n",
"\n",
"[1 rows x 10 columns]"
]
},
"metadata": {
"tags": []
},
"execution_count": 17
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "L-ESIytxllgA",
"colab_type": "code",
"outputId": "3b056359-815f-4466-b85e-2525b3f85c19",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 1000
}
},
"source": [
"print('======= TfidfVectorizer results =================')\n",
"results = pd.DataFrame(columns=['LinearSVC', 'MultinomialNB',\n",
" 'BernoulliNB', 'SGDClassifier', 'DecisionTreeClassifier',\n",
" 'RandomForestClassifier',\n",
" 'AdaBoostClassifier', 'KNeighborsClassifier', 'ensemble-Learning' , 'scikit_log_reg'], index=['result'])\n",
"results.loc['result'] = evaluate_classification(x_tfidf ,y_tfidf).accuracy"
],
"execution_count": 0,
"outputs": [
{
"output_type": "stream",
"text": [
"======= TfidfVectorizer results =================\n",
"Result For LinearSVC\n",
"Accuracy: 0.7690453230472517\n",
"Confusion Matrix:\n",
" [[ 3 2 0 0 10 0 1 2 1]\n",
" [ 0 62 0 24 13 0 1 1 5]\n",
" [ 0 2 18 0 24 0 2 0 0]\n",
" [ 1 11 3 207 20 5 0 1 0]\n",
" [ 3 8 22 29 828 36 66 2 1]\n",
" [ 0 0 1 5 60 83 0 0 0]\n",
" [ 0 2 0 1 91 0 120 0 0]\n",
" [ 0 2 0 2 1 0 0 269 0]\n",
" [ 2 7 1 2 5 0 0 1 5]]\n",
"Classification Report:\n",
" precision recall f1-score support\n",
"\n",
" culture 0.33 0.16 0.21 19\n",
" diverse 0.65 0.58 0.61 106\n",
" economy 0.40 0.39 0.40 46\n",
"internationalNews 0.77 0.83 0.80 248\n",
" localnews 0.79 0.83 0.81 995\n",
" politic 0.67 0.56 0.61 149\n",
" society 0.63 0.56 0.59 214\n",
" sport 0.97 0.98 0.98 274\n",
" technology 0.42 0.22 0.29 23\n",
"\n",
" accuracy 0.77 2074\n",
" macro avg 0.63 0.57 0.59 2074\n",
" weighted avg 0.76 0.77 0.76 2074\n",
"\n",
"Result For MultinomialNB\n",
"Accuracy: 0.7492767598842816\n",
"Confusion Matrix:\n",
" [[ 0 0 0 0 16 0 0 3 0]\n",
" [ 0 37 1 32 34 0 0 2 0]\n",
" [ 0 1 16 0 28 0 1 0 0]\n",
" [ 0 1 1 194 47 3 1 1 0]\n",
" [ 0 2 3 23 810 44 112 1 0]\n",
" [ 0 0 0 2 56 91 0 0 0]\n",
" [ 0 0 0 0 67 0 147 0 0]\n",
" [ 0 1 0 1 12 1 0 259 0]\n",
" [ 0 6 1 3 12 0 0 1 0]]\n",
"Classification Report:\n",
" precision recall f1-score support\n",
"\n",
" culture 0.00 0.00 0.00 19\n",
" diverse 0.77 0.35 0.48 106\n",
" economy 0.73 0.35 0.47 46\n",
"internationalNews 0.76 0.78 0.77 248\n",
" localnews 0.75 0.81 0.78 995\n",
" politic 0.65 0.61 0.63 149\n",
" society 0.56 0.69 0.62 214\n",
" sport 0.97 0.95 0.96 274\n",
" technology 0.00 0.00 0.00 23\n",
"\n",
" accuracy 0.75 2074\n",
" macro avg 0.58 0.50 0.52 2074\n",
" weighted avg 0.74 0.75 0.74 2074\n",
"\n",
"Result For BernoulliNB\n",
"Accuracy: 0.6822565091610414\n",
"Confusion Matrix:\n",
" [[ 8 1 1 0 5 0 1 2 1]\n",
" [ 1 78 1 21 0 0 0 3 2]\n",
" [ 1 2 34 0 7 0 2 0 0]\n",
" [ 3 14 3 211 4 7 3 3 0]\n",
" [ 23 14 53 37 519 131 202 9 7]\n",
" [ 1 0 1 4 17 125 0 1 0]\n",
" [ 1 4 1 3 30 0 173 2 0]\n",
" [ 3 1 0 2 2 1 0 264 1]\n",
" [ 1 13 3 1 2 0 0 0 3]]\n",
"Classification Report:\n",
" precision recall f1-score support\n",
"\n",
" culture 0.19 0.42 0.26 19\n",
" diverse 0.61 0.74 0.67 106\n",
" economy 0.35 0.74 0.48 46\n",
"internationalNews 0.76 0.85 0.80 248\n",
" localnews 0.89 0.52 0.66 995\n",
" politic 0.47 0.84 0.61 149\n",
" society 0.45 0.81 0.58 214\n",
" sport 0.93 0.96 0.95 274\n",
" technology 0.21 0.13 0.16 23\n",
"\n",
" accuracy 0.68 2074\n",
" macro avg 0.54 0.67 0.57 2074\n",
" weighted avg 0.76 0.68 0.69 2074\n",
"\n",
"Result For SGDClassifier\n",
"Accuracy: 0.7675988428158148\n",
"Confusion Matrix:\n",
" [[ 4 2 0 0 10 0 1 1 1]\n",
" [ 0 57 1 25 16 0 2 1 4]\n",
" [ 0 1 17 0 27 0 1 0 0]\n",
" [ 0 7 4 211 21 4 0 1 0]\n",
" [ 2 7 12 27 847 32 66 2 0]\n",
" [ 0 0 0 5 75 69 0 0 0]\n",
" [ 0 2 0 1 93 0 118 0 0]\n",
" [ 0 1 0 2 7 0 0 264 0]\n",
" [ 2 6 1 2 6 0 0 1 5]]\n",
"Classification Report:\n",
" precision recall f1-score support\n",
"\n",
" culture 0.50 0.21 0.30 19\n",
" diverse 0.69 0.54 0.60 106\n",
" economy 0.49 0.37 0.42 46\n",
"internationalNews 0.77 0.85 0.81 248\n",
" localnews 0.77 0.85 0.81 995\n",
" politic 0.66 0.46 0.54 149\n",
" society 0.63 0.55 0.59 214\n",
" sport 0.98 0.96 0.97 274\n",
" technology 0.50 0.22 0.30 23\n",
"\n",
" accuracy 0.77 2074\n",
" macro avg 0.66 0.56 0.59 2074\n",
" weighted avg 0.76 0.77 0.76 2074\n",
"\n",
"Result For DecisionTreeClassifier\n",
"Accuracy: 0.5800385728061717\n",
"Confusion Matrix:\n",
" [[ 0 0 0 0 19 0 0 0 0]\n",
" [ 0 0 0 11 95 0 0 0 0]\n",
" [ 0 0 0 0 45 0 1 0 0]\n",
" [ 0 0 0 32 216 0 0 0 0]\n",
" [ 0 0 0 6 952 18 19 0 0]\n",
" [ 0 0 0 0 122 27 0 0 0]\n",
" [ 0 0 0 0 166 0 48 0 0]\n",
" [ 1 0 0 3 126 0 0 144 0]\n",
" [ 0 0 0 0 23 0 0 0 0]]\n",
"Classification Report:\n",
" precision recall f1-score support\n",
"\n",
" culture 0.00 0.00 0.00 19\n",
" diverse 0.00 0.00 0.00 106\n",
" economy 0.00 0.00 0.00 46\n",
"internationalNews 0.62 0.13 0.21 248\n",
" localnews 0.54 0.96 0.69 995\n",
" politic 0.60 0.18 0.28 149\n",
" society 0.71 0.22 0.34 214\n",
" sport 1.00 0.53 0.69 274\n",
" technology 0.00 0.00 0.00 23\n",
"\n",
" accuracy 0.58 2074\n",
" macro avg 0.38 0.22 0.25 2074\n",
" weighted avg 0.58 0.58 0.50 2074\n",
"\n",
"Result For RandomForestClassifier\n",
"Accuracy: 0.47974927675988427\n",
"Confusion Matrix:\n",
" [[ 0 0 0 0 19 0 0 0 0]\n",
" [ 0 0 0 0 106 0 0 0 0]\n",
" [ 0 0 0 0 46 0 0 0 0]\n",
" [ 0 0 0 0 248 0 0 0 0]\n",
" [ 0 0 0 0 995 0 0 0 0]\n",
" [ 0 0 0 0 149 0 0 0 0]\n",
" [ 0 0 0 0 214 0 0 0 0]\n",
" [ 0 0 0 0 274 0 0 0 0]\n",
" [ 0 0 0 0 23 0 0 0 0]]\n",
"Classification Report:\n",
" precision recall f1-score support\n",
"\n",
" culture 0.00 0.00 0.00 19\n",
" diverse 0.00 0.00 0.00 106\n",
" economy 0.00 0.00 0.00 46\n",
"internationalNews 0.00 0.00 0.00 248\n",
" localnews 0.48 1.00 0.65 995\n",
" politic 0.00 0.00 0.00 149\n",
" society 0.00 0.00 0.00 214\n",
" sport 0.00 0.00 0.00 274\n",
" technology 0.00 0.00 0.00 23\n",
"\n",
" accuracy 0.48 2074\n",
" macro avg 0.05 0.11 0.07 2074\n",
" weighted avg 0.23 0.48 0.31 2074\n",
"\n",
"Result For AdaBoostClassifier\n",
"Accuracy: 0.47974927675988427\n",
"Confusion Matrix:\n",
" [[ 0 0 0 0 19 0 0 0 0]\n",
" [ 0 0 0 0 106 0 0 0 0]\n",
" [ 0 0 0 0 46 0 0 0 0]\n",
" [ 0 0 0 0 248 0 0 0 0]\n",
" [ 0 0 0 0 995 0 0 0 0]\n",
" [ 0 0 0 0 149 0 0 0 0]\n",
" [ 0 0 0 0 214 0 0 0 0]\n",
" [ 0 0 0 0 274 0 0 0 0]\n",
" [ 0 0 0 0 23 0 0 0 0]]\n",
"Classification Report:\n",
" precision recall f1-score support\n",
"\n",
" culture 0.00 0.00 0.00 19\n",
" diverse 0.00 0.00 0.00 106\n",
" economy 0.00 0.00 0.00 46\n",
"internationalNews 0.00 0.00 0.00 248\n",
" localnews 0.48 1.00 0.65 995\n",
" politic 0.00 0.00 0.00 149\n",
" society 0.00 0.00 0.00 214\n",
" sport 0.00 0.00 0.00 274\n",
" technology 0.00 0.00 0.00 23\n",
"\n",
" accuracy 0.48 2074\n",
" macro avg 0.05 0.11 0.07 2074\n",
" weighted avg 0.23 0.48 0.31 2074\n",
"\n",
"Result For KNeighborsClassifier\n",
"Accuracy: 0.44792671166827386\n",
"Confusion Matrix:\n",
" [[ 0 1 0 5 11 0 0 2 0]\n",
" [ 0 6 0 13 69 0 0 18 0]\n",
" [ 0 2 8 1 30 0 0 4 1]\n",
" [ 0 21 0 68 127 4 0 28 0]\n",
" [ 1 29 11 140 694 12 6 102 0]\n",
" [ 0 33 0 12 72 19 0 13 0]\n",
" [ 0 12 1 19 154 0 14 14 0]\n",
" [ 0 26 0 14 114 0 0 120 0]\n",
" [ 1 2 1 3 13 0 0 3 0]]\n",
"Classification Report:\n",
" precision recall f1-score support\n",
"\n",
" culture 0.00 0.00 0.00 19\n",
" diverse 0.05 0.06 0.05 106\n",
" economy 0.38 0.17 0.24 46\n",
"internationalNews 0.25 0.27 0.26 248\n",
" localnews 0.54 0.70 0.61 995\n",
" politic 0.54 0.13 0.21 149\n",
" society 0.70 0.07 0.12 214\n",
" sport 0.39 0.44 0.42 274\n",
" technology 0.00 0.00 0.00 23\n",
"\n",
" accuracy 0.45 2074\n",
" macro avg 0.32 0.20 0.21 2074\n",
" weighted avg 0.46 0.45 0.41 2074\n",
"\n",
"Result For ensemble-Learning\n",
"Accuracy: 0.7753134040501446\n",
"Confusion Matrix:\n",
" [[ 3 2 0 0 10 0 1 2 1]\n",
" [ 0 56 1 28 16 0 1 1 3]\n",
" [ 0 1 17 0 26 0 2 0 0]\n",
" [ 0 8 3 213 19 4 0 1 0]\n",
" [ 2 9 13 31 839 37 63 1 0]\n",
" [ 0 0 0 3 66 80 0 0 0]\n",
" [ 0 2 0 1 84 0 127 0 0]\n",
" [ 0 0 0 2 4 0 0 268 0]\n",
" [ 2 6 1 2 6 0 0 1 5]]\n",
"Classification Report:\n",
" precision recall f1-score support\n",
"\n",
" culture 0.43 0.16 0.23 19\n",
" diverse 0.67 0.53 0.59 106\n",
" economy 0.49 0.37 0.42 46\n",
"internationalNews 0.76 0.86 0.81 248\n",
" localnews 0.78 0.84 0.81 995\n",
" politic 0.66 0.54 0.59 149\n",
" society 0.65 0.59 0.62 214\n",
" sport 0.98 0.98 0.98 274\n",
" technology 0.56 0.22 0.31 23\n",
"\n",
" accuracy 0.78 2074\n",
" macro avg 0.66 0.56 0.60 2074\n",
" weighted avg 0.77 0.78 0.77 2074\n",
"\n",
"[LibLinear]Result For scikit_log_reg\n",
"Accuracy: 0.7743490838958534\n",
"Confusion Matrix:\n",
" [[ 2 2 0 0 12 0 1 2 0]\n",
" [ 0 57 0 27 18 0 1 1 2]\n",
" [ 0 1 16 0 27 0 2 0 0]\n",
" [ 0 7 2 210 24 4 0 1 0]\n",
" [ 2 9 11 29 854 35 54 1 0]\n",
" [ 0 0 0 3 72 74 0 0 0]\n",
" [ 0 2 0 1 90 0 121 0 0]\n",
" [ 0 1 0 2 4 0 0 267 0]\n",
" [ 2 6 1 2 6 0 0 1 5]]\n",
"Classification Report:\n",
" precision recall f1-score support\n",
"\n",
" culture 0.33 0.11 0.16 19\n",
" diverse 0.67 0.54 0.60 106\n",
" economy 0.53 0.35 0.42 46\n",
"internationalNews 0.77 0.85 0.80 248\n",
" localnews 0.77 0.86 0.81 995\n",
" politic 0.65 0.50 0.56 149\n",
" society 0.68 0.57 0.62 214\n",
" sport 0.98 0.97 0.98 274\n",
" technology 0.71 0.22 0.33 23\n",
"\n",
" accuracy 0.77 2074\n",
" macro avg 0.68 0.55 0.59 2074\n",
" weighted avg 0.76 0.77 0.76 2074\n",
"\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "SaBbgdp8lph_",
"colab_type": "code",
"outputId": "ecf83a40-4c2d-4833-c990-6ab569240ac4",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 118
}
},
"source": [
"results"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"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>LinearSVC</th>\n",
" <th>MultinomialNB</th>\n",
" <th>BernoulliNB</th>\n",
" <th>SGDClassifier</th>\n",
" <th>DecisionTreeClassifier</th>\n",
" <th>RandomForestClassifier</th>\n",
" <th>AdaBoostClassifier</th>\n",
" <th>KNeighborsClassifier</th>\n",
" <th>ensemble-Learning</th>\n",
" <th>scikit_log_reg</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>result</th>\n",
" <td>0.769045</td>\n",
" <td>0.749277</td>\n",
" <td>0.682257</td>\n",
" <td>0.767599</td>\n",
" <td>0.580039</td>\n",
" <td>0.479749</td>\n",
" <td>0.479749</td>\n",
" <td>0.447927</td>\n",
" <td>0.775313</td>\n",
" <td>0.774349</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" LinearSVC MultinomialNB ... ensemble-Learning scikit_log_reg\n",
"result 0.769045 0.749277 ... 0.775313 0.774349\n",
"\n",
"[1 rows x 10 columns]"
]
},
"metadata": {
"tags": []
},
"execution_count": 19
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "-m46ZazLlvf-",
"colab_type": "code",
"outputId": "c610fdc2-a02c-46ba-fb3f-148f33645826",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 283
}
},
"source": [
"cf_matrix = [[3 , 2, 0, 0, 10, 0, 1, 2, 1],\n",
" [ 0, 56, 1, 28, 16 , 0 , 1 , 1 , 3],\n",
" [ 0 , 1 , 17 , 0 , 26 , 0 , 2 , 0 , 0],\n",
" [ 0 , 8 , 3 ,213 ,19 ,4 ,0 ,1 ,0],\n",
" [ 2 ,9 , 13 , 31 ,839 , 37 , 63 , 1 , 0],\n",
" [ 0 , 0 , 0 , 3 ,66 , 80 , 0 , 0 , 0],\n",
" [ 0, 2 , 0 , 1 ,84 , 0 ,127 , 0 , 0],\n",
" [ 0 , 0 , 0 , 2 , 4 ,0 , 0 ,268 , 0],\n",
" [ 2 , 6 , 1 , 2 , 6 ,0 ,0 , 1 , 5]]\n",
"import seaborn as sns\n",
"sns.heatmap(cf_matrix, annot=True)"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x7f2f7be80cf8>"
]
},
"metadata": {
"tags": []
},
"execution_count": 3
},
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 2 Axes>"
]
},
"metadata": {
"tags": [],
"needs_background": "light"
}
}
]
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment