{ "cells": [ { "cell_type": "markdown", "id": "a420b5d2", "metadata": {}, "source": [ "# Öğrenme Ajansı Laboratuvarı Otomatik Deneme Puanlaması 2.0 - Learning Agency Lab Automated Essay Scoring 2.0" ] }, { "cell_type": "markdown", "id": "e91c5ef7", "metadata": {}, "source": [ "TR = Her yorum satırı kendisini üstündeki koda aittir. İlk olarak Türkçe, son olarak İngilizce yazıldı.\n", "\n", "EN = Each comment line belongs to the code above it. It was first written in Turkish and lastly in English.\n", "\n", "TR = Bu proje, derin öğrenme tekniklerini kullanarak gelişmiş bir otomatik makale puanlama (AES) sistemi geliştirmeyi amaçlamaktadır. Mevcut çerçeveye dayanarak, \"Learning Agency Lab AES 2.0\" öğrenci makalelerini daha fazla hassasiyet ve adaletle değerlendirme ve notlandırma yeteneğini geliştirir. Sistem makaleleri içerik, dil bilgisi, tutarlılık ve yazım tarzı açısından analiz ederek bütünsel bir değerlendirme sağlar. Sinir ağları, doğal dil işleme (NLP) ve regresyon modellerini kullanarak, bu AES sistemi eğitimciler ve öğrenciler için daha doğru, tutarlı ve etkili geri bildirim sunmak, kişiselleştirilmiş öğrenmeyi ve nesnel değerlendirmeyi desteklemek üzere tasarlanmıştır.\n", "\n", "EN = This project aims to develop an advanced automated essay scoring (AES) system using deep learning techniques. Building upon the existing framework, \"Learning Agency Lab AES 2.0\" enhances the ability to assess and grade student essays with greater precision and fairness. The system analyzes essays for content, grammar, coherence, and writing style, providing a holistic evaluation. By utilizing neural networks, natural language processing (NLP), and regression models, this AES system is designed to offer more accurate, consistent, and efficient feedback for educators and learners alike, supporting personalized learning and objective evaluation.\n", "\n", "Kaynak/Source = https://www.kaggle.com/competitions/learning-agency-lab-automated-essay-scoring-2" ] }, { "cell_type": "code", "execution_count": 1, "id": "17231e0f", "metadata": {}, "outputs": [], "source": [ "#pip install autocorrect" ] }, { "cell_type": "code", "execution_count": 2, "id": "34dfbaa8", "metadata": {}, "outputs": [], "source": [ "#pip install langdetect" ] }, { "cell_type": "code", "execution_count": 3, "id": "0f3cde94", "metadata": {}, "outputs": [], "source": [ "#pip install googletrans==4.0.0-rc1" ] }, { "cell_type": "code", "execution_count": 4, "id": "4afc940c", "metadata": {}, "outputs": [], "source": [ "#pip install wordcloud matplotlib" ] }, { "cell_type": "code", "execution_count": 5, "id": "a6dfba98", "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import seaborn as sns\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import nltk\n", "import time\n", "import math\n", "import warnings\n", "warnings.filterwarnings('ignore') \n", "import re\n", "import pickle\n", "\n", "from sklearn.feature_extraction.text import CountVectorizer\n", "from autocorrect import spell\n", "from textblob import TextBlob\n", "from langdetect import detect\n", "from googletrans import Translator\n", "from PIL import Image\n", "from wordcloud import WordCloud, STOPWORDS\n", "from sklearn.feature_extraction.text import TfidfVectorizer\n", "\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.preprocessing import StandardScaler ,MinMaxScaler\n", "from tensorflow.keras.models import Sequential\n", "from tensorflow.keras.layers import Dense, Flatten, Dropout, BatchNormalization, LeakyReLU\n", "from tensorflow.keras.callbacks import EarlyStopping\n", "from sklearn.metrics import r2_score, mean_squared_error, mean_absolute_error\n", "from wordcloud import WordCloud" ] }, { "cell_type": "code", "execution_count": 6, "id": "0d9bde94", "metadata": {}, "outputs": [], "source": [ "pd.set_option(\"display.max_columns\",None) \n", "# TR = En fazla kaç sütun olduğunu gösteriyor. \n", "# EN = It shows the maximum number of columns." ] }, { "cell_type": "code", "execution_count": 7, "id": "830e9a44", "metadata": {}, "outputs": [], "source": [ "df=pd.read_csv('train.csv')\n", "df_test=pd.read_csv('test.csv')" ] }, { "cell_type": "markdown", "id": "2638b690", "metadata": {}, "source": [ "## EDA Keşif Amaçlı Veri Analizi - EDA - Exploratory Data Analysis" ] }, { "cell_type": "code", "execution_count": 8, "id": "e27f4dd1", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " essay_id full_text score\n", "0 000d118 Many people have car where they live. The thin... 3\n", "1 000fe60 I am a scientist at NASA that is discussing th... 3\n", "2 001ab80 People always wish they had the same technolog... 4\n", "3 001bdc0 We all heard about Venus, the planet without a... 4\n", "4 002ba53 Dear, State Senator\\n\\nThis is a letter to arg... 3\n", "-----------------------------------\n", " essay_id full_text\n", "0 000d118 Many people have car where they live. The thin...\n", "1 000fe60 I am a scientist at NASA that is discussing th...\n", "2 001ab80 People always wish they had the same technolog...\n" ] } ], "source": [ "print(df.head())\n", "print('-----------------------------------')\n", "print(df_test.head())" ] }, { "cell_type": "code", "execution_count": 9, "id": "6a418b8f", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
essay_idfull_textscore
58795859154Dear Senator,\\n\\nWhat do you think about desca...2
11105a3ad983The \"Evening Star\" or otherwise known as Venus...2
12432b6f9938The coming of the future is upon us, and as th...4
350333e61e9Let me tell you about my life i am a young kid...2
14302d2ab150If you were asked to join a promgram called Se...3
\n", "
" ], "text/plain": [ " essay_id full_text score\n", "5879 5859154 Dear Senator,\\n\\nWhat do you think about desca... 2\n", "11105 a3ad983 The \"Evening Star\" or otherwise known as Venus... 2\n", "12432 b6f9938 The coming of the future is upon us, and as th... 4\n", "3503 33e61e9 Let me tell you about my life i am a young kid... 2\n", "14302 d2ab150 If you were asked to join a promgram called Se... 3" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.sample(5)" ] }, { "cell_type": "code", "execution_count": 10, "id": "0e1c7b08", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
essay_idfull_textscore
17302ffd378dthe story \" The Challenge of Exploing Venus \" ...2
17303ffddf1fTechnology has changed a lot of ways that we l...4
17304fff016dIf you don't like sitting around all day than ...2
17305fffb49bIn \"The Challenge of Exporing Venus,\" the auth...1
17306fffed3eVenus is worthy place to study but dangerous. ...2
\n", "
" ], "text/plain": [ " essay_id full_text score\n", "17302 ffd378d the story \" The Challenge of Exploing Venus \" ... 2\n", "17303 ffddf1f Technology has changed a lot of ways that we l... 4\n", "17304 fff016d If you don't like sitting around all day than ... 2\n", "17305 fffb49b In \"The Challenge of Exporing Venus,\" the auth... 1\n", "17306 fffed3e Venus is worthy place to study but dangerous. ... 2" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.tail()" ] }, { "cell_type": "code", "execution_count": 11, "id": "435d4831", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(17307, 3)\n", "-----------------------------------\n", "(3, 2)\n" ] } ], "source": [ "print(df.shape)\n", "print('-----------------------------------')\n", "print(df_test.shape)" ] }, { "cell_type": "code", "execution_count": 12, "id": "d364189c", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 17307 entries, 0 to 17306\n", "Data columns (total 3 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 essay_id 17307 non-null object\n", " 1 full_text 17307 non-null object\n", " 2 score 17307 non-null int64 \n", "dtypes: int64(1), object(2)\n", "memory usage: 405.8+ KB\n", "None\n", "-----------------------------------\n", "\n", "RangeIndex: 3 entries, 0 to 2\n", "Data columns (total 2 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 essay_id 3 non-null object\n", " 1 full_text 3 non-null object\n", "dtypes: object(2)\n", "memory usage: 180.0+ bytes\n", "None\n" ] } ], "source": [ "print(df.info())\n", "print('-----------------------------------')\n", "print(df_test.info())" ] }, { "cell_type": "code", "execution_count": 13, "id": "04e3a3a3", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "essay_id 0\n", "full_text 0\n", "score 0\n", "dtype: int64\n", "-----------------------------------\n", "essay_id 0\n", "full_text 0\n", "dtype: int64\n" ] } ], "source": [ "print(df.isnull().sum().sort_values(ascending=False))\n", "print('-----------------------------------')\n", "print(df_test.isnull().sum().sort_values(ascending=False))" ] }, { "cell_type": "raw", "id": "e48bb25b", "metadata": {}, "source": [] }, { "cell_type": "markdown", "id": "31396181", "metadata": {}, "source": [ "## Gereksiz Verileri Silme İşlemi Yapıyoruz - We Delete Unnecessary Data" ] }, { "cell_type": "code", "execution_count": 14, "id": "d2c6159e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " full_text score\n", "0 Many people have car where they live. The thin... 3\n", "-----------------------------------\n", " full_text\n", "0 Many people have car where they live. The thin...\n" ] } ], "source": [ "df=df.drop('essay_id',axis=1)\n", "df_test=df_test.drop('essay_id',axis=1)\n", "print(df.head(1))\n", "print('-----------------------------------')\n", "print(df_test.head(1))" ] }, { "cell_type": "raw", "id": "43638708", "metadata": {}, "source": [] }, { "cell_type": "markdown", "id": "d95258c3", "metadata": {}, "source": [ "## Boşluk Varsa Doldurmaya, Düzeltilecek Kısım Varsa Düzeltmeye Başladık - If there is a gap, we started to fill it and if there is a part to be corrected, we started to correct it." ] }, { "cell_type": "code", "execution_count": 15, "id": "eaf1b8a6", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Many people have car where they live. The thing they don\\'t know is that when you use a car alot of thing can happen\\xa0like you can get in accidet or\\xa0the smoke that the car has is bad to breath\\xa0on if someone is walk but in VAUBAN,Germany they dont have that proble because 70 percent of vauban\\'s families do not own cars,and 57 percent sold a car to move there. Street parkig ,driveways and home garages are forbidden\\xa0on the outskirts of freiburd that near the French and Swiss borders. You probaly won\\'t see a car in Vauban\\'s streets because they are completely \"car free\" but\\xa0If some that lives in VAUBAN that owns a car ownership is allowed,but there are only two places that you can park a large garages at the edge of the development,where a car owner buys a space but it not cheap to buy one they sell the space for you car for $40,000 along with a home. The vauban people completed this in 2006 ,they said that this an example of a growing trend in Europe,The untile states and some where else are suburban life from auto use this is called \"smart planning\". The current efforts to drastically reduce greenhouse gas emissions from tailes the passengee cars are responsible for 12 percent of greenhouse gas emissions in Europe and up to 50 percent in some car intensive in the United States. I honeslty think that good idea that they did that is Vaudan because that makes cities denser and better for walking and in VAUBAN there are 5,500 residents within a rectangular square mile. In the artical David Gold berg said that \"All of our development since World war 2 has been centered on the cars,and that will have to change\" and i think that was very true what David Gold said because alot thing we need cars to do we can go anyway were with out cars beacuse some people are a very lazy to walk to place thats why they alot of people use car and i think that it was a good idea that that they did that in VAUBAN so people can see how we really don\\'t need car to go to place from place because we can walk from were we need to go or we can ride bycles with out the use of a car. It good that they are doing that if you thik about your help the earth in way and thats a very good thing to. In the United states ,the Environmental protection Agency is promoting what is called \"car reduced\"communtunties,and the legislators are starting to act,if cautiously. Maany experts expect pubic transport serving suburbs to play a much larger role in a new six years federal transportation bill to approved this year. In previous bill,80 percent of appropriations have by law gone to highways and only 20 percent to other transports. There many good reason why they should do this. '" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['full_text'][0]" ] }, { "cell_type": "code", "execution_count": 16, "id": "98f192d6", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Many people have car where they live. The thing they don\\'t know is that when you use a car alot of thing can happen\\xa0like you can get in accidet or\\xa0the smoke that the car has is bad to breath\\xa0on if someone is walk but in VAUBAN,Germany they dont have that proble because 70 percent of vauban\\'s families do not own cars,and 57 percent sold a car to move there. Street parkig ,driveways and home garages are forbidden\\xa0on the outskirts of freiburd that near the French and Swiss borders. You probaly won\\'t see a car in Vauban\\'s streets because they are completely \"car free\" but\\xa0If some that lives in VAUBAN that owns a car ownership is allowed,but there are only two places that you can park a large garages at the edge of the development,where a car owner buys a space but it not cheap to buy one they sell the space for you car for $40,000 along with a home. The vauban people completed this in 2006 ,they said that this an example of a growing trend in Europe,The untile states and some where else are suburban life from auto use this is called \"smart planning\". The current efforts to drastically reduce greenhouse gas emissions from tailes the passengee cars are responsible for 12 percent of greenhouse gas emissions in Europe and up to 50 percent in some car intensive in the United States. I honeslty think that good idea that they did that is Vaudan because that makes cities denser and better for walking and in VAUBAN there are 5,500 residents within a rectangular square mile. In the artical David Gold berg said that \"All of our development since World war 2 has been centered on the cars,and that will have to change\" and i think that was very true what David Gold said because alot thing we need cars to do we can go anyway were with out cars beacuse some people are a very lazy to walk to place thats why they alot of people use car and i think that it was a good idea that that they did that in VAUBAN so people can see how we really don\\'t need car to go to place from place because we can walk from were we need to go or we can ride bycles with out the use of a car. It good that they are doing that if you thik about your help the earth in way and thats a very good thing to. In the United states ,the Environmental protection Agency is promoting what is called \"car reduced\"communtunties,and the legislators are starting to act,if cautiously. Maany experts expect pubic transport serving suburbs to play a much larger role in a new six years federal transportation bill to approved this year. In previous bill,80 percent of appropriations have by law gone to highways and only 20 percent to other transports. There many good reason why they should do this. '" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_test['full_text'][0]" ] }, { "cell_type": "code", "execution_count": 17, "id": "0866d8b9", "metadata": {}, "outputs": [], "source": [ "def algo_text(df):\n", "\n", " for col in df.columns:\n", " if df[col].dtype=='object':\n", " df[col] = df[col].str.lower()\n", " df[col] = df[col].str.replace(r'[^\\w\\s]', '', regex=True)\n", " df[col] = df[col].str.replace(r'\\n', '', regex=True)\n", " df[col] = df[col].str.replace(r'\\d+', '', regex=True)\n", " df[col] = df[col].str.replace(r'\\r', '', regex=True)\n", " df[col] = df[col].str.replace(r'\\\\', '')\n", " df[col] = df[col].str.replace(r'.', '')\n", " df[col] = df[col].str.replace(r',', '')\n", " return df\n", " # TR = Bu kod data type object olan verilerin buluyor ve onlarda istenmeyen işartetleri kaldırıyor.\n", " # EN = This code finds the data with data type object and removes the unwanted marks from them.\n", "\n", "df=algo_text(df)" ] }, { "cell_type": "code", "execution_count": 18, "id": "67cc79ae", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'many people have car where they live the thing they dont know is that when you use a car alot of thing can happen\\xa0like you can get in accidet or\\xa0the smoke that the car has is bad to breath\\xa0on if someone is walk but in vaubangermany they dont have that proble because percent of vaubans families do not own carsand percent sold a car to move there street parkig driveways and home garages are forbidden\\xa0on the outskirts of freiburd that near the french and swiss borders you probaly wont see a car in vaubans streets because they are completely car free but\\xa0if some that lives in vauban that owns a car ownership is allowedbut there are only two places that you can park a large garages at the edge of the developmentwhere a car owner buys a space but it not cheap to buy one they sell the space for you car for along with a home the vauban people completed this in they said that this an example of a growing trend in europethe untile states and some where else are suburban life from auto use this is called smart planning the current efforts to drastically reduce greenhouse gas emissions from tailes the passengee cars are responsible for percent of greenhouse gas emissions in europe and up to percent in some car intensive in the united states i honeslty think that good idea that they did that is vaudan because that makes cities denser and better for walking and in vauban there are residents within a rectangular square mile in the artical david gold berg said that all of our development since world war has been centered on the carsand that will have to change and i think that was very true what david gold said because alot thing we need cars to do we can go anyway were with out cars beacuse some people are a very lazy to walk to place thats why they alot of people use car and i think that it was a good idea that that they did that in vauban so people can see how we really dont need car to go to place from place because we can walk from were we need to go or we can ride bycles with out the use of a car it good that they are doing that if you thik about your help the earth in way and thats a very good thing to in the united states the environmental protection agency is promoting what is called car reducedcommuntuntiesand the legislators are starting to actif cautiously maany experts expect pubic transport serving suburbs to play a much larger role in a new six years federal transportation bill to approved this year in previous bill percent of appropriations have by law gone to highways and only percent to other transports there many good reason why they should do this '" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['full_text'][0]" ] }, { "cell_type": "code", "execution_count": 19, "id": "1dcb914a", "metadata": {}, "outputs": [], "source": [ "def algo_text(df_test):\n", "\n", " for col in df.columns:\n", " if df[col].dtype=='object':\n", " df[col] = df[col].str.lower()\n", " df[col] = df[col].str.replace(r'[^\\w\\s]', '', regex=True)\n", " df[col] = df[col].str.replace(r'\\n', '', regex=True)\n", " df[col] = df[col].str.replace(r'\\d+', '', regex=True)\n", " df[col] = df[col].str.replace(r'\\r', '', regex=True)\n", " df[col] = df[col].str.replace(r'\\\\', '')\n", " df[col] = df[col].str.replace(r'.', '')\n", " df[col] = df[col].str.replace(r',', '')\n", " return df\n", " # TR = Bu kod data type object olan verilerin buluyor ve onlarda istenmeyen işartetleri kaldırıyor.\n", " # EN = This code finds the data with data type object and removes the unwanted marks from them.\n", "\n", "df_test=algo_text(df_test)" ] }, { "cell_type": "raw", "id": "9e230725", "metadata": {}, "source": [] }, { "cell_type": "markdown", "id": "1dc8a50d", "metadata": {}, "source": [ "## Duygu Analizi - Sentiment Analysis" ] }, { "cell_type": "markdown", "id": "09780faf", "metadata": {}, "source": [ "### Yorumların Olumlumu ya da Olumsuzmu Olduğunu Tespit Etme - Determining Whether Comments Have Death or Immortality" ] }, { "cell_type": "code", "execution_count": 20, "id": "39a27dea", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([3, 4, 2, 1, 5, 6], dtype=int64)" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['score'].unique()" ] }, { "cell_type": "code", "execution_count": 21, "id": "1b46f633", "metadata": {}, "outputs": [], "source": [ "df['sentiment']=df['score']\n", "df['sentiment']=df['sentiment'].replace([5,6],'olumlu')\n", "df['sentiment']=df['sentiment'].replace([1,2],'olumsuz')\n", "df['sentiment']=df['sentiment'].replace([3,4],'notr')\n", "# TR = sentiment diye yeni bir sütun oluşturup () sütünundaki verilere eşitledik. [5,4],'olumlu', [1,2],'olumsuz', [3],'notr'\n", "# EN = We created a new column called sentiment and set it equal to the data in the () column. [5,4],'positive', [1,2],'negative', [3],'neutral'" ] }, { "cell_type": "code", "execution_count": 22, "id": "792b59e0", "metadata": {}, "outputs": [], "source": [ "df=df[['score','full_text','sentiment']]" ] }, { "cell_type": "code", "execution_count": 23, "id": "f728c724", "metadata": {}, "outputs": [], "source": [ "df=df[(df['sentiment']=='olumlu')|(df['sentiment']=='notr')|(df['sentiment']=='olumsuz')]\n", "# TR = sentimentimizi olumlu ya da olumsuz ya da notr olacak şekilde tanımladık.\n", "# EN = We defined our sentiment as positive, negative or neutral." ] }, { "cell_type": "code", "execution_count": 24, "id": "ded4992a", "metadata": {}, "outputs": [], "source": [ "df.reset_index(drop=True,inplace=True)\n", "# TR = Yukarıda yaptığımız işlem neticesinde olumlu,notr,olumsuz kelimeler kendi içlerinde üst üste oldular. Bu yüzden indexlerini sıfırlayıp tekrar verdik.\n", "# EN = As a result of the process we did above, positive, neutral and negative words were placed on top of each other. That's why we reset their indexes and gave them again." ] }, { "cell_type": "code", "execution_count": 25, "id": "7720767e", "metadata": {}, "outputs": [], "source": [ "x=df['full_text']\n", "y=df['sentiment']" ] }, { "cell_type": "code", "execution_count": 26, "id": "eb3fe280", "metadata": {}, "outputs": [], "source": [ "yelpbw = df[(df.score == 1) | (df.score == 2) | (df.score == 3) | (df.score == 4) | (df.score == 5) | (df.score == 6)]" ] }, { "cell_type": "code", "execution_count": 27, "id": "aed587a2", "metadata": {}, "outputs": [], "source": [ "yelpbw.reset_index(drop=True,inplace=True)" ] }, { "cell_type": "code", "execution_count": 28, "id": "3ed2fe88", "metadata": {}, "outputs": [], "source": [ "vect=CountVectorizer(stop_words='english',ngram_range=(1,2))" ] }, { "cell_type": "code", "execution_count": 29, "id": "c2318c0d", "metadata": {}, "outputs": [], "source": [ "x=yelpbw[\"full_text\"]\n", "y=yelpbw[\"score\"]" ] }, { "cell_type": "code", "execution_count": 30, "id": "02adcc31", "metadata": {}, "outputs": [], "source": [ "vect=CountVectorizer()\n", "x=vect.fit_transform(x)" ] }, { "cell_type": "raw", "id": "58e06619", "metadata": {}, "source": [] }, { "cell_type": "markdown", "id": "c5110c7a", "metadata": {}, "source": [ "## Verileri Görşelleştirme - Visualizing Data me" ] }, { "cell_type": "code", "execution_count": 31, "id": "9ad9a32c", "metadata": {}, "outputs": [ { "data": { "image/png": "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hYeHy+VyacKECcrJyVHnzp3ldDo1depUud1uDR06VJI0atQoJScn6/7779fcuXPl8Xj0xBNPKDs727rKM2nSJL3wwguaMWOGxo8fr/Xr12vFihUqLCy07dwBAEDbYesVoiVLlqiurk433nij4uLirNubb75prZk/f75uvfVWjR49WsOHD1dsbKz++te/WvtDQkK0atUqhYSEyO1267777tMDDzyg2bNnW2uSkpJUWFiooqIi9e3bV/PmzdPLL7+stDS+kgwAAGy+QnQuP4HUvn17LV68WIsXL/6XaxITE/W3v/3tR49z44036tNPPz3vGQEAwOWvzXzLDAAAwC4EEQAAMB5BBAAAjEcQAQAA4xFEAADAeAQRAAAwHkEEAACMRxABAADjEUQAAMB4BBEAADAeQQQAAIxHEAEAAOMRRAAAwHgEEQAAMB5BBAAAjEcQAQAA4xFEAADAeAQRAAAwHkEEAACMRxABAADjEUQAAMB4BBEAADAeQQQAAIxHEAEAAOMRRAAAwHgEEQAAMB5BBAAAjEcQAQAA4xFEAADAeAQRAAAwHkEEAACMRxABAADjEUQAAMB4BBEAADAeQQQAAIwXavcAl5Of3fGt3SO0CV+/083uEQAAOC9cIQIAAMYjiAAAgPEIIgAAYDyCCAAAGI8gAgAAxiOIAACA8QgiAABgPIIIAAAYjyACAADGszWINm7cqNtuu03x8fEKCgrSO++847ff5/MpLy9PcXFxCg8PV2pqqvbs2eO35tChQ8rMzJTT6VRERIQmTJigo0eP+q35/PPPdcMNN6h9+/ZKSEjQ3LlzL/apAQCAAGJrENXX16tv375avHjxWffPnTtXixYt0tKlS7V161Z16NBBaWlpOn78uLUmMzNTO3fuVFFRkVatWqWNGzdq4sSJ1n6v16tRo0YpMTFRZWVlevbZZzVr1iwtW7bsop8fAAAIDLb+XWbp6elKT08/6z6fz6cFCxboiSee0O233y5J+u///m/FxMTonXfe0dixY/XFF19ozZo12r59uwYNGiRJev7553XLLbfoj3/8o+Lj4/X666+rsbFRr7zyisLCwtS7d2+Vl5frueee8wsnAABgrjb7GaLKykp5PB6lpqZa21wul4YMGaLS0lJJUmlpqSIiIqwYkqTU1FQFBwdr69at1prhw4crLCzMWpOWlqbdu3fr8OHDZ33u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niSwnTx5Um+88Ybq6+v5q3JaKDs7WxkZGUpNTbV7lIC2Z88excfH65prrlFmZqaqqqrsHikgvffeexo0aJDuuusuRUdHq3///nrppZfsHuuCcYUIOIvm5mZNmzZNw4YN03XXXWf3OAGpoqJCbrdbx48fV8eOHbVy5UolJyfbPVbAeeONN/TJJ59o+/btdo8S0IYMGaKCggL16NFDBw4c0FNPPaUbbrhBO3bsUKdOneweL6B88803WrJkiXJycvSf//mf2r59ux5++GGFhYUpKyvL7vFajCACziI7O1s7duzgMwYXoEePHiovL1ddXZ3efvttZWVlqaSkhCg6D/v27dMjjzyioqIitW/f3u5xAtrpHyvo06ePhgwZosTERK1YsUITJkywcbLA09zcrEGDBmnOnDmSpP79+2vHjh1aunRpQAcRb5kBPzBlyhStWrVKH3zwgbp06WL3OAErLCxM3bt318CBA5Wfn6++fftq4cKFdo8VUMrKylRTU6MBAwYoNDRUoaGhKikp0aJFixQaGqqTJ0/aPWLAioiI0LXXXqu9e/faPUrAiYuLO+M/bHr16hXwb0FyhQj4/3w+n6ZOnaqVK1dqw4YNl8WHBNuS5uZmNTQ02D1GQBk5cqQqKir8to0bN049e/bUzJkzFRISYtNkge/o0aP6+uuvdf/999s9SsAZNmzYGT9J8tVXXykxMdGmiVoHQXQZOHr0qN9/5VRWVqq8vFydO3dW165dbZwssGRnZ2v58uV699131alTJ3k8HkmSy+VSeHi4zdMFltzcXKWnp6tr1646cuSIli9frg0bNmjt2rV2jxZQOnXqdMZn2Dp06KDIyEg+23aeHn30Ud12221KTEzU/v379eSTTyokJET33nuv3aMFnOnTp+sXv/iF5syZo7vvvlvbtm3TsmXLtGzZMrtHuzA+BLwPPvjAJ+mMW1ZWlt2jBZSzvYaSfK+++qrdowWc8ePH+xITE31hYWG+qKgo38iRI33r1q2ze6zLwi9/+UvfI488YvcYAeeee+7xxcXF+cLCwnxXX32175577vHt3bvX7rEC1vvvv++77rrrfA6Hw9ezZ0/fsmXL7B7pggX5fD6fTS0GAADQJvChagAAYDyCCAAAGI8gAgAAxiOIAACA8QgiAABgPIIIAAAYjyACAADGI4gAAIDxCCIAAGA8gggAABiPIAKAc9DY2Gj3CAAuIoIIQEB7++23lZKSovDwcEVGRio1NVX19fWSpFdeeUW9e/eWw+FQXFycpkyZYj2uqqpKt99+uzp27Cin06m7775b1dXV1v5Zs2apX79+evnll5WUlKT27dtLkmpra/Xggw8qKipKTqdTI0aM0GeffXZpTxpAqyOIAASsAwcO6N5779X48eP1xRdfaMOGDbrzzjvl8/m0ZMkSZWdna+LEiaqoqNB7772n7t27S5Kam5t1++2369ChQyopKVFRUZG++eYb3XPPPX7H37t3r/7yl7/or3/9q8rLyyVJd911l2pqarR69WqVlZVpwIABGjlypA4dOnSpTx9AK+JvuwcQsD755BMNHDhQ3377rRITE/32XX311Ro3bpyefvrpMx5XVFSk9PR0VVZWKiEhQZK0a9cu9e7dW9u2bdPgwYM1a9YszZkzR999952ioqIkSR999JEyMjJUU1Mjh8NhHa979+6aMWOGJk6ceBHPFsDFFGr3AADQUn379tXIkSOVkpKitLQ0jRo1SmPGjFFTU5P279+vkSNHnvVxX3zxhRISEqwYkqTk5GRFREToiy++0ODBgyVJiYmJVgxJ0meffaajR48qMjLS73jHjh3T119/fRHOEMClQhABCFghISEqKirS5s2btW7dOj3//PN6/PHHVVxc3CrH79Chg9/9o0ePKi4uThs2bDhjbURERKs8JwB7EEQAAlpQUJCGDRumYcOGKS8vT4mJiSoqKlK3bt1UXFysm2666YzH9OrVS/v27dO+ffv83jKrra1VcnLyv3yuAQMGyOPxKDQ0VN26dbtYpwTABgQRgIC1detWFRcXa9SoUYqOjtbWrVt18OBB9erVS7NmzdKkSZMUHR2t9PR0HTlyRJs2bdLUqVOVmpqqlJQUZWZmasGCBTpx4oR+85vf6Je//KUGDRr0L58vNTVVbrdbd9xxh+bOnatrr71W+/fvV2FhoX71q1/96GMBtG0EEYCA5XQ6tXHjRi1YsEBer1eJiYmaN2+e0tPTJUnHjx/X/Pnz9eijj+qqq67SmDFjJH1/Vendd9/V1KlTNXz4cAUHB+vmm2/W888//6PPFxQUpL/97W96/PHHNW7cOB08eFCxsbEaPny4YmJiLvr5Arh4+JYZAAAwHr9DBAAAjEcQAQAA4xFEAADAeAQRAAAwHkEEAACMRxABAADjEUQAAMB4BBEAADAeQQQAAIxHEAEAAOMRRAAAwHj/Dy5UqAxnIpKyAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sns.countplot(data=df, x='score',palette='bright');\n", "# TR = Kategorik verilerin her bir sınıfındaki gözlem sayısını görselleştirmek için kullanılır ve her kategorinin frekansını çubuklarla gösterir.\n", "# EN = It is used to visualize the number of observations in each class of categorical data and shows the frequency of each category with bars.\n", "\n", "# TR = (data=df) Veriyi df adlı DataFrame alacak.\n", "# TR = (x='score') column değişkenindeki sütunları alıp yatay eksenine eşitleyecek\n", "\n", "# EN = (data=df) Will take the data from the DataFrame named df.\n", "# EN = (x='score') Will take the columns in the column variable and assign them to the x-axi" ] }, { "cell_type": "code", "execution_count": null, "id": "bf27b1c6", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "e81a35ab", "metadata": {}, "source": [ "## En çok Sayıdaki Kelimeleri Kap İçine Alma - Containing the Most Numbered Words " ] }, { "cell_type": "code", "execution_count": 32, "id": "8dc1ec87", "metadata": {}, "outputs": [], "source": [ "#wc=wordcloud\n", "def wc(data,bgcolor):\n", " plt.figure(figsize=(10,10))\n", " # TR = Kabımızın boyutunu belirttik.\n", " # EN = We specified the size of our container.\n", " \n", " mask=np.array(Image.open('cloud.png'))\n", " # TR = Image.open ile resmimizi açtık. np.array resmi diziye çevirdik ve mask değişkenine atadık.\n", " # EN = We opened our image with Image.open. We converted the np.array image to an array and assigned it to the mask variable.\n", " \n", " wc=WordCloud(background_color=bgcolor,stopwords=STOPWORDS,mask=mask)\n", " # TR = Bir WordCloud tanımladık. Arka plan rengini bgcolor eşitledik. stopwords=STOPWORDS ile gereksiz kelimeleri atıp anahtar kelimeleri sakladık.\n", " # EN = We defined a WordCloud. We set the background color equal to bgcolor. We removed unnecessary words and kept keywords with stopwords=STOPWORDS\n", "\n", " # TR = mask=mask yukarıda tanımladığımız mask değişkenini kullan.\n", " # EN = mask=mask use the mask variable we defined above.\n", " \n", " wc.generate(''.join(data))\n", " # TR = .join(data) ile bütün sütündaki text alıp birleştirecek. \n", " # EN = With .join(data) it will take the text in all columns and combine them.\n", "\n", " # TR = İçinde geçen tüm kelimeleri sayacak ve hafızada tutup generate ile tanımladığımız WordCloud oluşturduk ona eşitleyecek. \n", " # EN = It will count all the words in it, keep it in memory and synchronize it with the WordCloud we created with generate.\n", " \n", " plt.imshow(wc)\n", " plt.axis('off')\n", " # TR = Bunla kod ile x ve y gözükmüyor.\n", " # EN = With this code, x and y do not appear." ] }, { "cell_type": "code", "execution_count": 33, "id": "8e9edd42", "metadata": {}, "outputs": [], "source": [ "olumlu = df[df['score'].isin([5, 6])]['full_text']\n", "nötr = df[df['score'].isin([3, 4])]['full_text']\n", "olumsuz = df[df['score'].isin([1, 2])]['full_text']\n", "# TR = 5 ya da 6 score olanları olumlu, 3 ya da 4 score olan nötr ve 1 ya da 2 score olanları olumsuz değişkenine eşitledik.\n", "# EN = We equated those with 5 or 6 score to positive, those with 3 or 4 score to neutral, and those with 1 or 2 score to negative." ] }, { "cell_type": "code", "execution_count": 34, "id": "59deb041", "metadata": {}, "outputs": [ { "ename": "FileNotFoundError", "evalue": "[Errno 2] No such file or directory: 'C:\\\\Users\\\\ErenK\\\\OneDrive\\\\Belgeler\\\\Yapay Zeka\\\\Proje\\\\Natural Language Processing (NLP) 1\\\\laboratuvar\\\\cloud.png'", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", "Cell \u001b[1;32mIn[34], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m wc(olumlu,\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mwhite\u001b[39m\u001b[38;5;124m'\u001b[39m)\n", "Cell \u001b[1;32mIn[32], line 7\u001b[0m, in \u001b[0;36mwc\u001b[1;34m(data, bgcolor)\u001b[0m\n\u001b[0;32m 3\u001b[0m plt\u001b[38;5;241m.\u001b[39mfigure(figsize\u001b[38;5;241m=\u001b[39m(\u001b[38;5;241m10\u001b[39m,\u001b[38;5;241m10\u001b[39m))\n\u001b[0;32m 4\u001b[0m \u001b[38;5;66;03m# TR = Kabımızın boyutunu belirttik.\u001b[39;00m\n\u001b[0;32m 5\u001b[0m \u001b[38;5;66;03m# EN = We specified the size of our container.\u001b[39;00m\n\u001b[1;32m----> 7\u001b[0m mask\u001b[38;5;241m=\u001b[39mnp\u001b[38;5;241m.\u001b[39marray(Image\u001b[38;5;241m.\u001b[39mopen(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcloud.png\u001b[39m\u001b[38;5;124m'\u001b[39m))\n\u001b[0;32m 8\u001b[0m \u001b[38;5;66;03m# TR = Image.open ile resmimizi açtık. np.array resmi diziye çevirdik ve mask değişkenine atadık.\u001b[39;00m\n\u001b[0;32m 9\u001b[0m \u001b[38;5;66;03m# EN = We opened our image with Image.open. We converted the np.array image to an array and assigned it to the mask variable.\u001b[39;00m\n\u001b[0;32m 11\u001b[0m wc\u001b[38;5;241m=\u001b[39mWordCloud(background_color\u001b[38;5;241m=\u001b[39mbgcolor,stopwords\u001b[38;5;241m=\u001b[39mSTOPWORDS,mask\u001b[38;5;241m=\u001b[39mmask)\n", "File \u001b[1;32m~\\anaconda3\\Lib\\site-packages\\PIL\\Image.py:3277\u001b[0m, in \u001b[0;36mopen\u001b[1;34m(fp, mode, formats)\u001b[0m\n\u001b[0;32m 3274\u001b[0m filename \u001b[38;5;241m=\u001b[39m os\u001b[38;5;241m.\u001b[39mpath\u001b[38;5;241m.\u001b[39mrealpath(os\u001b[38;5;241m.\u001b[39mfspath(fp))\n\u001b[0;32m 3276\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m filename:\n\u001b[1;32m-> 3277\u001b[0m fp \u001b[38;5;241m=\u001b[39m builtins\u001b[38;5;241m.\u001b[39mopen(filename, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mrb\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 3278\u001b[0m exclusive_fp \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m\n\u001b[0;32m 3280\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n", "\u001b[1;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: 'C:\\\\Users\\\\ErenK\\\\OneDrive\\\\Belgeler\\\\Yapay Zeka\\\\Proje\\\\Natural Language Processing (NLP) 1\\\\laboratuvar\\\\cloud.png'" ] }, { "data": { "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "wc(olumlu,'white')" ] }, { "cell_type": "code", "execution_count": null, "id": "0083f2f8", "metadata": {}, "outputs": [], "source": [ "wc(nötr,'white')" ] }, { "cell_type": "code", "execution_count": null, "id": "2782ea94", "metadata": {}, "outputs": [], "source": [ "wc(olumsuz,'white')" ] }, { "cell_type": "code", "execution_count": null, "id": "0219a1f1", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "3510eadb", "metadata": {}, "source": [ "## Öznitelik Mühendisliği - Feature Engineering" ] }, { "cell_type": "markdown", "id": "f3bfe2a0", "metadata": {}, "source": [ "### Model - Modelling" ] }, { "cell_type": "code", "execution_count": 40, "id": "c1956cce", "metadata": {}, "outputs": [], "source": [ "x = df['full_text']\n", "y = df['score'].values" ] }, { "cell_type": "code", "execution_count": 41, "id": "28aa7c6e", "metadata": {}, "outputs": [], "source": [ "vectorizer = TfidfVectorizer(max_features=1000)\n", "vectorizer.fit(x)\n", "x = vectorizer.transform(x)\n", "x_test = vectorizer.transform(df_test['full_text'])" ] }, { "cell_type": "code", "execution_count": 42, "id": "ffed7293", "metadata": {}, "outputs": [], "source": [ "x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=.20,random_state=42)\n", "# TR = modelimizi eğittik. \n", "# EN = We trained our model." ] }, { "cell_type": "code", "execution_count": 44, "id": "92336248", "metadata": {}, "outputs": [], "source": [ "x = x.toarray() # Convert sparse matrix to dense\n", "x_test = x_test.toarray()" ] }, { "cell_type": "code", "execution_count": 39, "id": "9ca2d123-2dbc-44ba-b234-1106b4ab65f9", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[0. , 0.0229158 , 0.03214887, ..., 0. , 0. ,\n", " 0. ],\n", " [0. , 0. , 0.02156446, ..., 0.02787769, 0. ,\n", " 0. ],\n", " [0. , 0. , 0. , ..., 0. , 0. ,\n", " 0. ],\n", " ...,\n", " [0. , 0. , 0.02142796, ..., 0.02770123, 0. ,\n", " 0. ],\n", " [0. , 0. , 0. , ..., 0. , 0. ,\n", " 0. ],\n", " [0. , 0.18880245, 0.04414556, ..., 0. , 0.10770003,\n", " 0. ]])" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x_test" ] }, { "cell_type": "code", "execution_count": 45, "id": "ab4dc089", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/100\n", "\u001b[1m433/433\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 6ms/step - loss: 7.2721 - mae: 2.2782 - val_loss: 0.9428 - val_mae: 0.7806\n", "Epoch 2/100\n", "\u001b[1m433/433\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 7ms/step - loss: 1.4098 - mae: 0.9450 - val_loss: 0.6211 - val_mae: 0.6367\n", "Epoch 3/100\n", "\u001b[1m433/433\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 5ms/step - loss: 1.0417 - mae: 0.8096 - val_loss: 0.5800 - val_mae: 0.6160\n", "Epoch 4/100\n", "\u001b[1m433/433\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 5ms/step - loss: 0.8533 - mae: 0.7347 - val_loss: 0.5536 - val_mae: 0.5986\n", "Epoch 5/100\n", "\u001b[1m433/433\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 4ms/step - loss: 0.7583 - mae: 0.6895 - val_loss: 0.5348 - val_mae: 0.5896\n", "Epoch 6/100\n", "\u001b[1m433/433\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 4ms/step - loss: 0.6790 - mae: 0.6529 - val_loss: 0.5181 - val_mae: 0.5802\n", "Epoch 7/100\n", "\u001b[1m433/433\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 5ms/step - loss: 0.6534 - mae: 0.6433 - val_loss: 0.5078 - val_mae: 0.5724\n", "Epoch 8/100\n", "\u001b[1m433/433\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 6ms/step - loss: 0.6189 - mae: 0.6245 - val_loss: 0.5110 - val_mae: 0.5717\n", "Epoch 9/100\n", "\u001b[1m433/433\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 5ms/step - loss: 0.5741 - mae: 0.6003 - val_loss: 0.4986 - val_mae: 0.5653\n", "Epoch 10/100\n", "\u001b[1m433/433\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 5ms/step - loss: 0.5656 - mae: 0.5960 - val_loss: 0.5026 - val_mae: 0.5663\n", "Epoch 11/100\n", "\u001b[1m433/433\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 6ms/step - loss: 0.5473 - mae: 0.5845 - val_loss: 0.4964 - val_mae: 0.5610\n", "Epoch 12/100\n", "\u001b[1m433/433\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 6ms/step - loss: 0.5346 - mae: 0.5784 - val_loss: 0.5081 - val_mae: 0.5695\n", "Epoch 13/100\n", "\u001b[1m433/433\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 3ms/step - loss: 0.5184 - mae: 0.5717 - val_loss: 0.5176 - val_mae: 0.5781\n", "Epoch 14/100\n", "\u001b[1m433/433\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 3ms/step - loss: 0.5036 - mae: 0.5631 - val_loss: 0.5118 - val_mae: 0.5734\n", "Epoch 15/100\n", "\u001b[1m433/433\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 4ms/step - loss: 0.4888 - mae: 0.5567 - val_loss: 0.4971 - val_mae: 0.5618\n", "Epoch 16/100\n", "\u001b[1m433/433\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 5ms/step - loss: 0.4895 - mae: 0.5557 - val_loss: 0.5141 - val_mae: 0.5711\n", "Epoch 17/100\n", "\u001b[1m433/433\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 4ms/step - loss: 0.4646 - mae: 0.5386 - val_loss: 0.5111 - val_mae: 0.5715\n", "Epoch 18/100\n", "\u001b[1m433/433\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 3ms/step - loss: 0.4443 - mae: 0.5291 - val_loss: 0.5233 - val_mae: 0.5754\n", "Epoch 19/100\n", "\u001b[1m433/433\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 6ms/step - loss: 0.4356 - mae: 0.5183 - val_loss: 0.5177 - val_mae: 0.5753\n", "Epoch 20/100\n", "\u001b[1m433/433\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m9s\u001b[0m 15ms/step - loss: 0.4206 - mae: 0.5113 - val_loss: 0.5128 - val_mae: 0.5702\n", "Epoch 21/100\n", "\u001b[1m433/433\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 5ms/step - loss: 0.3988 - mae: 0.5011 - val_loss: 0.5229 - val_mae: 0.5807\n", "Epoch 22/100\n", "\u001b[1m433/433\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 4ms/step - loss: 0.3920 - mae: 0.4946 - val_loss: 0.5093 - val_mae: 0.5683\n", "Epoch 23/100\n", "\u001b[1m433/433\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 5ms/step - loss: 0.3941 - mae: 0.4915 - val_loss: 0.5084 - val_mae: 0.5691\n", "Epoch 24/100\n", "\u001b[1m433/433\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m10s\u001b[0m 21ms/step - loss: 0.3832 - mae: 0.4887 - val_loss: 0.5160 - val_mae: 0.5727\n", "Epoch 25/100\n", "\u001b[1m433/433\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 13ms/step - loss: 0.3688 - mae: 0.4800 - val_loss: 0.5474 - val_mae: 0.5928\n", "Epoch 26/100\n", "\u001b[1m433/433\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 11ms/step - loss: 0.3582 - mae: 0.4729 - val_loss: 0.5224 - val_mae: 0.5793\n" ] } ], "source": [ "model=Sequential()\n", "model.add(Dense(128,activation='relu',input_dim=x_train.shape[1]))\n", "# TR = Bu katman, tüm giriş nöronlarına bağlantı kurar ve her nöronun ağırlıklarını öğrenir. 256 nöron var.\n", "# Aktivasyon fonksiyonunu ReLU (Rectified Linear Unit) olarak ayarlar. ReLU fonksiyonu, negatif değerleri sıfıra dönüştürür ve pozitif değerleri olduğu gibi bırakır.\n", "# EN = This layer connects all input neurons and learns the weights of each neuron. There are 256 neurons.\n", "# Sets the activation function to ReLU (Rectified Linear Unit). The ReLU function converts negative values ​​to zero and leaves positive values ​​as is.\n", "\n", "model.add(BatchNormalization())\n", "# TR = Bu katman, modelin eğitim sürecini daha stabil hale getirmek için kullanılır.\n", "# EN = This layer is used to make the training process of the model more stable.\n", "\n", "model.add(Dropout(0.5))\n", "# TR = Derin öğrenme modelinde aşırı uyumu (overfitting) azaltmak için kullanılır. Genelde 0.2 ile 0.5 arasında olur.\n", "# EN = It is used to reduce overfitting in the deep learning model. It is generally between 0.2 and 0.5.\n", "\n", "model.add(Dense(64,activation='relu'))\n", "model.add(BatchNormalization())\n", "model.add(Dropout(0.2))\n", "model.add(Dense(32,activation='relu'))\n", "model.add(BatchNormalization())\n", "model.add(Dropout(0.2))\n", "\n", "model.add(Dense(1, activation='linear'))\n", "# TR = Regresyon görevleri için lineer aktivasyon kullanıyoruz.\n", "# EN = We use linear activation for regression tasks. \n", "\n", "model.compile(loss='mse', optimizer='adam', metrics=['mae']) \n", "# TR = Modelin kayıp fonksiyonu olarak 'mse' (ortalama kare hatası), optimizer olarak 'adam' ve performans metriği olarak 'mae' (ortalama mutlak hata) kullanılarak derlenmesini sağlar \n", "# EN = Compiles the model using 'mse' (mean squared error) as the loss function, 'adam' as the optimizer, and 'mae' (mean absolute error) as the performance metric\n", "\n", "early_stopping = EarlyStopping(monitor='val_loss', patience=15, restore_best_weights=True)\n", "# TR = EarlyStopping ekleyin: Eğitim sırasında model performansı iyileşmediğinde erken durması için kullanıyoruz.\n", "# EN = Add EarlyStopping: We use it to stop early when model performance does not improve during training.\n", "\n", "# TR = val_loss 10 epoch boyunca iyileşmezse eğitimi durduruyor ve en iyi ağırlıkları geri yüklüyor.\n", "# EN = If val_loss does not improve for 10 epochs, it stops training and restores the best weights.\n", "\n", "history=model.fit(x_train, y_train, validation_data=(x_test, y_test), batch_size=32, epochs=100, callbacks=[early_stopping])\n", "# TR = Modeli 100 epoch boyunca eğitiyoruz, fakat EarlyStopping ile durdurulabilir. Batch boyutu 32 olarak belirlenmiş.\n", "# EN = We train the model for 100 epochs, but it can be stopped with EarlyStopping. Batch size is set to 32." ] }, { "cell_type": "code", "execution_count": 46, "id": "2698a26b", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Model: \"sequential\"\n",
       "
\n" ], "text/plain": [ "\u001b[1mModel: \"sequential\"\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓\n",
       "┃ Layer (type)                          Output Shape                         Param # ┃\n",
       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩\n",
       "│ dense (Dense)                        │ (None, 128)                 │         128,128 │\n",
       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
       "│ batch_normalization                  │ (None, 128)                 │             512 │\n",
       "│ (BatchNormalization)                 │                             │                 │\n",
       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
       "│ dropout (Dropout)                    │ (None, 128)                 │               0 │\n",
       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
       "│ dense_1 (Dense)                      │ (None, 64)                  │           8,256 │\n",
       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
       "│ batch_normalization_1                │ (None, 64)                  │             256 │\n",
       "│ (BatchNormalization)                 │                             │                 │\n",
       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
       "│ dropout_1 (Dropout)                  │ (None, 64)                  │               0 │\n",
       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
       "│ dense_2 (Dense)                      │ (None, 32)                  │           2,080 │\n",
       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
       "│ batch_normalization_2                │ (None, 32)                  │             128 │\n",
       "│ (BatchNormalization)                 │                             │                 │\n",
       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
       "│ dropout_2 (Dropout)                  │ (None, 32)                  │               0 │\n",
       "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
       "│ dense_3 (Dense)                      │ (None, 1)                   │              33 │\n",
       "└──────────────────────────────────────┴─────────────────────────────┴─────────────────┘\n",
       "
\n" ], "text/plain": [ "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓\n", "┃\u001b[1m \u001b[0m\u001b[1mLayer (type) \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m Param #\u001b[0m\u001b[1m \u001b[0m┃\n", "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩\n", "│ dense (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m128,128\u001b[0m │\n", "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", "│ batch_normalization │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m512\u001b[0m │\n", "│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │\n", "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", "│ dropout (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", "│ dense_1 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m8,256\u001b[0m │\n", "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", "│ batch_normalization_1 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m256\u001b[0m │\n", "│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │\n", "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", "│ dropout_1 (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", "│ dense_2 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m2,080\u001b[0m │\n", "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", "│ batch_normalization_2 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m128\u001b[0m │\n", "│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │\n", "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", "│ dropout_2 (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n", "│ dense_3 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1\u001b[0m) │ \u001b[38;5;34m33\u001b[0m │\n", "└──────────────────────────────────────┴─────────────────────────────┴─────────────────┘\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
 Total params: 417,285 (1.59 MB)\n",
       "
\n" ], "text/plain": [ "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m417,285\u001b[0m (1.59 MB)\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
 Trainable params: 138,945 (542.75 KB)\n",
       "
\n" ], "text/plain": [ "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m138,945\u001b[0m (542.75 KB)\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
 Non-trainable params: 448 (1.75 KB)\n",
       "
\n" ], "text/plain": [ "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m448\u001b[0m (1.75 KB)\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
 Optimizer params: 277,892 (1.06 MB)\n",
       "
\n" ], "text/plain": [ "\u001b[1m Optimizer params: \u001b[0m\u001b[38;5;34m277,892\u001b[0m (1.06 MB)\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "model.summary()" ] }, { "cell_type": "code", "execution_count": 43, "id": "89b83035", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m109/109\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 656us/step - loss: 0.5064 - mae: 0.5738\n", "Test doğruluğu: 0.5679\n" ] } ], "source": [ "test_loss, test_acc = model.evaluate(x_test, y_test)\n", "# TR = test_loss değişkeni, test verileri üzerinde hesaplanan kayıp değerini içerir. test_acc değişkeni, test verileri üzerinde hesaplanan doğruluk değerini içerir.\n", "# EN = The test_loss variable contains the loss value calculated on the test data. The test_acc variable contains the accuracy value calculated on the test data.\n", "\n", "print(f\"Test doğruluğu: {test_acc:.4f}\")" ] }, { "cell_type": "code", "execution_count": 44, "id": "ab86c012", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m109/109\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step\n" ] } ], "source": [ "pred=model.predict(x_test)\n", "# TR = modeli x_test ile predict özelliği ile tahmin ettik. predict=tahmin demek. Dahmin edip pred eşitledik. \n", "# EN = We predicted the model with x_test and the predict feature. predict=means prediction. We guessed and equalized the pred." ] }, { "cell_type": "code", "execution_count": 45, "id": "a7d76d61", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.5477825403213501" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "r2_score(y_test,pred) \n", "# TR = Bunu gerçek(y_test) değer ile tahmin(pred) edilen değerleri karşılaştır ve arasındaki farkı bul. \n", "# EN = Compare this with the actual (y_test) value and the predicted (pred) values ​​and find the difference between them." ] }, { "cell_type": "code", "execution_count": 46, "id": "22688e54", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.7063537801134147" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mean_squared_error(y_test,pred)**.5 \n", "# TR = Burada, Root Mean Square Error bulduk. Bunu gerçek(y_test) değer ile tahmin(pred) edilen değerleri karşılaştır arasındaki farkı bul ve **.5 ile karekökünü al.\n", "# EN = Here, we found Root Mean Square Error. Compare this with the actual (y_test) value and the predicted (pred) values, find the difference and take the square root of **.5." ] }, { "cell_type": "code", "execution_count": 47, "id": "fbc114cf", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.7063537801134147" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mean_squared_error(y_test,pred)**.5 \n", "# TR = Burada, Root Mean Square Error bulduk. Bunu gerçek(y_test) değer ile tahmin(pred) edilen değerleri karşılaştır arasındaki farkı bul ve **.5 ile karekökünü al.\n", "# EN = Here, we found Root Mean Square Error. Compare this with the actual (y_test) value and the predicted (pred) values, find the difference and take the square root of **.5." ] }, { "cell_type": "code", "execution_count": 48, "id": "b460b159", "metadata": {}, "outputs": [], "source": [ "loss_f=pd.DataFrame(history.history)" ] }, { "cell_type": "code", "execution_count": 49, "id": "1b964eab", "metadata": {}, "outputs": [ { "data": { "image/png": "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DxERddb3v/99ZGVlYf/+/bjxxhvD+x977DHccsstmDx5MnJycnDffffB6XTG5DUtFgveffdd3HnnnZgwYQIsFguuvfZaPPbYY+Hj3377LV588UVUV1ejoKAAixcvxq233opAIIDq6mrMmzcPlZWVyMnJwTXXXIPly5fHpGydIajt7eSdRE6nE3a7HQ6HAzabLS6v8el3p/Cf/7sdw/KteGfpJXF5DSIiap3H48Hhw4fRv39/mEymZBeH2qG1f7PO/P7mLZ6gphMGEhERUXIxoASF26BwHBQiIkqiNWvWID09vdllxIgRyS5ewrANSlCoBsXjV+DxyzDppSSXiIiIuqMf/vCHmDSp+ZFzU2GE10RhQAlKN+ogiQJkRYXD7WdAISKipLBarbBarckuRtLxFk8QZzQmIiJKHQwoTYTn4+FgbUREREnFgNJEuAaFY6EQERElFQNKE6Hh7h28xUNERJRUDChNsKsxERFRamBAaYLz8RARUbL069cPTzzxRLKLkTIYUJoIjybLNihERERJxYDSRKiRLNugEBERJRcDShOhRrJsg0JElDpUVYXS0JCUpb3z6a5YsQI9e/aEoigR+2fPno1bbrkFBw8exOzZs5GXl4f09HRMmDAB//rXvzr8ngiCgOeffx4/+MEPYLFYMHz4cGzbtg0HDhzAlClTkJaWhsmTJ+PgwYPha9pTBq/Xi3vuuQe9evVCWloaJk2ahM2bN3e4nJ3BkWSbsHPCQCKilKO63dg/bnxSXnvoF7sgWCxtnnfdddfhjjvuwIcffoipU6cCAE6fPo133nkHGzduRH19PWbOnInf//73MBqNeOmllzBr1izs378fffr06VDZHnroITz22GN47LHHcN999+HGG2/EgAEDsGzZMvTp0we33HILlixZgrfffhsA2lWGJUuWYN++fVi3bh169uyJ9evX48orr8Tu3bsxePDgDpWzo1iD0gRHkiUioo7IzMzEjBkzsHbt2vC+1157DTk5ObjsssswZswY3HrrrRg5ciQGDx6Mhx56CAMHDsQ///nPDr/mzTffjB/96EcYMmQI7rvvPhw5cgRz587F9OnTMXz4cNx5550RtR9tlaG0tBSrVq3Cq6++iosvvhgDBw7EPffcg+9973tYtWpVh8vZUaxBaSI8DgobyRIRpQzBbMbQL3Yl7bXba+7cuVi0aBGeeeYZ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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "loss_f.plot();" ] }, { "cell_type": "code", "execution_count": 47, "id": "cfc42c0b-0495-40de-bb22-a859dbb6ded6", "metadata": {}, "outputs": [], "source": [ "with open('laboratuvar_model.pkl', 'wb') as f:\n", " pickle.dump(model, f)\n", "\n", "with open('laboratuvar_vectorizer.pkl', 'wb') as f:\n", " pickle.dump(vectorizer, f)" ] } ], "metadata": { "kaggle": { "accelerator": "none", "dataSources": [ { "databundleVersionId": 8059942, "sourceId": 71485, "sourceType": "competition" } ], "dockerImageVersionId": 30762, "isGpuEnabled": false, "isInternetEnabled": true, "language": "python", "sourceType": "notebook" }, "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "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.4" } }, "nbformat": 4, "nbformat_minor": 5 }