<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Furkan Kızılay on Medium]]></title>
        <description><![CDATA[Stories by Furkan Kızılay on Medium]]></description>
        <link>https://medium.com/@furkankizilay?source=rss-4117a6c384fa------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*nnnyS7BY2KfnMlNhuKYKfQ.jpeg</url>
            <title>Stories by Furkan Kızılay on Medium</title>
            <link>https://medium.com/@furkankizilay?source=rss-4117a6c384fa------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 14 Nov 2026 11:06:11 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@furkankizilay/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Digit Recognition Project Using CNN and OpenCV]]></title>
            <link>https://pub.aimind.so/digit-recognition-project-using-cnn-and-opencv-c08a774c095c?source=rss-4117a6c384fa------2</link>
            <guid isPermaLink="false">https://medium.com/p/c08a774c095c</guid>
            <category><![CDATA[opencv]]></category>
            <category><![CDATA[python]]></category>
            <category><![CDATA[computer-vision]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[deep-learning]]></category>
            <dc:creator><![CDATA[Furkan Kızılay]]></dc:creator>
            <pubDate>Tue, 15 Aug 2023 15:32:38 GMT</pubDate>
            <atom:updated>2023-08-18T14:59:35.336Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Nw2yJPfBDwSVcGMXXy52Ww.jpeg" /></figure><p>Hi everyone i’m : <a href="https://medium.com/u/4117a6c384fa?source=post_page-----6fda32d25c5d--------------------------------">Furkan Kızılay</a></p><p>In today’s world, deep learning and image processing technologies are being utilized across various application domains. In this blog post, we will embark on a journey to accomplish a digit recognition project using the Convolutional Neural Network (CNN) and OpenCV libraries. We will proceed step by step to grasp how the project can be executed.</p><ol><li>Project Preparations</li><li>Separate the Data</li><li>Data Visualization</li><li>Data Preprocessing</li><li>Data Generate</li><li>Create the CNN Model</li><li>Evaluate the Model</li><li>Testing the Trained Model with OpenCV</li></ol><p><strong>Project Purpose and Scope</strong></p><p>In this project, we aim to create a digit recognition system using the power of Convolutional Neural Networks (CNNs) and OpenCV. The scope of the project encompasses building a model that can accurately identify digits. Through this undertaking, we will demonstrate the application of deep learning and image processing techniques for practical problem-solving.</p><p><strong>Separate the Data</strong></p><p>We are specifying the path to our dataset directory. We use the os.listdir() function to obtain a list of all items (files and directories) within the specified path. The len() function calculates the total number of items (files and directories) in the specified directory. Afterwards, we print the value of noOfClasses.</p><pre>path = &quot;myData&quot;<br>myList = os.listdir(path)<br>noOfClasses = len(myList)<br>print(&quot;number of classes&quot;, noOfClasses)</pre><p>We are defining arrays named images and classNo to hold our data.</p><pre>images = []<br>classNo = []<br><br>for i in range(noOfClasses):<br>    myImageList = os.listdir(path + &quot;\\&quot; + str(i))<br>    for j in myImageList:<br>        img = cv2.imread(path + &quot;\\&quot; + str(i) + &quot;\\&quot; + j)<br>        img = cv2.resize(img, (32, 32))<br>        images.append(img)<br>        classNo.append(i)<br><br>print(len(images))<br>print(len(classNo))<br><br>images = np.array(images)<br>classNo = np.array(classNo)<br><br>print(images.shape)<br>print(classNo.shape)</pre><p>This code reads images from different classes, resizes them to a standard size of 32x32 pixels, and organizes them with their class labels for deep learning. The images and class labels are stored in lists, then converted into NumPy arrays for further processing. The goal is to prepare these images and labels for training a deep learning model.</p><pre>x_train, x_test, y_train, y_test = train_test_split(images, classNo, test_size=0.5, random_state=42)<br>x_train, x_val, y_train, y_val = train_test_split(x_train, y_train, test_size=0.2, random_state=42)</pre><p>These two lines of code segment the dataset into training, validation, and testing sets, enabling the model to be trained on one subset, validated on another, and tested on the remaining portion. This is a common practice in deep learning to assess and improve model performance.</p><p>x_train, x_test, y_train, y_test = train_test_split(images, classNo, test_size=0.5, random_state=42) splits the dataset into training (x_train and y_train) and testing (x_test and y_test) sets. It divides the data so that 50% is allocated for testing, using a fixed random seed (random_state=42) for reproducibility.</p><p>x_train, x_val, y_train, y_val = train_test_split(x_train, y_train, test_size=0.2, random_state=42) further splits the training set into training (x_train and y_train) and validation (x_val and y_val) sets. It designates 20% of the training data for validation. Again, the random seed is set to 42 for consistent results.</p><p><strong>Data Visualization</strong></p><pre>fig, axes = plt.subplots(3,1, figsize=(7,7))<br>fig.subplots_adjust(hspace=0.5)<br>sns.countplot(y_train, ax=axes[0])<br>axes[0].set_title(&quot;y_train&quot;)<br><br>sns.countplot(y_test, ax=axes[1])<br>axes[1].set_title(&quot;y_test&quot;)<br><br>sns.countplot(y_val, ax=axes[2])<br>axes[2].set_title(&quot;y_val&quot;)<br>plt.show()</pre><p>Generates a visual representation of the class distribution in the training, testing, and validation datasets using bar plots. It helps to understand how balanced or imbalanced the class distribution is across the different subsets of data.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/700/1*kPfZL8Fk7HCoszKn1CMpIA.png" /></figure><p><strong>Data Preprocessing</strong></p><pre># preporcess<br>def preProcess(img):<br>    img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)<br>    img = cv2.equalizeHist(img) # histogram expanded from 0 to 255<br>    img = img / 255<br>    return img<br><br>x_train = np.array(list(map(preProcess, x_train)))<br>x_test = np.array(list(map(preProcess, x_test)))<br>x_val = np.array(list(map(preProcess, x_val)))<br><br>x_train = x_train.reshape(-1,32,32,1)<br>x_test = x_test.reshape(-1,32,32,1)<br>x_val = x_val.reshape(-1,32,32,1)</pre><p>Defines a preprocessing function that converts images to grayscale, performs histogram equalization, and normalizes pixel values. It then applies this preprocessing function to the training, testing, and validation datasets. Finally, it reshapes the images to the required format for model training. These preprocessing steps help enhance the quality and suitability of the images for feeding into a deep learning model.</p><p><strong>Data Generate</strong></p><pre># data generate<br>dataGen = ImageDataGenerator(width_shift_range=0.1,<br>                             height_shift_range=0.1,<br>                             zoom_range=0.2,<br>                             rotation_range=10)<br><br>dataGen.fit(x_train)</pre><p>Sets up an ImageDataGenerator to perform data augmentation by applying random shifts, zooms, and rotations to the training images. The generator is then fit to the training data to calculate necessary statistics and parameters for the augmentation process. This helps the model learn from a more diverse set of augmented images, improving its ability to generalize to new and unseen data.</p><pre>y_train = to_categorical(y_train, noOfClasses)<br>y_test = to_categorical(y_test, noOfClasses)<br>y_val = to_categorical(y_val, noOfClasses)</pre><p>Converting the original class labels into a binary matrix format using one-hot encoding. This format is commonly used in machine learning when dealing with categorical data, as it provides a suitable representation for training models that require numerical input.</p><p><strong>Create the CNN Model</strong></p><pre>model = Sequential()<br>model.add(Conv2D(input_shape=(32,32,1), filters=8, kernel_size=(5,5), activation=&quot;relu&quot;, padding=&quot;same&quot;))<br>model.add(MaxPooling2D(pool_size=(2,2)))<br>model.add(Conv2D(filters=16, kernel_size=(3,3), activation=&quot;relu&quot;, padding=&quot;same&quot;))<br>model.add(MaxPooling2D(pool_size=(2,2)))<br>model.add(Dropout(0.2))<br>model.add(Flatten())<br>model.add(Dense(units=256, activation=&quot;relu&quot;))<br>model.add(Dropout(0.2))<br>model.add(Dense(units=noOfClasses, activation=&quot;softmax&quot;))<br><br>model.compile(loss=&quot;categorical_crossentropy&quot;, optimizer=&quot;Adam&quot;, metrics=[&quot;Accuracy&quot;])<br><br>batch_size = 250<br><br>hist = model.fit_generator(dataGen.flow(x_train, y_train, batch_size = batch_size), <br>                                        validation_data = (x_val, y_val),<br>                                        epochs = 15,steps_per_epoch = x_train.shape[0]//batch_size, shuffle = 1)<br><br>model.save(&quot;modelWeights.h5&quot;)</pre><p>Defines a CNN model for image classification, compiles it, trains it using data augmentation, and saves the trained model’s weights and architecture for future use. The model is designed to learn features from the input images and classify them into one of the specified classes.</p><p><strong>Evaluate the Model</strong></p><pre>plt.figure()<br>plt.plot(hist.history[&quot;loss&quot;], label = &quot;Train Loss&quot;)<br>plt.plot(hist.history[&quot;val_loss&quot;], label = &quot;Val Loss&quot;)<br>plt.legend()<br>plt.show()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/640/1*pVI1LiXPyWZH3WpSb3y-Xg.png" /></figure><p>Creates a line plot showing the training loss and validation loss as the number of training epochs increases. It’s a visual way to understand how well the model is learning and whether it’s overfitting or underfitting.</p><pre>plt.figure()<br>plt.plot(hist.history[&quot;Accuracy&quot;], label = &quot;Train accuracy&quot;)<br>plt.plot(hist.history[&quot;val_Accuracy&quot;], label = &quot;Val accuracy&quot;)<br>plt.legend()<br>plt.show()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/640/1*VbgsB2kn-8bTuEA93ISyKg.png" /></figure><p>Creates a line plot showing the training accuracy and validation accuracy trends as the number of training epochs increases. This visualization helps assess how well the model is learning from the training data and how well it generalizes to the validation data.</p><pre>score = model.evaluate(x_test, y_test, verbose = 1)<br>print(&quot;Test loss: &quot;, score[0])<br>print(&quot;Test accuracy: &quot;, score[1])<br><br>y_pred = model.predict(x_val)<br>y_pred_class = np.argmax(y_pred, axis = 1)<br>Y_true = np.argmax(y_val, axis = 1)<br>cm = confusion_matrix(Y_true, y_pred_class)<br>f, ax = plt.subplots(figsize=(8,8))<br>sns.heatmap(cm, annot = True, linewidths = 0.01, cmap = &quot;Greens&quot;, linecolor = &quot;gray&quot;, fmt = &quot;.1f&quot;, ax=ax)<br>plt.xlabel(&quot;predicted&quot;)<br>plt.ylabel(&quot;true&quot;)<br>plt.title(&quot;cm&quot;)<br>plt.show()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*o0PIFfHr0snJ0z3PXP0lcQ.png" /></figure><p>Evaluates the model’s performance on the test dataset, calculates a confusion matrix for the validation dataset’s predictions, and then visualizes the confusion matrix using a heatmap. The heatmap helps to visualize how well the model is performing in terms of class predictions and where it might be making mistakes.</p><p><strong>Testing the Trained Model with OpenCV</strong></p><pre>cap = cv2.VideoCapture(0)<br>cap.set(3, 480)<br>cap.set(4, 480)<br><br># pickle_in = open(&quot;model_trained_new.pickle&quot;, &quot;rb&quot;)<br># model = pickle.load(pickle_in)<br>model = load_model(&quot;modelWeights.h5&quot;)<br><br>while True:<br>    success, frame = cap.read()<br>    if success:<br>        img = np.asarray(frame)<br>        img = cv2.resize(img, (32, 32))<br>        img = preProcess(img)<br>        img = img.reshape(1, 32, 32, 1)<br><br>        #predict<br>        #classIndex = int(model.predict_classes(img))<br>        predictions = model.predict(img)<br>        classIndex = np.argmax(predictions)<br>        probVal = np.amax(predictions)<br>        print(classIndex, probVal)<br><br>        if probVal &gt; 0.7:<br>            cv2.putText(frame, str(classIndex) + &quot;  &quot; + str(probVal), (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,255,0), 1)<br><br>        cv2.imshow(&quot;digit-recognition&quot;, frame)<br><br>    if cv2.waitKey(1) &amp; 0xFF == ord(&quot;q&quot;): break</pre><p>cap = cv2.VideoCapture(0): This line initializes a video capture object to capture frames from the webcam (camera index 0).</p><p>cap.set(3, 480) and cap.set(4, 480): These lines set the width and height of the captured video frames to 480 pixels each.</p><p>model = load_model(&quot;modelWeights.h5&quot;): This line loads the pre-trained CNN model from the &quot;modelWeights.h5&quot; file.</p><p>The code enters a loop to continuously capture and process video frames from the webcam.</p><p>success, frame = cap.read(): This line captures a frame from the webcam. success indicates whether the frame was captured successfully.</p><p>Inside the loop:</p><ul><li>The captured frame is processed and resized to 32x32 pixels using the preProcess function.</li><li>The processed image is reshaped into the required format for the model’s input.</li><li>The model predicts the class probabilities for the input image.</li><li>The predicted class index with the highest probability and the maximum probability value are extracted.</li><li>If the maximum probability value is greater than 0.7, the predicted class index and probability are displayed on the frame using cv2.putText.</li><li>The frame with annotations is displayed using cv2.imshow.</li></ul><p>if cv2.waitKey(1) &amp; 0xFF == ord(&quot;q&quot;): break: This checks if the &#39;q&#39; key is pressed. If it is, the loop breaks, ending the video capture and window display.</p><p>In summary, this code captures video frames from the webcam, processes them, feeds them into the pre-trained model, and displays the results (class index and probability) on the video feed. The loop continues until the ‘q’ key is pressed.</p><p>Let’s test our project by running code and showing a number to our computer’s camera.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/797/1*ZSFWUUH9q7m_Qm0FbkvHzw.png" /></figure><p>When I display the number 8 on the phone screen, OpenCV processes the image. Later, the photo we show to the camera serves as input to our model. Our model then predicts the shown number as 8.</p><p>Project: <a href="https://github.com/furkankizilay/computer-vision/tree/main/cnn-with-opencv/digit-recognition">https://github.com/furkankizilay/computer-vision/tree/main/cnn-with-opencv/digit-recognition</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c08a774c095c" width="1" height="1" alt=""><hr><p><a href="https://pub.aimind.so/digit-recognition-project-using-cnn-and-opencv-c08a774c095c">Digit Recognition Project Using CNN and OpenCV</a> was originally published in <a href="https://pub.aimind.so/">AI Mind</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[End-to-end machine learning project using FastAPI, Streamlit and Docker]]></title>
            <link>https://medium.com/@furkankizilay/end-to-end-machine-learning-project-using-fastapi-streamlit-and-docker-6fda32d25c5d?source=rss-4117a6c384fa------2</link>
            <guid isPermaLink="false">https://medium.com/p/6fda32d25c5d</guid>
            <category><![CDATA[machine-learning]]></category>
            <category><![CDATA[data-science]]></category>
            <category><![CDATA[python]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <dc:creator><![CDATA[Furkan Kızılay]]></dc:creator>
            <pubDate>Thu, 11 Aug 2022 10:40:46 GMT</pubDate>
            <atom:updated>2022-08-11T10:48:22.690Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*jCWCOHnqqnH_y1SHwkYi7g.png" /></figure><p>Hi everyone i’m : <a href="https://medium.com/u/4117a6c384fa">Furkan Kızılay</a></p><p>In this article, we will develop an end-to-end machine learning project with 11 steps in our own locale. After that, we will create an API with FastAPI, after creating the interface with the help of Streamlit, we will dockerize our project.</p><ol><li>Data Load</li><li>Feature Engineering</li><li>Data Cleaning</li><li>Outlier Removal</li><li>Data Visualization (Relationship Between Variables)</li><li>Extracting Training Data</li><li>Encoding</li><li>Build a Model</li><li>Create API with FastAPI</li><li>Creating a web interface to the model created with Streamlit.</li><li>Dockerize</li></ol><pre>df = pd.read_csv(&quot;cars.csv&quot;)<br>df.head()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/722/1*EMiVvSPZjfGxJFayskqa0w.png" /></figure><h3>Feature Engineering</h3><p>Add new feature for company names.</p><pre>df[&quot;company&quot;] = df.name.apply(lambda x: x.split(&quot; &quot;)[0])<br>df.head()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/787/1*qKioM-Moaq6SOVJeOlRj_Q.png" /></figure><h3>Data Cleaning</h3><p>year has many non-year values.</p><pre>df2 = df.copy()<br>df2 = df2[df2[&quot;year&quot;].str.isnumeric()]</pre><p>year is in object. Change to integer.</p><pre>df2[&quot;year&quot;] = df2[&quot;year&quot;].astype(int)</pre><p>Price has Ask for Price.</p><pre>df2 = df2[df2[&quot;Price&quot;] != &quot;Ask For Price&quot;]<br>df2.Price</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/507/1*EC1cI_oCazFMJoslUVLO5g.png" /></figure><p>Price has commas in its prices and is in object.</p><pre>df2.Price = df2.Price.str.replace(&quot;,&quot;,&quot;&quot;).astype(int)</pre><p>kms_driven has object values with kms at last.</p><pre>df2[&quot;kms_driven&quot;]</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/520/1*foj_BGqmq6MDx5YD-IrNzw.png" /></figure><pre>df2[&quot;kms_driven&quot;] = df2[&quot;kms_driven&quot;].str.split(&quot; &quot;).str.get(0).str.replace(&quot;,&quot;,&quot;&quot;)</pre><p>It has nan values and two rows have ‘Petrol’ in them.</p><pre>df2 = df2[df2[&quot;kms_driven&quot;].str.isnumeric()]<br>df2.info()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/353/1*LDyPGRw9fyM2pcj1KFAIsA.png" /></figure><pre>df2[&quot;kms_driven&quot;] = df2[&quot;kms_driven&quot;].astype(int)</pre><p>fuel_type has nan values.</p><pre>df2[df2[&quot;fuel_type&quot;].isna()]</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/592/1*fIKMWdjsu4pw7LKLg5F0AQ.png" /></figure><pre>df2 = df2[~df2[&quot;fuel_type&quot;].isna()]</pre><p>Changing car names. Keeping only the first three words.</p><pre>df2[&#39;name&#39;]=df2[&#39;name&#39;].str.split().str.slice(start=0,stop=3).str.join(&#39; &#39;)<br>df2.head()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/630/1*tYvbDqtuJ9JrK_k3qqts4w.png" /></figure><p>Resetting the index of the final cleaned data.</p><pre>df2 = df2.reset_index(drop=True)</pre><p>Save the clanned data.</p><pre>df2.to_csv(&quot;cleaned_car_data.csv&quot;)<br>df2.describe(include=&quot;all&quot;)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/755/1*I-7NhV9cF7IEtcScySZ4IA.png" /></figure><h3>Outlier Removal</h3><p>Drop the price outliers.</p><pre>df2 = df2[df2[&quot;Price&quot;]&lt;6e6].reset_index(drop=True)<br>df2</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/637/1*urlRiGQHY1OMTqBMtHaTEw.png" /></figure><h3>Data Visualization</h3><p>Checking relationship of Company with Price.</p><pre>df2[&quot;company&quot;].unique()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/762/1*kqDoceweRRDa9DZVCKKmKg.png" /></figure><pre>import seaborn as sns</pre><pre>plt.subplots(figsize=(15,7))<br>ax=sns.boxplot(x=&#39;company&#39;,y=&#39;Price&#39;,data=df2)<br>ax.set_xticklabels(ax.get_xticklabels(),rotation=40,ha=&#39;right&#39;)<br>plt.show()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/700/1*_yZTABh8blJOynYOObZjxg.png" /></figure><p>Checking relationship of Year with Price.</p><pre>plt.subplots(figsize=(20,10))<br>ax=sns.swarmplot(x=&#39;year&#39;,y=&#39;Price&#39;,data=df2)<br>ax.set_xticklabels(ax.get_xticklabels(),rotation=40,ha=&#39;right&#39;)<br>plt.show()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/705/1*mYbvKg6sGq3BxAuTNyjzng.png" /></figure><p>Checking relationship of kms_driven with Price.</p><pre>sns.relplot(x=&#39;kms_driven&#39;,y=&#39;Price&#39;,data=df2,height=7,aspect=1.5)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/785/1*9CcbS6-qiMIKvfXSEa3mIQ.png" /></figure><p>Checking relationship of Fuel Type with Price.</p><pre>plt.subplots(figsize=(14,7))<br>sns.boxplot(x=&#39;fuel_type&#39;,y=&#39;Price&#39;,data=df2)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/785/1*LmuaTg_lgYkQ5p1qFSzlYg.png" /></figure><p>Relationship of Price with FuelType, Year and Company mixed.</p><pre>ax=sns.relplot(x=&#39;company&#39;,y=&#39;Price&#39;,data=df2,hue=&#39;fuel_type&#39;,size=&#39;year&#39;,height=7,aspect=2)<br>ax.set_xticklabels(rotation=40,ha=&#39;right&#39;)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/782/1*KedGIydqtlmrxf-1IDSMVw.png" /></figure><h3>Extracting Training Data</h3><pre>X=df2[[&#39;name&#39;,&#39;company&#39;,&#39;year&#39;,&#39;kms_driven&#39;,&#39;fuel_type&#39;]]<br>y=df2[&#39;Price&#39;]</pre><pre>X</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/628/1*GXPQ5MaA2VzSd2utGE40GA.png" /></figure><p>Applying Train Test Split</p><pre>from sklearn.model_selection import train_test_split<br>X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2)</pre><h3>Encoding</h3><p>Creating an OneHotEncoder object to contain all the possible categories.</p><pre>from sklearn.linear_model import LinearRegression</pre><pre>from sklearn.preprocessing import OneHotEncoder<br>from sklearn.compose import make_column_transformer<br>from sklearn.pipeline import make_pipeline<br>from sklearn.metrics import r2_score</pre><pre>ohe=OneHotEncoder()<br>ohe.fit(X[[&#39;name&#39;,&#39;company&#39;,&#39;fuel_type&#39;]])</pre><p>Creating a column transformer to transform categorical columns.</p><pre>column_trans=make_column_transformer((OneHotEncoder(categories=ohe.categories_),[&#39;name&#39;,&#39;company&#39;,&#39;fuel_type&#39;]),<br>                                remainder=&#39;passthrough&#39;)</pre><h3>Build a Model</h3><p>Linear Regression Model</p><pre>lr=LinearRegression()</pre><p>Making a pipeline</p><pre>pipe=make_pipeline(column_trans,lr)</pre><p>Fitting the model</p><pre>pipe.fit(X_train,y_train)</pre><pre>y_pred=pipe.predict(X_test)</pre><p>Checking R2 Score</p><pre>r2_score(y_test,y_pred)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/260/1*jacTE0cWTzHWx0Kl9DUbfw.png" /></figure><p>Finding the model with a random state of TrainTestSplit where the model was found to give almost 0.92 as r2_score.</p><pre>scores=[]<br>for i in range(1000):<br>    X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.1,random_state=i)<br>    lr=LinearRegression()<br>    pipe=make_pipeline(column_trans,lr)<br>    pipe.fit(X_train,y_train)<br>    y_pred=pipe.predict(X_test)<br>    scores.append(r2_score(y_test,y_pred))</pre><pre>scores[np.argmax(scores)]</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/277/1*hJc3l_TmqGoTZZtJTgmMJA.png" /></figure><p>Predict spesific car price</p><pre>pipe.predict(pd.DataFrame(columns=X_test.columns,data=np.array([&#39;Maruti Suzuki Swift&#39;,&#39;Maruti&#39;,2019,100,&#39;Petrol&#39;]).reshape(1,5)))</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/320/1*Mcinr0RrO1HVRGCQsaP0Qg.png" /></figure><p>The best model is found at a certain random state</p><pre>X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.1,random_state=np.argmax(scores))<br>lr=LinearRegression()<br>pipe=make_pipeline(column_trans,lr)<br>pipe.fit(X_train,y_train)<br>y_pred=pipe.predict(X_test)<br>r2_score(y_test,y_pred)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/262/1*LtPf2ebh375ABm3rPAowmw.png" /></figure><pre>import joblib</pre><pre>joblib.dump(pipe,open(&#39;LinearRegressionModel.pkl&#39;,&#39;wb&#39;))</pre><pre>pipe.predict(pd.DataFrame(columns=[&#39;name&#39;,&#39;company&#39;,&#39;year&#39;,&#39;kms_driven&#39;,&#39;fuel_type&#39;],data=np.array([&#39;Maruti Suzuki Swift&#39;,&#39;Maruti&#39;,2019,100,&#39;Petrol&#39;]).reshape(1,5)))</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/312/1*ipBVd0i7gxWyODO5_ZRUDQ.png" /></figure><h3>Create API with FastAPI</h3><p>Initialize application instance in main.py in app folder.</p><pre>app = FastAPI(title=&#39;Car Price Prediction&#39;, version=&#39;1.0&#39;,</pre><pre>description=&#39;Linear Regression model is used for prediction&#39;)</pre><p>Initialize model artifacte files. This will be loaded at the start of FastAPI model server.</p><pre>model = joblib.load(&quot;LinearRegressionModel.joblib&quot;)</pre><p>This struture will be used for Json validation.</p><p>With just that Python type declaration, FastAPI will perform below operations on the request data</p><p>1) Read the body of the request as JSON.</p><p>2) Convert the corresponding types (if needed).</p><p>3) Validate the data.If the data is invalid, it will return a nice and clear error, indicating exactly where and what was the incorrect data.</p><pre>class Data(BaseModel):</pre><pre>    name: str</pre><pre>    company: str</pre><pre>    year: int</pre><pre>    kms_driven: float</pre><pre>    fuel_type: str</pre><p>Create API root or home endpoint.</p><pre>@app.get(&#39;/&#39;)</pre><pre>@app.get(&#39;/home&#39;)</pre><pre>def read_home():</pre><pre>    &quot;&quot;&quot;</pre><pre>    Home endpoint which can be used to test the availability of the    application.</pre><pre>    &quot;&quot;&quot;</pre><pre>    return {&#39;message&#39;: &#39;System is healthy&#39;}</pre><p>Create ML API endpoint to predict against the request received from the client.</p><pre>@app.post(&quot;/predict&quot;)</pre><pre>def predict(data: Data):</pre><pre>    result = model.predict(pd.DataFrame(columns=[&#39;name&#39;,&#39;company&#39;,&#39;year&#39;,&#39;kms_driven&#39;,&#39;fuel_type&#39;],data=np.array([data.name,data.company,data.year,data.kms_driven,data.fuel_type]).reshape(1,5)))[0]</pre><pre>    return result</pre><p>We need to add this code block to run the codes we wrote at the end of main.py.</p><pre>if __name__ == &#39;__main__&#39;:</pre><pre>    uvicorn.run(&quot;main:app&quot;, host=&quot;127.0.0.1&quot;, port=8000, reload=True)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*TPt8T-emC6O4RKZaZySPSg.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*SF-pgGCitHltBdkZamdWzQ.png" /></figure><h3>Creating a web interface to the model created with Streamlit.</h3><p>We are reading the csv file with the help of pandas, as we will use the data that we save the clean data in app.py.</p><pre>df = pd.read_csv(&quot;../cleaned_car_data.csv&quot;)</pre><p>Let’s add the codes that we will create the interface with the help of Streamlit.</p><pre>def run():</pre><pre>    streamlit.title(&quot;Car Price Prediction&quot;)</pre><pre>    name = streamlit.selectbox(&quot;Cars Model&quot;, df.name.unique())</pre><pre>    company = streamlit.selectbox(&quot;Company Name&quot;, df.company.unique())</pre><pre>    year = streamlit.number_input(&quot;Year&quot;)</pre><pre>    kms_driven = streamlit.number_input(&quot;Kilometers driven&quot;)</pre><pre>    fuel_type = streamlit.selectbox(&quot;Fuel type&quot;, df.fuel_type.unique())</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/903/1*894rfVbsJ4ANBovzHMDS5g.png" /></figure><p>Let’s store the data we receive from the user through the interface in the “data” variable.</p><pre>data = {</pre><pre>    &#39;name&#39;: name,</pre><pre>    &#39;company&#39;: company,</pre><pre>    &#39;year&#39;: year,</pre><pre>    &#39;kms_driven&#39;: kms_driven,</pre><pre>    &#39;fuel_type&#39;: fuel_type,</pre><pre>    }</pre><p>When the “Predict” button is clicked, we get results from our model using the API we created with the help of “request”.</p><pre>if streamlit.button(&quot;Predict&quot;):</pre><pre>    response = requests.post(&quot;http://127.0.0.1:8000/predict&quot;, json=data)</pre><pre>    prediction = response.text</pre><pre>    streamlit.success(f&quot;The prediction from model: {prediction}&quot;)</pre><p>We need to add this code block to run the codes we wrote at the end of app.py.</p><pre>if __name__ == &#39;__main__&#39;:</pre><pre>    run()</pre><p>We can open our application by running the “streamlit run app.py” command in the file directory where app.py is located.</p><p>Let’s try it, will we be able to get the results we got on the notebook in the web application?</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/852/1*1aHGeO8f7IP7xhUN6WfAMA.png" /></figure><p>We will do cauterization with Docker so that the service we have created works on other systems.</p><h3>Dockerize</h3><p>Before that, we should not forget to create the requirements.txt file with the pipreqs ./ command on the console screen.</p><p>We need to add Dockerfile, It will expect a file at /app/main.py and will expect it to contain a variable app with your FastAPI application.</p><pre>FROM tiangolo/uvicorn-gunicorn-fastapi:python3.7</pre><pre>COPY /app/requirements.txt /app/</pre><pre>RUN pip install -r /app/requirements.txt</pre><pre>COPY ./model /model/</pre><pre>COPY ./app /app</pre><ul><li>Again on the console screen, “docker image build -t car-price .” We create docker images by running the command.</li><li>We can see the image we created by running the “docker image ls” command.</li><li>We will upload our container to Docker Hub to share the created container with the whole world. After creating a repository in Docker Hub, we tag it with the code “docker tag car-price username/car-price”.</li><li>And finally, we push it to Docker Hub with the command “docker push username/car-price”. (This may take a long time) Then we can open Docker Hub and check that it has been pushed.</li></ul><p>Project: <a href="https://github.com/furkankizilay/car-price-prediction">https://github.com/furkankizilay/car-price-prediction</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=6fda32d25c5d" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Simple Pandas Usage and Data Visualization]]></title>
            <link>https://medium.com/@furkankizilay/simple-pandas-usage-and-data-visualization-1c0336942850?source=rss-4117a6c384fa------2</link>
            <guid isPermaLink="false">https://medium.com/p/1c0336942850</guid>
            <category><![CDATA[pandas]]></category>
            <category><![CDATA[data-visualization]]></category>
            <category><![CDATA[data-science]]></category>
            <category><![CDATA[python]]></category>
            <dc:creator><![CDATA[Furkan Kızılay]]></dc:creator>
            <pubDate>Sun, 07 Aug 2022 05:02:26 GMT</pubDate>
            <atom:updated>2022-08-07T05:02:26.212Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*34oAyPDmbgHhRlSCCtApQw.jpeg" /></figure><p>Hi everyone i’m : <a href="https://medium.com/u/4117a6c384fa">Furkan Kızılay</a></p><p>In this article, we will try to learn about the dataset by using pandas’ entry-level functions with a dataset containing the average temperature information of the countries. After that we will visualize the data using matplotlib and seaborn.</p><p>We will use a dataset containing the average temperature information of countries and cities. We will simply use pandas and visualize without questioning the accuracy of the data and without noisy data analysis, missing data analysis or outlier analysis.</p><h3>Let’s Start</h3><ul><li>First let import the pandas framework</li></ul><pre>import pandas as pd</pre><p><em>But firstly what is pandas ?</em></p><p>Pandas is a fast, powerful, flexible and easy to use open source data analysis and manipulation tool.</p><ul><li>Let’s assign the dataset containing the city temperatures to the variable data using pandas.</li></ul><pre>data = pd.read_csv(&quot;city_temperature.csv&quot;)</pre><ul><li>Let’s look at the first 5 observation units of the dataset.</li></ul><pre>data.head()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/628/1*7rT6ZgjQZmYsB4DtLJKmmQ.png" /></figure><ul><li>head() defaultly show 5 observation unit, if you want to see more observation unit you can give the parameter.</li></ul><p><em>Which type of data include this columns, let’s find out?</em></p><pre>data.dtypes</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/743/1*esk2yqjsKw3zGzKdWaz--Q.png" /></figure><ul><li>If you want to more information about dataset, you can use the info function.</li></ul><pre>data.info()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/762/1*Vf59OD-QTVRvSwCu7UALbA.png" /></figure><ul><li>info() show us the columns non-null count and the columns types, also how much memory used.</li></ul><p>Keep to examine, possible to see the central distribution measures of the features with a single line of code.</p><pre>data.describe().T</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/763/1*yYvjCIIPm-upbj76qcubwQ.png" /></figure><ul><li>The T at the end of the code means transpose.</li></ul><p>How many observation units and columns are dataset, ı want to see this together.</p><pre>data.shape</pre><p><em>(2906327, 8)</em></p><p>Is there any null value in the dataset?</p><pre>data.isnull()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/727/1*H3FW5ZvdKoZx3nMtDI6bnQ.png" /></figure><p>That way it would be very difficult to see if there is any missing data, wouldn’t it? We can make this situation easy in a very simple way.</p><pre>data.isnull().sum()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/742/1*ru8xQZoJzPU3subbPi80LA.png" /></figure><p>Upss, all data in the state column seems to be missing, let’s drop the column.</p><pre>data.drop(&quot;State&quot;,axis = 1 ,inplace=True)<br>data.head()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/573/1*U9yDDbdF-OmMC7mjlxL-5g.png" /></figure><ul><li>The drop method allows us to delete columns or indexes in the data set.</li><li>If we set the axis parameter to 1, drop can delete columns, and the inplace parameter ensures that the change we make is permanent.</li></ul><p>Let’s convert the object data type to the categorical data type.</p><pre>columns = data.columns[0:3]<br>for i in columns :<br>    data[i] = pd.Categorical(data[i])<br>data.dtypes</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/752/1*t8IeFrov96HiI4KijkDRTw.png" /></figure><p>Let’s explore the data frame further to answer some specific questions.</p><p><em>How many cities are in the dataset?</em></p><pre>data[&quot;City&quot;].nunique()</pre><p><em>321</em></p><p><em>How many data do we have from each country in our dataset?</em></p><pre>data[&quot;Country&quot;].value_counts()</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/755/1*Fgjye7g-aAlmP6YB65YsYg.png" /></figure><p><em>How many data do we have from some specific country?</em></p><pre>len(data[data[&quot;Country&quot;] == &quot;US&quot;])</pre><p><em>1455337</em></p><p><em>What is the mean average temperature?</em></p><pre>data[&quot;AvgTemperature&quot;].mean()</pre><p><em>56.004920781458054</em></p><p><em>What is the max average temperature?</em></p><pre>data[&quot;AvgTemperature&quot;].max()</pre><p><em>110.0</em></p><p>Is it 110, I wonder where is this place, let’s find out.</p><pre>data[data[&quot;AvgTemperature&quot;] == data[&quot;AvgTemperature&quot;].max()]</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/752/1*ybq-SDhHfp6zE5LD4RzfAg.png" /></figure><p><em>How many data are there for cities in any country we choose?</em></p><pre>data[data[&quot;Country&quot;].isin([&quot;Turkey&quot;,&quot;Australia&quot;,&quot;US&quot;])][&quot;City&quot;].value<em>_counts()</em></pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/746/1*7YZoqqUpoGsALD5mA1aIBw.png" /></figure><p>This example will be a bit silly but we should learn to use functions too.</p><p><em>Let’s find the average temperature of countries with the letter F in them.</em></p><pre>def re_find(f):<br>    if &quot;f&quot; in f.lower():<br>        return True<br>    return False</pre><pre>data[data[&quot;Country&quot;].apply(re_find)]</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/762/1*vOpehiD0_R1P1-Ikc0_p6g.png" /></figure><p>So how do we find the average temperature on each continent? (groupby method will help us)</p><pre>data.groupby(by = &quot;Region&quot;).mean()[&quot;AvgTemperature&quot;]</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/751/1*IMA3c3MSiLSGavm5HDg5SQ.png" /></figure><p>It may be more easy to see average temperatures on a graph rather than looking at a stack of numbers. <strong>Let’s do some visualization.</strong></p><ul><li>We need to import matplotlib library to make visualization.</li></ul><p><em>But firstly what is matplotlib?</em></p><p>Matplotlib is a comprehensive library for creating static, animated, and interactive visualizations in Python.</p><pre>import matplotlib.pyplot as plt<br>%matplotlib inline<br>data.groupby(by = &quot;Region&quot;).mean()[&quot;AvgTemperature&quot;].plot(kind = &quot;bar&quot;)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/787/1*I_cymbmuGAJvxuvcP8Egww.png" /></figure><p><em>It’s easier to see which continent has more data this way.</em></p><p>It is possible to draw a graph where we can compare the average temperatures of the continents with each other. For this, we import the more advanced seaborn library, which is based on matplotlib.</p><pre>import seaborn as sns<br>(sns<br> .FacetGrid(data,<br>              hue= &quot;Region&quot;,<br>              height = 5,<br>              xlim = (0,120))<br> .map(sns.kdeplot,&quot;AvgTemperature&quot;,shade = True)<br> .add_legend()<br>);</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/778/1*Wpda358R9aVZ_PMMHcxMTw.png" /></figure><p>What about comparison of average temperature by month?</p><pre>plt.ylim(0, 120)<br>sns.boxplot(x = &quot;Month&quot;, y = &quot;AvgTemperature&quot;,data = data);</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/750/1*3EMI2dbaYJRnEkHTU7JpeQ.png" /></figure><p><em>Since the values with an average temperature of -99 in the data set are evaluated incorrectly, we need to remove them from the data set.</em></p><pre>data = data[~(data[&quot;AvgTemperature&quot;] == -99)]<br>data.shape</pre><p><em>(2826655, 8)</em></p><ul><li>The ~ statement filters out the observation units that satisfy the condition in the parenthesis to the right.</li></ul><p>Let’s try to draw the density graphs of the 3 countries we have chosen in the same graph.</p><pre>data_selected = data[data[&quot;Country&quot;].isin([&quot;China&quot;,&quot;France&quot;,&quot;US&quot;])]<br>sns.set_style(&quot;whitegrid&quot;)<br>plt.figure(figsize=(15,5))<br>countries = data_selected[&quot;Country&quot;].unique()</pre><pre>for country in countries :<br>    data = data_selected[data_selected[&quot;Country&quot;]==country][&quot;AvgTemperature&quot;]<br>    sns.distplot(data)</pre><pre>plt.legend(countries)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/775/1*9-l3xggEL4u3XTxT7MIDUA.png" /></figure><h3>What did we do?</h3><ul><li>We examined the dataset using Pandas and tried to find the answers to the questions we asked to the dataset using Pandas.</li><li>We visualized the data we obtained so that the data can be read and understood more easily.</li></ul><h3>The dataset:</h3><p><a href="https://www.kaggle.com/datasets/subhamjain/temperature-of-all-countries-19952020">https://www.kaggle.com/datasets/subhamjain/temperature-of-all-countries-19952020</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=1c0336942850" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How I Started Programming]]></title>
            <link>https://medium.com/@furkankizilay/how-i-started-programming-68b95504d27c?source=rss-4117a6c384fa------2</link>
            <guid isPermaLink="false">https://medium.com/p/68b95504d27c</guid>
            <category><![CDATA[data-science]]></category>
            <category><![CDATA[python]]></category>
            <category><![CDATA[machine-learning]]></category>
            <category><![CDATA[getting-started]]></category>
            <category><![CDATA[programming]]></category>
            <dc:creator><![CDATA[Furkan Kızılay]]></dc:creator>
            <pubDate>Thu, 04 Aug 2022 04:05:03 GMT</pubDate>
            <atom:updated>2022-08-04T04:54:50.611Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*oh_e0M-RIO90fchMNXumaA.png" /></figure><p><strong>Hi everyone i’m :</strong> <a href="https://medium.com/u/4117a6c384fa">Furkan Kızılay</a></p><p>Welcome to my blog, where I will write about my experiences while learning programming, and the topics that I think may be useful. In this blog, I will describe my experience of getting started with programming.</p><h3>Where I Started Programming</h3><p>Firstly, like everyone ı was did so many research about programming. As I researched, I realized how comprehensive programming is and that there are many different areas to improve myself.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ngDXeXmy1SXpfTas-mHzLA.png" /></figure><p>The one common thread in every article I read about how to get started with programming was that programming should start with learning <strong>algorithm logic</strong>. So I started programming with learning algorithms, ı bought some algorithms books in my language and read some books. When i started learning something i didn’t have a computer so i could only learn theoretically.</p><h3>Programming Language and English</h3><p>After gaining knowledge of algorithms, I had to choose a programming language to learn. I decided to learn Python because it is easy to understand. I learned Python from books in my language again. After finish this book ı got some courses at Udemy. this courses were in my language again.</p><p>After finishing the book and completing the courses, I felt like I fell into a void because when I finished these I thought I could do anything with python. At the very least, I wanted to see something concrete that I could do with the knowledge I had learned.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/500/1*jYzXmNw5RWXIFeKkok7N1A.gif" /></figure><p>I didn’t trust my English to learn anything. But I knew that if I’m going to be a programmer, I need to improve my English. I started to <strong>improve my English while learning programming.</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/493/1*NTVnxVH3A9uXnUIiGPgYFQ.gif" /></figure><h3>Choosing Career Map</h3><p>When I look back now, I think that I made a good start in programming, but perhaps <em>I missed the most important detail and I had not determined my career path</em>. I researched for a long time to determine my career path, I needed to find the most suitable one for me. As a result of my research, I became interested in deep learning, machine learning and data science, but as a person with a programming background of 3 months, I was afraid of the difficulty of the subjects I need to learn for AI, and I thought that it would be healthy to learn AI after I chose another field and improved my programming knowledge. (not exactly a good idea)</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/730/1*5UQuSYIHWJh2rYIOBGEysg.png" /></figure><p>Since I wanted to see something concrete, I thought mobile development was the right career path for the moment. Since I don’t think it’s the right decision, I won’t dwell on it too much. First of all, I started learning Java (I’m glad I did, it helped me a lot at school), then I made simple application developments with Android Studio. Being aware of the fact that I need to learn on a cross platform, I took Flutter trainings and made application developments with Flutter. Before long, my interest in this field waned and I realized that I really did not want to further my career in this direction.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*Y0RASeaIbcVewql81VB7Eg.jpeg" /></figure><p>It was time to put my career path on the route I wanted to specialize in. After doing the longest and most comprehensive research I have done so far, I learned about data science, machine learning and deep learning, and I prepared a study plan.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1000/1*vRg3E1fm5TNXzvD1vbh-HA.gif" /></figure><p>This is how I started programming. In my next blogs, I will explain my data science and machine learning study plan, the resources I use and the route I follow.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=68b95504d27c" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>