From 72954746059770f846ef2a2649842220e3b66d83 Mon Sep 17 00:00:00 2001
From: Samyak Kala <48255425+Sk70249@users.noreply.github.com>
Date: Tue, 29 Sep 2020 22:04:49 +0530
Subject: [PATCH 1/2] Regression on Pre Owned Cars
---
Artificial Intelligence/RegresssionModel.py | 280 ++++++++++++++++++++
1 file changed, 280 insertions(+)
create mode 100644 Artificial Intelligence/RegresssionModel.py
diff --git a/Artificial Intelligence/RegresssionModel.py b/Artificial Intelligence/RegresssionModel.py
new file mode 100644
index 0000000..aaabcb8
--- /dev/null
+++ b/Artificial Intelligence/RegresssionModel.py
@@ -0,0 +1,280 @@
+# -*- coding: utf-8 -*-
+"""
+Created on Sun Jan 12 12:05:47 2020
+
+@author: Samyak
+"""
+
+#==============================================================================
+# REGRESSION MODEL - PREDICTING PRICE OF PRE OWNED CARS
+#==============================================================================
+import numpy as np
+import pandas as pd
+import seaborn as sns
+
+#setting graph size
+sns.set(rc = {"figure.figsize": (10, 8)})
+
+# Reading Data and getting info about data
+data_price = pd.read_csv("cars_sampled.csv")
+cars = data_price.copy()
+cars.info()
+
+cars.describe()
+
+# To set float values upto 3 decimal places
+pd.set_option("display.float_format", lambda x: "%.3f" % x)
+cars.describe()
+
+# Dropping unwanted columns
+cols = ["name", "dateCrawled", "dateCreated", "postalCode", "lastSeen"]
+cars = cars.drop(columns = cols, axis =1)
+
+#Removing duplicates from the data
+cars.drop_duplicates(keep="first", inplace=True)
+
+cars.isnull().sum()
+
+# varialbe Yearof Registration
+yearwise = cars["yearOfRegistration"].value_counts().sort_index()
+cars["yearOfRegistration"].describe()
+sum(cars["yearOfRegistration"] > 2018)
+sum(cars["yearOfRegistration"] < 1950)
+sns.regplot(x="yearOfRegistration", y="price", scatter=True, fit_reg=False, data=cars)
+
+# Removing Null values
+cars = cars.dropna(axis = 0)
+cars.isnull().sum()
+
+# varialbe price
+price_count = cars["price"].value_counts().sort_index()
+cars["price"].describe()
+sum(cars["price"] > 150000)
+sum(cars["price"] < 100)
+sns.distplot(cars["price"])
+
+# varialbe PowerPS
+power_count = cars["powerPS"].value_counts().sort_index()
+cars["powerPS"].describe()
+sum(cars["powerPS"] > 500)
+sum(cars["powerPS"] < 10)
+sns.boxplot(cars["powerPS"])
+sns.regplot(x="powerPS", y="price", scatter=True, fit_reg=False, data=cars)
+
+#Ranging the data to make it more usefull
+cars = cars[
+ (cars.yearOfRegistration >= 1950)
+ & (cars.yearOfRegistration <= 2018)
+ & (cars.price <= 150000)
+ & (cars.price >= 100)
+ & (cars.powerPS <= 500)
+ & (cars.powerPS >= 10)
+]
+
+cars["monthOfRegistration"] /= 12
+
+#Adding Age
+cars["Age"] = (2018-cars["yearOfRegistration"])+cars["monthOfRegistration"]
+cars["Age"] = round(cars["Age"], 2)
+cars["Age"].describe()
+#Since age is deployed therefor removing
+cols1 = ["yearOfRegistration", "monthOfRegistration"]
+cars = cars.drop(columns = cols1, axis = 1)
+cars1 = cars.copy()
+
+#Vissualizing Parameters after narrowing the range form dataframe
+#Age
+sns.distplot(cars["Age"])
+sns.boxplot(y=cars["Age"])
+sns.regplot(x="Age", y="price", scatter=True, fit_reg=False, data=cars1)
+
+#price
+sns.distplot(cars["price"])
+sns.boxplot(y=cars["price"])
+
+#poweerPS
+sns.distplot(cars["powerPS"])
+sns.boxplot(y=cars["powerPS"])
+sns.regplot(x="powerPS", y="price", scatter=True, fit_reg=False, data=cars1)
+
+#=============================================================================
+#Comparing and Analyzing each and every varaible with price
+#And removing Insignificant columns
+#=============================================================================
+
+#seller
+cars["seller"].value_counts()
+pd.crosstab(cars["seller"], columns="count", normalize=True)
+sns.countplot(x="seller", data=cars1)
+sns.boxplot(x="seller", y="price", data=cars1)
+#Fewer cars have commercial which is innsignificant
+#does not affect price as seen in boxplot
+cars1 = cars1.drop(columns=["seller"], axis=1)
+
+#offerType
+cars["offerType"].value_counts()
+pd.crosstab(cars["offerType"], columns="count", normalize=True)
+sns.countplot(x="offerType", data=cars1)
+sns.boxplot(x="offerType", y="price", data=cars1)
+#does not affect price as seen in boxplot
+cars1 = cars1.drop(columns=["offerType"], axis=1)
+
+#abtest
+cars["abtest"].value_counts()
+pd.crosstab(cars["abtest"], columns="count", normalize=True)
+sns.countplot(x="abtest", data=cars1)
+sns.boxplot(x="abtest", y="price", data=cars1)
+#does not affect price as seen in boxplot
+cars1 = cars1.drop(columns=["abtest"], axis=1)
+
+#vehicleType
+cars["vehicleType"].value_counts()
+pd.crosstab(cars["vehicleType"], columns="count", normalize=True)
+sns.countplot(x="vehicleType", data=cars1)
+sns.boxplot(x="vehicleType", y="price", data=cars1)
+#affecting the price
+
+#gearbox
+cars["gearbox"].value_counts()
+pd.crosstab(cars["gearbox"], columns="count", normalize=True)
+sns.countplot(x="gearbox", data=cars1)
+sns.boxplot(x="gearbox", y="price", data=cars1)
+#affecting the price
+
+#model
+cars["model"].value_counts()
+pd.crosstab(cars["model"], columns="count", normalize=True)
+#affecting the price
+
+#kilometer
+cars["kilometer"].value_counts()
+pd.crosstab(cars["kilometer"], columns="count", normalize=True)
+sns.countplot(x="kilometer", data=cars1)
+sns.boxplot(x="kilometer", y="price", data=cars1)
+#affecting the price
+
+#fuelType
+cars["fuelType"].value_counts()
+pd.crosstab(cars["fuelType"], columns="count", normalize=True)
+sns.countplot(x="fuelType", data=cars1)
+sns.boxplot(x="fuelType", y="price", data=cars1)
+#affecting the price
+
+#brand
+cars["brand"].value_counts()
+pd.crosstab(cars["brand"], columns="count", normalize=True)
+sns.countplot(x="brand", data=cars1)
+sns.boxplot(x="price", y="brand", data=cars1)
+#affecting the price
+
+#notRepairedDamage
+cars["notRepairedDamage"].value_counts()
+pd.crosstab(cars["notRepairedDamage"], columns="count", normalize=True)
+sns.countplot(x="notRepairedDamage", data=cars1)
+sns.boxplot(x="notRepairedDamage", y="price", data=cars1)
+#cars wihich have repaired their damage have significantly more value
+
+#============================================================================
+# CORRELATION
+#===========================================================================
+
+
+cars_select = cars.select_dtypes(exclude=[object])
+corelation = cars_select.corr()
+round(corelation, 3)
+cars_select.corr().loc[:, "price"].abs().sort_values(ascending=False)[1:]
+# powerPS have some decent affect on the price i.e 58%
+
+cars1.describe()
+#==============================================================================
+# BUILDING ML MODEL
+#==============================================================================
+
+cars2 = cars1.copy()
+#converting categorical variable in 0/1 format or dummy format
+cars2 = pd.get_dummies(cars1, drop_first=True)
+
+#==============================IMPORTING LIBRARIES=============================
+
+from sklearn.model_selection import train_test_split
+from sklearn.linear_model import LinearRegression
+from sklearn.ensemble import RandomForestRegressor
+from sklearn.metrics import mean_squared_error
+
+#Seprating the values for Linear Regression Model
+x1 = cars2.drop(["price"], axis = "columns", inplace = False )
+y1 = cars2["price"]
+
+#plotting the variable price
+prices = pd.DataFrame({"1. Before": y1, "2. After":np.log(y1)})
+prices.hist()
+
+#Transforming file as a loarithmic value
+y1 = np.log(y1)
+
+#splittting the training and testing data
+x_train, x_test, y_train, y_test = train_test_split(x1, y1, test_size = 0.3, random_state=0)
+
+#findin mean value on test data
+test_mean = np.mean(y_test)
+print(test_mean)
+test_mean = np.repeat(test_mean, len(y_test))
+print(test_mean)
+
+
+#Root mean squared value error
+rmse = np.sqrt(mean_squared_error(y_test, test_mean))
+print(rmse)
+
+linear_reg = LinearRegression(fit_intercept = True)
+
+model_fit = linear_reg.fit(x_train, y_train)
+
+cars_prediction = linear_reg.predict(x_test)
+
+#MSE and RMSE for predictive values
+mse1 = mean_squared_error(y_test, cars_prediction)
+rmse1 = np.sqrt(mse1)
+print(mse1)
+print(rmse1)
+
+# R SQUARED VALUE
+r2_test = model_fit.score(x_test, y_test)
+r2_train = model_fit.score(x_train, y_train)
+
+print(r2_test, r2_train)
+
+#Regression Diaagnostic - Residual plot analysis
+reiduals = y_test - cars_prediction
+sns.regplot(x=cars_prediction, y=reiduals, fit_reg=False, scatter=True)
+reiduals.describe()
+
+#=============================================================================
+# RANDOM FOREST MODEL
+#=============================================================================
+
+rf = RandomForestRegressor(n_estimators=100, max_features="auto",
+ max_depth=100, min_samples_split=10,
+ min_samples_leaf=4, random_state=1)
+
+model_rf = rf.fit(x_train, y_train)
+
+rf_prediction = rf.predict(x_test)
+
+
+#MSE and RMSE for predictive values
+mse1 = mean_squared_error(y_test, rf_prediction)
+rmse1 = np.sqrt(mse1)
+print(mse1)
+print(rmse1)
+
+# R SQUARED VALUE
+r2_test = model_rf.score(x_test, y_test)
+r2_train = model_rf.score(x_train, y_train)
+
+print(r2_test, r2_train)
+
+# END
+
+
+
From 527df5055a9565280f859f5a19e3867852b790dc Mon Sep 17 00:00:00 2001
From: Samyak Kala <48255425+Sk70249@users.noreply.github.com>
Date: Thu, 1 Oct 2020 00:20:49 +0530
Subject: [PATCH 2/2] Multi Linear Regression
Multiple Linear Regression on Fuelcomsumption by cars.
---
.../Mulitple-Linear-Regression.ipynb | 747 ++++++++++++++++++
1 file changed, 747 insertions(+)
create mode 100644 Artificial Intelligence/Mulitple-Linear-Regression.ipynb
diff --git a/Artificial Intelligence/Mulitple-Linear-Regression.ipynb b/Artificial Intelligence/Mulitple-Linear-Regression.ipynb
new file mode 100644
index 0000000..b21f94b
--- /dev/null
+++ b/Artificial Intelligence/Mulitple-Linear-Regression.ipynb
@@ -0,0 +1,747 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "button": false,
+ "new_sheet": false,
+ "run_control": {
+ "read_only": false
+ }
+ },
+ "source": [
+ "
Multiple Linear Regression
\n",
+ "\n",
+ "
About this Notebook
\n",
+ "In this notebook, we learn how to use scikit-learn to implement Multiple linear regression. We download a dataset that is related to fuel consumption and Carbon dioxide emission of cars. Then, we split our data into training and test sets, create a model using training set, Evaluate your model using test set, and finally use model to predict unknown value\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "
"
+ ],
+ "text/plain": [
+ " ENGINESIZE CYLINDERS FUELCONSUMPTION_CITY FUELCONSUMPTION_HWY \\\n",
+ "0 2.0 4 9.9 6.7 \n",
+ "1 2.4 4 11.2 7.7 \n",
+ "2 1.5 4 6.0 5.8 \n",
+ "3 3.5 6 12.7 9.1 \n",
+ "4 3.5 6 12.1 8.7 \n",
+ "5 3.5 6 11.9 7.7 \n",
+ "6 3.5 6 11.8 8.1 \n",
+ "7 3.7 6 12.8 9.0 \n",
+ "8 3.7 6 13.4 9.5 \n",
+ "\n",
+ " FUELCONSUMPTION_COMB CO2EMISSIONS \n",
+ "0 8.5 196 \n",
+ "1 9.6 221 \n",
+ "2 5.9 136 \n",
+ "3 11.1 255 \n",
+ "4 10.6 244 \n",
+ "5 10.0 230 \n",
+ "6 10.1 232 \n",
+ "7 11.1 255 \n",
+ "8 11.6 267 "
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "cdf = df[['ENGINESIZE','CYLINDERS','FUELCONSUMPTION_CITY','FUELCONSUMPTION_HWY','FUELCONSUMPTION_COMB','CO2EMISSIONS']]\n",
+ "cdf.head(9)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Lets plot Emission values with respect to Engine size:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {
+ "button": false,
+ "new_sheet": false,
+ "run_control": {
+ "read_only": false
+ },
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plt.scatter(cdf.ENGINESIZE, cdf.CO2EMISSIONS, color='blue')\n",
+ "plt.xlabel(\"Engine size\")\n",
+ "plt.ylabel(\"Emission\")\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "button": false,
+ "new_sheet": false,
+ "run_control": {
+ "read_only": false
+ }
+ },
+ "source": [
+ "#### Creating train and test dataset\n",
+ "Train/Test Split involves splitting the dataset into training and testing sets respectively, which are mutually exclusive. After which, you train with the training set and test with the testing set. \n",
+ "This will provide a more accurate evaluation on out-of-sample accuracy because the testing dataset is not part of the dataset that have been used to train the data. It is more realistic for real world problems.\n",
+ "\n",
+ "This means that we know the outcome of each data point in this dataset, making it great to test with! And since this data has not been used to train the model, the model has no knowledge of the outcome of these data points. So, in essence, it’s truly an out-of-sample testing.\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {
+ "button": false,
+ "new_sheet": false,
+ "run_control": {
+ "read_only": false
+ }
+ },
+ "outputs": [],
+ "source": [
+ "msk = np.random.rand(len(df)) < 0.8\n",
+ "train = cdf[msk]\n",
+ "test = cdf[~msk]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "button": false,
+ "new_sheet": false,
+ "run_control": {
+ "read_only": false
+ }
+ },
+ "source": [
+ "#### Train data distribution"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {
+ "button": false,
+ "new_sheet": false,
+ "run_control": {
+ "read_only": false
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plt.scatter(train.ENGINESIZE, train.CO2EMISSIONS, color='blue')\n",
+ "plt.xlabel(\"Engine size\")\n",
+ "plt.ylabel(\"Emission\")\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "button": false,
+ "new_sheet": false,
+ "run_control": {
+ "read_only": false
+ }
+ },
+ "source": [
+ "
Multiple Regression Model
\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "In reality, there are multiple variables that predict the Co2emission. When more than one independent variable is present, the process is called multiple linear regression. For example, predicting co2emission using FUELCONSUMPTION_COMB, EngineSize and Cylinders of cars. The good thing here is that Multiple linear regression is the extension of simple linear regression model."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {
+ "button": false,
+ "new_sheet": false,
+ "run_control": {
+ "read_only": false
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Coefficients: [[11.61568854 6.8962874 9.77564503]]\n"
+ ]
+ }
+ ],
+ "source": [
+ "from sklearn import linear_model\n",
+ "regr = linear_model.LinearRegression()\n",
+ "x = np.asanyarray(train[['ENGINESIZE','CYLINDERS','FUELCONSUMPTION_COMB']])\n",
+ "y = np.asanyarray(train[['CO2EMISSIONS']])\n",
+ "regr.fit (x, y)\n",
+ "# The coefficients\n",
+ "print ('Coefficients: ', regr.coef_)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "As mentioned before, __Coefficient__ and __Intercept__ , are the parameters of the fit line. \n",
+ "Given that it is a multiple linear regression, with 3 parameters, and knowing that the parameters are the intercept and coefficients of hyperplane, sklearn can estimate them from our data. Scikit-learn uses plain Ordinary Least Squares method to solve this problem.\n",
+ "\n",
+ "#### Ordinary Least Squares (OLS)\n",
+ "OLS is a method for estimating the unknown parameters in a linear regression model. OLS chooses the parameters of a linear function of a set of explanatory variables by minimizing the sum of the squares of the differences between the target dependent variable and those predicted by the linear function. In other words, it tries to minimizes the sum of squared errors (SSE) or mean squared error (MSE) between the target variable (y) and our predicted output ($\\hat{y}$) over all samples in the dataset.\n",
+ "\n",
+ "OLS can find the best parameters using of the following methods:\n",
+ " - Solving the model parameters analytically using closed-form equations\n",
+ " - Using an optimization algorithm (Gradient Descent, Stochastic Gradient Descent, Newton’s Method, etc.)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "